ReadFetch
Server Details
Pay-per-call web reading for AI agents over x402 — no account, no API key, billed only when content is delivered, with signed provenance on every paid response. Start free with POST /v1/probe.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 15 tools
Several tools orbit the same 'get a page' idea (text, scrape, fetch, section, residential, probe), which invites misselection. But each description explicitly states its boundary and cross-references siblings ('Prefer readfetch_text when JavaScript is not required; readfetch_fetch for raw HTTP'), so an attentive agent can pick correctly.
All tools share a uniform readfetch_ snake_case prefix, so no style mixing. The suffix convention mixes verbs (fetch, scrape, probe) with output nouns (text, pdf, screenshot, section) rather than a strict verb_noun pattern, but it is predictable and readable.
15 tools fit a rich multi-capability scraping server, with only one or two that feel secondary (readfetch_section, readfetch_diff). Within the healthy 3-15 band at its upper edge, each tool maps to a distinct capability.
Coverage spans discovery (map), async crawling with status polling, single/batch extraction, JS rendering, proxy routing, PDF, screenshot, search and raw HTTP. The only clear gaps are crawl job management (no cancel) and no structured/schema extraction tool.
Available Tools
15 toolsreadfetch_batchARead-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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_feedbackAInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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-onlyInspect
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
- 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
- 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
12 tool updates
- Changed
readfetch_batch1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_crawl1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_diff1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_fetch2 fields changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -} - removed
Input schema / properties / egress_fallbackRemoved value: -{ - "description": "Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.", - "title": "Egress Fallback", - "type": "string" -}
- Changed
readfetch_map2 fields changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -} - removed
Input schema / properties / egress_fallbackRemoved value: -{ - "description": "Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.", - "title": "Egress Fallback", - "type": "string" -}
- Changed
readfetch_pdf1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_probe1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_scrape2 fields changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -} - removed
Input schema / properties / egress_fallbackRemoved value: -{ - "description": "Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.", - "title": "Egress Fallback", - "type": "string" -}
- Changed
readfetch_screenshot1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_search1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_section1 field changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -}
- Changed
readfetch_text2 fields changed- removed
Input schema / properties / egressRemoved value: -{ - "description": "Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.", - "title": "Egress", - "type": "string" -} - removed
Input schema / properties / egress_fallbackRemoved value: -{ - "description": "Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.", - "title": "Egress Fallback", - "type": "string" -}
15 tool updates
- 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
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm55 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1618 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.