Skip to main content
Glama

ToolSnap MCP

One connection, superpowers for your agent: deterministic microtools. Pay per call with USDC on Base — no account needed — or buy fiat credits with a card if you'd rather not touch crypto.

toolsnap-mcp MCP server MCP x402 Base Cloudflare Workers LightNow capabilities Listed on mcpservers.org

Live endpoint: https://mcp.toolsnap.app/mcp
Server card: /.well-known/mcp.json
Pricing: /.well-known/pricing.json
Docs: mcp.toolsnap.app/docs


Why

ToolSnap is built around three ideas:

1. Deterministic — no LLM in the loop. Most agent stacks now "clean" web pages by paying a second model to summarize them. ToolSnap's extraction is pure parsing: exact quotes, stable output, zero added inference cost, reproducible runs. What you extract is what the page said.

2. Context-efficient by design. The biggest cost for AI agents isn't generation — it's context. Loading a raw webpage can burn 50,000+ tokens on HTML boilerplate; connecting a fat MCP server can burn as many in tool definitions. ToolSnap moves the work server-side and keeps discovery compact: tools/list shows a small curated core, and the full catalog of 47 microtools (web, PDFs, CSV/JSON, sitemaps, RSS, images, media generation…) sits one free tool_catalog() call away, executed via use_tool.

Benchmark (11 real pages, June 2026):

Raw HTML

Extracted

Saving

Median tokens

53,820

2,001

98.1%

Cost @ Sonnet ($3/M)

$0.162

$0.006

$0.156/call

Break-even page size

—

—

26 KB

fetch_extract is free — this saving costs nothing.

3. No account required (crypto path). Free tools work the second you connect. Paid tools settle per call with USDC on Base via x402 — an agent with a wallet can pay cold: no signup, no subscription, no key management. Rather not touch crypto? Buy fiat credits with a card and get an API key instead — same discounted per-call price, no wallet needed.


Related MCP server: Local SEO Data

Connect

Any agent, one line

Hand your agent this prompt and it can do the rest on its own:

Set up https://mcp.toolsnap.app/SKILL.md — connect the MCP server it describes and save the skill for future sessions.

SKILL.md is a self-contained skill file (connect config, tool discovery, cost guardrails), generated live from the tool registry so it is never stale.

Claude Desktop

{
  "mcpServers": {
    "toolsnap": {
      "url": "https://mcp.toolsnap.app/mcp",
      "transport": "streamable-http"
    }
  }
}

Free tools work immediately with the URL connection above. Paid tools need an x402 payment client — a wallet alone is not enough, because most MCP clients can't satisfy a 402 Payment Required on their own. Use the pay-proxy below (re-download it if your copy predates the 2026-10 spec-shaped 402, see Payment).

Claude Code

claude mcp add --transport http toolsnap https://mcp.toolsnap.app/mcp

Or install the Claude Code plugin (MCP connection + the toolsnap skill, bundled):

/plugin marketplace add ToolSnap-app/toolsnap-claude-plugin
/plugin install toolsnap

Paid tools — connect through the pay-proxy

scripts/pay-proxy.mjs is a local stdio MCP server that wraps the remote endpoint, reads your wallet, and signs + retries automatically when the server asks for payment. The private key never leaves your host; only signatures are sent.

{
  "mcpServers": {
    "toolsnap": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/to/toolsnap-mcp/scripts/pay-proxy.mjs"]
    }
  }
}

No wallet yet? Call the wallet_setup tool — it generates a wallet you control, helps your human fund it with USDC on Base, and wires this proxy. Key resolution order: TOOLSNAP_WALLET_KEY → ~/.toolsnap/wallet.key → macOS Keychain (toolsnap-agent-wallet/default).

Useful env: TOOLSNAP_MAX_PRICE_USDC (per-call spend cap, default 0.10), TOOLSNAP_PREPAID=1 + TOOLSNAP_AUTO_DEPOSIT_USDC (use the cheaper prepaid balance).

Paid tools — no wallet, pay with a card

Buy credits at mcp.toolsnap.app/checkout (handled by Polar, our Merchant of Record). You'll get an API key in a one-time pop-up — connect with it directly, no proxy needed:

{
  "mcpServers": {
    "toolsnap": {
      "url": "https://mcp.toolsnap.app/mcp",
      "headers": { "Authorization": "Bearer sk_live_..." }
    }
  }
}

Clients that can't send custom headers (some claude.ai connectors) can embed the key in the URL instead: https://mcp.toolsnap.app/mcp/sk_live_... (the key may then appear in that client's request logs — prefer the header when your client supports it).

Direct MCP call

curl -X POST https://mcp.toolsnap.app/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tools

47 tools total. tools/list shows a curated core of 17; discover everything else with the free tool_catalog tool and run it with use_tool(name, args).

Paid (x402)

Tool

Description

Price

screenshot_url

Capture a page → public image URL.

$0.04 USDC

fetch_rendered

Render a JS page (SPA) in a headless browser → clean text.

$0.04 USDC

keyword_research

Google Ads volume/CPC/competition via DataForSEO.

$0.04 USDC

remove_background

Remove an image's background → transparent PNG URL.

$0.03 USDC

image_generate

Text-to-image via fal.ai FLUX.

from $0.02 USDC

image_upscale

2x/4x super-resolution via fal.ai ESRGAN.

from $0.02 USDC

audio_transcribe

Speech-to-text via fal.ai Wizper.

from $0.02 USDC

text_to_speech

Text-to-speech via fal.ai Kokoro.

from $0.02 USDC

video_generate

Async text/image-to-video via fal.ai.

from $0.08 USDC

csv_query_xl / json_query_xl

Query URL-hosted CSV (5–100 MB) / JSON (5–25 MB).

$0.02 USDC

No first-call-free: these tools have real per-call cost, so every call settles from the start. Media tools are priced per call from your own args (the table shows the floor). Pay-per-call is USDC on Base using x402 v2 (EIP-3009 transferWithAuthorization); prepaid (deposit once, debit off-chain, crypto or card) is cheaper per call.

Free (always)

Flagship: fetch_extract (URL → clean text, median 98.1% fewer tokens than raw HTML) and fetch_html (URL → clean structured HTML). Plus a wide utility catalog:

Tool

Description

pricing

Machine-readable pricing menu. Call this first.

tool_catalog

Discover the full tool catalog (families → detail).

use_tool

Execute any tool not in your tools/list.

memory_snippet

Get the ToolSnap habit block for your harness's persistent memory.

task_recipes

Ready-to-run multi-tool workflows for whole tasks.

uuid_generate

1–100 random UUID v4 values

hash_text

SHA-256 / SHA-1 / SHA-512 (hex)

base64_encode / base64_decode

Base64 encode/decode

url_encode / url_decode

Percent-encode/decode

json_format

Parse + pretty-print or minify JSON

timestamp_convert

Unix ↔ ISO 8601 (auto-detects direction)

text_stats

Chars, words, lines, sentences

Call tool_catalog() for the complete, current list with schemas and prices.


Payment (x402)

When an agent calls a paid tool (e.g. screenshot_url) without payment, the server returns a tool result in the x402 v2 MCP transport shape: isError: true, the payment requirements in structuredContent, and the same object JSON-encoded in content[0].text (a second text block carries the next steps):

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "x402Version": 2,
      "error": "Payment required to use this tool",
      "resource": { "url": "https://mcp.toolsnap.app/mcp#screenshot_url", "serviceName": "ToolSnap" },
      "accepts": [{
        "scheme": "exact",
        "network": "eip155:8453",
        "amount": "40000",
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "payTo": "0x…",
        "maxTimeoutSeconds": 300
      }],
      "extensions": { "bazaar": { "info": { "input": { "type": "mcp" } } } }
    },
    "content": [{ "type": "text", "text": "<the same JSON>" }, { "type": "text", "text": "Payment required: …" }]
  }
}

Until 2026-10 this was a JSON-RPC error (error.code: 402, error.data). If you downloaded scripts/pay-proxy.mjs before then, download it again: older copies only recognise the old shape and will not pay on their own. (The prepaid-deposit challenge, account_deposit, still answers with the JSON-RPC 402 error.)

An x402-enabled client reads accepts[0], signs an EIP-3009 TransferWithAuthorization, and retries with _meta["x402/payment"] set. See x402 spec.


Run locally

npm install
cp .dev.vars.example .dev.vars  # fill in wallet secrets
npm run dev
# Worker at http://localhost:8787

Type-check

npm run typecheck

Deploy

npm run deploy

Production deploys come from .github/workflows/deploy.yml (push to main).

Alerta de despliegues inesperados

Vigila que nadie publique toolsnap-mcp ni toolsnap-portal fuera del workflow (acción A14 del plan de seguridad). Corre en el cron de 5 minutos que ya existe (src/alerts/deploy-watch.ts): lee los últimos deployments de cada Worker por la API de Cloudflare con un token de solo lectura y, si hay uno nuevo que no está registrado como esperado, avisa por Telegram (el canal de las demás alertas) con Worker, deployment, versión, fecha, author_email, origen y mensaje. La primera pasada sin estado solo guarda el último deployment. Un rollback avisa siempre, esté o no registrado.

Lo esperado vive en el KV X402_NONCES: esperado:{worker}:dep:{deploymentId} (caduca a los 90 días) y ultimo-visto:{worker}. Se registra el deployment y no la versión a propósito: un wrangler rollback crea un deployment nuevo con una versión ya conocida. El workflow registra el suyo tras wrangler deploy. Cualquier otra cosa avisa, también un wrangler secret put (crea una versión nueva): si lo has hecho tú, regístralo. Si el aviso no consigue salir por Telegram se reintenta cada pasada y, pasada 1 hora, el cron falla y lo ve /analytics (tarea deploy-watch).

Deploy manual desde el Mac (o tras un wrangler secret put):

CLOUDFLARE_API_TOKEN=... scripts/registrar-deploy.sh toolsnap-mcp

Hazlo en los tres minutos siguientes al deploy: es el margen de cortesía antes de que la alerta salga. toolsnap-portal se despliega desde otro repositorio: su workflow tiene que llamar a este mismo script con toolsnap-portal.

Qué hay que poner (una sola vez):

npx wrangler secret put VIGIA_CF_TOKEN
# TELEGRAM_BOT_TOKEN y TELEGRAM_CHAT_ID ya existen (alertas de error); no hay que tocarlos.
  • VIGIA_CF_TOKEN: token de solo lectura en la cuenta ToolSnap con el permiso Workers Metadata Read-Only (la documentación de la API lo acepta para GET .../deployments; no es el de «Workers Scripts Read», que además permite descargar el código de todos los Workers). Sin el secret, la vigilancia no hace nada.

  • El token CLOUDFLARE_API_TOKEN del environment production de GitHub necesita además Workers KV Storage: Edit (cuenta ToolSnap) para el paso «Register deployment as expected» (y para scripts/registrar-deploy.sh); sin él, cada deploy dará una alerta. Pon el secret y el permiso antes de fusionar.

  • VIGIA_WORKERS incluye también toolsnap-x-personal (Worker de los tokens personales de X, A16), cuyo job deploy-x-personal registra su deployment con el token CLOUDFLARE_API_TOKEN_X_PERSONAL. Ese token (Editor solo de ese Worker) necesita además Workers KV Storage: Edit (cuenta ToolSnap) para escribir en X402_NONCES. Dáselo antes de fusionar, como se hizo con el token principal: hasta entonces el paso «Register deployment as expected» de ese job falla sin cortar el deploy (continue-on-error) y cada merge a main hace saltar una alerta de la vigilancia por toolsnap-x-personal. Con el permiso de KV el token puede escribir en el mismo KV que usa el vigilante: es el coste de vigilar ese Worker con la misma lista de esperados.

Límite estructural. El vigilante corre dentro de toolsnap-mcp, que es uno de los vigilados, y el repositorio es público: quien pueda desplegar toolsnap-mcp puede quitar la llamada, escribir ultimo-visto y esperado:* en el KV y leer VIGIA_CF_TOKEN. Cubre un deploy descuidado del socio y cualquier deploy de toolsnap-portal; no cubre a un adversario con permiso de deploy sobre toolsnap-mcp. Para eso haría falta vigilar desde fuera (un schedule de GitHub Actions o un Worker aparte con su propio KV y token).


Stack

  • Runtime: Cloudflare Workers (edge, 0 ms cold start)

  • Protocol: MCP streamable-http (JSON-RPC 2.0)

  • Payment: x402 v2 · EIP-3009 on Base mainnet · USDC

  • Verification: off-chain EIP-712 signature recovery (viem)

  • Settlement: on-chain transferWithAuthorization via relayer wallet

  • Anti-replay: Cloudflare KV nonce store (7-day TTL)

  • First-call-free: mechanism exists in code (KV key first_free:{address}) for future flat-rate tools; all current paid tools have real COGS and are excluded, so every call settles


Contributing

PRs welcome for new free tools in src/tools/. Follow the pattern in src/tools/text-stats.ts and add the tool to src/tools/index.ts.

For paid tools or changes to the x402 payment logic, open an issue first.

Do not commit wallet private keys, .dev.vars, or any secrets.


toolsnap-mcp MCP server


License

MIT

Available Tools

17 tools
csv_queryQuery CSVA
Read-only
Inspect

Free, read-only. Query a comma-separated CSV with a header row, from a URL (max 5 MB, streamed) or inline text, one of the two: select columns, filter rows, sort, limit. Returns {meta:{returned_rows,columns,total_rows,truncated},rows:[{column:value}]}, all values strings, or CSV text with format='csv'. One filter condition, no joins or aggregates. Unknown select columns and bad filters error with the valid names or operators. Over 5 MB: csv_query_xl (paid, 100 MB).

NameRequiredDescriptionDefault
csvNoInline CSV text. Not with url.
urlNoCSV URL, max 5 MB. Not with csv.
limitNoRows to return. Default 500, max 5000; over it meta.truncated=true.
filterNo'column op value'. Ops: = != contains startswith endswith (text, case-insensitive), > >= < <= (numeric). E.g. 'age >= 30'.
formatNojson (default): {meta,rows}. csv: text with header row.
selectNoColumns to keep, comma-separated, exact header names. Omit for all.
headersNoHeaders to forward (Authorization, Cookie…).
sort_byNoColumn to sort by; numeric when values parse as numbers, else text.
sort_dirNoasc (default) or desc.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description goes well beyond by disclosing the 5 MB streamed cap, the default/max limit and the truncation flag, that all values are returned as strings, and that unknown select columns or bad filters produce errors listing valid names/operators. It also describes the return payload shape even though no output schema exists. It stops short of stating pagination or auth behavior for the forwarded headers, so not a full 5.

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 safety/size framing, then source modes, then capabilities, then return shape, then constraints, then the escape hatch to the paid sibling. Dense but every clause carries distinct information; no filler.

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?

With nine optional parameters, no output schema, and a nested headers object, the description still covers source modes, limits, error behavior, return structure and the upgrade path. Nothing an agent needs to invoke it correctly is missing.

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?

Schema coverage is 100%, so every parameter already carries its own description including the filter operator list and enum values. The description largely restates these (mutual exclusivity of csv/url, limit behavior, filter restrictions) rather than adding syntax or edge-case guidance the schema lacks. Baseline 3 is appropriate.

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?

States a specific verb (query) and resource (CSV with a header row) plus the exact operations available: select, filter, sort, limit. It also distinguishes itself from the paid sibling csv_query_xl and implicitly from json_query by naming the CSV format constraint.

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?

Gives explicit source exclusivity ("one of the two": url or inline csv), explicit scope limits (one filter condition, no joins or aggregates), and a named alternative with its trigger condition and trade-off (over 5 MB → csv_query_xl, paid, 100 MB). The agent knows both when to use this and when to switch.

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

fetch_extractFetch page as clean textA
Read-only
Inspect

Free, read-only. Fetch a public http(s) URL and return its body as plain text: script, style, nav, header, footer and aside removed, tags stripped, entities decoded, whitespace collapsed. Median 98% fewer tokens than raw HTML. Follows up to 5 redirects, 10 s timeout; private and local hosts are rejected and non-2xx responses error with the HTTP status. Text past maxChars is cut and ends with '[Truncated at N chars]': raise maxChars (max 32000) or use fetch_html for everything. Runs no JavaScript: a client-side-rendered SPA or a bot/login wall yields almost no text, so the call errors instead of returning an empty shell and names the fix (fetch_rendered, paid, runs a browser; screenshot_url; or headers for auth). For title/OG/JSON-LD only use fetch_metadata; for Markdown with links use html_to_markdown.

NameRequiredDescriptionDefault
urlYesPublic http:// or https:// URL. Local and private hosts are rejected.
headersNoHeaders to forward for pages behind login: Authorization, Cookie, X-API-Key only. Dropped if a redirect leaves the original host.
maxCharsNoCharacters of text to return. Default 8000, max 32000 (higher values are clamped). Truncated output ends with a '[Truncated at N chars]' marker.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses extensive behavior beyond the readOnlyHint annotation: redirect limits, timeout, private-host rejection, non-2xx error behavior, truncation, absence of JavaScript execution, and the failure mode for SPAs or bot walls. It also explains the fix path for those failures, which is unusually helpful for an agent.

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 dense but well structured and front-loaded: purpose first, then processing behavior, limits, failure modes, and alternatives. Every sentence carries actionable information, and the length is justified by the tool's complexity.

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?

With no output schema and only a readOnlyHint annotation, the description carries the full burden and does so thoroughly. It explains the return format, truncation marker, error behavior, and the key limitations an agent must know before invoking the 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?

Schema description coverage is 100%, so all three parameters are already documented in the input schema. The description reinforces the maxChars truncation behavior and mentions headers for authentication, but it does not add much parameter semantics beyond what the schema already states.

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?

States a specific verb and resource: fetch a public HTTP(S) URL and return its body as plain text. It also carefully distinguishes the output from siblings by naming fetch_html, fetch_metadata, html_to_markdown, and fetch_rendered with their respective use cases.

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 covers when to use this tool, when not to use it, and which alternatives to choose. It names the conditions that select fetch_html, fetch_metadata, html_to_markdown, fetch_rendered, screenshot_url, and authenticated headers.

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

fetch_htmlFetch raw HTMLA
Read-only
Inspect

Free, read-only. Fetch a page and return its HTML minus scripts, styles, svg, iframes, comments and inline handlers; tags and attributes stay, so structure is readable. For inspecting or rebuilding markup, not plain text (fetch_extract gives that). Runs no JavaScript: SPAs return an empty shell. Cut at maxChars with a marker.

NameRequiredDescriptionDefault
urlYeshttp(s) page URL. Private addresses are refused.
headersNoHeaders to forward (Authorization, Cookie…).
maxCharsNoOutput cap, chars. Default 16000, max 64000.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only cover readOnlyHint; the description carries the real behavioral burden: sanitization of scripts/styles/handlers, absence of JS execution with the SPA consequence, and truncation behavior at maxChars with a marker. These are non-obvious traits an agent needs before calling.

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?

Four dense sentences, each loading information: safety/scope first, then the fetch_extract contrast, then the JS limitation, then truncation. No filler or restatement of the title.

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?

No output schema exists, yet the description characterizes the return value precisely (tag/attribute-preserving HTML with listed elements stripped, truncated with a marker). For a 3-parameter tool with a nested headers object, nothing an agent needs to call it correctly is missing.

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 coverage is 100%, so the baseline is 3. The description adds beyond the schema by noting that maxChars produces a cut with a visible marker, which tells the agent how truncation manifests in output rather than just that a cap exists.

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?

Specific verb+resource ('fetch a page and return its HTML') plus an explicit statement of what is removed (scripts, styles, svg, iframes, comments, inline handlers) and what is preserved. It also names the sibling it is not (fetch_extract) so an agent can discriminate without opening a schema.

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 routes the agent: 'For inspecting or rebuilding markup, not plain text (fetch_extract gives that).' It also gives a negative condition — no JavaScript, so SPAs return an empty shell — which tells the agent when not to use it.

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

fetch_metadataFetch page metadataA
Read-only
Inspect

Free, read-only. Fetch a public http(s) URL and return its metadata as JSON: url (after redirects), title, description, canonical, robots, author, keywords, lang, charset, og{} and twitter{} (prefix stripped), httpEquiv{}, jsonLd[] (parsed blocks, malformed ones skipped). Absent fields are null or {}. Reads only the first 512 KB, follows up to 5 redirects, 10 s timeout; private and local hosts are rejected and non-2xx responses error with the HTTP status. Runs no JavaScript, so tags injected client-side are not seen. Not for body text: use fetch_extract (plain text) or fetch_html (raw HTML).

NameRequiredDescriptionDefault
urlYesPublic http:// or https:// URL. Local and private hosts are rejected.
headersNoHeaders to forward for pages behind login: Authorization, Cookie, X-API-Key only. Dropped if a redirect leaves the original host.

TDQS

A4.7/5.0
Behavior5/5

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

Even though readOnlyHint is already set, the description adds substantial operational detail: 512 KB read cap, 5-redirect limit, 10 s timeout, private/local host rejection, non-2xx error behavior, and no JavaScript execution.

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-loads the core purpose, then packs output shape, limits, security behavior, and alternatives into a dense but waste-free paragraph.

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?

No output schema is present, yet the description fully specifies the JSON return shape, null/{} handling for missing fields, malformed jsonLd behavior, and error conditions, leaving nothing essential unexplained.

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?

Schema description coverage is 100%, so both url and headers are already documented. The description reinforces the public/private URL rule but adds almost nothing about the headers parameter, so baseline 3 is appropriate.

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?

States a specific verb and resource — fetching a public URL's <head> metadata — and enumerates the returned fields, which clearly distinguishes it from fetch_extract and fetch_html.

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 excludes body-text use and names the two alternatives, fetch_extract for plain text and fetch_html for raw HTML, so the routing decision is unambiguous.

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

html_to_markdownConvert HTML to MarkdownA
Read-only
Inspect

Free, read-only. Convert a fetched URL or an HTML string you pass (one of the two) to Markdown: headings, links, lists, emphasis, code, quotes. Drops nav, header, footer, aside, script and style. Returns text, cut at maxChars with a marker. Runs no JavaScript: SPAs return an empty shell. Tables become plain text.

NameRequiredDescriptionDefault
urlNoPage URL to fetch. Not with html.
htmlNoHTML text to convert. Not with url.
headersNoHeaders to forward (Authorization, Cookie…).
maxCharsNoOutput cap, chars. Default 12000, max 50000.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint; the description adds substantial behavior beyond that: which elements are discarded, truncation at maxChars with a visible marker, no JavaScript execution so SPAs return an empty shell, and table flattening. These are exactly the failure modes and output-shape facts an agent needs before calling.

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?

Three dense sentences with zero throat-clearing. Safety and mutuality constraints are front-loaded, then output scope, then limitations – a sensible order for an agent scanning before invocation.

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 read-only converter with no output schema, the description supplies the return type ('text'), the truncation behavior, and the JS limitation that determines whether the tool is even viable for a given page. The empty-shell warning on SPAs is the kind of edge case that otherwise causes silent bad results.

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 coverage is 100%, so baseline is 3. The description adds two things beyond the schema: it reiterates the url/html mutual exclusivity as a top-level constraint, and it reveals that maxChars truncation is signaled by an inserted marker, which the schema does not say. It says nothing extra about headers.

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 opens with a specific verb and resource ('Convert ... to Markdown') and then enumerates the exact conversion scope: headings, links, lists, emphasis, code, quotes. It distinguishes itself from the sibling fetch tools by framing both a URL-fetch path and a raw-HTML path, and from fetch_extract by naming what gets stripped.

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?

It gives clear context for when this applies: post-processing a fetched page or converting a string you already have ('one of the two'). It cues the workflow with 'a fetched URL' and the stripped-element list, but never names fetch_html explicitly as the upstream sibling or states when to prefer it over fetch_extract.

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

json_queryQuery JSONA
Read-only
Inspect

Free, read-only. JSONPath-lite query on JSON from a URL or an inline string (one of the two). Returns matches as JSON: one match bare, several as an array. Supports $, .key, ['key'], [0], [-1], [*], ..key and [?(@.k op v)]; no slices or jq. Errors on invalid JSON or over 5 MB (json_query_xl: paid, 25 MB).

NameRequiredDescriptionDefault
urlNoJSON URL, max 5 MB. Not with json.
jsonNoInline JSON text. Not with url.
limitNoDefault 100, max 1000. Above it: {results,total,returned}.
queryYesStarts with $: '$.users[*].name', '$..price', '$.items[?(@.price<10)].id'. Filter ops: = != > >= < <= =~. '$' = whole document.
headersNoHeaders to forward (Authorization, Cookie…).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, and the description adds real value beyond that: free tier, an explicit 5 MB cap with the failure mode ('errors on invalid JSON or over 5 MB'), and the non-obvious return shape (one match bare, several as an array). Those are exactly the traits an agent cannot infer from structured fields.

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?

All the critical facts come first — free, read-only, source exclusivity, return shape — in one tight paragraph with no filler. The density borders on cryptic in the syntax list, but nothing is wasted.

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?

There is no output schema, so the description must carry return semantics, and it does partially (match cardinality, error conditions, limit-truncation guidance lives in the schema). A brief note on the error payload shape would close the remaining gap.

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?

Schema description coverage is 100%, so the schema already documents every parameter including the filter operators and the limit envelope. The description's main additions are negative constraints ('no slices or jq') and the 5 MB bound, which are useful but largely restate schema-level facts, so the baseline of 3 is right.

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?

States a specific verb and resource (JSONPath query over JSON from a URL or inline string) and pins the exact syntax subset supported. It also distinguishes itself from the paid sibling json_query_xl, so an agent can place it without opening a schema.

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?

Explicitly notes url and json are mutually exclusive ('one of the two') and names json_query_xl with its 25 MB ceiling as the alternative for larger payloads. It stops short of routing against other siblings (csv_query, fetch_extract), so it is clear but not exhaustive.

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

keyword_researchKeyword researchA
Read-only
Inspect

Google Ads volume/CPC/competition for 1-20 keywords. $0.04 USDC/call. Paid: calling without a payment payload returns a structured 402 with payment options — that response is the documented behavior, not a failure.

NameRequiredDescriptionDefault
keywordsYes1-20 keywords.
language_codeNoISO 639-1.es
location_codeNoDataForSEO location (default Spain).
include_suggestionsNoAdd related suggestions.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, so the description adds substantial context: cost per call, required payment payload, and the structured 402 response. It prevents the agent from misclassifying a normal payment challenge as an error.

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?

Three compact sentences with the purpose, cost, and payment behavior front-loaded. Every sentence carries operational value with no filler.

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?

For a tool with no output schema, the description identifies the returned metrics and explains the payment flow, which is the main complexity. It could say more about response shape, but the key behavioral information is present.

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?

Schema description coverage is 100%, so the schema already explains all four parameters. The description reinforces the 1-20 keyword constraint but adds no extra semantics for language_code, location_code, or include_suggestions.

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 names the specific data source and metrics (Google Ads volume/CPC/competition) and the exact input scope (1-20 keywords). This is more precise than a generic 'keyword research' label and makes the tool's output obvious.

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?

It clearly states the paid nature and that a 402 response without a payment payload is expected behavior, which is critical invocation guidance. It does not explicitly compare against sibling tools, but none of the listed siblings are close alternatives.

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

memory_snippetMemory snippet for agentsA
Read-only
Inspect

Free, read-only. Returns static text: a short note on when ToolSnap tools suit a task, plus how to store a note in your runtime's memory. This tool saves nothing. Use only if your user asks about persistent memory or ToolSnap setup; show them the text and save it only with their approval.

NameRequiredDescriptionDefault
harnessNoYour agent runtime, to tailor the save instruction. Omit for a generic one.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Free, read-only' and 'This tool saves nothing.' It also discloses the human-approval requirement before persisting anything, which annotations cannot express.

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?

Three tight sentences: cost/safety first, then what it returns, then usage guidance. Every clause carries a decision-relevant fact, with nothing padded.

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?

With no output schema, the description correctly summarizes the return value ('static text' with a note and save instructions) and covers the side-effect and approval model. Nothing needed to invoke it correctly is missing.

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?

Schema coverage is 100% and the single 'harness' parameter is fully documented in the schema, including enum values. The description never mentions the harness parameter or why one would omit it, so it adds no meaning beyond the schema. Baseline 3 applies.

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?

States a specific verb and resource: returns static text containing a note on when ToolSnap tools fit and how to save it in the runtime's memory. This is clearly distinguishable from siblings like tool_catalog, use_tool, and task_recipes, which do other things.

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 says when to use it ('only if your user asks about persistent memory or ToolSnap setup') and adds the operating instructions: show the user the text, save only with approval. No inference required.

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

pdf_text_extractExtract PDF textA
Read-only
Inspect

Free, read-only. Extract plain text from a PDF given as a URL (max 20 MB) or inline base64 (max 5 MB), one of the two. Returns text, cut at maxChars with a marker. Text-layer PDFs only: scans return little or nothing (no OCR). Layout and tables are not preserved. Fails if the URL serves HTML, not a PDF.

NameRequiredDescriptionDefault
urlNoDirect link to the .pdf file, not a viewer page. Not with data.
dataNoBase64 PDF, max 5 MB decoded. Not with url.
headersNoHeaders to forward (Authorization, Cookie…).
maxCharsNoOutput cap, chars. Default 20000, max 100000.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint; the description adds the constraints that actually shape a call — 20 MB URL / 5 MB base64 caps, mutual exclusivity of the two inputs, truncation at maxChars with a marker, no OCR, no layout/table preservation, and the HTML-mislabeled-URL failure mode.

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?

Four short sentences, front-loaded with safety and scope, then inputs, then return behavior, then failure modes. No filler and nothing repeated from the schema.

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?

Covers what the tool returns (text, cut at maxChars with a marker) despite there being no output schema, and documents every behavioral risk of a 4-parameter extraction tool: size ceilings, input exclusivity, missing OCR, and non-preserved layout.

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 coverage is already 100%, so the baseline is 3; the description earns extra by adding size limits per input mode and confirming the url/data either-or that the schema only hints at, plus the truncation behavior tied to maxChars.

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?

States a specific verb and resource — extract plain text from a PDF — plus the two accepted input forms. The 'PDF' scope cleanly separates it from fetch_html, html_to_markdown and fetch_extract even though no sibling is named.

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?

Makes the applicable domain explicit ('Text-layer PDFs only: scans return little or nothing'), which tells the agent when not to call it, and 'Fails if the URL serves HTML, not a PDF' routes HTML content elsewhere. No sibling is named outright, so the routing is inferred rather than stated.

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

pricingPricing and payment optionsA
Read-only
Inspect

Free, read-only, no network, no arguments; calling it charges nothing. Call it before a paid tool to see its exact cost and whether first_call_free applies, or to choose pay-per-call vs prepaid. Returns a JSON menu: endpoint and docs URLs; payment with x402 USDC on Base, minimum deposit, prepaid discount and SpendAuthorization fields; tools[] with name and tier free|paid, plus price_usdc, prepaid_price_usdc, first_call_free and a value note for paid ones. Flat prices are exact; fal.ai media tools show a default-args quote. For what a tool does and its schema use tool_catalog; this one is only about cost.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses that invocation is free ('calling it charges nothing'), that prices can be exact or a default-args quote depending on the tool (fal.ai media), and what payment mechanics exist (x402 USDC on Base, minimum deposit, prepaid discount, SpendAuthorization). These are non-obvious traits an agent needs before relying on the numbers.

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?

Front-loaded with the cost/read-only constraint, then routing guidance, then return shape, then the boundary against tool_catalog — a logical order. The return-value enumeration is dense and long, but it substitutes for the missing output schema, so most of it earns its place.

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?

With no output schema, the description carries the burden of describing return values and does so concretely (menu fields, tools[] with tier, price_usdc, first_call_free, value note). It also notes the precision caveat for quoted prices, so an agent knows how much to trust the numbers.

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?

Zero parameters, so the baseline is 4; the description reinforces this with 'no arguments,' matching the empty schema. Nothing further is needed or claimed.

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?

States a specific resource (pricing/payment options), its cost profile ('Free, read-only, no network, no arguments'), and precisely what it returns (a JSON menu of tiers and prices). It explicitly distinguishes itself from the sibling tool_catalog by scope: 'this one is only about cost.'

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?

Gives explicit when-to-use: 'Call it before a paid tool to see its exact cost and whether first_call_free applies, or to choose pay-per-call vs prepaid.' It also routes the agent away to the correct alternative for a different need: use tool_catalog for descriptions and schemas.

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

remove_backgroundRemove image backgroundAInspect

Remove an image's background, return a transparent PNG URL. $0.03 USDC/call. Paid: calling without a payment payload returns a structured 402 with payment options — that response is the documented behavior, not a failure.

NameRequiredDescriptionDefault
image_urlYesPublic image URL.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=false, which conveys little about a paid, non-mutating compute call. The description adds the price ($0.03 USDC/call) and pre-empts the most likely failure misread: a 402 without a payment payload is documented behavior, not an error. That is exactly the kind of context annotations cannot carry.

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?

Three short sentences, front-loaded with the capability and result, then cost, then the payment caveat. No filler and nothing repeated from the schema or annotations.

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 one-parameter tool with no output schema, the description covers purpose, return value, cost, and the expected 402 path. An agent has everything needed to call it and interpret both success and the unpaid response.

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?

Single required parameter with 100% schema description coverage ('Public image URL'), so the schema does the work. The description adds only that the output is a transparent PNG URL, not anything about the input beyond what the schema states.

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?

States a specific verb and resource ('Remove an image's background') and even the output ('transparent PNG URL'). No sibling tool in the catalog does image manipulation, so the description alone is enough to distinguish it.

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 payment clause effectively tells the agent how to invoke it correctly: without a payment payload you get a 402 rather than a result. There is no explicit when-not guidance or named alternative, but none of the sibling tools overlaps with this capability.

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

rss_parseParse RSS or Atom feedA
Read-only
Inspect

Free, read-only. Fetch an RSS 2.0 or Atom feed and return JSON: feed title, link, description, lastBuildDate, itemCount, truncated, and items[] with title, link, pubDate, guid, description (HTML stripped), author, categories, enclosure. Items past maxItems are dropped and truncated=true. A URL that is not a feed returns type 'unknown' and no items. Not JSON Feed. Errors on non-2xx, 10 s timeout or private hosts.

NameRequiredDescriptionDefault
urlYesFeed URL, http(s). Private hosts refused.
maxItemsNoDefault 20, max 200. itemCount still reports the full total.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint annotation: discloses truncation semantics ('Items past maxItems are dropped and truncated=true'), HTML stripping in descriptions, error conditions (non-2xx, 10 s timeout, private hosts refused), and the non-feed case. Cost ('Free') and safety profile are both stated.

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?

Front-loaded with capability and exclusion, and every clause carries a distinct fact. The telegraphic, fact-stacked style (comma-separated field lists, error list in one sentence) is efficient but dense enough to be slightly harder to scan than a cleanly segmented version.

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?

There is no output schema, and the description fully compensates by enumerating the response envelope and item fields, plus the truncation flag. With only two parameters and full schema coverage, nothing an agent needs to call this correctly is missing.

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 coverage is 100%, so baseline is 3; the description adds meaning by explaining that dropping items past maxItems sets truncated=true while itemCount still reflects the full total, clarifying the interaction between the two parameters. URL constraints (private hosts refused) are also reinforced in prose, though no format examples are given.

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?

States a specific verb+resource ('Fetch an RSS 2.0 or Atom feed and return JSON') and immediately enumerates the returned fields. It explicitly excludes JSON Feed and implicitly differentiates itself from siblings like sitemap_parse and fetch_metadata by naming its format scope.

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?

Clearly positions when the tool applies (RSS 2.0 / Atom URLs) and adds an exclusion ('Not JSON Feed') plus a fallback behavior for non-feed URLs ('returns type unknown and no items'). It does not name an alternative sibling to use for JSON Feed or generic HTML, so it stops short of full routing guidance.

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

screenshot_urlScreenshot a URLAInspect

Screenshot a page → public image URL. $0.04/call. Paid: calling without a payment payload returns a structured 402 with payment options — that response is the documented behavior, not a failure.

NameRequiredDescriptionDefault
urlYesPage URL.
widthNoViewport px.
formatNoDefault png.png
heightNoViewport px.
qualityNoJPEG only, 1-100.
fullPageNotrue = whole page, not viewport.

TDQS

A4/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing per-call cost ($0.04) and explicitly framing the 402 payment-required response as expected behavior rather than an error — a real trap for an agent. It stops short of describing rate limits, timeouts, or what the image URL looks like/expires.

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?

One compact line with the core action front-loaded, followed by cost and the non-failure 402 semantics in priority order. No wasted sentences.

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 the essentials an agent needs for a 6-param, no-output-schema tool: what comes back (a public image URL) and how billing/payment surfaces. Parameter details are fully handled by the schema, leaving only minor gaps like URL lifetime and error conditions other than 402.

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?

Schema coverage is 100%, so width, height, format, quality, and fullPage are already documented with defaults and constraints. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.

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?

"Screenshot a page → public image URL" names a specific verb, resource, and the shape of the output, which cleanly separates it from the fetch_* and conversion siblings. An agent knows exactly what it gets back without opening the schema.

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

Usage Guidelines3/5

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

The description clarifies the paid call model and what a 402 response means, which is genuinely useful usage context. It does not say when to prefer this over fetch_html or other rendering tools, so the alternative-selection guidance is only implied.

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

sitemap_parseParse sitemapA
Read-only
Inspect

Free, read-only. Fetch one XML sitemap and return JSON. A urlset gives urls[] (loc, lastmod, changefreq, priority, plus image/news extensions), urlCount and truncated. A sitemap index gives type 'sitemapindex' and sitemaps[] with the child URLs; children are not fetched, call again per child. Uncompressed XML only, no .gz. Errors on non-2xx, 10 s timeout or private hosts.

NameRequiredDescriptionDefault
urlYessitemap.xml or sitemap index URL, http(s), uncompressed.
maxUrlsNoDefault 100, max 1000; urlCount still reports the full total. Ignored for a sitemap index.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond readOnlyHint=true, it discloses the free/read-only nature, the exact failure modes (non-2xx, 10 s timeout, private hosts), the truncation flag, and that index children are not auto-fetched. That is a genuinely rich behavioral profile for a fetch tool.

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?

Four short sentences, each doing distinct work: purpose, urlset return shape, index return shape, and failure constraints. Scoping and the 'call again per child' caveat are front-loaded where an agent will see them.

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?

With no output schema, the description supplies the return contract for both response variants (urls[], urlCount, truncated, sitemaps[]), plus operational limits. An agent has everything needed to decide, call, and interpret results without further probing.

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?

Schema description coverage is 100%, so url format and maxUrls default/cap/full-count semantics are already documented in structured data. The description adds little parameter-specific information beyond reiterating the uncompressed-URL constraint, so baseline 3 applies.

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?

"Fetch one XML sitemap and return JSON" gives a precise verb, resource, input format and output format. The follow-up sentences distinguish the two sitemap shapes (urlset vs sitemapindex), which an agent could otherwise conflate with the sibling rss_parse or generic fetch tools.

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?

States clear boundaries: uncompressed XML only, no .gz, private hosts and non-2xx fail, and children of an index must be fetched with separate calls. It stops short of naming an alternative tool (e.g. rss_parse or fetch_extract) for non-sitemap feeds, so a sibling comparison is implied rather than explicit.

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

task_recipesTask recipesA
Read-only
Inspect

Free. Multi-tool workflow prompts (clone a site, SEO audit). No args → menu; recipe='' → prompt.

NameRequiredDescriptionDefault
recipeNoRecipe id; omit for menu.

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the main behavioral burden is covered. The description adds useful non-schema context: the tool is free, it returns workflow prompts, and omitting arguments produces a menu rather than an error.

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?

It is three compact fragments, front-loaded with cost and purpose, then invocation behavior. Every part carries useful information with no waste.

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?

For a simple, zero-required-parameter tool with full schema coverage and annotations, the description is nearly complete. It still does not explain what the menu contains or the shape of the returned prompt, but those are modest gaps given the tool's simplicity.

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?

Schema description coverage is 100%, so the sole parameter is already documented. The description restates the omit-for-menu behavior and adds that a recipe id yields a prompt, but it does not add syntax, ID format, or discovery detail beyond the schema.

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

Purpose4/5

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

The description states a specific resource — "Multi-tool workflow prompts" — and gives concrete examples ("clone a site, SEO audit"), so its purpose is clear beyond the title. It is not fully explicit about how it differs from sibling tools such as tool_catalog, but the recipe/prompt framing is distinct enough for selection.

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?

It gives explicit call patterns: "No args → menu" and "recipe='<id>' → prompt." This is clear invocation context, though it does not name alternatives or say when to prefer this over a sibling tool.

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

tool_catalogBrowse tool catalogA
Read-only
Inspect

Free, read-only, no network. Browse all 47 tools in 10 families (web, seo, data, documents, images, media, utils, payments, recipes, meta). No args: families with id, label, one-liner, tool count. family='': each tool with name, price, description, notes, inputSchema. tool='': that entry alone; wins over family. Unknown ids error naming the valid families. Run what you find via use_tool.

NameRequiredDescriptionDefault
toolNoExact tool name, e.g. 'fetch_rendered'. Takes precedence over family.
familyNoFamily id, e.g. 'web', 'data'. Lists its tools with schemas.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, yet the description still adds real context: 'Free', 'no network', the precedence resolution order, and that unknown ids error while naming valid families. It does not, however, discuss whether catalog contents are static or change over time.

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-loads the safety/scope facts, then walks the three call modes in the order an agent would try them. Telegraphic clauses carry high information density with no filler 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?

There is no output schema, and the description compensates by enumerating the returned fields for each of the three modes, plus error behavior and the handoff to use_tool. Nothing needed to call it correctly is missing.

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 coverage is 100%, so the baseline would be 3, but the description goes further by spelling out what each parameter mode returns (families with id/label/one-liner/count; tools with name/price/description/notes/inputSchema) and by stating the precedence between tool and family.

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?

States a specific verb and resource (browse the tool catalog) plus concrete scope: 47 tools across 10 named families. The final sentence ('Run what you find via use_tool') separates it from the sibling that actually executes tools, so an agent can distinguish the two without opening either schema.

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?

Gives explicit mode selection: no args for the family index, family='<id>' for tools with schemas, tool='<name>' for a single entry, plus the precedence rule 'wins over family'. It also names the alternative tool for execution and states the failure mode for unknown ids.

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

use_toolRun any catalog toolAInspect

Free wrapper. Runs any catalog tool missing from your tools/list exactly as a direct call: args pass through unchanged and the inner tool's price, payment, result and errors apply verbatim. Its hints are the worst case over the whole catalog: not read-only because some inner tools create a render, a stored file or a ledger entry; never destructive because no catalog tool deletes or overwrites anything. Get the inner tool's name, schema and its own annotations from tool_catalog(tool='') first. A missing or unknown name errors pointing to tool_catalog; it cannot call itself.

NameRequiredDescriptionDefault
argsNoObject matching that tool's inputSchema. Omit if none required.
nameYesExact tool name from tool_catalog. Not 'use_tool'.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it justifies readOnlyHint=false (inner tools may create a render, a stored file or a ledger entry) and destructiveHint=false (no catalog tool deletes or overwrites), and adds that pricing and payment apply verbatim, that errors propagate from the inner tool, and that unknown names fail with a pointer to tool_catalog. That is exactly the extra context annotations cannot carry for an aggregator whose safety profile is a catalog-wide worst case.

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?

Front-loaded with the one-line purpose before the hint rationale, and every sentence carries information. It runs dense — the second sentence packs annotations, rationale, prerequisites and the self-call exclusion — which trades a little readability for completeness, but there is no filler to cut.

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 pass-through dispatcher with two params, full schema coverage and no output schema, the description covers everything an agent needs: how to resolve the inner tool, how args are forwarded, what safety posture to assume and why, and how failures behave. No gap remains that would cause a misinvocation.

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?

Schema coverage is 100%, so both parameters are already documented in the schema, which sets the baseline at 3. The description does add real meaning — args pass through unchanged to the inner tool's inputSchema, and name must be an exact catalog name rather than 'use_tool' — but it is confirming and constraining what the schema says rather than introducing new parameter behavior.

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?

States a specific verb and resource — runs any catalog tool that is missing from tools/list — and frames it as exactly equivalent to a direct call, with args, price, payment, result and errors passing through verbatim. This clearly separates it from the sibling tool_catalog (discovery) and from every concrete tool (no wrapper needed).

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?

Gives an explicit precondition (the tool is missing from your tools/list), a required preceding step (fetch name, schema and annotations via tool_catalog(tool='<name>')), an explicit exclusion (it cannot call itself), and the failure mode (missing or unknown name errors pointing to tool_catalog). Nothing about when to reach for this versus the alternatives is left to inference.

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.

  1. 2 tool updatesv0.1.6
    • Changedfetch_extract3 fields changed
      • changedInput schema / properties / headers / description
        Previous value: -"Headers to forward (Authorization, Cookie…)."New value: +"Headers to forward for pages behind login: Authorization, Cookie, X-API-Key only. Dropped if a redirect leaves the original host."
      • changedInput schema / properties / maxChars / description
        Previous value: -"Default 8000, max 32000."New value: +"Characters of text to return. Default 8000, max 32000 (higher values are clamped). Truncated output ends with a '[Truncated at N chars]' marker."
      • changedInput schema / properties / url / description
        Previous value: -"Page URL."New value: +"Public http:// or https:// URL. Local and private hosts are rejected."
    • Changedfetch_metadata2 fields changed
      • changedInput schema / properties / headers / description
        Previous value: -"Headers to forward (Authorization, Cookie…)."New value: +"Headers to forward for pages behind login: Authorization, Cookie, X-API-Key only. Dropped if a redirect leaves the original host."
      • changedInput schema / properties / url / description
        Previous value: -"Page URL."New value: +"Public http:// or https:// URL. Local and private hosts are rejected."
  2. 5 tool updatesv0.1.5
    • Changedcsv_query8 fields changed
      • changedInput schema / properties / csv / description
        Previous value: -"Raw CSV (alt. to url)."New value: +"Inline CSV text. Not with url."
      • changedInput schema / properties / filter / description
        Previous value: -"'col op value'."New value: +"'column op value'. Ops: = != contains startswith endswith (text, case-insensitive), > >= < <= (numeric). E.g. 'age >= 30'."
      • changedInput schema / properties / format / description
        Previous value: -"Default json."New value: +"json (default): {meta,rows}. csv: text with header row."
      • changedInput schema / properties / limit / description
        Previous value: -"Default 500, max 5000."New value: +"Rows to return. Default 500, max 5000; over it meta.truncated=true."
      • changedInput schema / properties / select / description
        Previous value: -"Columns, comma-separated."New value: +"Columns to keep, comma-separated, exact header names. Omit for all."
      • changedInput schema / properties / sort_by / description
        Previous value: -"Sort column."New value: +"Column to sort by; numeric when values parse as numbers, else text."
      • changedInput schema / properties / sort_dir / description
        Previous value: -"Default asc."New value: +"asc (default) or desc."
      • changedInput schema / properties / url / description
        Previous value: -"CSV URL (alt. to csv)."New value: +"CSV URL, max 5 MB. Not with csv."
    • Changedrss_parse2 fields changed
      • changedInput schema / properties / maxItems / description
        Previous value: -"Max 200."New value: +"Default 20, max 200. itemCount still reports the full total."
      • changedInput schema / properties / url / description
        Previous value: -"Feed URL."New value: +"Feed URL, http(s). Private hosts refused."
    • Changedsitemap_parse2 fields changed
      • changedInput schema / properties / maxUrls / description
        Previous value: -"Max 1000."New value: +"Default 100, max 1000; urlCount still reports the full total. Ignored for a sitemap index."
      • changedInput schema / properties / url / description
        Previous value: -"Sitemap URL."New value: +"sitemap.xml or sitemap index URL, http(s), uncompressed."
    • Changedtool_catalog2 fields changed
      • changedInput schema / properties / family / description
        Previous value: -"Family id → its tools."New value: +"Family id, e.g. 'web', 'data'. Lists its tools with schemas."
      • changedInput schema / properties / tool / description
        Previous value: -"Tool name → detail."New value: +"Exact tool name, e.g. 'fetch_rendered'. Takes precedence over family."
    • Changeduse_tool2 fields changed
      • changedInput schema / properties / args / description
        Previous value: -"Args per that tool's inputSchema."New value: +"Object matching that tool's inputSchema. Omit if none required."
      • changedInput schema / properties / name / description
        Previous value: -"Tool name (see tool_catalog)."New value: +"Exact tool name from tool_catalog. Not 'use_tool'."
  3. 5 tool updatesv0.1.4
    • Changedfetch_html2 fields changed
      • changedInput schema / properties / maxChars / description
        Previous value: -"Default 16000, max 64000."New value: +"Output cap, chars. Default 16000, max 64000."
      • changedInput schema / properties / url / description
        Previous value: -"Page URL."New value: +"http(s) page URL. Private addresses are refused."
    • Changedhtml_to_markdown3 fields changed
      • changedInput schema / properties / html / description
        Previous value: -"Raw HTML (alt. to url)."New value: +"HTML text to convert. Not with url."
      • changedInput schema / properties / maxChars / description
        Previous value: -"Default 12000, max 50000."New value: +"Output cap, chars. Default 12000, max 50000."
      • changedInput schema / properties / url / description
        Previous value: -"Page URL (alt. to html)."New value: +"Page URL to fetch. Not with html."
    • Changedjson_query4 fields changed
      • changedInput schema / properties / json / description
        Previous value: -"Raw JSON (alt. to url)."New value: +"Inline JSON text. Not with url."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results."New value: +"Default 100, max 1000. Above it: {results,total,returned}."
      • changedInput schema / properties / query / description
        Previous value: -"e.g. '$.users[*].name'."New value: +"Starts with $: '$.users[*].name', '$..price', '$.items[?(@.price<10)].id'. Filter ops: = != > >= < <= =~. '$' = whole document."
      • changedInput schema / properties / url / description
        Previous value: -"JSON URL (alt. to json)."New value: +"JSON URL, max 5 MB. Not with json."
    • Changedmemory_snippet1 field changed
      • changedInput schema / properties / harness / description
        Previous value: -"Agent runtime; omit for generic."New value: +"Your agent runtime, to tailor the save instruction. Omit for a generic one."
    • Changedpdf_text_extract3 fields changed
      • changedInput schema / properties / data / description
        Previous value: -"Base64 PDF, ≤5MB decoded (alt. to url)."New value: +"Base64 PDF, max 5 MB decoded. Not with url."
      • changedInput schema / properties / maxChars / description
        Previous value: -"Default 20000, max 100000."New value: +"Output cap, chars. Default 20000, max 100000."
      • changedInput schema / properties / url / description
        Previous value: -"PDF URL (alt. to data)."New value: +"Direct link to the .pdf file, not a viewer page. Not with data."
  4. 35 tool updatesv0.1.1
    • Removedaccount_balance
    • Removedaccount_deposit
    • Removedbase64_decode
    • Removedbase64_encode
    • Removedcount_tokens
    • Changedcsv_query9 fields changed
      • changedInput schema / properties / csv / description
        Previous value: -"Raw CSV text (alternative to url)."New value: +"Raw CSV (alt. to url)."
      • changedInput schema / properties / filter / description
        Previous value: -"Row filter expression: 'column op value'. Operators: = != > >= < <= contains startswith endswith. E.g. 'age > 30' or 'country = US'."New value: +"'col op value'."
      • changedInput schema / properties / format / description
        Previous value: -"Output format: 'json' (default) or 'csv'."New value: +"Default json."
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of rows to return (default 500, max 5000)."New value: +"Default 500, max 5000."
      • changedInput schema / properties / select / description
        Previous value: -"Comma-separated column names to include (e.g. 'name,age,country'). Omit to include all columns."New value: +"Columns, comma-separated."
      • changedInput schema / properties / sort_by / description
        Previous value: -"Column name to sort by."New value: +"Sort column."
      • changedInput schema / properties / sort_dir / description
        Previous value: -"Sort direction: 'asc' (default) or 'desc'."New value: +"Default asc."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the CSV file to fetch (http/https)."New value: +"CSV URL (alt. to csv)."
    • Removeddiff_text
    • Changedfetch_extract3 fields changed
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / maxChars / description
        Previous value: -"Max characters to return (default 8000, max 32000)"New value: +"Default 8000, max 32000."
      • changedInput schema / properties / url / description
        Previous value: -"The URL to fetch and extract text from"New value: +"Page URL."
    • Changedfetch_html3 fields changed
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / maxChars / description
        Previous value: -"Max characters to return (default 16000, max 64000)."New value: +"Default 16000, max 64000."
      • changedInput schema / properties / url / description
        Previous value: -"The URL to fetch (http:// or https://)."New value: +"Page URL."
    • Changedfetch_metadata2 fields changed
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL to fetch (http:// or https://)."New value: +"Page URL."
    • Removedfetch_structured
    • Removedhash_text
    • Changedhtml_to_markdown4 fields changed
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / html / description
        Previous value: -"Raw HTML string to convert directly (alternative to url)."New value: +"Raw HTML (alt. to url)."
      • changedInput schema / properties / maxChars / description
        Previous value: -"Max characters of Markdown to return (default 12000, max 50000)."New value: +"Default 12000, max 50000."
      • changedInput schema / properties / url / description
        Previous value: -"URL to fetch and convert (http:// or https://)."New value: +"Page URL (alt. to html)."
    • Removedjson_format
    • Changedjson_query5 fields changed
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / json / description
        Previous value: -"Raw JSON string to query (alternative to url)."New value: +"Raw JSON (alt. to url)."
      • changedInput schema / properties / limit / description
        Previous value: -"Max number of results to return (default 100, max 1000)."New value: +"Max results."
      • changedInput schema / properties / query / description
        Previous value: -"JSONPath-lite expression. Examples: '$.users[*].name', '$..price', '$.items[?(@.stock > 0)].id', '$.store.books[0].title'"New value: +"e.g. '$.users[*].name'."
      • changedInput schema / properties / url / description
        Previous value: -"URL returning JSON to query (http/https)."New value: +"JSON URL (alt. to json)."
    • Changedkeyword_research4 fields changed
      • changedInput schema / properties / include_suggestions / description
        Previous value: -"Whether to fetch top-5 related keyword suggestions per seed keyword. Default true. Set false to skip the suggestions call and reduce latency."New value: +"Add related suggestions."
      • changedInput schema / properties / keywords / description
        Previous value: -"One keyword (string) or up to 20 keywords (array of strings, max 20). Pass a single string for one keyword or an array for multiple keywords in one API call."New value: +"1-20 keywords."
      • changedInput schema / properties / language_code / description
        Previous value: -"ISO 639-1 language code for Google Ads data. Default \"es\" (Spanish). Use \"en\" for English, \"fr\" for French, etc."New value: +"ISO 639-1."
      • changedInput schema / properties / location_code / description
        Previous value: -"DataForSEO location code for Google Ads geo-targeting. Default 2724 (Spain). Use 2840 for USA, 2826 for UK. Full list: https://api.dataforseo.com/v3/keywords_data/google_ads/locations"New value: +"DataForSEO location (default Spain)."
    • Addedmemory_snippet
    • Removedpage_assets
    • Removedpage_links
    • Changedpdf_text_extract5 fields changed
      • addedInput schema / properties / data
        Added value: +{
        +  "description": "Base64 PDF, ≤5MB decoded (alt. to url).",
        +  "type": "string"
        +}
      • addedInput schema / properties / headers
        Added value: +{
        +  "description": "Headers to forward (Authorization, Cookie…).",
        +  "type": "object"
        +}
      • changedInput schema / properties / maxChars / description
        Previous value: -"Max characters to return (default 20000, max 100000)."New value: +"Default 20000, max 100000."
      • changedInput schema / properties / url / description
        Previous value: -"URL of the PDF to fetch (http/https). Must be a PDF file."New value: +"PDF URL (alt. to data)."
      • removedInput schema / required
        Removed value: -[
        -  "url"
        -]
    • Removedregex_extract
    • Changedremove_background1 field changed
      • changedInput schema / properties / image_url / description
        Previous value: -"Public URL of the source image (JPEG, PNG, or WEBP). Must be accessible from the internet — local paths and data: URIs are not supported."New value: +"Public image URL."
    • Changedrss_parse2 fields changed
      • changedInput schema / properties / maxItems / description
        Previous value: -"Max feed items to return (default 20, max 200)."New value: +"Max 200."
      • changedInput schema / properties / url / description
        Previous value: -"RSS or Atom feed URL (http:// or https://)."New value: +"Feed URL."
    • Changedscreenshot_url6 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"Image format: \"png\" (default) or \"jpeg\"."New value: +"Default png."
      • changedInput schema / properties / fullPage / description
        Previous value: -"Capture the entire scrollable page instead of just the viewport. Default false."New value: +"true = whole page, not viewport."
      • changedInput schema / properties / height / description
        Previous value: -"Viewport height in pixels (default 800, 100–4000). Ignored when fullPage is true."New value: +"Viewport px."
      • changedInput schema / properties / quality / description
        Previous value: -"JPEG quality 1–100 (only applies when format is jpeg)."New value: +"JPEG only, 1-100."
      • changedInput schema / properties / url / description
        Previous value: -"The URL of the page to screenshot (http:// or https://)."New value: +"Page URL."
      • changedInput schema / properties / width / description
        Previous value: -"Viewport width in pixels (default 1280, 100–4000)."New value: +"Viewport px."
    • Changedsitemap_parse2 fields changed
      • changedInput schema / properties / maxUrls / description
        Previous value: -"Max URLs to return from a urlset (default 100, max 1000). Has no effect on sitemapindex (all child sitemaps are always returned)."New value: +"Max 1000."
      • changedInput schema / properties / url / description
        Previous value: -"Sitemap URL (http:// or https://). Accepts sitemap.xml, sitemap_index.xml, or any XML sitemap."New value: +"Sitemap URL."
    • Changedtask_recipes1 field changed
      • changedInput schema / properties / recipe / description
        Previous value: -"The recipe id to expand (e.g. 'replicate_website', 'seo_audit'). Omit to list the menu."New value: +"Recipe id; omit for menu."
    • Removedtext_stats
    • Removedtimestamp_convert
    • Addedtool_catalog
    • Removedupload_file
    • Removedurl_decode
    • Removedurl_encode
    • Addeduse_tool
    • Removeduuid_generate
    • Removedwallet_setup
  5. 10 tool updates
    • Removedextract_structured
    • Addedfetch_metadata
    • Addedfetch_structured
    • Addedkeyword_research
    • Addedremove_background
    • Addedscreenshot_url
    • Addedtask_recipes
    • Addedupload_file
    • Addedwallet_setup
    • Removedwebpage_metadata
  6. 27 tool updatesv0.1.0
    • First observedaccount_balance
    • First observedaccount_deposit
    • First observedbase64_decode
    • First observedbase64_encode
    • First observedcount_tokens
    • First observedcsv_query
    • First observeddiff_text
    • First observedextract_structured
    • First observedfetch_extract
    • First observedfetch_html
    • First observedhash_text
    • First observedhtml_to_markdown
    • First observedjson_format
    • First observedjson_query
    • First observedpage_assets
    • First observedpage_links
    • First observedpdf_text_extract
    • First observedpricing
    • First observedregex_extract
    • First observedrss_parse
    • First observedsitemap_parse
    • First observedtext_stats
    • First observedtimestamp_convert
    • First observedurl_decode
    • First observedurl_encode
    • First observeduuid_generate
    • First observedwebpage_metadata

TDQS

A4.1/5.0

Scored across 17 tools

Disambiguation4/5

Most tools target clearly distinct resource/action combinations, and descriptions explicitly route between similar tools. There is still some overlap between fetch_html, fetch_extract, and html_to_markdown, and use_tool is a generic wrapper that could be confused with direct calls, though the descriptions mitigate this.

Naming Consistency3/5

All names use snake_case and are readable, but the naming patterns are mixed: fetch_html, csv_query, sitemap_parse, memory_snippet, pricing, and html_to_markdown do not follow one predictable verb_noun or resource_action convention. This is mixed but still understandable rather than chaotic.

Tool Count4/5

Seventeen tools is slightly above the typical ideal range, but the server covers a broad set of extraction, metadata, pricing, catalog, and paid utility functions. Each top-level tool has a reasonably distinct role, though a few fetch variants could potentially be consolidated.

Completeness4/5

The surface covers the main web/data extraction formats (HTML, text, metadata, Markdown, PDF, CSV, JSON, sitemap, RSS) plus catalog, pricing, recipes, screenshots, and a wrapper for missing catalog tools. Minor gaps remain around OCR, direct JS rendering, and large-file query variants, but these are documented or reachable through the catalog wrapper.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    42 local SEO tools for AI assistants. SERP tracking, Google Business Profile data, review monitoring, keyword research, AI visibility scoring, geogrid rank scans, citation audits, and competitive analysis.
    53
    42 npm
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Read any public web page, or up to 20 in one batch, as a clean AIDocument: Markdown plus title, description, structure, and provenance, with navigation and boilerplate stripped. Reads are served through Lyrenth's own independently built web index, so each costs a fraction of the tokens of raw HTML and is origin-friendly. A third tool reports your plan and how many reads you have used.
    3
    83 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Pay-per-call MCP server for WebberSites x402 Data API, offering 45 tools for AI agents: web scraping, document extraction, SEO audits, linting, crypto data, and more, with payment via USDC on Base.
    66 npm
    MIT