Skip to main content
Glama
jfjensen

camofox-browser MCP server (stage2)

by jfjensen

Local LLM agent that reads AND acts on web pages (camofox-browser + MCP)

Code for Part 6 of the Build Your Own Claude Code series: Acting on Web Pages with a Small Local LLM — Click, Type, Submit.

The series so far:

  • Part 1: the agent (CLI, tools, skills, history, compaction)

  • Part 2: the browser UI (FastAPI + WebSockets)

  • Part 3: web search (SearXNG via MCP)

  • Part 4: web browsing (camofox-browser via MCP) + composing with Part 3's search

  • Part 5: reading whole pages without truncation — chunked extract and summarize, plus a family of small single-purpose reader tools (fetch_snippet, fetch_urls, fetch_structure)

  • Part 6 (this repo): interaction — a persistent-tab lifecycle (open_tab / read_tab / close_tab) plus action tools (click, type_into, press_key, select_option, or a single interact tool, depending on config) so the agent can fill in a search box, click Next on a paginated list, or submit a form, not just read what is already on the page.

The problem this part solves: Part 5's reader tools are URL-first — each one opens a fresh tab, snapshots it, and closes it, so there is nothing to act on. Real tasks (search a site, page through results, fill out and submit a form) need a tab that stays open across calls and element references that survive long enough to click or type into. camofox keeps a tab alive until told to close it; this part adds the MCP plumbing on top — open a persistent tab, read its current state to find an element's [eN] ref, act on that ref, then re-read before the next action because every action renumbers the refs.

Install

git clone https://github.com/jfjensen/local-LLM-agent-mcp-interaction.git
cd local-LLM-agent-mcp-interaction
python -m venv .venv
# Linux / macOS:
source .venv/bin/activate
# Windows PowerShell:
.\.venv\Scripts\Activate.ps1
pip install -e .

You will also need:

  • Docker to run camofox-browser and SearXNG (Stage 1 brings up both).

  • Ollama with a tool-capable model. The default is qwen3.5:9b:

    ollama pull qwen3.5:9b

SearXNG comes pre-configured (the settings file is mounted into the container), so the JSON API works without editing anything.

Related MCP server: Puppeteer MCP Server

Configuration

All tunable settings live in config.toml at the repo root:

  • model name, temperature, thinking;

  • SearXNG and camofox URLs;

  • chunking and reading budgets (the page snapshot size is capped by camofox itself, not here — see the note in config.toml's [browser]);

  • [acting] — the new section for Part 6: action_tool_style picks between four intent-named action tools (click, type_into, press_key, select_option) and a single interact(action=...) tool; wait_timeout_ms / wait_for_network control how long the server waits for a page to settle after an action; action_result_snippet optionally attaches a head-snippet of the post-action page to the action's result;

  • log verbosity (logging.level = "DEBUG" shows each tool call, its arguments, and a preview of what came back).

To see what is currently active:

mcp-config-show

The loader looks for config.toml in the current working directory first, then falls back to the one bundled with the repo.

How to run

Stage

What it is

How to run

1

Standing up camofox-browser and SearXNG via Docker

cd stage1 && docker compose up -d (see stage1/README.md for the camofox image build step)

2

The full agent: search plus the browser reader and action tools

mcp-agent-stage2

The browser MCP server (mcp-browser-stage2) exposes three groups of tools.

URL-first readers (from Part 5; each opens a one-shot tab, reads it, closes it):

  • fetch_snippet — the head of a page, for a quick look.

  • fetch_urls — the page's links as {text, url} pairs, absolute.

  • fetch_structure — the heading outline.

  • extract — named fields as JSON, via chunk-and-merge over the whole page (no truncation).

  • summarize — a prose summary, built by combining per-chunk summaries (map-reduce by default, or refine).

Persistent-tab lifecycle and readers (new in Part 6; for when you need to act on a page, not just read it):

  • open_tab — opens a page in a tab that stays open and returns a tab_id.

  • read_tab — reads the CURRENT state of an open tab: mode="snippet" (default, shows the [eN] element refs you need for an action), "urls", or "structure".

  • summarize_tab / extract_tab — the same whole-page, no-truncation summarize / extract logic, applied to the live tab instead of a fresh URL fetch (use these after navigating or acting your way to a page that may not be re-fetchable by URL, such as a form's POST target).

  • close_tab — closes one tab; close_all_tabs — tears down every tab in the session (the agent calls this automatically on shutdown).

Action tools (new in Part 6; act on an [eN] ref from the latest read_tab). The surface shown to the model is picked by config.toml's [acting].action_tool_style:

  • "separate" (default) — four intent-named tools: click, type_into (optionally submit=True to press Enter afterwards), press_key, select_option (for native <select> dropdowns).

  • "interact" — one interact(tab_id, action, ...) tool with an action enum (click / type / press / select), mirroring camofox's own /act dispatcher.

Every action re-snapshots the tab and reports the resulting url and a fresh refsCount: refs are renumbered after every action, so the rule is always read_tab → act → read_tab again before the next action.

Plus the search server (mcp-search-part3), a copy of Part 3's SearXNG MCP server, so the repo is self-contained.

Probing MCP servers with inspect_any.py

inspect_any.py makes one tool call per process, which is fine for the URL-first readers but not for interaction (each process would get its own tab). For the lifecycle/action tools, use test_act_flow.py instead (see below).

# List a server's tools:
python inspect_any.py mcp_browser_02.main

# Call a reader tool:
python inspect_any.py mcp_browser_02.main fetch_snippet --kv url=https://example.com
python inspect_any.py mcp_browser_02.main fetch_urls --kv url=https://example.com

# Call extract with a JSON Schema (use --args or --args-file for nested args):
python inspect_any.py mcp_browser_02.main extract --args-file extract_args.json

Where extract_args.json might look like:

{
  "url": "https://en.wikipedia.org/wiki/Vleteren",
  "schema": {
    "type": "object",
    "properties": {
      "mayor": {"type": "string", "description": "The current mayor, from the infobox"},
      "postal_code": {"type": "string", "description": "The postal code"},
      "population": {"type": "string", "description": "The total population"}
    }
  }
}

Exercising the action tools with test_act_flow.py

Unlike inspect_any.py, this opens a single MCP stdio session and runs the whole interaction loop in one process, so the persistent tab stays warm across calls:

python test_act_flow.py
# or against a different target:
python test_act_flow.py https://en.wikipedia.org/wiki/Main_Page

It runs open_tabread_tabtype_into(..., submit=True)read_tab → a deliberate reuse of the now-stale ref (to demonstrate why refs must be re-read after every action) → close_tab. The default target is DuckDuckGo Lite, a tiny HTML page whose search box makes a clean before/after-submit comparison.

Probing camofox directly with probe_camofox.py

A lower-level probe that talks to camofox's HTTP API directly (no MCP layer), useful when something in the action tools misbehaves and you need to rule out the MCP server as the cause. It first checks which "open a tab" endpoint your camofox build actually answers to, then drives open → snapshot → type → submit → snapshot → a stale-ref check → close against a real public form:

python probe_camofox.py
# or against a different form:
python probe_camofox.py https://html.duckduckgo.com/html/

Notes

  • The agent creates a history/ folder in the current working directory on first run.

  • The repo ships a copy of Part 3's SearXNG MCP server as mcp-search-part3, byte-for-byte the same, so you do not need to install Part 3.

  • The agent calls close_all_tabs automatically on shutdown, since the model does not reliably close tabs itself; persistent tabs would otherwise accumulate in camofox across sessions.

License

MIT © 2026 Jes Fink-Jensen. See LICENSE for details.

Troubleshooting

  • The Docker build fails with "dist not found". Use Dockerfile.ci instead of the default Dockerfile. See stage1/README.md.

  • FileNotFoundError: [WinError 2] when the agent spawns an MCP server. Your venv is not activated. Activate it so console scripts are on PATH.

  • Script exits silently on Windows. The default asyncio event loop on Windows cannot spawn subprocesses. The agent sets WindowsProactorEventLoopPolicy at startup; do the same if you copy the code elsewhere.

  • extract returns nulls on a page you know has the data. With the chunked extract this should be rare, but a very large page makes many model calls. Lower chunking.chunk_chars for smaller, more numerous chunks, or raise it for fewer, larger ones.

  • fetch_structure returns few or no headings. Some pages (short stubs, pages whose content lives in tables or infoboxes) have a thin heading outline. Use summarize or extract for those.

  • camofox returns a small or empty snapshot. Some pages need more than the default 1.5-second settle. Bump browser.settle_seconds.

  • An action fails with a stale-ref or "page may have changed" error. Every action renumbers the tab's [eN] refs. Call read_tab again to get fresh refs before retrying; never reuse a ref from before an action.

  • An action on a result page seems to silently target the wrong element, or the page doesn't look like what you expected. Don't re-fetch the result by URL — use read_tab / summarize_tab / extract_tab on the tab instead. Some result pages (a form's POST target, for example) only exist inside the tab and are not independently fetchable.

  • select_option fails even though the dropdown is visible. camofox only exposes a ref for <select>/combobox elements that its accessibility snapshot assigns one to; if read_tab shows no [eN] ref on the dropdown, it cannot be selected on that build. Use click on the visible options instead if the site renders them as a custom (non-<select>) widget.

  • probe_camofox.py can't find an open endpoint. It tries the canonical POST /tabs route first, falling back to the older POST /tabs/open shim. If neither returns a tabId, your camofox build's API has likely changed; paste the script's output to see which step failed.

Available Tools

15 tools
clickA

Click an interactive element in an open tab, by its ref.

The ref is an [eN] marker (like e42) from the tab's latest read_tab snapshot. Use this for links, buttons, checkboxes, and to submit a form that has a submit button. To submit a form that has no button, type into the field with submit=True, or press_key(tab_id, "Enter").

Args: tab_id: The handle from open_tab. ref: The element ref to click, e.g. "e42".

Returns: JSON with the resulting url and fresh ref count. Refs renumber after the click, so call read_tab again before your next action.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
refNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses that refs renumber after click, requiring a fresh read_tab. Does not detail other side effects like page navigation, pop-ups, or required permissions, but the note on renumbering is valuable for agent operational correctness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with purpose, followed by usage guidance, then parameter and return details. Every sentence adds unique value. No redundancy or fluff. Well-structured for quick parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low parameter count (2) and existence of output schema, description covers purpose, usage, parameter semantics, and behavioral side effect (ref renumbering). Also describes return as 'JSON with resulting url and fresh ref count'. Complete for a click action with no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% description coverage; description fully compensates. Explains tab_id as 'handle from open_tab' and ref as '[eN] marker (like e42) from tab's latest read_tab snapshot.' Adds concrete examples and context entirely missing from schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states action: 'Click an interactive element... by its ref.' Verb and resource specific. Explicitly distinguishes from siblings by mentioning alternatives like press_key and type_into for form submission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: links, buttons, checkboxes, submitting forms with a submit button. Also states when-not-to-use: for forms without a submit button, recommending type_into with submit=True or press_key with Enter. Includes post-click guidance to call read_tab again due to ref renumbering.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_all_tabsA

Close ALL persistent browser tabs at once (tears down the browsing session). You normally do not need this; the agent calls it automatically on shutdown so tabs do not leak between sessions. Opening a tab afterwards starts a fresh session.

Returns: A short confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that the tool is destructive ('tears down the session') and mentions that opening a tab afterward starts a fresh session, implying session termination. However, it lacks specifics on whether state is saved or how the confirmation behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using three clear sentences. The first sentence states the action, the second provides usage context, and the third describes the return value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, a simple return of a short confirmation, and clear context from sibling tools, the description is fully complete. It explains both the mechanism (closing all tabs) and the reason (automatic shutdown cleanup).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so no parameter description is needed. The baseline for no parameters is 4, and the description does not add or subtract from that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool closes ALL persistent browser tabs at once, tearing down the browsing session. It distinguishes from the sibling 'close_tab' which closes individual tabs, making the purpose unique and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'You normally do not need this; the agent calls it automatically on shutdown', providing clear guidance on when not to use it. It implies that for individual tab closures, 'close_tab' should be used, though it does not explicitly mention that alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_tabA

Close a persistent tab opened with open_tab. Call this when you have finished interacting with a page, to free the browser tab.

Args: tab_id: The handle returned by open_tab.

Returns: A short confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states it closes the tab and returns a short confirmation, but without annotations, it lacks details on potential side effects (e.g., unsaved data loss) or prerequisites (e.g., tab must be opened by open_tab). It is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with two sentences plus a structured Args/Returns section. Every sentence is necessary, and important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one required parameter) and the presence of an output schema (returning a short confirmation), the description covers purpose, usage, parameter, and return value. It is mostly complete, though it could mention handling of tabs not opened by open_tab.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to the tab_id parameter by noting it is 'the handle returned by open_tab,' which is not present in the schema (which only specifies type string). This helps the agent understand the origin and usage of the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Close a persistent tab', verb+resource) and specifies that it applies to tabs opened with open_tab, distinguishing it from the sibling close_all_tabs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call this when you have finished interacting with a page, to free the browser tab,' providing clear usage context. It does not explicitly exclude alternative scenarios or mention when not to use it, but the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extractA

Fetch a webpage and extract structured data from it according to a JSON Schema. The MCP server fetches the page, then asks a local Ollama model to populate the schema from the page contents. So the caller gets clean JSON back, without having to read or parse the snapshot itself.

Use this tool when the user asks for specific fields that you can name in advance, especially on pages with structured content (WHOIS lookups, product pages, GitHub repos, recipes, tables of data). Arrays and nested objects are supported, since the work is done by an LLM and not by a constrained server-side extractor.

Prefer fetch when the user asks an open-ended question or wants a free-form summary.

Args: url: The full URL to extract from. schema: A JSON Schema describing the fields to extract. Property descriptions guide the extraction model in finding the right page content. Example: { "type": "object", "properties": { "registrar": {"type": "string", "description": "Domain registrar name"}, "expiration_date": {"type": "string", "description": "Registrar Registration Expiration Date"}, "nameservers": {"type": "array", "items": {"type": "string"}, "description": "Name Server entries"} } } user_id: Optional, same semantics as for fetch.

Returns: A JSON string with the extracted fields. If a field cannot be found, it is set to null.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
schemaYes
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description explains the mechanism (fetches page, uses local LLM to populate schema) and return format. Missing details on error handling or limitations, but adequately transparent for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well structured with key info front-loaded. Could be slightly more concise but no wasted sentences. Each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers core functionality, usage, parameters, and return behavior (null for unfound fields). With output schema present, return details are less critical. Missing limitations but overall complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% description coverage, but the description fully compensates: explains `url`, gives detailed guidance and example for `schema`, and notes `user_id` semantics. Provides essential meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches a webpage and extracts structured data per a JSON Schema. It distinguishes from siblings like `fetch` by noting the structured extraction use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (specific fields, structured content) and when to prefer the sibling `fetch` tool for open-ended questions. Provides clear context for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_tabA

Extract structured data from the CURRENT page in an open tab according to a JSON Schema, using the same whole-page chunk-and-merge extractor as extract, but reading the live tab instead of opening a URL. Use this for named fields on a page you have navigated or interacted your way to.

Args: tab_id: The handle from open_tab. schema: A JSON Schema describing the fields to extract (same shape as for extract).

Returns: A JSON string with the extracted fields; missing fields are null.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
schemaYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that it uses the same chunk-and-merge extractor as `extract` and works on a live tab. However, it does not detail potential side effects, rate limits, or what happens if the tab changes, which would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two well-organized paragraphs: first the main purpose and usage, then parameter and return details. It is front-loaded and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's behavior, parameters, return format, and distinguishes it from siblings. It could mention that the tab must already be open, but that is implied. Given the low complexity and presence of an output schema, it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains both parameters: tab_id is a handle from open_tab, and schema is a JSON Schema same as for `extract`. This adds meaning beyond the raw schema (which has no descriptions), especially given 0% schema coverage. The explanation is sufficient but could include examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool extracts structured data from the current tab using a JSON Schema, distinguishing it from the sibling `extract` tool which opens a URL. The verb 'extract' and resource 'tab' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool: 'for named fields on a page you have navigated or interacted your way to', contrasting with `extract`. It provides clear context but lacks explicit 'when-not-to-use' or alternative tools beyond the implicit comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_snippetA

Fetch a webpage and return a short snippet from the top of it.

This is the quick-look tool. It returns the head of the page's accessibility-tree snapshot, which is usually enough to tell what the page is and whether it is the right one. If the page is longer than the snippet, the result ends with a marker telling you to use summarize for the full content or extract for specific fields.

Use this when you want a fast look at a page, or to confirm a URL is what you expect before doing more with it. For a full understanding of a long page, prefer summarize; for named fields, prefer extract.

Args: url: The full URL to fetch (must include http:// or https://). user_id: Optional. If set, camofox reuses a browser context across calls (faster). Default opens a one-shot tab.

Returns: The head of the page snapshot, with a marker if it was longer.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, but the description discloses that the result includes a marker if the page is longer, and explains the user_id parameter's effect on browser context reuse, adding behavioral context beyond schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured with intro, output explanation, usage guidance, and parameter details, no wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with an output schema, the description adequately explains purpose, output, and parameters, making it complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaning: URL must include http:// or https://, and user_id is optional with context reuse behavior explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches a webpage and returns a short snippet from the top, explicitly differentiating it from siblings like 'summarize' and 'extract' for full content or specific fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it (fast look, confirm URL) and when not to (prefer 'summarize' for full content, 'extract' for named fields), providing clear guidance over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_structureA

Fetch a webpage and return its heading outline: the page's headings with their levels, in order, like a table of contents.

Use this to see how a page is organized and whether the section you want is on it, before deciding what to read in full. Note that some pages (short stubs, pages whose content sits in tables or infoboxes rather than under headings) have a thin outline; in that case prefer summarize or extract.

Args: url: The full URL to outline. user_id: Optional, same semantics as for fetch_snippet.

Returns: A plain-text outline, one heading per line, indented by level.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return format (plain-text outline indented by level) and notes pages with thin outlines. Lacks details on side effects or auth requirements, but overall informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, well-structured description: purpose, usage, then arguments. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, and return format adequately. Could mention if full page is read, but sufficient for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Explains 'url' as 'The full URL to outline' and 'user_id' as optional with same semantics as fetch_snippet. Adds meaning but user_id relies on external reference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches a webpage and returns its heading outline, like a table of contents. It distinguishes from sibling tools like 'summarize' and 'extract'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (to see page organization before reading) and when not to (thin outlines, then prefer 'summarize' or 'extract').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_urlsA

Fetch a webpage and return the links on it as a list of {text, url} pairs, where text is the link's visible label and url is the absolute target.

Use this when you need to navigate from a page: to find which link to follow next, or to see what a page links out to. The list is deduplicated and the URLs are made absolute, so you can pass any of them straight to another tool.

Args: url: The full URL to read links from. user_id: Optional, same semantics as for fetch_snippet.

Returns: A JSON array of {"text": ..., "url": ...} objects.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that URLs are made absolute and deduplicated, which is key behavioral detail. It does not mention rate limits or auth, but as a read operation these are less critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: purpose first, then usage guidance, then args, then returns. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple parameters and presence of an output schema, the description is reasonably complete. It explains the return format, but could mention edge cases like empty link lists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fill the gap. It explains 'url' as 'The full URL to read links from' and 'user_id' as optional with reference to another tool. This provides meaningful context beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Fetch a webpage and return the links'), specifies the output format ('list of {text, url} pairs'), and distinguishes its use from siblings like fetch_snippet by focusing on navigation and link discovery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: 'when you need to navigate from a page... to find which link to follow next, or to see what a page links out to.' It does not explicitly mention alternatives or when not to use, but the context is clear enough for the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_tabA

Open a webpage in a persistent browser tab and return a tab_id handle.

Use this ONLY when you need to interact with the page (click a link or button, type into a field, submit a form). For plain reading, prefer the URL-first tools (fetch_snippet, summarize, extract, fetch_urls, fetch_structure), which do not need a tab handle.

The tab stays open across calls so you can act on it. After opening, call read_tab(tab_id) to see the page and its interactive element refs. Close the tab with close_tab(tab_id) when you are finished.

Args: url: The full URL to open (must include http:// or https://).

Returns: JSON with the tab_id, the settled url, and the element ref count.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Details behavioral traits: tab persists across calls, need to read_tab to see content, close_tab when finished. Also describes return value (tab_id, settled url, element ref count). No contradictions with missing annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured: opens with purpose, follows with usage guidance, then parameter description, then return value. Every sentence adds value; no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully addresses the tool's purpose, usage context, parameter constraint, behavioral lifecycle, and return value. Given the simplicity (1 param, output schema exists), the description is complete and leaves no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds essential constraint beyond the schema ('must include http:// or https://'). With 0% schema coverage, the description fully compensates by explaining the parameter's meaning and requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('Open a webpage in a persistent browser tab and return a tab_id handle') and distinguishes from sibling tools by specifying when to use (for interaction) versus when to prefer other tools (plain reading).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use (interact with the page) and when not to (plain reading), listing specific alternative tools (fetch_snippet, summarize, etc.) and the required next steps (read_tab, close_tab).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

press_keyA

Press a single key in an open tab (e.g. "Enter" to submit a focused form, "Tab" to move between fields, "Escape" to dismiss a dialog).

Args: tab_id: The handle from open_tab. key: The key name, e.g. "Enter".

Returns: JSON with the resulting url and fresh ref count.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
keyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description only reveals it returns JSON with url and ref count. Does not disclose potential side effects like navigation or waiting behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise with clear Args and Returns sections. Every sentence adds value, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, arguments, return for a simple key press tool. Could mention if key is case-sensitive or list valid keys, but adequate for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given 0% schema coverage, description adds meaning: explains tab_id as handle from open_tab and key with example 'Enter'. Could list more key names or format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it presses a single key in an open tab with examples like 'Enter', 'Tab', 'Escape'. Distinct from sibling tools like 'click' and 'type_into'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases: submit form, move between fields, dismiss dialog. Lacks explicit 'when not to use' or alternatives, but context from siblings implies type_into for multiple characters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_tabA

Read the CURRENT state of an open tab (one you opened with open_tab).

Always read_tab right before an action, because the element refs you need (the [eN] markers) come from the latest snapshot and are renumbered after every action and navigation. A ref from an earlier read is stale.

Args: tab_id: The handle returned by open_tab. mode: What to return: "snippet" - the head of the page snapshot, including the [eN] refs on interactive elements (the default; use this to find the ref you want to click or type into). "urls" - the page's links as {text, url} pairs. "structure" - the page's heading outline.

Returns: The requested view of the current tab.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
modeNosnippet

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the key behavior that refs are renumbered after actions, making earlier reads stale. No annotations provided, so the description carries the full burden; it adequately covers the read-only nature and output variations, though it does not detail error cases or performance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by essential guidance in a well-structured Args list. Every sentence is necessary and no fluff. Extremely concise for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple modes, staleness concern), the description covers why to read before actions, what each mode returns, and the source of tab_id. An output schema is available, so the brief return statement suffices.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds significant meaning beyond the bare schema: tab_id is 'The handle returned by open_tab,' and mode explains all three options ('snippet', 'urls', 'structure') with their purposes. Schema coverage is 0%, so the description compensates effectively, though it could note that mode has a default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the current state of an open tab, using specific verbs and resource identification. It distinguishes itself from sibling tools by emphasizing that element refs ([eN]) come from the latest snapshot and are renumbered after actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance to read_tab right before an action because refs become stale, and explains the three modes ('snippet', 'urls', 'structure') with their intended use cases. This differentiates from alternative tools like fetch_snippet or fetch_urls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_optionA

Choose an option in a dropdown (a native / combobox) in an open tab, by the dropdown's ref and the option's label or value.

This is ONLY for dropdowns. For radio buttons, checkboxes, links and ordinary buttons, use click instead. A radio "Large" or a checkbox "Onion" is clicked, not selected.

Args: tab_id: The handle from open_tab. ref: The ref of the dropdown element (the combobox/select), from the latest read_tab. Note: if the dropdown has no [eN] ref in the snapshot, it cannot be selected. value: The option to choose, by its visible label or value (e.g. "Belgium (nl)").

Returns: JSON with the resulting url and fresh ref count.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
valueYes
refNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It explains that the tool selects by ref and label/value, notes that a dropdown without a ref cannot be selected, and describes the return value. It does not mention any destructive behavior, which is appropriate for a selection tool. Minor omission: no mention of whether the selection triggers navigation or state changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a clear one-sentence purpose, a usage warning, and an Args section with parameter explanations. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 3-parameter tool with an output schema (indicated), the description covers the key constraints (ref must exist in snapshot) and the return format (url and ref count). It is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description fully explains each parameter: tab_id (from open_tab), ref (from latest read_tab, must have [eN] ref), value (by visible label or value). This adds essential meaning beyond the schema's property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Choose an option in a dropdown (a native <select> / combobox)'. It uses a specific verb ('choose') and resource ('option in a dropdown'), and distinguishes from sibling tool 'click' by explicitly stating it is ONLY for <select> dropdowns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-not-to-use guidance: 'This is ONLY for <select> dropdowns. For radio buttons, checkboxes, links and ordinary buttons, use click instead.' This clearly contrasts with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarizeA

Fetch a webpage and return a concise summary of it. The MCP server fetches the page, and if it is large, splits it into overlapping chunks and combines per-chunk work into one summary (the strategy, map-reduce or refine, is set in config), so the whole page is summarized rather than a truncated slice.

Use this tool when the user wants a free-form summary of a page, or an answer to an open question about a long page, rather than a fixed set of named fields (use extract for named fields).

Args: url: The full URL to summarize. question: Optional. If set, the summary is focused on answering this question rather than being a general overview. user_id: Optional, same semantics as for fetch.

Returns: A plain-text summary of the page.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
questionNo
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses the fetch-and-summarize behavior, chunking for large pages, configurable strategy, and return type. It does not mention error handling or rate limits, but for a read-only tool this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise single paragraph of 6 sentences. Front-loaded with main purpose, followed by details and parameters. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers main behavior (fetch, chunk, summarize, config strategy) and return type. Output schema exists but is not shown; description simply says 'plain-text summary'. Could mention error handling, but sufficient for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning the schema has no descriptions. The description compensates by defining each parameter: url (mandatory), question (optional, focusing summary), user_id (optional, same as fetch). This adds crucial semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch a webpage and return a concise summary of it.' It distinguishes from sibling 'extract' by contrasting free-form summary vs. named fields, and explains the chunking/combining strategy for large pages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs: 'Use this tool when the user wants a free-form summary of a page, or an answer to an open question about a long page, rather than a fixed set of named fields (use extract for named fields).' This provides clear when-to-use and alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_tabA

Summarize the CURRENT page in an open tab, using the same whole-page chunk-and-combine summarizer as summarize, but reading the live tab instead of opening a URL. Use this after you have navigated or interacted your way to a page and want a full summary of it (read_tab only returns the head of the page; this reads all of it without truncation).

Args: tab_id: The handle from open_tab. question: Optional focus question, same meaning as in summarize.

Returns: A plain-text summary of the whole current page.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
questionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It explains the tool reads the entire page without truncation, uses a chunk-and-combine summarizer, and returns plain text. It does not mention rate limits or prerequisites like tab loading, but is otherwise transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the main purpose, and logically structured with usage context, arguments, and return value. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low parameter count and presence of an output schema, the description adequately covers purpose, usage, and return format. It could mention edge cases (e.g., tab not fully loaded) but is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by explaining `tab_id` as 'the handle from open_tab' and `question` as an optional focus. This adds significant meaning beyond the raw schema, though it could detail valid values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool summarizes the current page in an open tab, and explicitly distinguishes it from sibling `summarize` (URL-based) and `read_tab` (head-only). It uses specific verb+resource and differentiates from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using this tool after navigation/interaction for a full summary, notes that `read_tab` truncates, and references sibling `summarize`. It provides clear when-to-use context but does not explicitly list all exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

type_intoA

Type text into a form field in an open tab, by its ref.

Args: tab_id: The handle from open_tab. ref: The field's element ref, e.g. "e7", from the latest read_tab. text: The text to type. submit: If true, press Enter after typing, which submits most search boxes and simple forms in one step. If the form needs a button instead, leave this false and click the submit button's ref.

Returns: JSON with the resulting url and fresh ref count.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idYes
textYes
refNo
submitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that typing is done into an open tab, uses ref from read_tab, and explains the submit behavior. It does not mention potential side effects or rate limits, but the core behavior is well described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear summary, followed by Args and Returns sections. Each sentence serves a purpose, and the structure is front-loaded with the main action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main use case and return value (url and ref count). It implies prerequisites like an open tab and existing ref, but doesn't explicitly list error conditions. Given the output schema exists, this is largely adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters are explained in the Args section: tab_id, ref (with example 'e7'), text, and submit (with behavior details). This adds significant meaning beyond the schema titles, compensating for 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Type text into a form field in an open tab, by its ref,' providing a specific verb and resource. This distinguishes it from sibling tools like click and press_key, which have different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use the submit parameter (true for search boxes/simple forms, false when a button click is needed). It also implies when not to use submit by suggesting clicking the submit button's ref instead.

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. Dates show when Glama detected each change.

  1. 15 tool updatesv0.1.0
    • First observedclick
    • First observedclose_all_tabs
    • First observedclose_tab
    • First observedextract
    • First observedextract_tab
    • First observedfetch_snippet
    • First observedfetch_structure
    • First observedfetch_urls
    • First observedopen_tab
    • First observedpress_key
    • First observedread_tab
    • First observedselect_option
    • First observedsummarize
    • First observedsummarize_tab
    • First observedtype_into

TDQS

A4.5/5.0
Disambiguation5/5

Each tool has a distinct purpose: interactions (click, type_into, press_key, select_option), tab management (open, close, read), and content retrieval (fetch_snippet, summarize, extract, fetch_urls, fetch_structure, plus tab variants). No ambiguity between tools.

Naming Consistency5/5

Names follow a predictable verb_noun pattern (e.g., open_tab, close_tab, read_tab, fetch_snippet, summarize_tab). Single-word verbs like click and extract are acceptable as they are common actions. The convention is consistent throughout.

Tool Count5/5

15 tools cover the full scope of browser automation: tab lifecycle, element interaction, multiple reading methods (snippet, summary, extract, structure, links). The count is well-balanced, not excessive or sparse.

Completeness4/5

Covers core browsing operations thoroughly: open/close tabs, interact with elements, read pages in various ways, extract structured data. Missing explicit navigation history or tab listing, but these can be managed externally. Minor gap, overall solid.

Maintenance

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to control a browser with 30 tools for navigation, interaction, extraction, and tab management, supporting human-like browser automation.
    13
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a persistent browser profile for AI agents, enabling them to log in once and maintain sessions across restarts. Supports 20 tools for browsing, navigation, text extraction, and screenshot.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jfjensen/local-LLM-agent-mcp-interaction'

If you have feedback or need assistance with the MCP directory API, please join our Discord server