Skip to content

Commit 0e2e93f

Browse files
committed
chore: make tool definition arguments optional
1 parent 855a328 commit 0e2e93f

4 files changed

Lines changed: 62 additions & 62 deletions

File tree

src/McpContext.ts

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ export interface TextSnapshotNode extends SerializedAXNode {
5353
}
5454

5555
export interface ExtensionServiceWorker {
56-
url: string;
57-
target: Target;
58-
id: string;
56+
url: string;
57+
target: Target;
58+
id: string;
5959
}
6060

6161
export interface GeolocationOptions {
@@ -156,8 +156,8 @@ export class McpContext implements Context {
156156
#pageIdMap = new WeakMap<Page, number>();
157157
#nextPageId = 1;
158158

159-
#extensionServiceWorkerMap = new WeakMap<Target, string>();
160-
#nextExtensionServiceWorkerId = 1;
159+
#extensionServiceWorkerMap = new WeakMap<Target, string>();
160+
#nextExtensionServiceWorkerId = 1;
161161

162162
#nextSnapshotId = 1;
163163
#traceResults: TraceResult[] = [];
@@ -508,7 +508,7 @@ export class McpContext implements Context {
508508
}
509509
if (page.isClosed()) {
510510
throw new Error(
511-
`The selected page has been closed. Call ${listPages({} as ParsedArguments).name} to see open pages.`,
511+
`The selected page has been closed. Call ${listPages().name} to see open pages.`,
512512
);
513513
}
514514
return page;
@@ -598,40 +598,40 @@ export class McpContext implements Context {
598598
}
599599
}
600600

601-
/**
602-
* Creates a snapshot of the extension service workers.
603-
*/
604-
async createExtensionServiceWorkersSnapshot(): Promise<
605-
ExtensionServiceWorker[]
606-
> {
607-
const allTargets = await this.browser.targets();
608-
609-
const serviceWorkers = allTargets.filter(target => {
610-
return (
611-
target.type() === 'service_worker' &&
612-
target.url().includes('chrome-extension://')
613-
);
614-
});
615-
616-
for (const serviceWorker of serviceWorkers) {
617-
if (!this.#extensionServiceWorkerMap.has(serviceWorker)) {
618-
this.#extensionServiceWorkerMap.set(
619-
serviceWorker,
620-
'sw-' + this.#nextExtensionServiceWorkerId++,
621-
);
622-
}
623-
}
624-
625-
this.#extensionServiceWorkers = serviceWorkers.map(serviceWorker => {
626-
return {
627-
target: serviceWorker,
628-
id: this.#extensionServiceWorkerMap.get(serviceWorker)!,
629-
url: serviceWorker.url(),
630-
};
631-
});
632-
633-
return this.#extensionServiceWorkers;
634-
}
601+
/**
602+
* Creates a snapshot of the extension service workers.
603+
*/
604+
async createExtensionServiceWorkersSnapshot(): Promise<
605+
ExtensionServiceWorker[]
606+
> {
607+
const allTargets = await this.browser.targets();
608+
609+
const serviceWorkers = allTargets.filter(target => {
610+
return (
611+
target.type() === 'service_worker' &&
612+
target.url().includes('chrome-extension://')
613+
);
614+
});
615+
616+
for (const serviceWorker of serviceWorkers) {
617+
if (!this.#extensionServiceWorkerMap.has(serviceWorker)) {
618+
this.#extensionServiceWorkerMap.set(
619+
serviceWorker,
620+
'sw-' + this.#nextExtensionServiceWorkerId++,
621+
);
622+
}
623+
}
624+
625+
this.#extensionServiceWorkers = serviceWorkers.map(serviceWorker => {
626+
return {
627+
target: serviceWorker,
628+
id: this.#extensionServiceWorkerMap.get(serviceWorker)!,
629+
url: serviceWorker.url(),
630+
};
631+
});
632+
633+
return this.#extensionServiceWorkers;
634+
}
635635

636636
async createPagesSnapshot(): Promise<Page[]> {
637637
const allPages = await this.#getAllPages();
@@ -726,15 +726,15 @@ export class McpContext implements Context {
726726
}
727727
}
728728

729-
getExtensionServiceWorkers(): ExtensionServiceWorker[] {
730-
return this.#extensionServiceWorkers;
731-
}
729+
getExtensionServiceWorkers(): ExtensionServiceWorker[] {
730+
return this.#extensionServiceWorkers;
731+
}
732732

733-
getExtensionServiceWorkerId(
734-
extensionServiceWorker: ExtensionServiceWorker,
735-
): string | undefined {
736-
return this.#extensionServiceWorkerMap.get(extensionServiceWorker.target);
737-
}
733+
getExtensionServiceWorkerId(
734+
extensionServiceWorker: ExtensionServiceWorker,
735+
): string | undefined {
736+
return this.#extensionServiceWorkerMap.get(extensionServiceWorker.target);
737+
}
738738

739739
getPages(): Page[] {
740740
return this.#pages;

src/tools/ToolDefinition.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,16 @@ export function defineTool<
165165
Schema extends zod.ZodRawShape,
166166
Args extends ParsedArguments = ParsedArguments,
167167
>(
168-
definition: (args: Args) => ToolDefinition<Schema>,
169-
): (args: Args) => ToolDefinition<Schema>;
168+
definition: (args?: Args) => ToolDefinition<Schema>,
169+
): (args?: Args) => ToolDefinition<Schema>;
170170

171171
export function defineTool<
172172
Schema extends zod.ZodRawShape,
173173
Args extends ParsedArguments = ParsedArguments,
174174
>(
175-
definition: ToolDefinition<Schema> | ((args: Args) => ToolDefinition<Schema>),
175+
definition:
176+
| ToolDefinition<Schema>
177+
| ((args?: Args) => ToolDefinition<Schema>),
176178
) {
177179
return definition;
178180
}

src/tools/pages.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@ import {zod} from '../third_party/index.js';
1212
import {ToolCategory} from './categories.js';
1313
import {CLOSE_PAGE_ERROR, defineTool, timeoutSchema} from './ToolDefinition.js';
1414

15-
export const listPages = defineTool((args) => {
15+
export const listPages = defineTool(args => {
1616
return {
1717
name: 'list_pages',
18-
description: `Get a list of pages ${args.categoryExtensions ? 'including extension service workers' : ''} open in the browser.`,
18+
description: `Get a list of pages ${args?.categoryExtensions ? 'including extension service workers' : ''} open in the browser.`,
1919
annotations: {
2020
category: ToolCategory.NAVIGATION,
2121
readOnlyHint: true,
2222
},
2323
schema: {},
2424
handler: async (_request, response) => {
2525
response.setIncludePages(true);
26-
if(args.categoryExtensions) {
26+
if (args?.categoryExtensions) {
2727
response.setIncludeExtensionServiceWorkers(true);
2828
}
2929
},
@@ -41,7 +41,7 @@ export const selectPage = defineTool({
4141
pageId: zod
4242
.number()
4343
.describe(
44-
`The ID of the page to select. Call ${listPages({} as ParsedArguments).name} to get available pages.`,
44+
`The ID of the page to select. Call ${listPages().name} to get available pages.`,
4545
),
4646
bringToFront: zod
4747
.boolean()
@@ -378,7 +378,7 @@ export const getTabId = defineTool({
378378
pageId: zod
379379
.number()
380380
.describe(
381-
`The ID of the page to get the tab ID for. Call ${listPages({} as ParsedArguments).name} to get available pages.`,
381+
`The ID of the page to get the tab ID for. Call ${listPages().name} to get available pages.`,
382382
),
383383
},
384384
handler: async (request, response, context) => {

tests/tools/pages.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,7 @@ describe('pages', () => {
3838
describe('list_pages', () => {
3939
it('list pages', async () => {
4040
await withMcpContext(async (response, context) => {
41-
await listPages({} as ParsedArguments).handler(
42-
{params: {}},
43-
response,
44-
context,
45-
);
41+
await listPages().handler({params: {}}, response, context);
4642
assert.ok(response.includePages);
4743
});
4844
});
@@ -64,7 +60,9 @@ describe('pages', () => {
6460

6561
response.resetResponseLineForTesting();
6662

67-
const listPageDef = listPages({categoryExtensions} as ParsedArguments);
63+
const listPageDef = listPages({
64+
categoryExtensions,
65+
} as ParsedArguments);
6866
await listPageDef.handler({params: {}}, response, context);
6967

7068
const result = await response.handle(listPageDef.name, context);

0 commit comments

Comments
 (0)