Skip to main content
Glama

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.

Ownership verified
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A4.1/5.0

Scored across 15 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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 tools
readfetch_batchA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlsYesURLs to read, deduped before quoting.
freshNoWhen true, bypass cached responses for each item (default false).
formatNoPer-item output flavour, same as /v1/text: markdown (default) or plain text.markdown
pipelineNotext = HTTP-first; render needs the browser tier.text
timeout_sNoTotal budget for the whole batch in seconds; every item shares it and no item restarts it.
accept_languageNoAccept-Language header for every item, e.g. 'de-DE,de;q=0.9'. Defaults to en-US when omitted.

Output Schema

NameRequiredDescription
creditNo
failedNo
statusNo
resultsNo
deliveredNo
billed_pagesNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description 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.

Purpose5/5

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.

Usage Guidelines5/5

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_crawlA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesSeed URL; crawl stays on the same registrable domain.
excludeNoPath prefixes to skip during the crawl.
includeNoPath prefixes to allow; * suffix wildcard.
max_depthNoLink depth from the seed URL (default 2).
max_pagesNoMaximum pages to fetch in this job (quoted up front for payment).

Output Schema

NameRequiredDescription
hintNo
job_idNo
statusNo
price_usdNo
pages_quotedNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_statusA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
idNoJob id returned by POST /v1/crawl.

Output Schema

NameRequiredDescription
pagesNo
totalNo
job_idNo
statusNo
completedNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_diffA
Read-only
Inspect

Stateless change detection: send the hash you hold, get changed/unchanged and a bounded diff. A no-change answer is billable.

NameRequiredDescriptionDefault
urlYes
formatNotext
timeout_sNoTotal budget for the whole call in seconds, both fetches included. 60 s is the ceiling on this route.
previous_hashNosha256:... from a previous call.
previous_contentNoPrevious text, for an added/removed diff.

Output Schema

NameRequiredDescription
urlNo
diffNo
hashNo
hintNo
addedNo
billedNo
statusNo
changedNo
removedNo
status_codeNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
messageYes
categoryYes
request_idYesX-Request-Id from the call you are reporting.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_fetchA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesRequest URL (http or https).
bodyNoRaw request body string for POST/PUT/PATCH (mutually exclusive with json_body).
binaryNoWhen true, return body as base64 instead of UTF-8 text.
methodNoHTTP method (GET default).GET
headersNoOptional request headers, e.g. Authorization or Accept.
json_bodyNoJSON object serialized as the request body (Content-Type application/json).
max_bytesNoStop reading and truncate once the response body exceeds this size (bytes).
timeout_sNoTotal budget for the whole call in seconds, redirect hops included.
follow_redirectsNoFollow 3xx redirects (default true).

Output Schema

NameRequiredDescription
urlNo
sizeNo
textNo
statusNo
status_codeNo
content_typeNo

TDQS

A4.1/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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_mapA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL of the site to map.
limitNoMaximum number of URLs to return (1-1000).
max_bytesNoAbort if any single document exceeds this many bytes.
timeout_sNoTotal 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

NameRequiredDescription
urlNo
hostNo
urlsNo
feedsNo
linksNo
robotsNo
statusNo
sitemapsNo
url_countNo
status_codeNo
total_foundNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_pdfA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlNoPublic PDF URL; fetched through egress (≤ 20 MB). Mutually exclusive with content_base64.
filenameNoOptional label when using content_base64 (default upload.pdf); ignored for url-only requests.
max_pagesNoExtract at most this many pages. Default 50; raise up to 200 when the document is longer. Over cap → 413, unbilled.
content_base64NoBase64-encoded PDF bytes (≤ 20 MB). Mutually exclusive with url; pair with filename when the label matters.

Output Schema

NameRequiredDescription
hintNo
pagesNo
titleNo
billedNo
sourceNo
statusNo
markdownNo
metadataNo
page_countNo
content_sha256No

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_probeA
Read-only
Inspect

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).

NameRequiredDescriptionDefault
urlYesPublic http(s) URL to inspect.
timeout_sNoTotal budget for the whole call in seconds.
accept_languageNoAccept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US.

Output Schema

NameRequiredDescription
urlNo
bytesNo
titleNo
billedNo
statusNo
previewNo
languageNo
challengeNo
redirectedNo
status_codeNo
content_typeNo
requested_urlNo
content_sha256No

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_residentialA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL to load in Chromium.
authNoOptional cookie, bearer, or basic auth for the page load.
modeNoWhole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll).render
freshNoWhen true, bypass cached scrape results (default false).
formatNoPrimary body field returned: markdown (default), plain text, or raw HTML.markdown
optionsNoDeprecated — use `advanced` instead (same ScrapeOptions shape). Scheduled for removal in a future API semver bump.
advancedNoBrowser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc.

Output Schema

NameRequiredDescription
urlNo
titleNo
billedNo
statusNo
markdownNo
status_codeNo
cache_statusNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_scrapeA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL to load in Chromium.
authNoOptional cookie, bearer, or basic auth for the page load.
modeNoWhole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll).render
freshNoWhen true, bypass cached scrape results (default false).
formatNoPrimary body field returned: markdown (default), plain text, or raw HTML.markdown
optionsNoDeprecated — use `advanced` instead (same ScrapeOptions shape). Scheduled for removal in a future API semver bump.
advancedNoBrowser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc.

Output Schema

NameRequiredDescription
urlNo
titleNo
billedNo
statusNo
markdownNo
status_codeNo
cache_statusNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3; the description 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.

Purpose5/5

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.

Usage Guidelines5/5

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_screenshotA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL to render in headless Chromium.
modeNoWhole-call budget: fast (15 s), render (30 s, default), or full (60 s; always captures the full scrollable page).render
widthNoViewport width in pixels before navigation (default 1280, max 3840).
formatNoImage encoding for `image_base64` (png default, or jpeg).png
heightNoViewport height in pixels before navigation (default 800, max 2160).
delay_msNoMilliseconds to wait after navigation before capture (0–30000); use for SPAs and lazy-loaded content.
selectorNoCSS selector — capture that element's box only. Omit for page/viewport per full_page.
full_pageNotrue (default): entire scrollable document; false: viewport only. Ignored when mode=full.

Output Schema

NameRequiredDescription
urlNo
hintNo
mimeNo
sizeNo
widthNo
billedNo
formatNo
heightNo
statusNo
status_codeNo
image_base64No
content_sha256No

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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_sectionA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic page URL to extract from.
modeNofast = HTTP-first; render = one browser pass when plain HTTP fails (default).render
formatNoOutput flavour for the matched section (markdown default).markdown
headingNoCase-insensitive, whitespace-normalised.
selectorNoCSS selector; up to 20 matches concatenated.
max_charsNoTruncate matched text after this many characters.

Output Schema

NameRequiredDescription
urlNo
hintNo
textNo
charsNo
titleNo
billedNo
statusNo
matchedNo
status_codeNo
used_browserNo
content_sha256No
available_headingsNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_textA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL to read.
formatNoOutput flavour: Markdown keeps headings, lists and tables.markdown
max_bytesNoAbort if the response body exceeds this many bytes.
timeout_sNoTotal budget for the whole call in seconds: DNS, redirects, the render fallback and any retry share it.
accept_languageNoAccept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US.

Output Schema

NameRequiredDescription
urlNo
sizeNo
textNo
titleNo
formatNo
statusNo
metadataNo
status_codeNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ('fetch a public 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.

Usage Guidelines5/5

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.

  1. 14 tool updates
    • Changedreadfetch_batch4 fields changed
      • addedInput schema / properties / accept_language / description
        Added value: +"Accept-Language header for every item, e.g. 'de-DE,de;q=0.9'. Defaults to en-US when omitted."
      • addedInput schema / properties / format / description
        Added value: +"Per-item output flavour, same as /v1/text: markdown (default) or plain text."
      • addedInput schema / properties / fresh / description
        Added value: +"When true, bypass cached responses for each item (default false)."
      • changedOutput 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"
        +}
    • Changedreadfetch_crawl6 fields changed
      • addedInput schema / properties / exclude / description
        Added value: +"Path prefixes to skip during the crawl."
      • changedInput schema / properties / include / description
        Previous value: -"Path prefixes; * suffix wildcard."New value: +"Path prefixes to allow; * suffix wildcard."
      • addedInput schema / properties / max_depth / description
        Added value: +"Link depth from the seed URL (default 2)."
      • addedInput schema / properties / max_pages / description
        Added value: +"Maximum pages to fetch in this job (quoted up front for payment)."
      • addedInput schema / properties / url / description
        Added value: +"Seed URL; crawl stays on the same registrable domain."
      • changedOutput 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"
        +}
    • Changedreadfetch_crawl_status1 field changed
      • changedOutput 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"
        +}
    • Changedreadfetch_diff1 field changed
      • changedOutput 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"
        +}
    • Changedreadfetch_fetch9 fields changed
      • addedInput schema / properties / binary / description
        Added value: +"When true, return body as base64 instead of UTF-8 text."
      • addedInput schema / properties / body / description
        Added value: +"Raw request body string for POST/PUT/PATCH (mutually exclusive with json_body)."
      • addedInput schema / properties / follow_redirects / description
        Added value: +"Follow 3xx redirects (default true)."
      • addedInput schema / properties / headers / description
        Added value: +"Optional request headers, e.g. Authorization or Accept."
      • addedInput schema / properties / json_body / description
        Added value: +"JSON object serialized as the request body (Content-Type application/json)."
      • addedInput schema / properties / max_bytes / description
        Added value: +"Stop reading and truncate once the response body exceeds this size (bytes)."
      • addedInput schema / properties / method / description
        Added value: +"HTTP method (GET default)."
      • addedInput schema / properties / url / description
        Added value: +"Request URL (http or https)."
      • changedOutput 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"
        +}
    • Changedreadfetch_map1 field changed
      • changedOutput 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"
        +}
    • Changedreadfetch_pdf5 fields changed
      • changedInput schema / properties / content_base64 / description
        Previous 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."
      • addedInput schema / properties / filename / description
        Added value: +"Optional label when using content_base64 (default upload.pdf); ignored for url-only requests."
      • addedInput schema / properties / max_pages / description
        Added value: +"Extract at most this many pages. Default 50; raise up to 200 when the document is longer. Over cap → 413, unbilled."
      • changedInput schema / properties / url / description
        Previous value: -"PDF URL, fetched through egress."New value: +"Public PDF URL; fetched through egress (≤ 20 MB). Mutually exclusive with content_base64."
      • changedOutput 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"
        +}
    • Changedreadfetch_probe1 field changed
      • changedOutput 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"
        +}
    • Changedreadfetch_residential7 fields changed
      • addedInput schema / properties / advanced / description
        Added value: +"Browser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc."
      • addedInput schema / properties / auth / description
        Added value: +"Optional cookie, bearer, or basic auth for the page load."
      • addedInput schema / properties / format / description
        Added value: +"Primary body field returned: markdown (default), plain text, or raw HTML."
      • addedInput schema / properties / fresh / description
        Added value: +"When true, bypass cached scrape results (default false)."
      • addedInput schema / properties / mode / description
        Added value: +"Whole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll)."
      • addedInput schema / properties / url / description
        Added value: +"Public http(s) URL to load in Chromium."
      • changedOutput 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"
        +}
    • Changedreadfetch_scrape7 fields changed
      • addedInput schema / properties / advanced / description
        Added value: +"Browser interactions: scroll, wait_for selector, js_code, headers, cookies, locale, include_links, etc."
      • addedInput schema / properties / auth / description
        Added value: +"Optional cookie, bearer, or basic auth for the page load."
      • addedInput schema / properties / format / description
        Added value: +"Primary body field returned: markdown (default), plain text, or raw HTML."
      • addedInput schema / properties / fresh / description
        Added value: +"When true, bypass cached scrape results (default false)."
      • addedInput schema / properties / mode / description
        Added value: +"Whole-call budget and render depth: fast (15 s), render (30 s, default), or full (60 s with page scroll)."
      • addedInput schema / properties / url / description
        Added value: +"Public http(s) URL to load in Chromium."
      • changedOutput 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"
        +}
    • Changedreadfetch_screenshot9 fields changed
      • addedInput schema / properties / delay_ms / description
        Added value: +"Milliseconds to wait after navigation before capture (0–30000); use for SPAs and lazy-loaded content."
      • addedInput schema / properties / format / description
        Added value: +"Image encoding for `image_base64` (png default, or jpeg)."
      • addedInput schema / properties / full_page / description
        Added value: +"true (default): entire scrollable document; false: viewport only. Ignored when mode=full."
      • addedInput schema / properties / height / description
        Added value: +"Viewport height in pixels before navigation (default 800, max 2160)."
      • addedInput schema / properties / mode / description
        Added value: +"Whole-call budget: fast (15 s), render (30 s, default), or full (60 s; always captures the full scrollable page)."
      • changedInput schema / properties / selector / description
        Previous value: -"Capture one element."New value: +"CSS selector — capture that element's box only. Omit for page/viewport per full_page."
      • addedInput schema / properties / url / description
        Added value: +"Public http(s) URL to render in headless Chromium."
      • addedInput schema / properties / width / description
        Added value: +"Viewport width in pixels before navigation (default 1280, max 3840)."
      • changedOutput 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"
        +}
    • Changedreadfetch_search5 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"e.g. en, de-DE"New value: +"Optional language/locale hint, e.g. en or de-DE."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results to return (default 5)."
      • addedInput schema / properties / query / description
        Added value: +"Search query string."
      • changedInput schema / properties / tbs / description
        Previous value: -"Time range."New value: +"Optional recency filter: h=hour, d=day, w=week, m=month, y=year."
      • changedOutput 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"
        +}
    • Changedreadfetch_section5 fields changed
      • addedInput schema / properties / format / description
        Added value: +"Output flavour for the matched section (markdown default)."
      • addedInput schema / properties / max_chars / description
        Added value: +"Truncate matched text after this many characters."
      • addedInput schema / properties / mode / description
        Added value: +"fast = HTTP-first; render = one browser pass when plain HTTP fails (default)."
      • addedInput schema / properties / url / description
        Added value: +"Public page URL to extract from."
      • changedOutput 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"
        +}
    • Changedreadfetch_text1 field changed
      • changedOutput 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"
        +}
  2. 1 tool update
    • Changedreadfetch_diff3 fields changed
      • addedInput schema / properties / timeout_s / default
        Added value: +30
      • addedInput schema / properties / timeout_s / description
        Added value: +"Total budget for the whole call in seconds, both fetches included. 60 s is the ceiling on this route."
      • changedInput schema / properties / timeout_s / maximum
        Previous value: -120New value: +60
  3. 12 tool updates
    • Changedreadfetch_batch1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_crawl1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_diff1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_fetch2 fields changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
      • removedInput schema / properties / egress_fallback
        Removed 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"
        -}
    • Changedreadfetch_map2 fields changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
      • removedInput schema / properties / egress_fallback
        Removed 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"
        -}
    • Changedreadfetch_pdf1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_probe1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_scrape2 fields changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
      • removedInput schema / properties / egress_fallback
        Removed 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"
        -}
    • Changedreadfetch_screenshot1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_search1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_section1 field changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
    • Changedreadfetch_text2 fields changed
      • removedInput schema / properties / egress
        Removed 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"
        -}
      • removedInput schema / properties / egress_fallback
        Removed 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"
        -}
  4. 15 tool updates
    • First observedreadfetch_batch
    • First observedreadfetch_crawl
    • First observedreadfetch_crawl_status
    • First observedreadfetch_diff
    • First observedreadfetch_feedback
    • First observedreadfetch_fetch
    • First observedreadfetch_map
    • First observedreadfetch_pdf
    • First observedreadfetch_probe
    • First observedreadfetch_residential
    • First observedreadfetch_scrape
    • First observedreadfetch_screenshot
    • First observedreadfetch_search
    • First observedreadfetch_section
    • First observedreadfetch_text

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote 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
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    16
    18 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources