@readfetch/mcp-x402-proxy
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@readfetch/mcp-x402-proxyfetch the text content of https://example.com/blog/article"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
readfetch MCP + x402 signing proxy
Most MCP hosts (Cursor, Claude Desktop, etc.) cannot attach PAYMENT-SIGNATURE on tools/call.
This stdio MCP server lists tools from https://readfetch.com/mcp, executes tools/call against /v1/{endpoint} on the same host (so HTTP 402 triggers @x402/fetch payment), and signs retries automatically.
Requirements
Node.js 20+
A wallet on Base mainnet with a little USDC for paid tools (
readfetch_text, …).tools/listdoes not load your key; the firsttools/calldoes.Private key in env — never commit it
Related MCP server: x402 MCP Proxy
Cursor / Claude MCP config
{
"mcpServers": {
"readfetch": {
"command": "npx",
"args": ["-y", "@readfetch/mcp-x402-proxy@0.1.12"],
"env": {
"EVM_PRIVATE_KEY": "0xYOUR_KEY"
}
}
}
}From a checkout:
{
"mcpServers": {
"readfetch": {
"command": "node",
"args": ["/absolute/path/to/readfetch/tools/mcp-x402-proxy/index.mjs"],
"env": {
"EVM_PRIVATE_KEY": "0xYOUR_KEY"
}
}
}
}Optional: READFETCH_MCP_URL (default https://readfetch.com/mcp; https only for readfetch.com / www.readfetch.com, or localhost / 127.0.0.1 / [::1] with READFETCH_DEV=1). Upstream redirects are rejected. READFETCH_MAX_PAYMENT_USD (default 1, max 100) caps each x402 authorization. On readfetch.com upstream, payments must match READFETCH_EXPECTED_PAYTO (default catalog payee). READFETCH_DEV=1 is only for local MCP URLs and enables Sepolia there — never set it when READFETCH_MCP_URL points at production.
Wallet risk: any tool the model invokes (readfetch_crawl, batch, …) can spend USDC from your key until the wallet is empty (subject to the per-payment cap). Use a dedicated low-balance wallet.
Install from a checkout:
cd tools/mcp-x402-proxy
npm cinpm ci in a git checkout uses the committed package-lock.json. npx @readfetch/mcp-x402-proxy installs exact dependency versions pinned in package.json (npm does not ship the lockfile in the published tarball).
Local smoke (checkout)
npm ci && npm test
npm run smoke # readfetch_probe (free)
SMOKE_TOOL=readfetch_text npm run smoke # paid REST path; needs Base USDCFrom this directory — not the repo root:
cd tools/mcp-x402-proxy
npm login # user must own or belong to npm org @readfetch
npm publish --access public # first publish of a scoped packageWrong: npm publish @readfetch/mcp-x402-proxy from ReadFetch/ (404 — nothing to publish there).
If the @readfetch org does not exist on npmjs.com, create it or temporarily change name in package.json to an unscoped name you control.
Default tool path
readfetch_probewith{ "url": "…" }(free; may includepreview~400 chars when HTML, not a bot wall)readfetch_textwith the sameurlIf probe reports
challenge: true, usereadfetch_scrape(thenreadfetch_scrape_residentialif needed)
Feedback (integration issues)
After a confusing 402, MCP result, or doc mismatch, call readfetch_feedback (free — no EVM_PRIVATE_KEY) with:
{ "request_id": "<X-Request-Id from that call>", "category": "integration", "message": "…" }Paid delivery disputes use POST /v1/claims, not feedback. Details: readfetch.com/docs#feedback.
Without this proxy
REST:
awal x402 pay https://readfetch.com/v1/text -d '{"url":"…"}'or@x402/fetchin your appDirect MCP URL: only works if your host can set payment headers on the HTTP request to
/mcp
See also readfetch integrations and SKILL.md.
Directory: Official MCP Registry io.github.readfetch/mcp-x402-proxy · Glama listing steps in readfetch/readfetch docs/GLAMA.md (operator).
Available Tools
15 toolsreadfetch_batchARead-only
Read a fixed list of public HTML pages in one call—the same article extraction as POST /v1/text for each URL (Markdown or plain text plus title and metadata). One x402 payment covers the batch (minimum 10 pages quoted; URLs deduped, max 50). Returns results in input order: each item has url, status_code, text, billed, and hint when undelivered, plus batch-level delivered, failed, billed_pages, and optional credit for unused pages. Undelivered pages are not billed. Use readfetch_text for one URL, readfetch_map then readfetch_crawl to discover and walk a site, readfetch_scrape when JavaScript is required. Read-only; 402 without PAYMENT-SIGNATURE like other paid tools.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | URLs to read, deduped before quoting. | |
| fresh | No | When true, bypass cached responses for each item (default false). | |
| format | No | Per-item output flavour, same as /v1/text: markdown (default) or plain text. | markdown |
| pipeline | No | text = HTTP-first; render needs the browser tier. | text |
| timeout_s | No | Total budget for the whole batch in seconds; every item shares it and no item restarts it. | |
| accept_language | No | Accept-Language header for every item, e.g. 'de-DE,de;q=0.9'. Defaults to en-US when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| credit | No | |
| failed | No | |
| status | No | |
| results | No | |
| delivered | No | |
| billed_pages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint/openWorldHint; the description adds substantial context beyond them: x402 payment covering the whole batch, minimum 10-page quoting, dedupe before quoting, undelivered pages not billed, batch-level billed_pages and optional credit, the 402-without-PAYMENT-SIGNATURE auth behavior, and a shared timeout budget across items. That is exactly the kind of billing/auth/failure disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and every subsequent clause carries a fact an agent needs (billing, ordering, alternatives, auth). The sentences are long and run-on, packing several ideas each, which costs a little clarity but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers invocation, cost model, failure semantics, result shape and ordering, and alternatives to every sibling. Although an output schema exists, the summary of returned fields is a welcome shortcut rather than wasted space.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds real meaning by clarifying the billing minimum (10 pages quoted) versus the schema's minItems of 1, that URLs are deduped, and that results preserve input order. It does not explain 'fresh' or 'pipeline' beyond the schema, keeping it at a 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a fixed list of public HTML pages in one call') and equates the per-URL output to POST /v1/text, so the agent knows exactly what it gets back. It then names the sibling for each near-miss case (readfetch_text, readfetch_map/crawl, readfetch_scrape), making it distinguishable without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: single URL → readfetch_text, discovery → readfetch_map then readfetch_crawl, JS-needed pages → readfetch_scrape. The batch-specific constraint (minimum 10 pages quoted, max 50) tells the agent when this tool is economically inappropriate too.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_crawlARead-only
Start a bounded async crawl from one seed URL. Returns job_id, status (queued), pages_quoted, and price_usd — then poll readfetch_crawl_status with that id until status is completed or failed. Completed jobs include per-page url and Markdown in the status payload. Cap scope with max_pages (default 20, max 100) and max_depth (default 2, max 3); include/exclude filter paths by prefix (* suffix on include). Prefer readfetch_batch for a fixed URL list; readfetch_map to list URLs without fetching bodies; readfetch_text for a single page.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Seed URL; crawl stays on the same registrable domain. | |
| exclude | No | Path prefixes to skip during the crawl. | |
| include | No | Path prefixes to allow; * suffix wildcard. | |
| max_depth | No | Link depth from the seed URL (default 2). | |
| max_pages | No | Maximum pages to fetch in this job (quoted up front for payment). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| job_id | No | |
| status | No | |
| price_usd | No | |
| pages_quoted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint/openWorldHint; the description adds real behavior beyond that — asynchronous job semantics, the exact return fields (job_id, status, pages_quoted, price_usd), the polling contract, the terminal states, and what a completed payload contains. It doesn't spell out failure/error handling or what happens if the poll never completes, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then returns, then polling, then scope caps, then the alternative routing — a sensible priority order with no filler sentences. Minor redundancy in restating schema defaults costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async, paid, open-world crawl with 5 params and an output schema, the description covers initiation, cost quoting, poll cadence, terminal states, scoping knobs, and sibling routing. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so url, include, exclude, max_pages and max_depth are already documented with defaults and bounds. The description mostly repeats those defaults and maxima ('default 20, max 100', 'default 2, max 3') rather than adding semantics, though the wildcard note on include is a useful confirmation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Start a bounded async crawl from one seed URL') and immediately situates it among siblings: batch for a fixed list, map for URL listing, text for a single page. An agent can pick this tool over readfetch_scrape or readfetch_fetch 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rules are given for all three alternatives, plus the required follow-up call ('poll readfetch_crawl_status with that id until status is completed or failed'). It states both when to use this tool and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_crawl_statusARead-only
FREE — no payment or wallet: Poll a crawl job started with readfetch_crawl. FREE — no payment or wallet; unauthenticated. Pass id from the crawl response. Returns job_id, status (queued, running, completed, or failed), completed/total counts, and a growing pages list (url plus Markdown) as results land. Stop polling when status is completed or failed. Results are kept for one hour after the job finishes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Job id returned by POST /v1/crawl. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | No | |
| total | No | |
| job_id | No | |
| status | No | |
| completed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations by disclosing the no-payment/no-auth access model, the enumerated status values, the incremental/growing nature of the `pages` list as results land, and the one-hour result retention window that constrains how long polling can continue.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key operational facts are front-loaded, but 'FREE — no payment or wallet' appears twice in near-identical form, and 'unauthenticated' repeats the same point a third time, wasting the opening of the description on redundant monetization messaging.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still enumerates the return fields; that is mild redundancy rather than a gap. The substantive gaps are covered — retention window, stop condition, and status values — leaving nothing an agent needs in order to call it correctly missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the `id` description already says it comes from POST /v1/crawl, so the description's 'Pass `id` from the crawl response' is largely duplicative. It does implicitly signal that `id` is effectively required despite `required: []`, but adds no format or error-handling detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Poll a crawl job') and anchors it to the sibling that creates the job ('started with readfetch_crawl'), so an agent can distinguish it from readfetch_crawl 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the prerequisite (must follow readfetch_crawl), the input source ('Pass `id` from the crawl response'), and an explicit termination condition ('Stop polling when status is completed or failed'), which is exactly the when/when-not guidance a polling tool needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_diffARead-only
Stateless change detection: send the hash you hold, get changed/unchanged and a bounded diff. A no-change answer is billable.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| format | No | text | |
| timeout_s | No | Total budget for the whole call in seconds, both fetches included. 60 s is the ceiling on this route. | |
| previous_hash | No | sha256:... from a previous call. | |
| previous_content | No | Previous text, for an added/removed diff. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| diff | No | |
| hash | No | |
| hint | No | |
| added | No | |
| billed | No | |
| status | No | |
| changed | No | |
| removed | No | |
| status_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, and the description adds genuinely non-obvious behavior: the call is stateless and a no-change answer is still billable. It stops short of explaining what 'bounded' means for the diff or how the two hash/content inputs interact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core contract and finished with the cost caveat. Nothing is wasted and no sentence restates the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described, and billing is disclosed. Still missing for a 5-parameter tool: first-call behavior with a null previous_hash, whether previous_content is needed for an added/removed diff, and the meaning of 'bounded'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the schema documents timeout_s and previous_hash/previous_content while url and format are bare. The description reinforces the 'hash you hold' idea but adds no meaning for format, the null-hash first call, or how previous_content differs from previous_hash.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific mechanism (stateless change detection via a supplied hash) and the outcome (changed/unchanged plus a bounded diff), which distinguishes it from readfetch_fetch or readfetch_text. It never names those siblings, so differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Send the hash you hold' implies the tool is for re-checks against a prior result, which is useful implied usage. However, it never states when to use this instead of readfetch_fetch, nor what to do on a first call when no hash exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_feedbackA
FREE — report integration, docs or site issues for a prior call. Bind with request_id from X-Request-Id. Paid delivery disputes use /v1/claims, not this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| category | Yes | ||
| request_id | Yes | X-Request-Id from the call you are reporting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses two things annotations don't: the call is FREE (cost is a real differentiator in this suite) and it must be bound to a prior request via X-Request-Id. readOnlyHint=false is consistent with submitting a report, so no contradiction. It stops short of saying what happens to a submitted report or whether any confirmation is returned, which for a write-flagged endpoint is the one missing behavioral beat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly two sentences with the highest-value token ("FREE") front-loaded and zero filler. Every clause — cost, action, binding requirement, exclusion — carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All three parameters are required and there is no output schema, so the description should cover the input contract and at least gesture at what comes back. It covers binding and scope well but omits message constraints and any indication of the response, leaving an agent unable to predict the outcome of the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only request_id is documented), so the description is expected to compensate. It does explain the request_id origin and implicitly maps "integration, docs or site" onto three of the four category enum values, but it says nothing about the message parameter (including the 500-character cap) or the "other" category, so the compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: "report integration, docs or site issues for a prior call," which pins down both the action and the object. It also carves out a boundary against the paid-dispute route (/v1/claims), though it never references any of the readfetch_* siblings (fetch, crawl, scrape, etc.), so an agent gets no explicit routing contrast within the tool family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the context of use (issues arising from a prior call in the categories integration/docs/site) and gives an explicit when-not with a named alternative: paid delivery disputes go to /v1/claims. It does not clarify the reverse direction — e.g. whether this tool is ever correct without a prior request_id — leaving the prerequisite as an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_fetchARead-only
Send an HTTP request (GET, POST, PUT, PATCH, DELETE, HEAD) through egress and return status_code, response headers, and body as text or base64 (binary: true). max_bytes caps the stored body; follow_redirects (default true) and timeout_s (95 s ceiling) apply to the full redirect chain. Use json_body for JSON POST/PUT payloads; use body for raw bytes or strings. Prefer readfetch_text for readable HTML articles; readfetch_pdf to extract PDF text (not raw bytes alone). POST/PUT/DELETE can change remote state despite readOnlyHint.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Request URL (http or https). | |
| body | No | Raw request body string for POST/PUT/PATCH (mutually exclusive with json_body). | |
| binary | No | When true, return body as base64 instead of UTF-8 text. | |
| method | No | HTTP method (GET default). | GET |
| headers | No | Optional request headers, e.g. Authorization or Accept. | |
| json_body | No | JSON object serialized as the request body (Content-Type application/json). | |
| max_bytes | No | Stop reading and truncate once the response body exceeds this size (bytes). | |
| timeout_s | No | Total budget for the whole call in seconds, redirect hops included. | |
| follow_redirects | No | Follow 3xx redirects (default true). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| size | No | |
| text | No | |
| status | No | |
| status_code | No | |
| content_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although the description adds useful behavioral detail such as redirect-chain scope, max_bytes truncation, and timeout ceiling, its final sentence explicitly says POST/PUT/DELETE can change remote state despite readOnlyHint. That directly contradicts the readOnlyHint=true annotation, so the rubric requires a score of 1 despite the otherwise strong disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, first stating the operation and return values before covering limits, redirect behavior, body choices, alternatives, and the mutation caveat. Every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain return values, but it still summarizes them. It covers methods, body encoding, size limits, redirect behavior, timeout, alternatives, and the write-risk caveat, making it complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful synthesis beyond the schema: binary mode returns base64, max_bytes caps the stored body, follow_redirects and timeout_s apply across the redirect chain, and json_body versus body controls payload encoding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: sends an HTTP request with enumerated methods and returns status_code, response headers, and body. It clearly distinguishes the tool from readfetch_text and readfetch_pdf by naming those alternatives for HTML and PDF extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: prefer readfetch_text for readable HTML articles and readfetch_pdf for PDF text extraction. It also explains when to use json_body versus body for request payloads, which directly affects invocation choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_mapARead-only
Discover a site's crawlable surface without crawling it: parse robots.txt allow/disallow rules, collect URLs from sitemap.xml and sitemap indexes, find RSS, Atom and JSON feeds, and count internal and external links on the homepage. Use the returned URLs to plan a /v1/scrape or /v1/crawl.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL of the site to map. | |
| limit | No | Maximum number of URLs to return (1-1000). | |
| max_bytes | No | Abort if any single document exceeds this many bytes. | |
| timeout_s | No | Total budget for the whole call in seconds; every sitemap fetch and the browser fallback share it. 95 s is the edge ceiling (Cloudflare closes at 100 s). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| host | No | |
| urls | No | |
| feeds | No | |
| links | No | |
| robots | No | |
| status | No | |
| sitemaps | No | |
| url_count | No | |
| status_code | No | |
| total_found | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds real value on top: it emphasizes no crawling occurs and enumerates exactly which documents are fetched, so the agent knows the cost profile. It omits failure behavior (site with no robots.txt or sitemap) and the browser-fallback cost noted only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core capability and the 'without crawling it' qualifier, then the follow-up action. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description covers what is collected and why, leaving only edge-case behavior (empty robots.txt, partial failures) unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so url, limit, max_bytes, and timeout_s are already fully documented with ranges and defaults. The description adds no parameter-level detail such as how limit interacts with the four discovery sources, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('discover') and resource ('a site's crawlable surface') and then enumerates the concrete sources parsed: robots.txt, sitemap.xml/indexes, RSS/Atom/JSON feeds, and homepage link counts. It is clearly differentiated from readfetch_crawl and readfetch_scrape by the phrase 'without crawling it'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence explicitly routes the agent: 'Use the returned URLs to plan a /v1/scrape or /v1/crawl,' which positions this as the pre-flight step before those siblings. It stops short of stating when-not-to-use (e.g., a single known URL should go straight to readfetch_fetch), so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_pdfARead-only
Extract text from a PDF (%PDF- magic, not Content-Type): send exactly one of url (downloaded through egress) or content_base64 (inline bytes, ≤ 20 MB). Returns per-page text in pages, one concatenated markdown body, plus title and metadata; $0.005 per document, not per page. max_pages limits how many pages are extracted (default 50, max 200); a document above the cap or above 200 pages returns 413 and is not billed. Image-only/scanned PDFs may return empty text with billed: false and a hint. Use readfetch_text or readfetch_scrape for HTML pages; use readfetch_batch for many HTML URLs, not PDFs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public PDF URL; fetched through egress (≤ 20 MB). Mutually exclusive with content_base64. | |
| filename | No | Optional label when using content_base64 (default upload.pdf); ignored for url-only requests. | |
| max_pages | No | Extract at most this many pages. Default 50; raise up to 200 when the document is longer. Over cap → 413, unbilled. | |
| content_base64 | No | Base64-encoded PDF bytes (≤ 20 MB). Mutually exclusive with url; pair with filename when the label matters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| pages | No | |
| title | No | |
| billed | No | |
| source | No | |
| status | No | |
| markdown | No | |
| metadata | No | |
| page_count | No | |
| content_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and open-world annotations, the description discloses pricing ($0.005 per document, not per page), failure billing behavior (413 above page cap is not billed), and scanned-PDF behavior (empty text can return with `billed: false` and a hint). This is unusually complete behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then layers constraints, return shape, pricing, edge cases, and sibling alternatives in a compact paragraph. Every sentence carries operational value and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, complete schema, and existing output schema, the description supplies the remaining operational context an agent needs: input selection, size/page limits, billing exceptions, and when to choose a sibling tool instead. Nothing important for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents mutual exclusivity, the 20 MB limit, and max_pages default/max/413 behavior. The description reinforces these constraints clearly but adds little parameter-level meaning beyond what the structured schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: extract text from a PDF, with a clear magic-byte check rather than Content-Type. It also distinguishes from siblings by naming readfetch_text/readfetch_scrape for HTML and readfetch_batch for many HTML URLs, not PDFs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage rules: send exactly one of `url` or `content_base64`, use the former through egress and the latter for inline bytes up to 20 MB. It also states when not to use it, routing HTML work to readfetch_text, readfetch_scrape, or readfetch_batch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_probeARead-only
FREE — no payment or wallet: Free preflight on a URL: HTTP status, content type, byte size, title, language, and whether a bot wall is waiting (challenge). When the response is HTML and not a challenge page, the JSON includes preview: up to 400 characters of the text /v1/text would return (same extractor). Optional preview only — not the full article. Plain HTTP (no browser render).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL to inspect. | |
| timeout_s | No | Total budget for the whole call in seconds. | |
| accept_language | No | Accept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| bytes | No | |
| title | No | |
| billed | No | |
| status | No | |
| preview | No | |
| language | No | |
| challenge | No | |
| redirected | No | |
| status_code | No | |
| content_type | No | |
| requested_url | No | |
| content_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds the operational facts an agent actually needs: no payment required, plain HTTP without browser rendering (so JS-heavy pages may look different than a rendered fetch), detection of bot walls via 'challenge', and a hard 400-character cap on preview text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The cost qualifier and tool identity are front-loaded, then the returned fields, then the preview caveat with its limit. Dense but every clause carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description's remaining job is scoping (free, metadata-only, no rendering, capped preview) — all of which it covers. Nothing needed to decide whether to call or to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only three parameters, so the schema already documents url, timeout_s and accept_language thoroughly. The description adds no format or syntax detail about any parameter, so it neither compensates nor detracts — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('free preflight on a URL') and enumerates exactly what comes back: HTTP status, content type, byte size, title, language, challenge detection. It also separates itself from content-returning siblings by noting the preview is 'not the full article' and that this is plain HTTP with no browser render.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'FREE — no payment or wallet' framing and 'preflight' label clearly position it as the cheap check to run before a paid/extraction call, and 'same extractor as /v1/text' implies where to go for full content. It stops short of an explicit when-to-use/when-not statement naming siblings like readfetch_text or readfetch_fetch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_residentialARead-only
Identical request and response to /v1/scrape, but the render leaves through a residential address instead of the datacentre. For targets that block by IP reputation (DataDome, PerimeterX, Cloudflare, AWS WAF). One attempt, no retries: residential bandwidth is the cost, and four times the scrape price is what it takes to cover it honestly.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL to load in Chromium. | |
| auth | No | Optional cookie, bearer, or basic auth for the page load. | |
| mode | No | Whole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll). | render |
| fresh | No | When true, bypass cached scrape results (default false). | |
| format | No | Primary body field returned: markdown (default), plain text, or raw HTML. | markdown |
| options | No | Deprecated — use `advanced` instead (same ScrapeOptions shape). Scheduled for removal in a future API semver bump. | |
| advanced | No | Browser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| title | No | |
| billed | No | |
| status | No | |
| markdown | No | |
| status_code | No | |
| cache_status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world behavior. On top of that, the description discloses critical operational traits: single attempt with no retries, residential egress, and a 4x price multiplier, which materially affects agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core equivalence, then targeting guidance, then cost/retry caveat. Every sentence carries decision-relevant information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers response structure, annotations cover safety and openness, and the description supplies the missing behavioral context (retry policy, cost, IP-reputation targeting). An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all 7 parameters. The description adds only that the request shape is identical to /v1/scrape, which is useful context but does not elaborate on any individual parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (render via residential address) and explicitly frames it as an alternative to the datacentre scrape endpoint. It distinguishes itself from sibling scrape/fetch tools by naming the exact use case: targets that block by IP reputation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for use ('For targets that block by IP reputation') and lists example vendors, plus a strong cost/caveat signal (one attempt, 4x price). It stops short of explicitly naming the sibling to use otherwise (readfetch_scrape), leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_scrapeARead-only
Load a public URL in headless Chromium and return Markdown, plain text, or HTML (format, plus status_code, title, cache_status, billed; optional links via advanced.include_links). mode sets latency and depth: fast (15 s, minimal render), render (30 s, default, full JS), full (60 s, scroll the page). fresh: true bypasses cache. Put scroll, wait_for, js_code, headers, cookies, and auth in advanced (options is deprecated, same shape). Prefer readfetch_text when JavaScript is not required; readfetch_fetch for raw HTTP/API bytes; readfetch_residential when the site blocks datacentre IPs; readfetch_screenshot for a PNG/JPEG. Bot-check or empty extractions may return billed: false with a hint.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL to load in Chromium. | |
| auth | No | Optional cookie, bearer, or basic auth for the page load. | |
| mode | No | Whole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll). | render |
| fresh | No | When true, bypass cached scrape results (default false). | |
| format | No | Primary body field returned: markdown (default), plain text, or raw HTML. | markdown |
| options | No | Deprecated — use `advanced` instead (same ScrapeOptions shape). Scheduled for removal in a future API semver bump. | |
| advanced | No | Browser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| title | No | |
| billed | No | |
| status | No | |
| markdown | No | |
| status_code | No | |
| cache_status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses per-mode latency budgets, that `fresh` bypasses cache, that `options` is deprecated in favour of `advanced`, and the edge case that bot-check or empty extractions can return billed: false with a hint. That is substantive behavioral context the agent could not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and output, then parameters and routing; nearly every clause carries information. It is dense in a single block, and the parenthetical output-field list is slightly redundant given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter scrape tool with an output schema present, the description covers rendering depth, latency budget, caching, auth, deprecation, and failure modes — nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description still adds meaning by mapping mode to concrete time budgets (15/30/60 s), enumerating which knobs live in `advanced` (scroll, wait_for, js_code, headers, cookies, auth), and calling out the deprecated `options` alias.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Load a public URL in headless Chromium') and names the exact return artifacts, so it is immediately distinguishable from readfetch_fetch and readfetch_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: 'Prefer readfetch_text when JavaScript is not required; readfetch_fetch for raw HTTP/API bytes; readfetch_residential when the site blocks datacentre IPs; readfetch_screenshot for a PNG/JPEG.' Each alternative comes with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_screenshotARead-only
Capture a public URL in headless Chromium and return PNG or JPEG as JSON (image_base64, mime, width, height, status_code, billed) — not a hosted URL. Scope: viewport (full_page: false), the full scrollable page (default), or one element (selector). mode is the whole-call budget: fast (15 s), render (30 s, default), or full (60 s, always full-page). Set width/height before navigation (default 1280×800); use delay_ms after load for SPAs and lazy media. Prefer readfetch_text or readfetch_scrape for readable text, readfetch_pdf for PDF documents, readfetch_fetch for raw HTTP. Blank or bot-check frames may still include an image but billed: false with a hint; paid x402 like other routes.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL to render in headless Chromium. | |
| mode | No | Whole-call budget: fast (15 s), render (30 s, default), or full (60 s; always captures the full scrollable page). | render |
| width | No | Viewport width in pixels before navigation (default 1280, max 3840). | |
| format | No | Image encoding for `image_base64` (png default, or jpeg). | png |
| height | No | Viewport height in pixels before navigation (default 800, max 2160). | |
| delay_ms | No | Milliseconds to wait after navigation before capture (0–30000); use for SPAs and lazy-loaded content. | |
| selector | No | CSS selector — capture that element's box only. Omit for page/viewport per full_page. | |
| full_page | No | true (default): entire scrollable document; false: viewport only. Ignored when mode=full. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| hint | No | |
| mime | No | |
| size | No | |
| width | No | |
| billed | No | |
| format | No | |
| height | No | |
| status | No | |
| status_code | No | |
| image_base64 | No | |
| content_sha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: budget semantics per mode, viewport-before-navigation ordering, full_page being ignored under mode=full, billing behavior on blank/bot-check frames (billed: false plus a hint), and that payment is x402 like other routes. Annotations already cover read-only/open-world, so the remaining gap is minor (e.g., no rate limits or size caps on the returned image).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the crucial 'returns base64, not a URL' fact, then scope, then budget, then siblings. Dense and nearly waste-free, though the parenthetical output-field enumeration overlaps what the output schema already declares.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, open-world capture tool with an output schema and annotations, everything needed to call it correctly is present: scope selection, timing budget, delay guidance, billing caveats, and sibling routing. The output schema handles the return contract, so no further return documentation is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds cross-parameter meaning the schema does not: width/height must be set before navigation, mode acts as a whole-call budget, and delay_ms is specifically for SPAs and lazy content. This is genuine value-add beyond the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Capture a public URL in headless Chromium') and immediately pins the return shape (PNG/JPEG as JSON with base64, not a hosted URL). It explicitly differentiates itself from five siblings by naming them, so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit branching alternatives: readfetch_text/scrape for readable text, readfetch_pdf for PDFs, readfetch_fetch for raw HTTP. Also states when to use delay_ms (SPAs, lazy media) and the scope options (viewport, full page, selector element).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_searchARead-only
Run a web search without a separate search API subscription. Returns titles, URLs, and snippets only — not full page text; follow with readfetch_text, readfetch_probe, or readfetch_scrape on a chosen result URL. limit is 1–20 (default 5). Optional lang biases locale (e.g. en, de-DE). Optional tbs filters recency: h= past hour, d= day, w= week, m= month, y= year. Use readfetch_map/readfetch_crawl when you already know the site; readfetch_* URL tools when you have the link.
| Name | Required | Description | Default |
|---|---|---|---|
| tbs | No | Optional recency filter: h=hour, d=day, w=week, m=month, y=year. | |
| lang | No | Optional language/locale hint, e.g. en or de-DE. | |
| limit | No | Maximum number of results to return (default 5). | |
| query | Yes | Search query string. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| query | No | |
| billed | No | |
| status | No | |
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world behavior, and the description adds genuinely useful context beyond them: no separate search API subscription is required, results are limited to titles/URLs/snippets rather than page text, and follow-up tools are required for full content. It also documents the recency filter semantics and result limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and output limitation, then provides usage routing. It is generally efficient, but some parameter detail duplicates the schema and could be trimmed without losing necessary guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, annotations, and full schema coverage, the description supplies everything an agent needs: purpose, output scope, parameter behavior, and sibling-tool routing. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meanings are already fully documented in the schema. The description restates limit, lang, and tbs semantics, which is helpful but largely redundant; it adds examples for lang and expands tbs values, but does not add meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: run a web search. It immediately distinguishes this from full-page retrieval tools by saying it returns titles, URLs, and snippets only, not full page text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: follow with readfetch_text, readfetch_probe, or readfetch_scrape on a chosen URL. It also names alternatives for known-site tasks (readfetch_map/readfetch_crawl) and link-based tasks (readfetch_* URL tools), so when-to-use and when-to-use-something-else are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_sectionARead-only
Extract one heading or one CSS selector from a public page instead of the whole document. Returns matched Markdown or text, title, chars, content_sha256, and billed. If the heading is missing, returns HTTP 200 with empty text and available_headings so you can retry. mode: fast (plain HTTP) or render (default, Chromium when the page blocks HTTP). max_chars truncates output (default 8000, max 20000). Prefer readfetch_text for full articles; readfetch_scrape when content needs JavaScript.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public page URL to extract from. | |
| mode | No | fast = HTTP-first; render = one browser pass when plain HTTP fails (default). | render |
| format | No | Output flavour for the matched section (markdown default). | markdown |
| heading | No | Case-insensitive, whitespace-normalised. | |
| selector | No | CSS selector; up to 20 matches concatenated. | |
| max_chars | No | Truncate matched text after this many characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| hint | No | |
| text | No | |
| chars | No | |
| title | No | |
| billed | No | |
| status | No | |
| matched | No | |
| status_code | No | |
| used_browser | No | |
| content_sha256 | No | |
| available_headings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds substantial context beyond them: the returned fields (Markdown/text, title, chars, content_sha256, billed), the missing-heading case returning HTTP 200 with empty text and available_headings for retry, and the max_chars truncation and billing implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, all front-loaded with the core action and the retry/fallback behavior before the sibling routing. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description still covers the key edge cases (missing heading, blocked HTTP, truncation) so an agent can call and recover correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description still adds useful semantics for mode (Chromium fallback only on HTTP block), max_chars default/max, and the retry-oriented behavior of heading. Most parameter detail is duplicated from the schema, but the mode and truncation explanations add real value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb (extract) and resource (one heading or one CSS selector) and explicitly contrasts it with the whole-document alternative. An agent can distinguish it from readfetch_text/readfetch_scrape without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Prefer readfetch_text for full articles; readfetch_scrape when content needs JavaScript.' It also gives the mode tradeoff (fast vs render default), so when-to-use is fully specified alongside the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readfetch_textARead-only
Fetch a public URL and return its main readable content as Markdown or plain text, plus title, author, published date and site name. Strips navigation, ads and boilerplate. No JavaScript rendering by default (cheaper than readfetch_scrape); one Chromium fallback when plain HTTP is blocked. Prefer readfetch_fetch when you need raw status, headers, or non-HTML bytes; readfetch_scrape when the article only appears after JavaScript runs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL to read. | |
| format | No | Output flavour: Markdown keeps headings, lists and tables. | markdown |
| max_bytes | No | Abort if the response body exceeds this many bytes. | |
| timeout_s | No | Total budget for the whole call in seconds: DNS, redirects, the render fallback and any retry share it. | |
| accept_language | No | Accept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| size | No | |
| text | No | |
| title | No | |
| format | No | |
| status | No | |
| metadata | No | |
| status_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the real behavioral burden and does so: content stripping (nav/ads/boilerplate), no JS rendering by default, one Chromium fallback on block, and a relative cost signal versus readfetch_scrape. That is material context an agent cannot infer from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, front-loaded with the outcome and return shape, then cost/fallback behavior, then sibling routing. Every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-values burden is already met; the description still names the key metadata fields for orientation. For a read-only, open-world fetch tool, nothing an agent needs in order to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a descriptive string, so the baseline is 3. The description only restates the output format choice (Markdown vs text) and adds nothing on max_bytes, timeout_s, or accept_language beyond what the schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('fetch a public URL and return its main readable content') plus the concrete return payload: Markdown/text, title, author, date, site name. The parenthetical contrast with readfetch_scrape ('cheaper than') and the explicit sibling references make the boundary unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use readfetch_fetch for raw status/headers/non-HTML bytes, readfetch_scrape when the article only renders after JavaScript. It also states the default operating mode (no JS) and that a single Chromium fallback occurs when plain HTTP is blocked, so the agent knows both when to pick this tool and what it will silently do.
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.
14 tool updates
v0.1.13- Changed
readfetch_batch4 fields changed- added
Input schema / properties / accept_language / descriptionAdded value: +"Accept-Language header for every item, e.g. 'de-DE,de;q=0.9'. Defaults to en-US when omitted." - added
Input schema / properties / format / descriptionAdded value: +"Per-item output flavour, same as /v1/text: markdown (default) or plain text." - added
Input schema / properties / fresh / descriptionAdded value: +"When true, bypass cached responses for each item (default false)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed_pages": { + "type": "integer" + }, + "credit": { + "type": "string" + }, + "delivered": { + "type": "integer" + }, + "failed": { + "type": "integer" + }, + "results": { + "items": { + "properties": { + "billed": { + "type": "boolean" + }, + "content_sha256": { + "type": "string" + }, + "hint": { + "type": "null" + }, + "requested_url": { + "format": "uri", + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + }, + "used_browser": { + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" + }, + "status": { + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_crawl6 fields changed- added
Input schema / properties / exclude / descriptionAdded value: +"Path prefixes to skip during the crawl." - changed
Input schema / properties / include / descriptionPrevious value: -"Path prefixes; * suffix wildcard."New value: +"Path prefixes to allow; * suffix wildcard." - added
Input schema / properties / max_depth / descriptionAdded value: +"Link depth from the seed URL (default 2)." - added
Input schema / properties / max_pages / descriptionAdded value: +"Maximum pages to fetch in this job (quoted up front for payment)." - added
Input schema / properties / url / descriptionAdded value: +"Seed URL; crawl stays on the same registrable domain." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "hint": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "pages_quoted": { + "type": "integer" + }, + "price_usd": { + "type": "number" + }, + "status": { + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_crawl_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "completed": { + "type": "integer" + }, + "job_id": { + "type": "string" + }, + "pages": { + "items": {}, + "type": "array" + }, + "status": { + "type": "string" + }, + "total": { + "type": "integer" + } + }, + "type": "object" +}
- Changed
readfetch_diff1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "added": { + "items": { + "type": "string" + }, + "type": "array" + }, + "billed": { + "type": "boolean" + }, + "changed": { + "type": "boolean" + }, + "diff": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "hint": { + "type": "null" + }, + "removed": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_fetch9 fields changed- added
Input schema / properties / binary / descriptionAdded value: +"When true, return body as base64 instead of UTF-8 text." - added
Input schema / properties / body / descriptionAdded value: +"Raw request body string for POST/PUT/PATCH (mutually exclusive with json_body)." - added
Input schema / properties / follow_redirects / descriptionAdded value: +"Follow 3xx redirects (default true)." - added
Input schema / properties / headers / descriptionAdded value: +"Optional request headers, e.g. Authorization or Accept." - added
Input schema / properties / json_body / descriptionAdded value: +"JSON object serialized as the request body (Content-Type application/json)." - added
Input schema / properties / max_bytes / descriptionAdded value: +"Stop reading and truncate once the response body exceeds this size (bytes)." - added
Input schema / properties / method / descriptionAdded value: +"HTTP method (GET default)." - added
Input schema / properties / url / descriptionAdded value: +"Request URL (http or https)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "content_type": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_map1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "feeds": { + "items": { + "format": "uri", + "type": "string" + }, + "type": "array" + }, + "host": { + "type": "string" + }, + "links": { + "properties": { + "external": { + "type": "integer" + }, + "internal": { + "type": "integer" + } + }, + "type": "object" + }, + "robots": { + "properties": { + "allow": { + "items": {}, + "type": "array" + }, + "crawl_delay": { + "type": "null" + }, + "disallow": { + "items": { + "type": "string" + }, + "type": "array" + }, + "sitemaps": { + "items": { + "format": "uri", + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "sitemaps": { + "items": { + "format": "uri", + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "total_found": { + "type": "integer" + }, + "url": { + "format": "uri", + "type": "string" + }, + "url_count": { + "type": "integer" + }, + "urls": { + "items": { + "format": "uri", + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
readfetch_pdf5 fields changed- changed
Input schema / properties / content_base64 / descriptionPrevious value: -"Inline PDF, up to 20 MB."New value: +"Base64-encoded PDF bytes (≤ 20 MB). Mutually exclusive with url; pair with filename when the label matters." - added
Input schema / properties / filename / descriptionAdded value: +"Optional label when using content_base64 (default upload.pdf); ignored for url-only requests." - added
Input schema / properties / max_pages / descriptionAdded value: +"Extract at most this many pages. Default 50; raise up to 200 when the document is longer. Over cap → 413, unbilled." - changed
Input schema / properties / url / descriptionPrevious value: -"PDF URL, fetched through egress."New value: +"Public PDF URL; fetched through egress (≤ 20 MB). Mutually exclusive with content_base64." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed": { + "type": "boolean" + }, + "content_sha256": { + "type": "string" + }, + "hint": { + "type": "null" + }, + "markdown": { + "type": "string" + }, + "metadata": { + "properties": { + "author": { + "type": "string" + }, + "created": { + "type": "string" + }, + "producer": { + "type": "string" + } + }, + "type": "object" + }, + "page_count": { + "type": "integer" + }, + "pages": { + "items": { + "properties": { + "page": { + "type": "integer" + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "source": { + "format": "uri", + "type": "string" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_probe1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed": { + "type": "boolean" + }, + "bytes": { + "type": "integer" + }, + "challenge": { + "type": "boolean" + }, + "content_sha256": { + "type": "string" + }, + "content_type": { + "type": "string" + }, + "language": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "redirected": { + "type": "boolean" + }, + "requested_url": { + "format": "uri", + "type": "string" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_residential7 fields changed- added
Input schema / properties / advanced / descriptionAdded value: +"Browser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc." - added
Input schema / properties / auth / descriptionAdded value: +"Optional cookie, bearer, or basic auth for the page load." - added
Input schema / properties / format / descriptionAdded value: +"Primary body field returned: markdown (default), plain text, or raw HTML." - added
Input schema / properties / fresh / descriptionAdded value: +"When true, bypass cached scrape results (default false)." - added
Input schema / properties / mode / descriptionAdded value: +"Whole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll)." - added
Input schema / properties / url / descriptionAdded value: +"Public http(s) URL to load in Chromium." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed": { + "type": "boolean" + }, + "cache_status": { + "type": "string" + }, + "markdown": { + "type": "string" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_scrape7 fields changed- added
Input schema / properties / advanced / descriptionAdded value: +"Browser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc." - added
Input schema / properties / auth / descriptionAdded value: +"Optional cookie, bearer, or basic auth for the page load." - added
Input schema / properties / format / descriptionAdded value: +"Primary body field returned: markdown (default), plain text, or raw HTML." - added
Input schema / properties / fresh / descriptionAdded value: +"When true, bypass cached scrape results (default false)." - added
Input schema / properties / mode / descriptionAdded value: +"Whole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll)." - added
Input schema / properties / url / descriptionAdded value: +"Public http(s) URL to load in Chromium." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed": { + "type": "boolean" + }, + "cache_status": { + "type": "string" + }, + "markdown": { + "type": "string" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_screenshot9 fields changed- added
Input schema / properties / delay_ms / descriptionAdded value: +"Milliseconds to wait after navigation before capture (0–30000); use for SPAs and lazy-loaded content." - added
Input schema / properties / format / descriptionAdded value: +"Image encoding for `image_base64` (png default, or jpeg)." - added
Input schema / properties / full_page / descriptionAdded value: +"true (default): entire scrollable document; false: viewport only. Ignored when mode=full." - added
Input schema / properties / height / descriptionAdded value: +"Viewport height in pixels before navigation (default 800, max 2160)." - added
Input schema / properties / mode / descriptionAdded value: +"Whole-call budget: fast (15 s), render (30 s, default), or full (60 s; always captures the full scrollable page)." - changed
Input schema / properties / selector / descriptionPrevious value: -"Capture one element."New value: +"CSS selector — capture that element's box only. Omit for page/viewport per full_page." - added
Input schema / properties / url / descriptionAdded value: +"Public http(s) URL to render in headless Chromium." - added
Input schema / properties / width / descriptionAdded value: +"Viewport width in pixels before navigation (default 1280, max 3840)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed": { + "type": "boolean" + }, + "content_sha256": { + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "hint": { + "type": "null" + }, + "image_base64": { + "type": "string" + }, + "mime": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "url": { + "format": "uri", + "type": "string" + }, + "width": { + "type": "integer" + } + }, + "type": "object" +}
- Changed
readfetch_search5 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"e.g. en, de-DE"New value: +"Optional language/locale hint, e.g. en or de-DE." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of results to return (default 5)." - added
Input schema / properties / query / descriptionAdded value: +"Search query string." - changed
Input schema / properties / tbs / descriptionPrevious value: -"Time range."New value: +"Optional recency filter: h=hour, d=day, w=week, m=month, y=year." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "billed": { + "type": "boolean" + }, + "hint": { + "type": "null" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "properties": { + "position": { + "type": "integer" + }, + "snippet": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "status": { + "type": "string" + } + }, + "type": "object" +}
- Changed
readfetch_section5 fields changed- added
Input schema / properties / format / descriptionAdded value: +"Output flavour for the matched section (markdown default)." - added
Input schema / properties / max_chars / descriptionAdded value: +"Truncate matched text after this many characters." - added
Input schema / properties / mode / descriptionAdded value: +"fast = HTTP-first; render = one browser pass when plain HTTP fails (default)." - added
Input schema / properties / url / descriptionAdded value: +"Public page URL to extract from." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "available_headings": { + "items": { + "type": "string" + }, + "type": "array" + }, + "billed": { + "type": "boolean" + }, + "chars": { + "type": "integer" + }, + "content_sha256": { + "type": "string" + }, + "hint": { + "type": "null" + }, + "matched": { + "properties": { + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "level": { + "type": "integer" + } + }, + "type": "object" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + }, + "used_browser": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
readfetch_text1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "format": { + "type": "string" + }, + "metadata": { + "properties": { + "author": { + "type": "string" + }, + "date": { + "type": "string" + }, + "sitename": { + "type": "string" + } + }, + "type": "object" + }, + "size": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "status_code": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +}
1 tool update
v0.1.12- Changed
readfetch_diff3 fields changed- added
Input schema / properties / timeout_s / defaultAdded value: +30 - added
Input schema / properties / timeout_s / descriptionAdded value: +"Total budget for the whole call in seconds, both fetches included. 60 s is the ceiling on this route." - changed
Input schema / properties / timeout_s / maximumPrevious value: -120New value: +60
15 tool updates
v0.1.0- First observed
readfetch_batch - First observed
readfetch_crawl - First observed
readfetch_crawl_status - First observed
readfetch_diff - First observed
readfetch_feedback - First observed
readfetch_fetch - First observed
readfetch_map - First observed
readfetch_pdf - First observed
readfetch_probe - First observed
readfetch_residential - First observed
readfetch_scrape - First observed
readfetch_screenshot - First observed
readfetch_search - First observed
readfetch_section - First observed
readfetch_text
TDQS
Scored across 15 tools
Descriptions explicitly route the agent between overlapping extraction tools (text = no JS, scrape = Chromium render, residential = IP-blocked sites, section = single selector, batch = many URLs), which resolves most ambiguity. Some boundary cases remain (text vs scrape vs residential on a JS-heavy blocked site), but the 'prefer X when Y' guidance is unusually explicit.
Every tool uses the readfetch_ prefix followed by a lowercase snake_case noun (text, scrape, fetch, batch, pdf, screenshot, search, crawl, crawl_status, probe, feedback). The pattern is uniform and predictable, with the nested crawl_status being the only compound and it reads naturally.
15 tools sits at the top of the well-scoped range but each maps to a distinct capability of a scraping proxy (discovery, extraction variants, rendering, raw HTTP, utilities). Nothing appears redundant enough to cut without losing a real use case.
The surface covers the full pipeline: discovery (map, search, probe), extraction (text, scrape, section, batch, pdf), crawling (crawl + crawl_status), raw HTTP, screenshots, and change detection. Minor gaps exist—no crawl cancel/delete, no structured/schema extraction, and the referenced claims/refund route is not exposed as a tool—but agents can work around these.
Maintenance
Related MCP Connectors
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Paid MCP tools behind one endpoint. Agents pay per call in USDC on Base via x402.
Pay-per-action access to APIs and MCP tools over Lightning L402 and Base USDC x402.
8 pay-per-call web intel tools over MCP. Free discovery, calls settle in USDC on Base (x402).
Related MCP Servers
- AlicenseBqualityFmaintenanceA Model Context Protocol server that provides browser automation capabilities using Playwright. This server enables LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment.3212,730 npm5,675MIT
- AlicenseNot gradedqualityCmaintenanceA local MCP proxy that connects to remote MCP servers and automatically handles x402 payments, signing USDC on-chain when a tool returns HTTP 402.17 npm1MIT
- AlicenseAqualityFmaintenanceEnables MCP clients to access all endpoints of an x402 gateway by paying real-time microtransactions (USDC on Base) per API call, with automatic tool discovery and spend guardrails.2352 npmMIT
- AlicenseNot gradedqualityFmaintenanceMCP server that lets AI agents scrape web pages as clean markdown for a micro-payment in USDC, using the x402 protocol on Base network. No API keys or signup required.MIT