{
 "$comment": "There is no registered schema and no settled convention for /.well-known/mcp.json — MCP discovery is the official registry plus the client's own configuration — so this document invents no fields. The first block is the record the official MCP Registry holds for this server, mirrored: it is reproduced verbatim under x-registry-record, schema and all. The one difference is the query string on `remotes`: ?c=well-known instead of ?c=mcp-registry, so that a client which found the server through this file is attributed to this file. Same endpoint, and the server ignores the query string. Everything else is prefixed x- because it is description, not specification. Generated by surfaces/ai-crawler-index/build.py; the tool list is parsed out of the server's own source, so it cannot drift from what tools/list returns. This host serves 6 MCP servers with no tool in common, each its own registry record: this document describes the first and lists the rest under x-other-servers — both halves generated from the server*.json records on disk, so a new record appears here without an edit. The same bytes are served at /.well-known/mcp; each endpoint additionally serves a document scoped to itself at <endpoint>/.well-known/mcp[.json].",
 "name": "dev.workers.pathwren.www/ai-crawler-index",
 "title": "AI Crawler Index",
 "description": "Name any bot user-agent, verify a crawler IP, or generate robots.txt. Free, no key, no signup.",
 "version": "1.3.0",
 "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-registry-official/mcp.html",
 "remotes": [
  {
   "type": "streamable-http",
   "url": "https://www.pathwren.workers.dev/mcp?s=pathwren-edge&c=well-known"
  }
 ],
 "x-registry-record": {
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "dev.workers.pathwren.www/ai-crawler-index",
  "title": "AI Crawler Index",
  "description": "Name any bot user-agent, verify a crawler IP, or generate robots.txt. Free, no key, no signup.",
  "version": "1.3.0",
  "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-registry-official/mcp.html",
  "icons": [
   {
    "src": "https://www.pathwren.workers.dev/c/mcp-registry-official/icon.png",
    "mimeType": "image/png",
    "sizes": [
     "256x256"
    ]
   }
  ],
  "remotes": [
   {
    "type": "streamable-http",
    "url": "https://www.pathwren.workers.dev/c/mcp-registry-official/mcp"
   }
  ],
  "_meta": {
   "io.modelcontextprotocol.registry/publisher-provided": {
    "keywords": [
     "robots.txt",
     "gptbot",
     "googlebot",
     "ai crawler",
     "user agent lookup",
     "block ai scrapers",
     "bot detection",
     "crawler ip",
     "llms.txt",
     "free",
     "no api key",
     "no auth"
    ],
    "auth": "none",
    "authentication": "none — no key, no account, no OAuth, no rate limit",
    "pricing": "free",
    "dataLicense": "CC0-1.0",
    "publisher": "Pathwren — an independent, non-commercial automated project",
    "tools": [
     {
      "name": "classify_user_agent",
      "search": "identify a bot from its user-agent string"
     },
     {
      "name": "lookup_crawler",
      "search": "look up one crawler: operator, purpose, cost of blocking it"
     },
     {
      "name": "list_crawlers",
      "search": "list or filter every AI crawler in the index"
     },
     {
      "name": "generate_robots_txt",
      "search": "generate a robots.txt that blocks AI training or scrapers"
     },
     {
      "name": "is_verified_crawler_ip",
      "search": "check whether an IP really belongs to Googlebot/GPTBot"
     },
     {
      "name": "whats_changed",
      "search": "see what changed in the index and when it was built"
     },
     {
      "name": "example",
      "search": "run the worked example — no arguments"
     }
    ],
    "example": {
     "note": "Every tool here accepts {} and answers with its own documented worked example — nothing of yours is read, nothing is fetched from a third party. Send the request below verbatim.",
     "endpoint": "https://www.pathwren.workers.dev/c/mcp-registry-official/mcp",
     "transport": "streamable-http",
     "request": {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "tools/call",
      "params": {
       "name": "example",
       "arguments": {}
      }
     },
     "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/mcp-registry-official/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'",
     "verified_live_at": "2026-09-02T08:49:08Z"
    },
    "docs": "https://www.pathwren.workers.dev/c/mcp-registry-official/mcp.html"
   }
  }
 },
 "x-registry": "https://registry.modelcontextprotocol.io",
 "x-endpoint": {
  "url": "https://www.pathwren.workers.dev/mcp",
  "transport": "streamable-http",
  "method": "POST",
  "protocol": "JSON-RPC 2.0 over HTTP POST (Streamable HTTP), stateless — no session id",
  "protocol_versions": [
   "2025-06-18"
  ],
  "accept": "application/json, text/event-stream",
  "auth": "none — public, read-only, no key, no signup, no quota",
  "get_returns": "a plain JSON description of this server; MCP messages go by POST",
  "posting_to_this_document": "307 Temporary Redirect to the endpoint above, method and body preserved (RFC 9110 §15.4.8); the redirect body is a JSON-RPC error naming the endpoint in error.data.endpoint for clients that do not follow redirects. This document is a card, not an endpoint — but POSTing to it works."
 },
 "x-documentation": "https://www.pathwren.workers.dev/mcp.html",
 "x-tools": [
  {
   "name": "classify_user_agent",
   "title": "Classify a user-agent string",
   "description": "Identify the crawler behind a raw User-Agent header: operator, category, robots.txt stance, how to verify it, and what blocking it costs. A user-agent is a claim, not proof — confirm with is_verified_crawler_ip. Example: user_agent='GPTBot/1.2' returns GPTBot, OpenAI, ai-training. Also callable without MCP, same implementation: GET https://www.pathwren.workers.dev/tools/classify-ua?ua=GPTBot%2F1.2&s=client-dossiers"
  },
  {
   "name": "lookup_crawler",
   "title": "Look up one crawler",
   "description": "The full index record for one crawler: operator, category, robots.txt token and stance, user-agent substring and example, verification method, mirrored IP-range endpoint, and what blocking it costs. An unknown slug returns near matches. Example: slug='claudebot'."
  },
  {
   "name": "list_crawlers",
   "title": "List and filter crawlers",
   "description": "The index, filtered or whole: each row says what the crawler is and what blocking it costs, and the reply lists every valid filter value. Example: category='ai-training', limit=20."
  },
  {
   "name": "generate_robots_txt",
   "title": "Generate a robots.txt for a stance",
   "description": "A ready-to-paste robots.txt block for one stance, with the reasoning and the crawlers it names. Omit the argument to get all eight stances described. Example: stance='block-ai-training'."
  },
  {
   "name": "is_verified_crawler_ip",
   "title": "Check an IP against operator-published crawler ranges",
   "description": "Test an IPv4 or IPv6 address against every crawler prefix the operators themselves publish, remirrored every six hours. Returns the matching prefix, its source and the crawlers using it; a miss is reported as a miss, not as a forgery. Example: ip='20.171.206.5'. Also callable without MCP, same implementation: GET https://www.pathwren.workers.dev/tools/verify-crawler?ip=20.171.206.5&s=client-dossiers"
  },
  {
   "name": "whats_changed",
   "title": "What changed in the index",
   "description": "Freshness and change state: when the index was built, when each operator source was last fetched, which changed, which are failing, and the dated changelog. The cron check before regenerating a config from this data. Example: since='2026-08-01'."
  },
  {
   "name": "changes_since",
   "title": "What changed since your cursor",
   "description": "Only what changed since your last call: prefixes added or removed, upstreams failed or recovered, records edited. Send back the `cursor` from the previous result; it advances only on a real change, and the data refreshes every 6h. Example: since='0'."
  },
  {
   "name": "whoami",
   "title": "Who is calling? (no arguments)",
   "description": "Takes no arguments. Safe to call. Deterministic. Touches no third party. Classifies the request you just sent: the user-agent you claim, the address you came from, the class this host's own instrument books you as, whether we have seen you here before and what you fetched, and what this host's robots policy says about you. Every fact comes from the headers on your own request or from a file this host already publishes — nothing is fetched, nothing about you is invented, no argument exists. Example: arguments={} returns your user-agent, your address, the class we book you as and whether we have seen you here before."
  },
  {
   "name": "example",
   "title": "Run this server's worked example (no arguments)",
   "description": "Takes no arguments. Safe to call. Deterministic. Touches no third party. Runs this server's own worked example end to end — one of its real tools, on a canned input taken from this host's own published data — and returns exactly the structuredContent a real call returns, not a mock and not a description of one. Use it to see the shape of an answer before you decide what to send. No URL of yours is fetched and no third party is touched. Example: arguments={} runs it and returns the real answer."
  }
 ],
 "x-other-servers": [
  {
   "name": "dev.workers.pathwren.www/agent-discovery-doctor",
   "title": "Agent Discovery Doctor - llms.txt, agent card, mcp.json",
   "description": "See which discovery files a host serves - llms.txt, agent card, mcp.json. Free, no key, no signup.",
   "version": "1.0.1",
   "remotes": [
    {
     "type": "streamable-http",
     "url": "https://www.pathwren.workers.dev/mcp/doctor?s=pathwren-edge&c=well-known"
    }
   ],
   "x-documentation": "https://www.pathwren.workers.dev/mcp-doctor.html",
   "x-tools": [
    "check_discovery_documents",
    "explain_document",
    "validate_llms_txt",
    "llms_txt_from_sitemap",
    "validate_agent_card",
    "whoami",
    "example"
   ],
   "x-registry-record": {
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "dev.workers.pathwren.www/agent-discovery-doctor",
    "title": "Agent Discovery Doctor - llms.txt, agent card, mcp.json",
    "description": "See which discovery files a host serves - llms.txt, agent card, mcp.json. Free, no key, no signup.",
    "version": "1.0.1",
    "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-record-doctor/mcp-doctor.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/mcp-record-doctor/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/mcp-record-doctor/mcp/doctor"
     }
    ],
    "_meta": {
     "io.modelcontextprotocol.registry/publisher-provided": {
      "keywords": [
       "llms.txt",
       "llms.txt validator",
       "agent card",
       "a2a",
       "well-known",
       "mcp.json",
       "openapi",
       "site audit",
       "ai readiness",
       "discovery",
       "free",
       "no api key",
       "no auth"
      ],
      "auth": "none",
      "authentication": "none — no key, no account, no OAuth, no rate limit",
      "pricing": "free",
      "dataLicense": "CC0-1.0",
      "publisher": "Pathwren — an independent, non-commercial automated project",
      "tools": [
       {
        "name": "check_discovery_documents",
        "search": "check which discovery files a site publishes"
       },
       {
        "name": "validate_llms_txt",
        "search": "validate an llms.txt you paste"
       },
       {
        "name": "llms_txt_from_sitemap",
        "search": "generate an llms.txt from a sitemap"
       },
       {
        "name": "validate_agent_card",
        "search": "validate an A2A agent card"
       },
       {
        "name": "explain_document",
        "search": "explain what a discovery document is and who reads it"
       },
       {
        "name": "example",
        "search": "run the worked example — no arguments"
       }
      ],
      "example": {
       "note": "Every tool here accepts {} and answers with its own documented worked example — nothing of yours is read, nothing is fetched from a third party. Send the request below verbatim.",
       "endpoint": "https://www.pathwren.workers.dev/c/mcp-record-doctor/mcp/doctor",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "example",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/mcp-record-doctor/mcp/doctor -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:08Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/mcp-record-doctor/mcp.html"
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/mcp-endpoint-lint",
   "title": "MCP Endpoint Lint - handshake, tool schemas, JSON-RPC errors",
   "description": "Lint any MCP endpoint you name: handshake, tool schemas, error conformance. Free, no key.",
   "version": "1.0.0",
   "remotes": [
    {
     "type": "streamable-http",
     "url": "https://www.pathwren.workers.dev/mcp/lint?s=pathwren-edge&c=well-known"
    }
   ],
   "x-documentation": "https://www.pathwren.workers.dev/mcp-lint.html",
   "x-tools": [
    "handshake_report",
    "tools_list_report",
    "error_conformance",
    "discovery_report",
    "score_card",
    "whoami",
    "example"
   ],
   "x-registry-record": {
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "dev.workers.pathwren.www/mcp-endpoint-lint",
    "title": "MCP Endpoint Lint - handshake, tool schemas, JSON-RPC errors",
    "description": "Lint any MCP endpoint you name: handshake, tool schemas, error conformance. Free, no key.",
    "version": "1.0.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-record-lint/mcp-lint.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/mcp-record-lint/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/mcp-record-lint/mcp/lint"
     }
    ],
    "_meta": {
     "io.modelcontextprotocol.registry/publisher-provided": {
      "keywords": [
       "mcp",
       "lint",
       "validator",
       "conformance",
       "health check",
       "monitoring",
       "json-rpc",
       "json schema",
       "protocol version",
       "streamable http",
       "oauth-protected-resource",
       "rfc 9728",
       "discovery",
       "score card",
       "free",
       "no api key",
       "no auth"
      ],
      "auth": "none",
      "authentication": "none - no key, no account, no OAuth",
      "pricing": "free",
      "dataLicense": "CC0-1.0",
      "publisher": "Pathwren - an independent, non-commercial automated project",
      "tools": [
       {
        "name": "handshake_report",
        "search": "does this MCP endpoint's initialize work, and is it idempotent"
       },
       {
        "name": "tools_list_report",
        "search": "schema-validate every tool an MCP endpoint advertises"
       },
       {
        "name": "error_conformance",
        "search": "does it answer -32601/-32602, or an HTML 500"
       },
       {
        "name": "discovery_report",
        "search": "what an MCP client looks for before it dials, and what answered"
       },
       {
        "name": "score_card",
        "search": "score an MCP endpoint out of 100 in one call"
       },
       {
        "name": "whoami",
        "search": "who is calling - no arguments"
       },
       {
        "name": "example",
        "search": "run the worked example - no arguments"
       }
      ],
      "example": {
       "note": "Every tool here accepts {} and answers with its own documented worked example, run against a built-in fixture: no outbound request is made and no third party is touched. Send the request below verbatim. To lint a real endpoint, pass your own url - this server fetches the URL you give it, and only that.",
       "endpoint": "https://www.pathwren.workers.dev/c/mcp-record-lint/mcp/lint",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "example",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/mcp-record-lint/mcp/lint -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'"
      },
      "outbound_requests": {
       "makes_them": true,
       "only_to": "the URL supplied by the caller in the tool arguments",
       "user_agent": "growth-loop/1.0 (+https://www.pathwren.workers.dev/mcp-lint.html)",
       "timeout_ms": 6000,
       "rate_limited": "per caller, per target host, and per edge location",
       "refuses": "its own publisher, ephemeral tunnel and preview hostnames, IP literals, private names, URLs carrying credentials, non-HTTP schemes and unusual ports - before any socket is opened",
       "storage": "none - a caller's URL is never written to a database, a log line or a metric",
       "zero_argument_calls": "run against a built-in fixture and make no outbound request at all"
      },
      "docs": "https://www.pathwren.workers.dev/c/mcp-record-lint/mcp.html"
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/crawler-ip-verifier",
   "title": "Crawler IP Verifier - real Googlebot or fake",
   "description": "Tell real Googlebot/GPTBot from fake: 500 IPs a call, firewall allowlist out. Free, no key.",
   "version": "1.0.1",
   "remotes": [
    {
     "type": "streamable-http",
     "url": "https://www.pathwren.workers.dev/mcp/netcheck?s=pathwren-edge&c=well-known"
    }
   ],
   "x-documentation": "https://www.pathwren.workers.dev/mcp-netcheck.html",
   "x-tools": [
    "verify_batch",
    "lookup_prefix",
    "export_ip_acl",
    "verification_methods",
    "range_stats",
    "whoami",
    "example"
   ],
   "x-registry-record": {
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "dev.workers.pathwren.www/crawler-ip-verifier",
    "title": "Crawler IP Verifier - real Googlebot or fake",
    "description": "Tell real Googlebot/GPTBot from fake: 500 IPs a call, firewall allowlist out. Free, no key.",
    "version": "1.0.1",
    "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-record-netcheck/mcp-netcheck.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/mcp-record-netcheck/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/mcp-record-netcheck/mcp/netcheck"
     }
    ],
    "_meta": {
     "io.modelcontextprotocol.registry/publisher-provided": {
      "keywords": [
       "verify googlebot",
       "gptbot ip",
       "is this bot real",
       "ip allowlist",
       "firewall",
       "cidr lookup",
       "bot verification",
       "reverse dns",
       "nginx allow",
       "cloudflare firewall",
       "free",
       "no api key",
       "no auth"
      ],
      "auth": "none",
      "authentication": "none — no key, no account, no OAuth, no rate limit",
      "pricing": "free",
      "dataLicense": "CC0-1.0",
      "publisher": "Pathwren — an independent, non-commercial automated project",
      "tools": [
       {
        "name": "verify_batch",
        "search": "verify up to 500 IPs against operator-published ranges"
       },
       {
        "name": "lookup_prefix",
        "search": "check whether a CIDR overlaps a published crawler range"
       },
       {
        "name": "export_ip_acl",
        "search": "export an nginx, Apache, HAProxy, ipset or Cloudflare allowlist"
       },
       {
        "name": "verification_methods",
        "search": "find out whether a crawler can be verified at all, and how"
       },
       {
        "name": "range_stats",
        "search": "see the state of the mirrored prefix lists"
       },
       {
        "name": "example",
        "search": "run the worked example — no arguments"
       }
      ],
      "example": {
       "note": "Every tool here accepts {} and answers with its own documented worked example — nothing of yours is read, nothing is fetched from a third party. Send the request below verbatim.",
       "endpoint": "https://www.pathwren.workers.dev/c/mcp-record-netcheck/mcp/netcheck",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "example",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/mcp-record-netcheck/mcp/netcheck -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:09Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/mcp-record-netcheck/mcp.html"
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/robots-policy-lint",
   "title": "Robots.txt Policy Lint",
   "description": "Lint your robots.txt and see which AI crawlers it really blocks. Free, no key, nothing to install.",
   "version": "1.0.1",
   "remotes": [
    {
     "type": "streamable-http",
     "url": "https://www.pathwren.workers.dev/mcp/robots?s=pathwren-edge&c=well-known"
    }
   ],
   "x-documentation": "https://www.pathwren.workers.dev/mcp-robots.html",
   "x-tools": [
    "lint_robots_txt",
    "check_path_allowed",
    "audit_ai_access",
    "diff_robots_txt",
    "merge_policy",
    "whoami",
    "example"
   ],
   "x-registry-record": {
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "dev.workers.pathwren.www/robots-policy-lint",
    "title": "Robots.txt Policy Lint",
    "description": "Lint your robots.txt and see which AI crawlers it really blocks. Free, no key, nothing to install.",
    "version": "1.0.1",
    "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-record-robots/mcp-robots.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/mcp-record-robots/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/mcp-record-robots/mcp/robots"
     }
    ],
    "_meta": {
     "io.modelcontextprotocol.registry/publisher-provided": {
      "keywords": [
       "robots.txt",
       "robots.txt tester",
       "robots.txt checker",
       "rfc 9309",
       "block ai training",
       "disallow",
       "crawl-delay",
       "seo",
       "opt out of ai",
       "free",
       "no api key",
       "no auth"
      ],
      "auth": "none",
      "authentication": "none — no key, no account, no OAuth, no rate limit",
      "pricing": "free",
      "dataLicense": "CC0-1.0",
      "publisher": "Pathwren — an independent, non-commercial automated project",
      "tools": [
       {
        "name": "lint_robots_txt",
        "search": "lint a robots.txt you paste"
       },
       {
        "name": "check_path_allowed",
        "search": "test whether a crawler may fetch a path (RFC 9309)"
       },
       {
        "name": "audit_ai_access",
        "search": "see which AI crawlers your robots.txt actually stops"
       },
       {
        "name": "diff_robots_txt",
        "search": "diff two robots.txt files by effect, not by text"
       },
       {
        "name": "merge_policy",
        "search": "add a ready-made block-ai-training stance to your file"
       },
       {
        "name": "example",
        "search": "run the worked example — no arguments"
       }
      ],
      "example": {
       "note": "Every tool here accepts {} and answers with its own documented worked example — nothing of yours is read, nothing is fetched from a third party. Send the request below verbatim.",
       "endpoint": "https://www.pathwren.workers.dev/c/mcp-record-robots/mcp/robots",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "example",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/mcp-record-robots/mcp/robots -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:09Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/mcp-record-robots/mcp.html"
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/crawler-log-triage",
   "title": "Crawler Log Triage",
   "description": "Paste access-log lines: every bot named, fakes flagged, robots.txt and WAF rules. Free, no key.",
   "version": "1.0.1",
   "remotes": [
    {
     "type": "streamable-http",
     "url": "https://www.pathwren.workers.dev/mcp/triage?s=pathwren-edge&c=well-known"
    }
   ],
   "x-documentation": "https://www.pathwren.workers.dev/mcp-triage.html",
   "x-tools": [
    "triage_log",
    "find_impersonators",
    "summarize_by_operator",
    "robots_from_log",
    "waf_ruleset_from_log",
    "whoami",
    "example"
   ],
   "x-registry-record": {
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "dev.workers.pathwren.www/crawler-log-triage",
    "title": "Crawler Log Triage",
    "description": "Paste access-log lines: every bot named, fakes flagged, robots.txt and WAF rules. Free, no key.",
    "version": "1.0.1",
    "websiteUrl": "https://www.pathwren.workers.dev/c/mcp-record-triage/mcp-triage.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/mcp-record-triage/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/mcp-record-triage/mcp/triage"
     }
    ],
    "_meta": {
     "io.modelcontextprotocol.registry/publisher-provided": {
      "keywords": [
       "access log",
       "log analysis",
       "nginx log",
       "apache log",
       "bot traffic",
       "fake googlebot",
       "waf rules",
       "robots.txt generator",
       "who is crawling me",
       "free",
       "no api key",
       "no auth"
      ],
      "auth": "none",
      "authentication": "none — no key, no account, no OAuth, no rate limit",
      "pricing": "free",
      "dataLicense": "CC0-1.0",
      "publisher": "Pathwren — an independent, non-commercial automated project",
      "tools": [
       {
        "name": "triage_log",
        "search": "paste an access log and see which bots hit you"
       },
       {
        "name": "find_impersonators",
        "search": "find the lines faking Googlebot or GPTBot"
       },
       {
        "name": "summarize_by_operator",
        "search": "roll a log up by operator: who crawled you, how much"
       },
       {
        "name": "robots_from_log",
        "search": "generate a robots.txt for the bots actually in your log"
       },
       {
        "name": "waf_ruleset_from_log",
        "search": "generate nginx, Caddy, Cloudflare, HAProxy or Apache rules"
       },
       {
        "name": "example",
        "search": "run the worked example — no arguments"
       }
      ],
      "example": {
       "note": "Every tool here accepts {} and answers with its own documented worked example — nothing of yours is read, nothing is fetched from a third party. Send the request below verbatim.",
       "endpoint": "https://www.pathwren.workers.dev/c/mcp-record-triage/mcp/triage",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "example",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/mcp-record-triage/mcp/triage -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:08Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/mcp-record-triage/mcp.html"
     }
    }
   }
  }
 ],
 "x-resources": [
  "https://www.pathwren.workers.dev/data/agents.json",
  "https://www.pathwren.workers.dev/data/ua-regex.json",
  "https://www.pathwren.workers.dev/ip-ranges/all.json",
  "https://www.pathwren.workers.dev/status.json",
  "https://www.pathwren.workers.dev/changes.json?since=0"
 ],
 "x-changes-feed": {
  "url": "https://www.pathwren.workers.dev/changes.json",
  "start_here": "https://www.pathwren.workers.dev/changes.json?since=111",
  "cursor_parameter": "since",
  "head_cursor": 111,
  "min_poll_seconds": 21600,
  "tool": "changes_since",
  "resource": "https://www.pathwren.workers.dev/changes.json?since=0",
  "how": "Read `cursor` from the response and send it back as `since`. It advances only when something really changed; an unchanged answer is a few hundred bytes, or a 304 with no body if you send back the ETag."
 },
 "x-example": "curl -s https://www.pathwren.workers.dev/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"classify_user_agent\",\"arguments\":{\"user_agent\":\"GPTBot/1.2\"}}}'",
 "x-license": "CC0-1.0",
 "x-independent": "An independent, non-commercial automated project: it is run by software rather than by a person, and it says so wherever it introduces itself. It is not affiliated with, endorsed by or operated by any of the crawler operators it documents, nor by any other company. The category and cost-of-blocking fields are its own assessment and are labelled as such; every other field is cited to the operator's own documentation.",
 "x-a2a": {
  "endpoint": "https://www.pathwren.workers.dev/a2a",
  "agent_card": "https://www.pathwren.workers.dev/.well-known/agent-card.json",
  "protocol": "A2A (Agent2Agent) v1.0 / v0.3, JSON-RPC 2.0 over HTTP POST",
  "invoke_with": "message/send (v1.0 name: SendMessage)",
  "returns": "a Task already in state completed, in the same HTTP response — no polling, no streaming, no task store; the task id encodes the call so tasks/get can re-run it",
  "every_skill_as_a_ready_body": "https://www.pathwren.workers.dev/a2a/example.json?s=a2a-crawler-index",
  "same_tools": "the A2A skills are these MCP tools, executed by the same functions in the same worker"
 },
 "x-authorization": {
  "required": false,
  "oauth_protected_resource_metadata": null,
  "oauth_authorization_server_metadata": null,
  "refusal_is_machine_readable_at": [
   "https://www.pathwren.workers.dev/.well-known/oauth-protected-resource",
   "https://www.pathwren.workers.dev/.well-known/oauth-authorization-server",
   "https://www.pathwren.workers.dev/.well-known/openid-configuration"
  ],
  "refusal_status": "404 with a JSON body — the status is the answer, the body is the reason",
  "why": "This server requires no authorization: every method is public and read-only, it never issues a 401 and it never inspects an Authorization header. The MCP authorization specification is written for a protected server — 'a protected MCP server acts as an OAuth 2.1 resource server' — and its Authorization Server Discovery section requires that 'the Protected Resource Metadata document returned by the MCP server MUST include the authorization_servers field containing at least one authorization server'. There is no authorization server here to name, so /.well-known/oauth-protected-resource is 404 rather than a document with an empty or invented field, and /.well-known/oauth-authorization-server is 404 because this host is not an OAuth authorization server at all. Both 404s are a branch the specification's own discovery flow draws ('Root metadata not found'). Since 2026-09-01T03:35Z those 404s carry a JSON body saying exactly this, so a scanner learns the reason without having to find this file.",
  "specification": "https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/authorization-server-discovery"
 },
 "x-ownership": {
  "document": "https://www.pathwren.workers.dev/.well-known/owners.json",
  "also_at": [
   "https://www.pathwren.workers.dev/mcp/.well-known/owners.json",
   "https://www.pathwren.workers.dev/mcp/doctor/.well-known/owners.json",
   "https://www.pathwren.workers.dev/mcp/lint/.well-known/owners.json",
   "https://www.pathwren.workers.dev/mcp/netcheck/.well-known/owners.json",
   "https://www.pathwren.workers.dev/mcp/robots/.well-known/owners.json",
   "https://www.pathwren.workers.dev/mcp/triage/.well-known/owners.json"
  ],
  "schema": "https://verifymcp.io/schemas/owners.json",
  "claims": "the address in that document is the operator of every MCP server served from this host; it is the same address published in /.well-known/security.txt and in the apis.json contact"
 }
}