Skip to main content
Glama

Bintu Scrape Text

bintu_scrape_text
Read-onlyIdempotent

Fetch one public HTTP or HTTPS URL and return its readable text, sized for an LLM context window. Only HTML/XHTML pages up to 1 MiB are supported (PDF, JSON, images and pages that need JavaScript are not). Article or main content is preferred; navigation, headers, footers, ads and cookie banners are dropped, repeated story blocks are removed (deduplicated_count), links appear as 'label (url)', code is returned in fenced blocks with indentation kept, and tables are pipe-delimited. Modes: scrape (default) returns the text trimmed to max_tokens; chunk splits it into chunks that each fit max_tokens (headings stay with their text, table header rows repeat in continuation chunks, and one indivisible unit such as a very long table row can exceed the budget); summarize returns the leading lines and whole sentences that fit max_tokens (it is not an AI-written summary). Pages are read up to about 200,000 characters (roughly 50,000 tokens): truncated=true with limiting_factor=char_cap means that ceiling was hit, token_budget means max_tokens was. tokens and approx_tokens are approximate estimates (characters divided by 4), not tokenizer counts; tokens_saved_estimate is the source-HTML estimate minus the tokens delivered in this response. low_yield=true means a large page produced very little text, usually because it needs JavaScript or a login; see yield_hint. Results may come from a cache (cache_hit, cache_layer): set cache=false to bypass cache reads and persist=false to skip the persistent write; URLs with credential-like query parameters are never stored. robots.txt is honored. JavaScript rendering (render_js) works only if the operator enables it. Failures return isError=true with a code such as invalid_or_unsafe_url, upstream_access_denied, blocked_by_robots, payload_too_large or unsupported_media_type.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "bintu_scrape_text"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlYesAbsolute public HTTP or HTTPS URL to read. Private, loopback, link-local and metadata addresses, non-standard ports and URLs containing credentials are rejected with invalid_or_unsafe_url.
modeNoscrape: the page text trimmed to max_tokens. chunk: the whole page split into chunks that each fit max_tokens. summarize: the leading lines and whole sentences that fit max_tokens. 'chunked' is accepted as an alias for chunk.scrape
cacheNoRead from the memory and persistent caches (default true). false bypasses cache reads; a fresh result may still be written to the cache.
linksNoHow to represent hyperlinks in extracted text. inline preserves readable link URLs; footnotes uses numbered references and a link list; false removes URLs for the lowest-token output.inline
persistNoAllow a fresh result to be written to the persistent cache (default true). false skips that write; extraction and the short-lived memory cache are unchanged.
sectionsNoOptional heading selectors for scrape mode. Accepts either a newline-separated string (for example "Alpha\nBeta") or an array of strings (for example ["Alpha", "Beta"]). Whitespace and case are normalized for exact heading matching. Empty or whitespace-only selectors return invalid_arguments. Each selector must be 200 characters or fewer. When provided, the persistent and memory caches are bypassed for reads; a fresh extraction may still be written when persist is true.
render_jsNoRender the page in a browser before extraction. Available only if the operator enables it; otherwise render_js_disabled is returned and you should retry with false.
max_tokensNoEstimated-token budget, enforced in every mode: scrape trims to it, chunk makes each chunk fit it, summarize returns the leading text within it. Range 100 to 50000, default 6000. A single indivisible unit in chunk mode (for example one very long table row) can exceed it. Accepted alias: chunk_token_budget.
chunk_token_budgetNoAccepted alias for max_tokens; max_tokens wins on conflict. Range 100 to 50000.
footnote_url_policyNoFor links=footnotes only: full preserves complete URL destinations; truncated replaces over-limit destinations with non-clickable abbreviated text. Default: truncated.truncated
max_footnote_url_lengthNoFor links=footnotes only: maximum URL length for the visible label and, with the truncated policy, the destination. Positive integer. Default: 100.

Output Schema

NameRequiredDescriptionDefault
modeYesExtraction mode: scrape returns readable text; chunk splits it into budgeted chunks; summarize selects leading text within a budget. The accepted chunked alias normalizes to chunk.
splitYesTrue when content spans multiple chunks (chunk mode only; not truncation).
chunksYes
tokensYesCompatibility alias of approx_tokens.
cache_hitYesTrue when the response was served from memory or persistent cache.
low_yieldNoTrue when a large page produced very little text (often JavaScript-rendered or login-gated).
truncatedYesTrue when extracted content exceeded a limit and the returned text was shortened.
source_urlYesThe requested URL with sensitive-looking query parameters removed, safe for logs and display.
yield_hintNoPresent only when low_yield is true: a short suggestion for what to try next.
cache_layerYesWhich cache served the response: none, memory, or persistent.
chunk_countYesNumber of chunks in the chunks array (1 for scrape and summarize modes when not split).
html_tokensYesApproximate token count of the fetched source HTML, computed the same way as approx_tokens.
extracted_atYesUTC ISO 8601 timestamp of the extraction.
token_methodYesMethod used to compute approx_tokens: ceil(characters / 4).
approx_tokensYesApproximate token count of the returned text: ceil(characters / 4). An estimate, not a tokenizer count.
limiting_factorYesWhich limit bound the returned text: char_cap (extracted-text character ceiling) or token_budget (max_tokens), or none when no limit shortened the response.
deduplicated_countNoRepeated story blocks removed from the extracted text.
tokens_saved_estimateYesEstimated tokens saved by extraction: source-HTML approximate tokens minus returned-text approximate tokens, floored at 0.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / sections / description
      Previous value: -"Newline-separated list of heading selectors to include in the response. Whitespace and case are normalized for matching. Empty or whitespace-only sections returns invalid_arguments. Sections longer than 200 characters return invalid_arguments."New value: +"Optional heading selectors for scrape mode. Accepts either a newline-separated string (for example \"Alpha\\nBeta\") or an array of strings (for example [\"Alpha\", \"Beta\"]). Whitespace and case are normalized for exact heading matching. Empty or whitespace-only selectors return invalid_arguments. Each selector must be 200 characters or fewer. When provided, the persistent and memory caches are bypassed for reads; a fresh extraction may still be written when persist is true."
    • addedInput schema / properties / sections / oneOf
      Added value: +[
      +  {
      +    "description": "Optional heading selectors for scrape mode. Accepts either a newline-separated string (for example \"Alpha\\nBeta\") or an array of strings (for example [\"Alpha\", \"Beta\"]). Whitespace and case are normalized for exact heading matching. Empty or whitespace-only selectors return invalid_arguments. Each selector must be 200 characters or fewer. When provided, the persistent and memory caches are bypassed for reads; a fresh extraction may still be written when persist is true.",
      +    "type": "string"
      +  },
      +  {
      +    "description": "Optional heading selectors for scrape mode. Accepts either a newline-separated string (for example \"Alpha\\nBeta\") or an array of strings (for example [\"Alpha\", \"Beta\"]). Whitespace and case are normalized for exact heading matching. Empty or whitespace-only selectors return invalid_arguments. Each selector must be 200 characters or fewer. When provided, the persistent and memory caches are bypassed for reads; a fresh extraction may still be written when persist is true.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • removedInput schema / properties / sections / type
      Removed value: -"string"
  2. Changed1 schema field changed
    • addedInput schema / properties / sections
      Added value: +{
      +  "description": "Newline-separated list of heading selectors to include in the response. Whitespace and case are normalized for matching. Empty or whitespace-only sections returns invalid_arguments. Sections longer than 200 characters return invalid_arguments.",
      +  "type": "string"
      +}
  3. Changed16 schema fields changed
    • changedInput schema / properties / chunk_token_budget / description
      Previous value: -"Accepted alias for max_tokens; max_tokens wins on conflict."New value: +"Accepted alias for max_tokens; max_tokens wins on conflict. Range 100 to 50000."
    • changedInput schema / properties / footnote_url_policy / description
      Previous value: -"For links=footnotes only, choose full URL destinations or replace over-limit destinations with non-clickable truncated text."New value: +"For links=footnotes only: full preserves complete URL destinations; truncated replaces over-limit destinations with non-clickable abbreviated text. Default: truncated."
    • changedInput schema / properties / max_footnote_url_length / description
      Previous value: -"For links=footnotes only, maximum URL length for the visible label and truncated destination."New value: +"For links=footnotes only: maximum URL length for the visible label and, with the truncated policy, the destination. Positive integer. Default: 100."
    • addedOutput schema / properties / approx_tokens / description
      Added value: +"Approximate token count of the returned text: ceil(characters / 4). An estimate, not a tokenizer count."
    • addedOutput schema / properties / cache_hit / description
      Added value: +"True when the response was served from memory or persistent cache."
    • addedOutput schema / properties / cache_layer / description
      Added value: +"Which cache served the response: none, memory, or persistent."
    • addedOutput schema / properties / chunk_count / description
      Added value: +"Number of chunks in the chunks array (1 for scrape and summarize modes when not split)."
    • addedOutput schema / properties / extracted_at / description
      Added value: +"UTC ISO 8601 timestamp of the extraction."
    • addedOutput schema / properties / html_tokens / description
      Added value: +"Approximate token count of the fetched source HTML, computed the same way as approx_tokens."
    • addedOutput schema / properties / limiting_factor / description
      Added value: +"Which limit bound the returned text: char_cap (extracted-text character ceiling) or token_budget (max_tokens), or none when no limit shortened the response."
    • addedOutput schema / properties / mode / description
      Added value: +"Extraction mode: scrape returns readable text; chunk splits it into budgeted chunks; summarize selects leading text within a budget. The accepted chunked alias normalizes to chunk."
    • addedOutput schema / properties / source_url / description
      Added value: +"The requested URL with sensitive-looking query parameters removed, safe for logs and display."
    • addedOutput schema / properties / split / description
      Added value: +"True when content spans multiple chunks (chunk mode only; not truncation)."
    • addedOutput schema / properties / token_method / description
      Added value: +"Method used to compute approx_tokens: ceil(characters / 4)."
    • addedOutput schema / properties / tokens_saved_estimate / description
      Added value: +"Estimated tokens saved by extraction: source-HTML approximate tokens minus returned-text approximate tokens, floored at 0."
    • addedOutput schema / properties / truncated / description
      Added value: +"True when extracted content exceeded a limit and the returned text was shortened."
  4. Changed2 schema fields changed
    • changedInput schema / properties / footnote_url_policy / default
      Previous value: -"full"New value: +"truncated"
    • changedInput schema / properties / footnote_url_policy / description
      Previous value: -"For links=footnotes only, preserve complete URL destinations or replace over-limit destinations with non-clickable truncated text."New value: +"For links=footnotes only, choose full URL destinations or replace over-limit destinations with non-clickable truncated text."
  5. Changed2 schema fields changed
    • addedInput schema / properties / footnote_url_policy
      Added value: +{
      +  "default": "full",
      +  "description": "For links=footnotes only, preserve complete URL destinations or replace over-limit destinations with non-clickable truncated text.",
      +  "enum": [
      +    "full",
      +    "truncated"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / max_footnote_url_length
      Added value: +{
      +  "default": 100,
      +  "description": "For links=footnotes only, maximum URL length for the visible label and truncated destination.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
  6. Changed1 schema field changed
    • addedInput schema / properties / links
      Added value: +{
      +  "default": "inline",
      +  "description": "How to represent hyperlinks in extracted text. inline preserves readable link URLs; footnotes uses numbered references and a link list; false removes URLs for the lowest-token output.",
      +  "enum": [
      +    "inline",
      +    "footnotes",
      +    "false"
      +  ],
      +  "type": "string"
      +}
  7. Changed2 schema fields changed
    • addedInput schema / properties / chunk_token_budget
      Added value: +{
      +  "description": "Accepted alias for max_tokens; max_tokens wins on conflict.",
      +  "maximum": 50000,
      +  "minimum": 100,
      +  "type": "integer"
      +}
    • changedInput schema / properties / mode / enum
      Previous value: -[
      -  "scrape",
      -  "chunk",
      -  "summarize"
      -]New value: +[
      +  "scrape",
      +  "chunk",
      +  "summarize",
      +  "chunked"
      +]
  8. Changed9 schema fields changed
    • changedInput schema / properties / cache / description
      Previous value: -"Read available memory/persistent caches. False bypasses cache reads but does not disable writes of fresh results."New value: +"Read from the memory and persistent caches (default true). false bypasses cache reads; a fresh result may still be written to the cache."
    • changedInput schema / properties / max_tokens / description
      Previous value: -"Approximate token budget for chunk/summarize modes; ignored in scrape mode. Accepted alias: chunk_token_budget. The extracted-text character cap applies first. Indivisible units in chunk mode, and a first oversized sentence in summarize mode, may exceed the budget."New value: +"Estimated-token budget, enforced in every mode: scrape trims to it, chunk makes each chunk fit it, summarize returns the leading text within it. Range 100 to 50000, default 6000. A single indivisible unit in chunk mode (for example one very long table row) can exceed it. Accepted alias: chunk_token_budget."
    • changedInput schema / properties / mode / description
      Previous value: -"scrape returns extracted text in the envelope; chunk creates approximately budgeted chunks; summarize selects leading sentences within an approximate budget. The accepted chunked alias normalizes to chunk."New value: +"scrape: the page text trimmed to max_tokens. chunk: the whole page split into chunks that each fit max_tokens. summarize: the leading lines and whole sentences that fit max_tokens. 'chunked' is accepted as an alias for chunk."
    • changedInput schema / properties / persist / description
      Previous value: -"Allow a fresh successful result to be written to the persistent cache. False prevents that write; memory caching and extraction are unchanged."New value: +"Allow a fresh result to be written to the persistent cache (default true). false skips that write; extraction and the short-lived memory cache are unchanged."
    • changedInput schema / properties / render_js / description
      Previous value: -"Render in Chromium before extraction when enabled by the operator. If render_js_disabled is returned, retry with false."New value: +"Render the page in a browser before extraction. Available only if the operator enables it; otherwise render_js_disabled is returned and you should retry with false."
    • changedInput schema / properties / url / description
      Previous value: -"Absolute public HTTP or HTTPS URL to extract. Unsafe targets fail with invalid_or_unsafe_url."New value: +"Absolute public HTTP or HTTPS URL to read. Private, loopback, link-local and metadata addresses, non-standard ports and URLs containing credentials are rejected with invalid_or_unsafe_url."
    • addedOutput schema / properties / deduplicated_count
      Added value: +{
      +  "description": "Repeated story blocks removed from the extracted text.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / low_yield
      Added value: +{
      +  "description": "True when a large page produced very little text (often JavaScript-rendered or login-gated).",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / yield_hint
      Added value: +{
      +  "description": "Present only when low_yield is true: a short suggestion for what to try next.",
      +  "type": "string"
      +}
  9. Changed26 schema fields changed
    • changedInput schema / properties / cache / description
      Previous value: -"Use the in-memory + Supabase cache when available."New value: +"Read available memory/persistent caches. False bypasses cache reads but does not disable writes of fresh results."
    • changedInput schema / properties / max_tokens / description
      Previous value: -"Token budget for chunk/summarize modes (ignored in scrape mode). Pitch alias: chunk_token_budget. Note: extracted text is always capped at 6,000 characters first, so that cap usually binds before this budget on long pages."New value: +"Approximate token budget for chunk/summarize modes; ignored in scrape mode. Accepted alias: chunk_token_budget. The extracted-text character cap applies first. Indivisible units in chunk mode, and a first oversized sentence in summarize mode, may exceed the budget."
    • changedInput schema / properties / mode / description
      Previous value: -"Extraction mode: scrape returns the metered envelope; chunk splits text into max_tokens-sized chunks for vector databases (pitch alias: chunked); summarize truncates to a token budget."New value: +"scrape returns extracted text in the envelope; chunk creates approximately budgeted chunks; summarize selects leading sentences within an approximate budget. The accepted chunked alias normalizes to chunk."
    • addedInput schema / properties / persist
      Added value: +{
      +  "default": true,
      +  "description": "Allow a fresh successful result to be written to the persistent cache. False prevents that write; memory caching and extraction are unchanged.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / render_js / description
      Previous value: -"Render the page in Chromium before extracting text. Usually disabled on free infra; when off the call fails with render_js_disabled — retry with false."New value: +"Render in Chromium before extraction when enabled by the operator. If render_js_disabled is returned, retry with false."
    • changedInput schema / properties / url / description
      Previous value: -"Absolute public HTTP or HTTPS URL to extract. Private IPs, non-http schemes, and unsafe targets fail with invalid_or_unsafe_url."New value: +"Absolute public HTTP or HTTPS URL to extract. Unsafe targets fail with invalid_or_unsafe_url."
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / description
      Added value: +"Successful extraction envelope returned in structuredContent. The same object is serialized as JSON in content[0].text."
    • addedOutput schema / properties / approx_tokens
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / cache_hit
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / cache_layer
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / chunk_count
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / chunks
      Added value: +{
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "approx_tokens": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "index": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "text": {
      +        "type": "string"
      +      },
      +      "tokens": {
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "index",
      +      "text",
      +      "tokens",
      +      "approx_tokens"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • removedOutput schema / properties / content
      Removed value: -{
      -  "description": "MCP content blocks. content[0].text is always the unified JSON envelope: {mode, tokens, chunk_count, cache_hit, source_url, extracted_at, tokens_saved_estimate, truncated, chunks:[{index, text, tokens}]} for predictable context budgets in every mode.",
      -  "items": {
      -    "properties": {
      -      "text": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • addedOutput schema / properties / extracted_at
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / html_tokens
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • removedOutput schema / properties / isError
      Removed value: -{
      -  "description": "True when extraction failed; content[0].text holds a code-prefixed hint (e.g. invalid_or_unsafe_url, render_js_disabled).",
      -  "type": "boolean"
      -}
    • addedOutput schema / properties / limiting_factor
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / mode
      Added value: +{
      +  "enum": [
      +    "scrape",
      +    "chunk",
      +    "summarize"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / source_url
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / split
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / token_method
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / tokens
      Added value: +{
      +  "description": "Compatibility alias of approx_tokens.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / tokens_saved_estimate
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "content"
      -]New value: +[
      +  "mode",
      +  "tokens",
      +  "approx_tokens",
      +  "html_tokens",
      +  "token_method",
      +  "limiting_factor",
      +  "chunk_count",
      +  "cache_hit",
      +  "cache_layer",
      +  "source_url",
      +  "extracted_at",
      +  "tokens_saved_estimate",
      +  "truncated",
      +  "split",
      +  "chunks"
      +]
  10. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare this as a safe, idempotent, open-world read; the description goes far beyond that with extraction behavior (boilerplate dropped, story blocks deduplicated, pipe-delimited tables, fenced code), caching layers including a rule that credential-like query params are never stored, and robots.txt compliance. It also explains truncation signals (truncated, limiting_factor), the ~200,000-character ceiling, and the concrete failure codes returned with isError=true.

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 and size constraint are front-loaded in the first sentence, and nearly every clause carries operational information rather than filler. The weakness is structural: it is one dense run-on block where mode semantics, token accounting, caching and error codes all blend together, so a reader must parse carefully to find the mode guidance buried mid-paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, multi-mode fetch tool with an output schema and full annotation coverage, this is complete: supported content, mode semantics, token estimation caveats, cache behavior, robots.txt, JS-rendering availability, low-yield diagnosis and the failure taxonomy are all present. An agent has what it needs to call it correctly and to interpret degenerate results without consulting anything else.

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, and the description earns more by explaining the semantics the schema only asserts: max_tokens is enforced across every mode and a single indivisible unit can exceed it, tokens/approx_tokens are character/4 estimates rather than tokenizer counts, and tokens_saved_estimate compares source-HTML against delivered tokens. It adds little for sections and the footnote_* parameters, which are left entirely to the schema.

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 names a specific verb and resource ('Fetch one public HTTP or HTTPS URL and return its readable text') and immediately bounds scope ('sized for an LLM context window'). The support envelope is also stated concretely: only HTML/XHTML up to 1 MiB, with PDF, JSON, images and JS-dependent pages excluded, so an agent knows precisely what this tool can and cannot do before opening the schema.

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

Usage Guidelines5/5

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

It gives explicit mode-selection guidance (scrape for trimmed text, chunk for budget-fitting chunks, summarize for leading lines that is explicitly 'not an AI-written summary'), plus concrete opt-out conditions such as cache=false to bypass reads and persist=false to skip writes. Exclusion cases are spelled out rather than implied, including the note that render_js works only if the operator enables it.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.