ToolSnap MCP
Measured conclusion: Alive, not deep-tested. L2 outcome: not_attempted.
Deterministic AI agent microtools, no accounts/API keys. fetch_extract: 98% token cut. 38 tools.
| Author | app.toolsnap |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Alive, not deep-tested |
| L1 liveness | alive |
| L1 latency | 2331 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"ToolSnap MCP": {
"url": "https://mcp.toolsnap.app/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (17)
tool_catalogread-onlyFree, 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='<id>': each tool with name, price, description, notes, inputSchema. tool='<name>': that entry alone; wins over family. Unknown ids error naming the valid families. Run what you find via use_tool.
Parameters:
tool— string — Exact tool name, e.g. 'fetch_rendered'. Takes precedence over family.family— string — Family id, e.g. 'web', 'data'. Lists its tools with schemas.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world no
use_toolFree 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='<name>') first. A missing or unknown name errors pointing to tool_catalog; it cannot call itself.
Parameters:
name(required) — string — Exact tool name from tool_catalog. Not 'use_tool'.args— object — Object matching that tool's inputSchema. Omit if none required.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
task_recipesread-onlyFree. Multi-tool workflow prompts (clone a site, SEO audit). No args → menu; recipe='<id>' → prompt.
Parameters:
recipe— string — Recipe id; omit for menu.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world no
memory_snippetread-onlyFree, 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.
Parameters:
harness— string — Your agent runtime, to tailor the save instruction. Omit for a generic one.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world no
pricingread-onlyFree, 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.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world no
fetch_extractread-onlyFree, 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.
Parameters:
url(required) — string — Public http:// or https:// URL. Local and private hosts are rejected.headers— object — Headers to forward for pages behind login: Authorization, Cookie, X-API-Key only. Dropped if a redirect leaves the original host.maxChars— number — Characters of text to return. Default 8000, max 32000 (higher values are clamped). Truncated output ends with a '[Truncated at N chars]' marker.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
fetch_htmlread-onlyFree, 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.
Parameters:
url(required) — string — http(s) page URL. Private addresses are refused.headers— object — Headers to forward (Authorization, Cookie…).maxChars— number — Output cap, chars. Default 16000, max 64000.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
html_to_markdownread-onlyFree, 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.
Parameters:
url— string — Page URL to fetch. Not with html.html— string — HTML text to convert. Not with url.headers— object — Headers to forward (Authorization, Cookie…).maxChars— number — Output cap, chars. Default 12000, max 50000.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
fetch_metadataread-onlyFree, read-only. Fetch a public http(s) URL and return its <head> 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).
Parameters:
url(required) — string — Public http:// or https:// URL. Local and private hosts are rejected.headers— object — Headers to forward for pages behind login: Authorization, Cookie, X-API-Key only. Dropped if a redirect leaves the original host.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
pdf_text_extractread-onlyFree, 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.
Parameters:
url— string — Direct link to the .pdf file, not a viewer page. Not with data.data— string — Base64 PDF, max 5 MB decoded. Not with url.headers— object — Headers to forward (Authorization, Cookie…).maxChars— number — Output cap, chars. Default 20000, max 100000.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
csv_queryread-onlyFree, 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).
Parameters:
csv— string — Inline CSV text. Not with url.url— string — CSV URL, max 5 MB. Not with csv.limit— number — Rows to return. Default 500, max 5000; over it meta.truncated=true.filter— string — 'column op value'. Ops: = != contains startswith endswith (text, case-insensitive), > >= < <= (numeric). E.g. 'age >= 30'.format— string — json (default): {meta,rows}. csv: text with header row.select— string — Columns to keep, comma-separated, exact header names. Omit for all.headers— object — Headers to forward (Authorization, Cookie…).sort_by— string — Column to sort by; numeric when values parse as numbers, else text.sort_dir— string — asc (default) or desc.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
json_queryread-onlyFree, 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).
Parameters:
query(required) — string — Starts with $: '$.users[*].name', '$..price', '$.items[?(@.price<10)].id'. Filter ops: = != > >= < <= =~. '$' = whole document.url— string — JSON URL, max 5 MB. Not with json.json— string — Inline JSON text. Not with url.limit— number — Default 100, max 1000. Above it: {results,total,returned}.headers— object — Headers to forward (Authorization, Cookie…).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
sitemap_parseread-onlyFree, 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.
Parameters:
url(required) — string — sitemap.xml or sitemap index URL, http(s), uncompressed.maxUrls— number — Default 100, max 1000; urlCount still reports the full total. Ignored for a sitemap index.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
rss_parseread-onlyFree, 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.
Parameters:
url(required) — string — Feed URL, http(s). Private hosts refused.maxItems— number — Default 20, max 200. itemCount still reports the full total.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
screenshot_urlScreenshot 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.
Parameters:
url(required) — string — Page URL.width— number — Viewport px.format— string — Default png.height— number — Viewport px.quality— number — JPEG only, 1-100.fullPage— boolean — true = whole page, not viewport.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
keyword_researchread-onlyGoogle 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.
Parameters:
keywords(required) — array — 1-20 keywords.language_code— string — ISO 639-1.location_code— number — DataForSEO location (default Spain).include_suggestions— boolean — Add related suggestions.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
remove_backgroundRemove 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.
Parameters:
image_url(required) — string — Public image URL.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.