Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions src/McpResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ export class McpResponse implements Response {
});
}

format(
async format(
toolName: string,
context: McpContext,
data: {
Expand All @@ -692,7 +692,7 @@ export class McpResponse implements Response {
webmcpTools?: WebMCPTool[];
errorMessage?: string;
},
): {content: Array<TextContent | ImageContent>; structuredContent: object} {
): Promise<{content: Array<TextContent | ImageContent>; structuredContent: object}> {
const structuredContent: {
snapshot?: object;
snapshotFilePath?: string;
Expand Down Expand Up @@ -810,10 +810,12 @@ Call ${handleDialog.name} to handle it before continuing.`);
const contextLabel = isolatedContextName
? ` isolatedContext=${isolatedContextName}`
: '';
const title = await page.title().catch(() => '');
const pageLabel = title ? `${title} (${page.url()})` : page.url();
parts.push(
`${context.getPageId(page)}: ${page.url()}${context.isPageSelected(page) ? ' [selected]' : ''}${contextLabel}`,
`${context.getPageId(page)}: ${pageLabel}${context.isPageSelected(page) ? ' [selected]' : ''}${contextLabel}`,
);
structuredPages.push(createStructuredPage(page, context));
structuredPages.push(await createStructuredPage(page, context));
}
response.push(...parts);
structuredContent.pages = structuredPages;
Expand All @@ -828,10 +830,14 @@ Call ${handleDialog.name} to handle it before continuing.`);
const contextLabel = isolatedContextName
? ` isolatedContext=${isolatedContextName}`
: '';
const title = await page.title().catch(() => '');
const pageLabel = title ? `${title} (${page.url()})` : page.url();
response.push(
`${context.getPageId(page)}: ${page.url()}${context.isPageSelected(page) ? ' [selected]' : ''}${contextLabel}`,
`${context.getPageId(page)}: ${pageLabel}${context.isPageSelected(page) ? ' [selected]' : ''}${contextLabel}`,
);
structuredExtensionPages.push(
await createStructuredPage(page, context),
);
structuredExtensionPages.push(createStructuredPage(page, context));
}
structuredContent.extensionPages = structuredExtensionPages;
}
Expand Down Expand Up @@ -1157,16 +1163,19 @@ Call ${handleDialog.name} to handle it before continuing.`);
this.#textResponseLines = [];
}
}
function createStructuredPage(page: Page, context: McpContext) {
async function createStructuredPage(page: Page, context: McpContext) {
const isolatedContextName = context.getIsolatedContextName(page);
const title = await page.title().catch(() => '');
const entry: {
id: number | undefined;
url: string;
title: string;
selected: boolean;
isolatedContext?: string;
} = {
id: context.getPageId(page),
url: page.url(),
title,
selected: context.isPageSelected(page),
};
if (isolatedContextName) {
Expand Down
5 changes: 5 additions & 0 deletions tests/McpResponse.test.js.snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ exports[`McpResponse > list pages 2`] = `
{
"id": 1,
"url": "about:blank",
"title": "",
"selected": true
}
]
Expand Down Expand Up @@ -1295,6 +1296,7 @@ exports[`webmcp > includes webmcp tools in list_pages response 2`] = `
{
"id": 1,
"url": "about:blank",
"title": "",
"selected": true
}
],
Expand Down Expand Up @@ -1323,6 +1325,7 @@ exports[`webmcp > includes webmcp tools in navigate_page response 2`] = `
{
"id": 1,
"url": "about:blank",
"title": "",
"selected": true
}
],
Expand All @@ -1349,6 +1352,7 @@ exports[`webmcp > includes webmcp tools in select_page response 2`] = `
{
"id": 1,
"url": "about:blank",
"title": "",
"selected": true
}
],
Expand All @@ -1375,6 +1379,7 @@ exports[`webmcp > list no webmcp tools if experimentalWebmcp is false 2`] = `
{
"id": 1,
"url": "about:blank",
"title": "",
"selected": true
}
]
Expand Down
12 changes: 6 additions & 6 deletions tests/tools/pages.test.js.snapshot
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
exports[`pages > close_page > when dialog is open 1`] = `
{"content":[{"type":"text","text":"## Pages\\n1: about:blank [selected]"}],"structuredContent":{"pages":[{"id":1,"url":"about:blank","selected":true}]}}
{"content":[{"type":"text","text":"## Pages\\n1: about:blank [selected]"}],"structuredContent":{"pages":[{"id":1,"url":"about:blank","title":"","selected":true}]}}
`;

exports[`pages > list_pages > list pages for extension pages with --category-extensions 1`] = `
Expand Down Expand Up @@ -31,21 +31,21 @@ sw-1: chrome-extension://<extension-id>/sw.js
`;

exports[`pages > list_pages > when dialog is open 1`] = `
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","selected":true}]}}
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","title":"","selected":true}]}}
`;

exports[`pages > navigate_page > when dialog is open 1`] = `
{"content":[{"type":"text","text":"Successfully navigated to data:text/html,<div>Navigated</div>.\\n# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: data:text/html,<div>Navigated</div> [selected]"}],"structuredContent":{"message":"Successfully navigated to data:text/html,<div>Navigated</div>.","dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"data:text/html,<div>Navigated</div>","selected":true}]}}
{"content":[{"type":"text","text":"Successfully navigated to data:text/html,<div>Navigated</div>.\\n# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: data:text/html,<div>Navigated</div> [selected]"}],"structuredContent":{"message":"Successfully navigated to data:text/html,<div>Navigated</div>.","dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"data:text/html,<div>Navigated</div>","title":"","selected":true}]}}
`;

exports[`pages > new_page with isolatedContext > when dialog is open 1`] = `
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank\\n2: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","selected":false},{"id":2,"url":"about:blank","selected":true}]}}
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank\\n2: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","title":"","selected":false},{"id":2,"url":"about:blank","title":"","selected":true}]}}
`;

exports[`pages > resize > when dialog is open 1`] = `
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","selected":true}]}}
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","title":"","selected":true}]}}
`;

exports[`pages > select_page > when dialog is open 1`] = `
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","selected":true}]}}
{"content":[{"type":"text","text":"# Open dialog\\nalert: test dialog.\\nCall handle_dialog to handle it before continuing.\\n## Pages\\n1: about:blank [selected]"}],"structuredContent":{"dialog":{"type":"alert","message":"test dialog","defaultValue":""},"pages":[{"id":1,"url":"about:blank","title":"","selected":true}]}}
`;
Loading