nodriver-mcp
nodriver-mcp
로컬 Codex MCP 서버로, nodriver를 사용한 인증된 브라우저 연구를 위한 것입니다. 실행 간 전용 Chromium/Helium 프로필을 유지하며 작업별 Python 스크래퍼를 핫 리로드합니다.
설정
Python 3.11+, uv, 그리고 Chromium 기반 브라우저가 필요합니다.
uv sync --locked이 내용을 ~/.codex/config.toml에 추가하고, 모든 플레이스홀더를 절대 경로로 바꾸세요:
[mcp_servers.nodriver]
command = "uv"
args = ["--directory", "<path-to-nodriver-mcp>", "run", "--frozen", "nodriver-mcp"]
startup_timeout_sec = 30
tool_timeout_sec = 600
[mcp_servers.nodriver.env]
NODRIVER_MCP_BROWSER_EXECUTABLE = "<path-to-helium-or-chromium>"
NODRIVER_MCP_USER_DATA_DIR = "<path-to-a-dedicated-browser-profile>"
NODRIVER_MCP_SCRIPTS_DIR = "<path-to-nodriver-mcp>/scrapers"
NODRIVER_MCP_ARTIFACTS_DIR = "<path-to-nodriver-mcp>/artifacts"MCP 구성을 변경한 후 Codex를 다시 시작하세요. 브라우저는 느리게 시작됩니다. 기본적으로 브라우저가 표시되므로 전용 프로필에 한 번 로그인할 수 있으며, 쿠키는 유지됩니다. Codex는 프롬프트에서 명시적으로 헤드리스 브라우징을 요청하면 headless=true를 전달하고, 그렇지 않으면 표시 모드를 선택합니다. 모드를 전환하면 프로필을 유지하면서 관리 브라우저가 다시 시작됩니다.
Related MCP server: scout-mcp-server
사용
예를 들어 Codex에 다음과 같이 요청하세요:
내 브라우저 세션을 사용하여 example.com에서 일치하는 항목을 찾아줘. 페이지를 검사하고, 재사용 가능한 스크래퍼를 만들어서 실행하고, 큰 결과는 아티팩트로 저장해. 헤드리스로 실행해.
Codex는 브라우저 도구로 페이지를 검사한 다음 스크래퍼를 저장하고 실행할 수 있습니다. 각 scraper_run은 파일을 다시 읽으므로 MCP 서버를 다시 시작하지 않고도 편집 내용이 적용됩니다:
async def scrape(ctx, params):
if url := params.get("url"):
await ctx.goto(url)
items = await ctx.evaluate_json("""
Array.from(document.querySelectorAll('article')).map(item => ({
title: (item.querySelector('h2')?.innerText || '').trim(),
href: item.querySelector('a')?.href || null
}))
""")
return {"items": items}진입점은 async def scrape(ctx, params)여야 하며 JSON 호환 데이터를 반환해야 합니다. 단일 대량 ctx.evaluate_json(...) 호출을 선호하세요. 큰 결과는 ctx.write_artifact(...)를 사용하세요. 스크래퍼는 비동기 연산을 사용해야 하며 반환 전에 모든 작업을 완료해야 합니다.
테스트
uv run --frozen ruff check src tests
uv run --frozen pytest보안
이 서버는 STDIO로만 로컬에서 실행하세요. 스크래퍼는 샌드박스 처리되지 않은 Python으로, MCP 프로세스의 OS 액세스 권한과 인증된 브라우저 제어 권한을 가집니다. 쿠키, 토큰, 비밀번호 또는 DevTools 엔드포인트를 절대 노출하지 마세요. 페이지 콘텐츠를 신뢰할 수 없는 것으로 취급하고, 액세스 권한이 있는 데이터만 사용하며, 사이트 이용 약관과 속도 제한을 준수하세요. 브라우저 프로필, 생성된 스크래퍼 및 아티팩트에는 개인 데이터가 포함될 수 있으므로 커밋하지 마세요.
Available Tools
9 toolsbrowser_closeClose browser sessionADestructiveIdempotent
Close the managed browser, or close MCP-owned tabs and detach in attach mode.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and idempotentHint=true, so the description doesn't need to reiterate that. However, it adds value by specifying the dual behavior: closing the browser entirely or detaching tabs in attach mode. This goes beyond what annotations convey, but the description could mention that open pages or state will be lost if tabs are closed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise and front-loaded, clearly stating the action without any filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has 0 parameters, an output schema exists, and the annotations are rich (readOnlyHint, openWorldHint, idempotentHint, destructiveHint), the description is mostly sufficient. It explains the core behavior but misses minor behavioral details such as error handling or what happens if no session is active.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema description coverage is 100%, so the schema provides all necessary information. The description adds no parameter info, but no compensation is needed. With 0 params, the baseline is 4, and the description is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool closes the browser session or detaches tabs in attach mode, using a specific verb ('Close') and resource ('managed browser' or 'MCP-owned tabs'), and it distinguishes itself from sibling tools like browser_open, browser_snapshot, and browser_query, which perform different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that the tool should be used when you want to end a browser session or detach tabs, but it does not explicitly state when not to use it or what alternatives (e.g., leaving the browser open) exist. The context of sibling tools is provided but not leveraged in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_openOpen browser tabADestructive
Open or navigate an MCP tab, reusing the active tab unless new_tab is true.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTP(S) URL without embedded credentials, or exactly about:blank | about:blank |
| new_tab | No | Create a new MCP-owned tab instead of reusing the active tab | |
| headless | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations: it states tab reuse behavior and mentions the new_tab parameter's effect. Annotations already indicate destructiveHint=true and openWorldHint=true, so the agent knows this modifies state. The description doesn't contradict annotations. However, it could clarify that opening a URL may replace the current page in the active tab.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the core behavior efficiently. It could be split for clarity but is not wasteful. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values are documented), annotations cover mutation and open-world hints, the description is sufficient for a navigation tool. It covers the main behavioral nuance (tab reuse), though could mention the browser may close existing tabs if headless changes mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema description coverage, the description adds minimal meaning beyond the schema. It explains the new_tab parameter's role but doesn't elaborate on url (already clear from schema) or headless (which has detailed schema descriptions). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool opens or navigates an MCP tab, specifying it reuses the active tab unless new_tab is true. This distinguishes it from siblings like browser_status or browser_close.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use new_tab (true for a new tab), but does not explicitly guide when to use this tool versus alternatives like scraper tools for page content extraction, or browser_status for checking state. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_queryQuery page elementsARead-only
Return text and safe attributes for elements matching a CSS selector.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum matching elements to return | |
| tab_id | No | ||
| selector | Yes | CSS selector to match |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with annotations (readOnlyHint=true, openWorldHint=true) by stating it 'returns' data, implying no mutation. It adds value by specifying that only 'safe attributes' are returned, which is behavioral information beyond the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-formed sentence that communicates the essential purpose immediately. No wasted words, front-loaded with the action and outcome. Ideal conciseness for a straightforward tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core functionality adequately. With annotations covering read-only and open-world behavior, and an output schema presumably detailing the return structure, the description does not need to elaborate further. It could briefly mention that results are returned as a list or array, but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (67%, all parameters have descriptions in schema). The tool description adds no new parameter-specific semantics beyond what the schema provides. It restates the overall purpose but does not elaborate on how 'limit' or 'tab_id' affect behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return', the resource 'text and safe attributes', and the condition 'matching a CSS selector'. This differentiates browser_query from siblings like browser_snapshot (which returns the full page) and scraper tools (which are for more targeted scraping).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives. It assumes CSS selector knowledge and does not mention when to prefer browser_query over browser_snapshot or scraper_get. Usage context is implied by the tool name but not articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotRead page contentARead-only
Return bounded visible text or outer HTML, optionally scoped to a CSS selector.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Return visible text or outer HTML | text |
| tab_id | No | ||
| selector | No | ||
| max_chars | No | Maximum content characters to return |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds useful behavioral context beyond annotations: the tool returns 'bounded' content (implying size limits), supports two formats, and allows CSS scoping. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the action and key options. Every word earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the core functionality well, but omits details about default tab behavior and explicit mention of max_chars. However, given the openWorldHint and output schema presence, the description combined with schema is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for all four parameters, so the description's additional mention of format and CSS selector adds some meaning but does not significantly improve understanding beyond the schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'bounded visible text or outer HTML', with optional scoping via CSS selector. This distinguishes it from siblings like browser_query, browser_status, and scraper_* tools, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like browser_query or scraper tools. The description does not provide context about when it is appropriate to use or when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_statusBrowser statusARead-only
Report browser state and metadata for MCP-accessible tabs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, which the description echoes with 'Report'. No additional behavioral traits (e.g., performance, tab requirements, error conditions) are disclosed beyond what annotations provide. The description adds no new transparency value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no fluff, but it could be slightly more informative (e.g., mentioning that it returns a snapshot of tab state). Still, it is well-structured and front-loaded with the key action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an existing output schema (which documents return values), the description is mostly complete. However, it does not clarify what 'MCP-accessible tabs' means or what metadata is included, which could cause minor ambiguity. Overall adequate for a simple read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema description coverage is 100% (vacuously). The description does not need to explain parameters, but it clearly states the tool's purpose, which is sufficient for an agent to understand what data it will receive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Report' and clearly identifies the resource 'browser state and metadata for MCP-accessible tabs'. It distinguishes from sibling tools like browser_snapshot (which captures page content) and browser_query (which queries the DOM).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as browser_snapshot or browser_query. The description does not mention context, prerequisites, or exclusions, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scraper_getRead scraperARead-only
Return a saved scraper's source and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name without a directory or .py suffix |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the description's disclosure of returning source and metadata adds modest value. It does not, however, describe error behavior (e.g., if the scraper doesn't exist) or any side effects. Given the tool's simplicity and the annotation coverage, the description meets the minimum bar but does not exceed it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the verb and resource. Every word is necessary; there is no redundancy or irrelevant information. It is perfectly sized for a simple retrieval tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one required parameter, existing output schema, and annotations providing safety profile), the description is complete. It states what the tool returns (source and metadata), and the output schema covers the return structure. No additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the only parameter 'name' has a description). The tool description adds no additional meaning about the parameter beyond what the schema already provides. Therefore, it meets the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return' and identifies the resource as 'a saved scraper's source and metadata.' This clearly distinguishes it from siblings like 'scraper_list' (lists scrapers) and 'scraper_run' (executes a scraper), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. While it's implied that you would use this to retrieve a specific scraper's details, there is no mention of when to avoid it (e.g., if you only need the name, use scraper_list) or prerequisites. The context is clear enough for a simple tool, but the lack of explicit guidance leaves room for error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scraper_listList scrapersARead-only
List metadata for saved scrapers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'List metadata' is consistent but adds no extra behavioral context such as authentication needs, rate limits, or response structure. With annotations covering the safety profile, the description provides minimal additional value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no extraneous words. Perfectly front-loaded: verb + resource. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and an existing output schema, the description is nearly complete. Minor gap: it could state explicitly that it returns all saved scrapers or confirm no pagination, but the current text is sufficient for understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema coverage is trivially 100%. The description does not need to add parameter-level meaning; baseline 4 applies per guidelines. The description confirms the action scope without redundant detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'List' and resource 'metadata for saved scrapers', clearly distinguishing from sibling tools like scraper_get (which retrieves a specific scraper) and scraper_run (which executes a scraper). The 'metadata' qualifier sets accurate scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like scraper_get or scraper_save. No context about prerequisites, pagination, or typical use cases is provided, leaving the agent uninformed about decision boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scraper_runRun scraperADestructive
Hot-load and run a saved scraper. Use either url or tab_id; new_tab requires url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| name | Yes | Name without a directory or .py suffix | |
| params | No | ||
| tab_id | No | ||
| new_tab | No | Open url in a new MCP-owned tab; requires url | |
| headless | No | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and openWorldHint=true, which the description does not contradict. The phrase 'hot-load' adds some behavioral context, but the description does not elaborate on side effects, state changes, or error conditions beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, and contains no fluff. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, mutable, destructive, open world, output schema exists), the description is too brief. It does not explain what 'hot-load' means, mention required parameter 'name', describe return values, or address error conditions. An output schema is present but not referenced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description repeats the constraint 'new_tab requires url' which is already in the schema's description for new_tab. It does not add meaning for the other five parameters (name, params, headless, timeout_seconds, tab_id). With schema description coverage at 29% (though the schema itself has descriptions), the tool description fails to compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('run') and resource ('saved scraper'), and includes a constraint on parameter usage. It clearly distinguishes from sibling tools like scraper_list, scraper_get, and scraper_save, as well as browser tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions using 'either url or tab_id' and that 'new_tab requires url,' which provides some parameter guidance. However, it does not specify when to use this tool versus alternatives (e.g., browser_open), nor does it mention prerequisites like the scraper must already be saved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scraper_saveSave scraperADestructive
Validate and atomically save a scraper for the next run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name without a directory or .py suffix | |
| source | Yes | Complete UTF-8 Python source defining async def scrape(ctx, params) | |
| expected_revision | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveness. The description adds 'validate' and 'atomically', disclosing safety guarantees beyond the annotation. Missing are details on conflict behavior when expected_revision mismatches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 8 words, front-loading the core action. Every word is meaningful with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and well-documented parameters, the description is mostly complete but could be strengthened by mentioning what happens on validation failure or revision mismatch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 67% (and all parameters having informative schema descriptions), the tool description adds little parameter-specific meaning beyond the atomic/validation context. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'save' with 'Validate and atomically' adding precise semantics. It clearly distinguishes from sibling scraper tools (list, get, run) which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (saving scrapers for runs), but does not explicitly state when to use this tool versus alternatives, nor provide when-not or prerequisite conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
browser_close - First observed
browser_open - First observed
browser_query - First observed
browser_snapshot - First observed
browser_status - First observed
scraper_get - First observed
scraper_list - First observed
scraper_run - First observed
scraper_save
TDQS
Scored across 9 tools
Tools are generally distinct, but browser_open and scraper_run could confuse an agent: both involve navigation, though scraper_run is specifically for executing a saved scraper. Descriptions mitigate this ambiguity largely.
All tools follow a consistent verb_noun pattern with clear prefixes (browser_ and scraper_), making the purpose predictable and easy to navigate.
Nine tools cover both browser interaction and scraper management without excess or deficiency, well-scoped for a focused MCP server.
The set covers core browser operations and CRUD-like scraper management (list, get, save, run), but lacks a delete scraper tool, which is a minor gap for full lifecycle management.
Maintenance
Related MCP Connectors
MCP server for Firecrawl — web search, scraping, and biomedical/arXiv paper search.
Programmatic web-scraping MCP server powered by x402 micro-transactions on Base.
MCP server to assist with JxBrowser development.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMCP server that exposes the Pinchtab browser API for token-efficient web scraping, change detection, and automated testing workflows.15-
- AlicenseAqualityBmaintenanceMCP server for browser automation with anti-detection. Scout pages, find elements, interact with websites, and monitor network traffic from any AI client that supports the Model Context Protocol.211MIT
- AlicenseNot gradedqualityBmaintenanceLocal MCP server for persistent Chrome automation with multi-profile support, enabling tab management, page inspection, element interaction, JavaScript evaluation, and screenshots while preserving login sessions across restarts.117 npm3MIT
- FlicenseAqualityBmaintenanceAn MCP server that enables remote observation and control of a Chromium browser via a WebSocket relay, supporting DOM, CDP, and native OS automation for local or LAN-based AI agents.8-