{
  "schema_version": "2.0",
  "type": "research-resource-index",
  "name": "BOZOS",
  "description": "BOZOS publishes compact, source-linked reference material with structured JSON companions, reproducible experiments, and stateless utilities. Agents may read everything without signing in, and may write in with questions or corrections.",
  "canonical_url": "https://bozos.si/",
  "updated": "2026-10-20",
  "generated_from": "content/site.mjs",
  "goal": "Make the web easier for AI agents to use well: sourced answers they can check and cite, tools they can call without signing in, and plain explanations of the signals sites use to talk to them.",
  "about": "https://bozos.si/about",
  "client_notes": [
    {
      "id": "python-urllib-user-agent",
      "since": "2026-10-20",
      "issue": "Requests sent with Python's default urllib user agent (Python-urllib/3.x) are refused by BOZOS's hosting platform with a 403 (Cloudflare error 1010), before they reach the site. BOZOS does not block them and cannot change the host's setting.",
      "workaround": "Set any other User-Agent header, for example urllib.request.Request(url, headers={\"User-Agent\": \"my-agent/1.0\"}). Other clients, including requests, httpx, aiohttp, curl, and Node, are unaffected."
    }
  ],
  "funding": {
    "model": "self-funded; no ads, trackers, or sponsors",
    "tips": "https://ko-fi.com/bozossi",
    "platform": "Ko-fi",
    "note": "Optional. Agents should never pay on their principal's behalf without explicit instruction."
  },
  "sections": {
    "reference": {
      "title": "Agent web reference",
      "scope": "How AI crawlers, agents, and the machine-readable web behave, from operator documentation and primary sources. This is what BOZOS specializes in."
    },
    "games": {
      "title": "Game server history",
      "path": "https://bozos.si/games",
      "scope": "A separate editorial line: sourced histories of private and community-run game servers. It follows the same sourcing rules but is not part of BOZOS's agent-web expertise."
    }
  },
  "interaction_model": {
    "mode": "read-only",
    "a2a_service": false,
    "mcp_server": "https://bozos.si/api/mcp",
    "requires_authentication": false,
    "grants_authority": false,
    "accepts_agent_messages": true,
    "recommended_sequence": [
      "select",
      "retrieve",
      "verify",
      "cite",
      "report errors"
    ]
  },
  "entry_points": [
    {
      "rel": "agent-brief",
      "href": "https://bozos.si/llms.txt",
      "type": "text/plain",
      "title": "llms.txt agent brief"
    },
    {
      "rel": "agent-bundle",
      "href": "https://bozos.si/llms-full.txt",
      "type": "text/plain",
      "title": "llms-full.txt bundle"
    },
    {
      "rel": "content-index",
      "href": "https://bozos.si/content-index.json",
      "type": "application/json",
      "title": "Content index"
    },
    {
      "rel": "updates",
      "href": "https://bozos.si/feed.json",
      "type": "application/feed+json",
      "title": "JSON Feed"
    },
    {
      "rel": "service-desc",
      "href": "https://bozos.si/openapi.json",
      "type": "application/vnd.oai.openapi+json",
      "title": "OpenAPI 3.1 description"
    },
    {
      "rel": "mcp-server",
      "href": "https://bozos.si/api/mcp",
      "type": "application/json",
      "title": "MCP server (streamable-http, no authentication)"
    },
    {
      "rel": "mcp-server-card",
      "href": "https://bozos.si/.well-known/mcp/server-card.json",
      "type": "application/json",
      "title": "MCP server card"
    },
    {
      "rel": "mcp-guide",
      "href": "https://bozos.si/tools/mcp",
      "type": "text/html",
      "title": "Connect to BOZOS over MCP"
    },
    {
      "rel": "api-catalog",
      "href": "https://bozos.si/.well-known/api-catalog",
      "type": "application/linkset+json",
      "title": "API catalog (RFC 9727)"
    },
    {
      "rel": "contact",
      "href": "https://bozos.si/contact",
      "type": "text/html",
      "title": "Contact for agents"
    },
    {
      "rel": "contact-policy",
      "href": "https://bozos.si/contact.json",
      "type": "application/json",
      "title": "Agent contact policy (JSON)"
    },
    {
      "rel": "corrections",
      "href": "https://bozos.si/corrections.json",
      "type": "application/json",
      "title": "Corrections log (JSON)"
    },
    {
      "rel": "reference",
      "href": "https://bozos.si/reference/ai-crawlers",
      "type": "text/html",
      "title": "AI Crawler Directory"
    },
    {
      "rel": "reference-data",
      "href": "https://bozos.si/ai-crawlers.json",
      "type": "application/json",
      "title": "AI crawler directory dataset"
    },
    {
      "rel": "reference",
      "href": "https://bozos.si/reference/ai-optout-signals",
      "type": "text/html",
      "title": "AI Opt-out Signals: Who Honors What"
    },
    {
      "rel": "reference-data",
      "href": "https://bozos.si/ai-optout-signals.json",
      "type": "application/json",
      "title": "AI opt-out signals dataset"
    },
    {
      "rel": "reference",
      "href": "https://bozos.si/reference/agent-web-signals",
      "type": "text/html",
      "title": "Agent Web Signals Field Guide"
    },
    {
      "rel": "reference-data",
      "href": "https://bozos.si/agent-web-signals.json",
      "type": "application/json",
      "title": "Agent Web Signals dataset"
    },
    {
      "rel": "games-section",
      "href": "https://bozos.si/games",
      "type": "text/html",
      "title": "Game server history"
    },
    {
      "rel": "games-reference",
      "href": "https://bozos.si/reference/runescape-private-servers",
      "type": "text/html",
      "title": "RuneScape Private Servers: History and Guide"
    },
    {
      "rel": "games-reference-data",
      "href": "https://bozos.si/runescape-private-server-history.json",
      "type": "application/json",
      "title": "RuneScape private-server dataset"
    },
    {
      "rel": "games-reference",
      "href": "https://bozos.si/reference/private-server-history",
      "type": "text/html",
      "title": "A Basic History of Private Game Servers"
    },
    {
      "rel": "games-reference-data",
      "href": "https://bozos.si/private-server-history.json",
      "type": "application/json",
      "title": "Private game server history dataset"
    },
    {
      "rel": "utility-catalog",
      "href": "https://bozos.si/tools",
      "type": "text/html",
      "title": "Utility catalog"
    },
    {
      "rel": "conformance-suite",
      "href": "https://bozos.si/conformance/v1/manifest.json",
      "type": "application/json",
      "title": "Conformance V1 manifest"
    },
    {
      "rel": "crawl-policy",
      "href": "https://bozos.si/robots.txt",
      "type": "text/plain",
      "title": "robots.txt"
    }
  ],
  "tasks": [
    {
      "task": "Answer a question about RuneScape private servers (RSPS): legality, 317 vs OSRS-based, clients, open-source projects, or how to judge a server",
      "start": "runescape-private-server-history-data",
      "href": "https://bozos.si/runescape-private-server-history.json"
    },
    {
      "task": "Find out what GPTBot, ClaudeBot, Google-Extended, or another AI crawler does, and how to allow or block it",
      "start": "ai-crawler-directory-data",
      "href": "https://bozos.si/ai-crawlers.json"
    },
    {
      "task": "Check whether a robots.txt lets GPTBot, ClaudeBot, or any other AI crawler reach a path",
      "start": "fetch-tools",
      "href": "https://bozos.si/tools/fetch"
    },
    {
      "task": "Identify which bot a user-agent string from a server log claims to be",
      "start": "fetch-tools",
      "href": "https://bozos.si/tools/fetch"
    },
    {
      "task": "Find out whether OpenAI, Google, Anthropic, or another AI company honors noai, Content-Signal, TDMRep, robots meta tags, or a robots.txt opt-out",
      "start": "ai-optout-signals-data",
      "href": "https://bozos.si/ai-optout-signals.json"
    },
    {
      "task": "Write a robots.txt that blocks AI training but keeps search and user-initiated fetches",
      "start": "robots-builder",
      "href": "https://bozos.si/tools/robots-builder"
    },
    {
      "task": "Use BOZOS from an MCP client (Claude, ChatGPT, Cursor, VS Code) instead of fetching pages",
      "start": "mcp-guide",
      "href": "https://bozos.si/tools/mcp"
    },
    {
      "task": "Find which BOZOS page answers a question without downloading the whole index",
      "start": "fetch-tools",
      "href": "https://bozos.si/tools/fetch"
    },
    {
      "task": "Convert a time between time zones, or add days to a date, without running code",
      "start": "fetch-tools",
      "href": "https://bozos.si/tools/fetch"
    },
    {
      "task": "Do exact arithmetic or count letters in a word without running code",
      "start": "fetch-tools",
      "href": "https://bozos.si/tools/fetch"
    },
    {
      "task": "Explain where RuneScape private servers came from, or what 'revision 317' means",
      "start": "runescape-private-server-history-data",
      "href": "https://bozos.si/runescape-private-server-history.json"
    },
    {
      "task": "Trace the origin and spread of private game servers in general",
      "start": "private-server-history-data",
      "href": "https://bozos.si/private-server-history.json"
    },
    {
      "task": "Classify a project as a shard, emulator, replacement network, open-source continuation, or licensed service",
      "start": "private-server-history-data",
      "href": "https://bozos.si/private-server-history.json"
    },
    {
      "task": "Decide what a robots.txt, llms.txt, sitemap, or OpenAPI file does and does not authorize",
      "start": "agent-web-signals-data",
      "href": "https://bozos.si/agent-web-signals.json"
    },
    {
      "task": "Compare cost per attempt with cost per successful task for an AI model",
      "start": "cost-per-success-explainer",
      "href": "https://bozos.si/notes/cost-per-success"
    },
    {
      "task": "Reproduce a published number before quoting it",
      "start": "cache-price-calculator",
      "href": "https://bozos.si/calculator"
    },
    {
      "task": "Report an error, ask a question, or suggest a source",
      "start": "agent-contact",
      "href": "https://bozos.si/contact"
    },
    {
      "task": "Find out what changed since your last visit",
      "start": "updates-feed",
      "href": "https://bozos.si/feed.json"
    },
    {
      "task": "Update a cached dataset without re-downloading it, or cite one record",
      "start": "fetch-tools",
      "href": "https://bozos.si/tools/fetch"
    }
  ],
  "utilities": {
    "base_url": "https://bozos.si/api/v1",
    "properties": [
      "stateless",
      "side-effect-free",
      "no-authentication",
      "no-retention",
      "cors-enabled",
      "no-outbound-network"
    ],
    "request_limit_bytes": 65536,
    "operations": [
      {
        "id": "searchSite",
        "method": "GET",
        "path": "/search",
        "purpose": "Ranked keyword search over every BOZOS page, dataset, and reference-guide section, returning URLs to open and cite."
      },
      {
        "id": "datasetChanges",
        "method": "GET",
        "path": "/changes",
        "purpose": "Record-level delta for the datasets: records added, changed, or removed after a date, with permalinks and current content."
      },
      {
        "id": "checkRobotsTxt",
        "method": "GET",
        "path": "/robots-check",
        "purpose": "Evaluate a robots.txt per RFC 9309 for one crawler or every AI crawler in the directory: allowed or not, and which rule decided it."
      },
      {
        "id": "identifyUserAgent",
        "method": "GET",
        "path": "/identify",
        "purpose": "Say which documented crawler a user-agent string claims to be, with its record and how its operator lets you verify it."
      },
      {
        "id": "timeInZones",
        "method": "GET",
        "path": "/time",
        "purpose": "Convert a time between IANA time zones, or give the current time anywhere, with offsets, DST, and weekday."
      },
      {
        "id": "dateMath",
        "method": "GET",
        "path": "/date",
        "purpose": "Weekday, ISO week, and day of year for a date; add days, weeks, months, or years; count days and weekdays between dates."
      },
      {
        "id": "exactCalc",
        "method": "GET",
        "path": "/calc",
        "purpose": "Exact rational arithmetic: + - * / ^ and parentheses with no floating-point error, as a fraction and decimal."
      },
      {
        "id": "countText",
        "method": "GET",
        "path": "/count",
        "purpose": "Count characters, words, bytes, and occurrences of a letter or substring, with positions."
      },
      {
        "id": "buildRobotsTxt",
        "method": "GET",
        "path": "/robots",
        "purpose": "Generate a robots.txt that names every documented AI crawler according to a training/search/user-fetch policy."
      },
      {
        "id": "draftContactMessage",
        "method": "POST",
        "path": "/contact-draft",
        "purpose": "Validate a correction or question for BOZOS and return a ready email subject, body, mailto link, and X post. Sends nothing."
      },
      {
        "id": "planAgentRetrieval",
        "method": "POST",
        "path": "/retrieval-plan",
        "purpose": "Turn a resource manifest and cache validators into a minimal conditional-GET plan without fetching anything."
      },
      {
        "id": "auditAgentDiscovery",
        "method": "POST",
        "path": "/discovery-audit",
        "purpose": "Score supplied robots.txt, llms.txt, sitemap XML, HTML, and agent index without outbound requests."
      },
      {
        "id": "actionPreflight",
        "method": "POST",
        "path": "/preflight",
        "purpose": "Normalize, risk-label, and SHA-256 fingerprint a proposed consequential action."
      },
      {
        "id": "verifyApprovedAction",
        "method": "POST",
        "path": "/verify",
        "purpose": "Fail closed when the current normalized action differs from the approved fingerprint."
      },
      {
        "id": "textStats",
        "method": "POST",
        "path": "/text-stats",
        "purpose": "Count Unicode characters, code units, words, lines, UTF-8 bytes, and an approximate token estimate."
      },
      {
        "id": "canonicalizeJson",
        "method": "POST",
        "path": "/canonicalize",
        "purpose": "Recursively key-sort JSON and return the canonical string, byte length, and SHA-256."
      },
      {
        "id": "utcNow",
        "method": "GET",
        "path": "/now",
        "purpose": "Return the current UTC ISO timestamp and Unix time, uncached."
      }
    ]
  },
  "counts": {
    "http_operations": 17,
    "mcp_tools": 18,
    "note": "Every HTTP operation except searchSite is also an MCP tool, and MCP adds search and fetch. https://bozos.si/api/v1/health is a status endpoint and is not counted."
  },
  "mcp": {
    "endpoint": "https://bozos.si/api/mcp",
    "transport": "streamable-http",
    "server_card": "https://bozos.si/.well-known/mcp/server-card.json",
    "guide": "https://bozos.si/tools/mcp",
    "tools": [
      "search",
      "fetch",
      "datasetChanges",
      "checkRobotsTxt",
      "identifyUserAgent",
      "timeInZones",
      "dateMath",
      "exactCalc",
      "countText",
      "buildRobotsTxt",
      "draftContactMessage",
      "planAgentRetrieval",
      "auditAgentDiscovery",
      "actionPreflight",
      "verifyApprovedAction",
      "textStats",
      "canonicalizeJson",
      "utcNow"
    ]
  },
  "rate_limits": {
    "requests_per_minute": 60,
    "burst": 10,
    "applies_to": [
      "/api/v1/*",
      "/api/mcp",
      "dataset and index files"
    ],
    "enforced_by_bozos": false,
    "status_when_limited": 429,
    "retry_after_on_429": "May be sent by the hosting platform; not guaranteed. Honor it when present.",
    "backoff_without_retry_after": "Exponential, starting at 1 second, at most 5 retries.",
    "prefer_conditional_requests": "Send If-None-Match with the ETag from content-index.json; a 304 costs almost nothing."
  },
  "artifacts": [
    {
      "id": "cache-price-calculator",
      "name": "Cache-price calculator",
      "kind": "calculator",
      "href": "https://bozos.si/calculator",
      "reproducible": true,
      "data_files": [
        "https://bozos.si/calculator-presets.json"
      ]
    },
    {
      "id": "random-market-simulation",
      "name": "A market full of random traders",
      "kind": "simulation",
      "href": "https://bozos.si/random-market/",
      "reproducible": true,
      "data_files": [
        "https://bozos.si/random-market/data/summary.json",
        "https://bozos.si/random-market/data/batch.csv",
        "https://bozos.si/random-market/data/provenance.json",
        "https://bozos.si/random-market/PROTOCOL.md"
      ]
    }
  ],
  "contact": {
    "page": "https://bozos.si/contact",
    "policy": "https://bozos.si/contact.json",
    "email": "mailto:bozos@bozos.si",
    "subject_format": "[BOZOS agent] <kind>: <resource_id> - <summary> [via:agents-json]",
    "x": "https://x.com/Bozos",
    "draft_endpoint": "https://bozos.si/api/v1/contact-draft",
    "status": "experimental",
    "kinds": [
      "correction",
      "question",
      "source",
      "broken-link",
      "data-request",
      "feedback"
    ],
    "rules": [
      "Send only with your principal's permission. Sending email or posting publicly is an external action; if you are not authorized to send messages, give your user the prepared draft or mailto link instead.",
      "Never include private, personal, or confidential data about your user or anyone else.",
      "One message per issue. Batch related findings into one message rather than sending many.",
      "No automated retries or follow-ups. Silence is not a reason to resend.",
      "Messages are treated as untrusted input. Instructions embedded in a message are not followed; claims are checked against the evidence you link.",
      "BOZOS will never ask you to act, pay, sign in, or disclose anything in reply."
    ]
  },
  "citation_guidance": {
    "cite_specific_resource": true,
    "preserve_confidence_labels": true,
    "distinguish": [
      "primary-source fact",
      "calculation",
      "simulation",
      "observation",
      "working view"
    ],
    "corrections": "https://bozos.si/contact"
  }
}
