interceptor_browser_snapshot
Capture an ARIA accessibility snapshot of a web page as a YAML role tree, enabling LLM-driven page understanding without HTML parsing.
Instructions
Take an ARIA accessibility snapshot of the bound page (YAML-formatted role tree). Great for LLM-driven page understanding without parsing HTML.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| target_id | Yes | Target ID from interceptor_browser_launch or interceptor_camoufox_launch | |
| selector | No | Root selector to snapshot (default: 'body') | body |
| mode | No | Snapshot mode — 'ai' adds ref attributes for locator reuse | default |
Implementation Reference
- src/index.ts:69-69 (registration)Registration call: registerDevToolsTools(server) is invoked to register all devtools tools including interceptor_browser_snapshot.
registerDevToolsTools(server); - src/tools/devtools.ts:118-122 (schema)Input schema for interceptor_browser_snapshot: target_id (string), selector (optional string, default 'body'), mode (optional enum 'default'|'ai', default 'default').
{ target_id: z.string().describe("Target ID from interceptor_browser_launch or interceptor_camoufox_launch"), selector: z.string().optional().default("body").describe("Root selector to snapshot (default: 'body')"), mode: z.enum(["default", "ai"]).optional().default("default").describe("Snapshot mode — 'ai' adds ref attributes for locator reuse"), }, - src/tools/devtools.ts:123-143 (handler)Handler implementation: resolves the Playwright Page via getPageForTarget, calls page.locator(selector).ariaSnapshot({mode}), and returns the snapshot text along with target_id, url, title, and root selector.
async ({ target_id, selector, mode }) => { try { const page = await getPageForTarget(target_id); const snapshot = await page.locator(selector).ariaSnapshot({ mode }); return { content: [{ type: "text", text: truncateResult({ status: "success", target_id, url: page.url(), title: await page.title().catch(() => ""), root: selector, snapshot, }), }], }; } catch (e) { return { content: [{ type: "text", text: JSON.stringify({ status: "error", error: errorToString(e) }) }] }; } }, - src/tools/devtools.ts:111-144 (registration)Registration function registerDevToolsTools which calls server.tool('interceptor_browser_snapshot', ...) to register the tool on the MCP server.
export function registerDevToolsTools(server: McpServer): void { // ── snapshot ────────────────────────────────────────────────── server.tool( "interceptor_browser_snapshot", "Take an ARIA accessibility snapshot of the bound page (YAML-formatted role tree). " + "Great for LLM-driven page understanding without parsing HTML.", { target_id: z.string().describe("Target ID from interceptor_browser_launch or interceptor_camoufox_launch"), selector: z.string().optional().default("body").describe("Root selector to snapshot (default: 'body')"), mode: z.enum(["default", "ai"]).optional().default("default").describe("Snapshot mode — 'ai' adds ref attributes for locator reuse"), }, async ({ target_id, selector, mode }) => { try { const page = await getPageForTarget(target_id); const snapshot = await page.locator(selector).ariaSnapshot({ mode }); return { content: [{ type: "text", text: truncateResult({ status: "success", target_id, url: page.url(), title: await page.title().catch(() => ""), root: selector, snapshot, }), }], }; } catch (e) { return { content: [{ type: "text", text: JSON.stringify({ status: "error", error: errorToString(e) }) }] }; } }, ); - src/browser/session.ts:127-137 (helper)getPageForTarget helper: resolves a target_id to a Playwright Page, handling both cloakbrowser (browser_*) and camoufox (camoufox_*) target types.
export async function getPageForTarget(targetId: string): Promise<Page> { const entry = getEntry(targetId); if (isCamoufoxTargetId(targetId)) { return ensureCamoufoxPage(entry as CamoufoxEntryWithDriver); } const browserEntry = entry as BrowserTargetEntry; if (browserEntry.page.isClosed()) { throw new Error(`Page for browser target '${targetId}' is closed.`); } return browserEntry.page; }