Read a public HTTPS page or PDF as text with source and citation metadata
readSourceRead a public HTTPS page or PDF as text with source and citation metadata. Returns the page text itself, not a model-written summary, so you can quote and cite it. No AI model. Checks robots.txt for BOZOSReader, does not execute scripts, stores no content in the application, and makes outbound public HTTPS requests. Supports HTML, Markdown, plain text, and the text layer of PDFs (pages gives each page's code-point range); no OCR or JavaScript rendering. Limits: 15 seconds, 3 page redirects, 2 MiB source (10 MiB and 300 pages for PDFs), 100000 output code points. GET also accepts url, max_characters and format directly, or a JSON body in ?json= / ?b64=. Declared canonical URL and author/date fields are publisher-supplied and unverified. Cite final_url. Errors always return JSON. gzip, deflate, and Brotli response bodies are decoded before the size limit and source hash are computed. Headless instructions: https://bozos.si/tools/source-reader.md. Source failures include recovery and upstream. For upstream_error, robots_unavailable, and retry_after_redirect, upstream contains stage (robots or source), HTTP status, and parsed Retry-After seconds; other failures set upstream to null. No automatic retries or waiting. Redirects requesting a future delay stop with retry_after_redirect. For retry_later failures with a valid upstream delay, the response exposes a Retry-After header; MCP preserves it in si.bozos/retry-after metadata. Upstream failures continue to use HTTP 424. Set include_quote_source:true with JSON output to also receive the exact matching text from this retrieval, with its own hash and truncation flag. HTML text excludes generated titles and link destinations; Markdown/plain text keep literal syntax (outer whitespace trimmed); PDFs use the text layer. Reuse quote_source.source_text and source_truncated in supplied-text checks. Keep original retrieval metadata yourself. The second representation is opt-in and independently bounded by max_characters. Same as POST https://bozos.si/api/v1/source-reader.
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": "readSource"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTPS URL on the default port, without credentials. Private addresses and IP literals are blocked. | |
| max_characters | No | Maximum returned Unicode code points per representation. Markdown and optional quote_source text are truncated independently. | |
| include_quote_source | No | JSON only. Include quote_source: the literal matching text, its SHA-256, length, PDF page ranges, and independent truncation flag, from this same retrieval. Reuse source_text and source_truncated in Quote Checker or Citation Checker without fetching again. Increases response size; omitted by default. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | PDF only: one entry per page with its one-based number and code-point range [start, end) in markdown. Null for other sources. | |
| title | Yes | ||
| output | Yes | ||
| markdown | Yes | ||
| final_url | Yes | ||
| integrity | Yes | ||
| extraction | No | main-content, readability, body, passthrough, or pdf-text-layer. | |
| quote_source | No | Present only with include_quote_source:true and format=json. Matching text from the same source retrieval, using the same extraction as URL Quote Checker with the same max_characters. Null if Markdown exists but no literal matching text was extracted. Keep final_url, retrieved_at, and integrity with this response; resubmitting text does not verify its provenance. | |
| retrieved_at | Yes |