Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Certificate recorded, valid to 2027-01-18
Authorization not required
Changed the definition of "checkCitations", "checkQuote", "fetch" and 1 more
⟨373 unchanged words⟩ sets a whole-response Retry-After or retries sources automatically. To read a page before choosing quotations, call readSource with include_quote_source:true, then supply its quote_source.source_text and source_truncated without refetching. Retain the original reader response for URL provenance; submitted text is still labeled supplied_text. Same as POST https://bozos.si/api/v1/citation-check.
⟨138 unchanged words⟩ metadata. Upstream failures continue to use HTTP 424. To read a page before choosing quotations, call readSource with include_quote_source:true, then supply its quote_source.source_text and source_truncated without refetching. Retain the original reader response for URL provenance; submitted text is still labeled supplied_text. Same as POST https://bozos.si/api/v1/quote-check.
⟨22 unchanged words⟩ or note, or a JSON dataset. Pass agent-recipes#check-existing-text for one executable recipe, a record permalink (https://bozos.si/ai-crawlers.json#gptbot) or <dataset ⟨10 unchanged words⟩
⟨210 unchanged words⟩ 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.
{"additionalProperties":false,"properties":{"include_quote_source":{"default":false,"description":"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.","type":"boolean"},"max_characters":{"default":40000,"description":"Maximum returned Unicode codepoints.pointsTruncationperisrepresentation.explicitly
Removed "actionPreflight", "auditAgentDiscovery", "buildRobotsTxt" and 14 more; changed the definition of "checkCitations", "checkQuote" and "readSource" (26 tools before, 9 now)
Checkwhethercited linksresolveorandquotationsreadin supplied source text, without AI
Checkwhethercited linksresolveorandquotationsread
Unknown → Live
First tool surface recorded: 26 tools (server version 1.4.0)
https://bozos.si/api/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 7 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨85 unchanged words⟩ "type":["array","null"]},"quote_source":{"additionalProperties":false,"description":"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.","properties":{"characters":{"maximum":100000,"minimum":1,"type":"integer"},"checked_text_sha256":{"description":"SHA-256 of source_text encoded as UTF-8, after its own truncation. A content identifier, not a truth or origin guarantee.","pattern":"^[0-9a-f]{64}$","type":"string"},"full_characters":{"minimum":1,"type":"integer"},"pages":{"description":"PDF page numbers and code-point ranges [start, end) in source_text; null for other source types. Supplied-text checks do not automatically retain these page labels.","items":{"properties":{"end":{"type":"integer"},"page":{"type":"integer"},"start":{"type":"integer"}},"required":["page","start","end"],"type":"object"},"type":["array","null"]},"representation":{"enum":["extracted_html_text","pdf_text_layer","literal_text"],"type":"string"},"source_text":{"description":"Exact text to submit as source_text. Offsets and checked_text_sha256 refer to this string unchanged. HTML excludes generated titles, Markdown syntax, metadata, and link destinations. Plain text and Markdown retain their literal syntax with outer whitespace trimmed, as in URL Quote Checker.","maxLength":100000,"minLength":1,"type":"string"},"source_truncated":{"description":"Pass this flag to the supplied-text checker. Independent of output.truncated, which describes Markdown.","type":"boolean"}},"required":["source_text","source_truncated","representation","characters","full_characters","checked_text_sha256","pages"],"type":["object","null"]},"retrieved_at":{"format":"date-time","type": ⟨17 unchanged words⟩
{"additionalProperties":false,"description":"Supply exactly one of urls or citations. Optional sources requires citations; source_id references must exist and supplied-text citations require quote. Source IDs and citation IDs must each be unique in their own list.","properties":{"citations":{"description":"1–10 citations in result order. Use url with optional quote, or source_id with required quote. Repeated URLs share a retrieval; source_id references reuse the supplied text. Optional citation ids must be unique.","items":{"additionalProperties":false,"oneOf":[{"not":{"required":["source_id"]},"required":["url"]},{"not":{"required":["url"]},"required":["source_id","quote"]}],"properties":{"id":{"description":"Optional non-blank citation identifier, unique within the batch; echoed unchanged on success and failure.","maxLength":128,"minLength":1,"type":"string"},"quote":{"description":"The exact words attributed to this source.","maxLength":4000,"minLength":1,"type":"string"},"source_id":{"description":"References an id in sources. Use exactly one of url or source_id; source_id requires quote. No URL is fetched for this entry.","maxLength":128,"minLength":1,"type":"string"},"url":{"format":"uri","maxLength":4096,"type":"string"}},"type":"object"},"maxItems":10,"minItems":1,"type":"array"},"sources":{"description":"Optional caller-supplied sources, only with citations. Refer to each by source_id. No URL provenance is accepted or verified. The entire request must fit within 64 KiB.","items":{"additionalProperties":false,"properties":{"id":{"description":"Non-blank source identifier, unique in sources.","maxLength":128,"minLength":1,"type":"string"},"source_text":{"description":"Non-blank text checked literally, preserving original whitespace and offsets. Share it across citations instead of repeating the text. No markup removal, fetching, or code execution.","maxLength":100000,"minLength":1,"type":"string"},"source_truncated":{"default":false,"description":"Set true for an excerpt or incomplete source. A missing quotation is then inconclusive for the complete source.","type":"boolean"}},"required":["id","source_text"],"type":"object"},"maxItems":10,"minItems":1,"type":"array"},"urls":{"description":"Public HTTPS URLs to check, 1-10, inorder.order, without quotations. Each uses the guarded Source Reader: robots.txt is ⟨21 unchanged words⟩ ,"minItems":1,"type":"array"}},"required":["urls"],"type":"object"}
⟨57 unchanged words⟩ "type":["integer","null"]},"id":{"description":"Optional non-blank citation identifier, unique within the batch; echoed unchanged on success and failure.","maxLength":128,"minLength":1,"type":"string"},"message":{"type":["string","null"]},"quote":{"description":"The quotation as supplied, when one was sent.","type":"string"},"quote_check":{"description":"Present when a quote was sent; null when the link could not be read.","properties":{"checked_text_sha256":{"pattern":"^[a-f0-9]{64}$","type":"string"},"match_counts":{"properties":{"exact":{"minimum":0,"type":"integer"},"normalized":{"minimum":0,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["total","exact","normalized"],"type":"object"},"matched":{"description":"Null when the source was truncated and the quote was not found in the checked part.","type":["boolean","null"]},"matches":{"items":{"properties":{"after":{"type":"string"},"before":{"type":"string"},"end":{"minimum":0,"type":"integer"},"kind":{"enum":["exact_match","normalized_match"],"type":"string"},"line_end":{"minimum":1,"type":"integer"},"line_start":{"minimum":1,"type":"integer"},"page_end":{"description":"PDF sources only: one-based page where the match ends.","type":["integer","null"]},"page_start":{"description":"PDF sources only: one-based page where the match starts.","type":["integer","null"]},"start":{"minimum":0,"type":"integer"},"text":{"type":"string"},"utf16_end":{"minimum":0,"type":"integer"},"utf16_start":{"minimum":0,"type":"integer"}},"required":["start","end","utf16_start","utf16_end","line_start","line_end","text","before","after","kind"],"type":"object"},"maxItems":3,"type":"array"},"matches_truncated":{"description":"More passages matched than the three returned; this does not indicate an incomplete source.","type":"boolean"},"matching":{"properties":{"case_sensitive":{"const":true,"type":"boolean"},"fuzzy_matching":{"const":false,"type":"boolean"},"normalize_whitespace":{"const":true,"type":"boolean"},"punctuation_sensitive":{"const":true,"type":"boolean"},"word_boundaries":{"const":true,"type":"boolean"}},"required":["normalize_whitespace","case_sensitive","punctuation_sensitive","word_boundaries","fuzzy_matching"],"type":"object"},"offsets":{"properties":{"end":{"type":"string"},"lines":{"type":"string"},"pages":{"type":"string"},"relative_to":{"type":"string"},"start":{"type":"string"},"unit":{"type":"string"},"utf16":{"type":"string"}},"required":["unit","start","end","utf16","lines","relative_to"],"type":"object"},"source":{"properties":{"characters":{"description":"Unicode code points checked.","maximum":100000,"minimum":0,"type":"integer"},"full_characters":{"description":"Code points in the full extraction or submitted text before any checker output limit; for incomplete supplied text the original document length is unknown.","minimum":0,"type":"integer"},"representation":{"enum":["extracted_html_text","literal_text","pdf_text_layer","supplied_text"],"type":"string"}},"required":["representation","characters","full_characters"],"type":"object"},"source_truncated":{"description":"Only part of the original source is represented: a fetched extraction exceeded the limit, or the caller declared supplied text incomplete. Missing quotations are inconclusive.","type":"boolean"},"status":{"enum":["exact_match","normalized_match","not_found","source_truncated"],"type":"string"},"warnings":{"items":{"type":"string"},"type":"array"}},"required":["status","matched","match_counts","matches","checked_text_sha256","source_truncated","warnings","matches_truncated","matching","offsets","source"],"type":["object","null"]},"recovery":{"description":"Suggested next step after a source failure. BOZOS does not retry or wait automatically. retry_later may succeed but is not guaranteed; honor upstream delay and client budgets. use_supplied_text refers only to text the caller is authorized to supply.","enum":["check_request","check_url","respect_robots","retry_later","use_supplied_text","review_source"],"type":"string"},"redirected":{"type":["boolean","null" ⟨25 unchanged words⟩ "type":["integer","null"]},"source_id":{"description":"Supplied source identifier, present only for supplied-text results.","type":"string"},"source_sha256":{"description":"SHA-256 of the response ⟨5 unchanged words⟩ "string","null"]},"status":{"description":"readable: URL was fetched and text extracted; supplied_text: caller-provided text was checked without a fetch; failed: URL could not be read.","enum":["readable","failed","supplied_text"],"type":"string"},"title":{ ⟨4 unchanged words⟩ "type":["string","null"]},"urlupstream":{"description":"ThePresent for failed source checks; null if no failing HTTP response was recorded. A robots response is not the page status.","properties":{"http_status":{"maximum":599,"minimum":100,"type":"integer"},"retry_after_seconds":{"description":"Parsed upstream Retry-After: nonnegative seconds or an HTTP-date converted to seconds at receipt, rounded up. Null for missing, malformed, or unrepresentable values; zero is a known elapsed/zero delay.","maximum":9007199254740991,"minimum":0,"type":["integer","null"]},"stage":{"enum":["robots","source"],"type":"string"}},"required":["stage","http_status","retry_after_seconds"],"type":["object","null"]},"url":{"description":"URL assupplied.supplied for URL citations; null for supplied-text citations.","type":["string","null"]}},"required":["url","status", ⟨11 unchanged words⟩ ,"retrieved_at"],"type":"object"},"maxItems":10,"minItems":1,"type":"array"},"safety":{"properties" ⟨20 unchanged words⟩ ,"type":"string"},"summary":{"description":"Counts citation entries, including repeats. total = readable + failed + supplied (treat omitted supplied as 0). Supplied text is not counted as a readable URL.","properties":{"failed":{"type":"integer"},"quotes":{"description":"Present when citations were sent with quotes.","properties":{"checked":{"type":"integer"},"found":{"type":"integer"},"inconclusive":{"type":"integer"},"not_found":{"type":"integer"},"unchecked":{"type":"integer"}},"type":"object"},"readable":{"type":"integer"},"supplied":{"description":"Present only when supplied-text citations were checked; counts these entries separately from fetched readable URLs.","minimum":1,"type":"integer"},"total":{"type ⟨15 unchanged words⟩
⟨69 unchanged words⟩ source_unavailable; absent quotes in partial sources remain inconclusive. 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. Same as POST https://bozos.si/api/v1/quote-check.
⟨57 unchanged words⟩ "minimum":1,"type":"integer"},"page_end":{"description":"PDF sources only: one-based page where the match ends.","type":["integer","null"]},"page_start":{"description":"PDF sources only: one-based page where the match starts.","type":["integer","null"]},"start":{"minimum":0,"type":"integer ⟨76 unchanged words⟩ {"enum":["extracted_html_text","literal_text","supplied_text","pdf_text_layer"],"type":"string"},"retrieved_at": ⟨44 unchanged words⟩
Read a public HTTPS page or PDF asMarkdowntext with source and citation metadata
Read a public HTTPS page or PDF asMarkdowntext 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 ⟨11 unchanged words⟩ outbound public HTTPS requests. Supports HTML, Markdown, plain text, andplainthetext;text layer of PDFs (pages gives each page's code-point range); no2 MiBsize 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. Same as POST https://bozos.si/api/v1/source-reader.
{"properties":{"extraction":{"description":"main-content, readability, body, passthrough, or pdf-text-layer.","type":"string"},"final_url":{"format":"uri","type": ⟨26 unchanged words⟩ type":"boolean"}},"type":"object"},"pages":{"description":"PDF only: one entry per page with its one-based number and code-point range [start, end) in markdown. Null for other sources.","items":{"properties":{"end":{"type":"integer"},"page":{"type":"integer"},"start":{"type":"integer"}},"required":["page","start","end"],"type":"object"},"type":["array","null"]},"retrieved_at":{"format":"date-time"," ⟨18 unchanged words⟩
Validate, normalize, and fingerprint a proposed agent action — Validate, normalize, and fingerprint a proposed agent action. Same as POST https://bozos.si/api/v1/preflight.
Audit supplied crawler and agent discovery materials without fetching URLs — Audit supplied crawler and agent discovery materials without fetching URLs. Checks a caller-supplied bundle only. Makes no outbound network requests and retains no payload. Same as POST https://bozos.si/api/v1/discovery-audit.
Generate a robots.txt naming every documented AI crawler for a policy — Generate a robots.txt naming every documented AI crawler for a policy. Same as GET https://bozos.si/api/v1/robots.
Canonicalize JSON and compute SHA-256 — Canonicalize JSON and compute SHA-256. Same as POST https://bozos.si/api/v1/canonicalize.
Evaluate a robots.txt for one crawler or every AI crawler in the directory, per RFC 9309 — Evaluate a robots.txt for one crawler or every AI crawler in the directory, per RFC 9309. Pass the robots.txt text; nothing is fetched. Returns allowed or disallowed per crawler for the path, the matching group and rule, sitemaps, Content-Signal lines, and warnings. Directory crawlers that may ignore robots.txt for user-initiated fetches are flagged. Same as GET https://bozos.si/api/v1/robots-check.
Count characters, words, bytes, and occurrences of a letter or substring — Count characters, words, bytes, and occurrences of a letter or substring. Same as GET https://bozos.si/api/v1/count.
List dataset records added, changed, or removed after a date — List dataset records added, changed, or removed after a date. Record-level delta for every BOZOS dataset (or the ones named), so a cached copy can be updated without re-downloading. Records include their permalink and, unless records=ids, their current content. Dates have day precision and are strictly after since. Same as GET https://bozos.si/api/v1/changes.
Weekday, ISO week, date addition, and day/weekday counts — Weekday, ISO week, date addition, and day/weekday counts. Same as GET https://bozos.si/api/v1/date.
Draft a correction or question for BOZOS as an email and X post without sending it — Draft a correction or question for BOZOS as an email and X post without sending it. Validates the message against https://bozos.si/contact.json and returns subject, body, mailto link, X intent URL, and a SHA-256 fingerprint. Deterministic: the same input gives the same output. Sending is up to the caller and requires its principal's permission. Same as POST https://bozos.si/api/v1/contact-draft.
Exact rational arithmetic with no floating-point error — Exact rational arithmetic with no floating-point error. Same as GET https://bozos.si/api/v1/calc.
Say which documented crawler a user-agent string claims to be, and how to verify it — Say which documented crawler a user-agent string claims to be, and how to verify it. Matches the string against the AI crawler directory (longest token first). Returns the crawler record with its cite line, the operator's verification method, or the undocumented-token entry. A user-agent string is a claim, not proof. Same as GET https://bozos.si/api/v1/identify.
Access inspector for agents limited to fetching URLs — Access inspector for agents limited to fetching URLs. Read-only GET equivalent of inspectAgentAccess. Supply one url parameter. Same as GET https://bozos.si/api/v1/access-inspect.
Build a minimal conditional HTTP retrieval plan — Build a minimal conditional HTTP retrieval plan. Compares a caller-supplied resource manifest with cache validators and optional budgets. Makes no outbound network requests and retains no payload. Same as POST https://bozos.si/api/v1/retrieval-plan.
Measure text deterministically — Measure text deterministically. Same as POST https://bozos.si/api/v1/text-stats.
Convert a time between IANA time zones, or give the current time anywhere — Convert a time between IANA time zones, or give the current time anywhere. Same as GET https://bozos.si/api/v1/time.
Get the current UTC and Unix time — Get the current UTC and Unix time. Same as GET https://bozos.si/api/v1/now.
Verify that an action still matches its approved fingerprint — Verify that an action still matches its approved fingerprint. Same as POST https://bozos.si/api/v1/verify.