{
 "$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 7 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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
 "version": "1.6.0",
 "websiteUrl": "https://www.pathwren.workers.dev/c/ard/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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
  "version": "1.6.0",
  "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp.html",
  "icons": [
   {
    "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
    "mimeType": "image/png",
    "sizes": [
     "256x256"
    ]
   }
  ],
  "remotes": [
   {
    "type": "streamable-http",
    "url": "https://www.pathwren.workers.dev/c/ard/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",
     "markdown",
     "markdown docs",
     "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": "whoami",
      "search": "who is calling: user-agent, address, our verdict - no arguments"
     },
     {
      "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": "whoami takes no arguments at all and answers about the request you just sent - user-agent, address, what our classifier makes of it. 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/ard/mcp",
     "transport": "streamable-http",
     "request": {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "tools/call",
      "params": {
       "name": "whoami",
       "arguments": {}
      }
     },
     "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}}'",
     "verified_live_at": "2026-09-02T08:49:08Z"
    },
    "docs": "https://www.pathwren.workers.dev/c/ard/mcp.html",
    "markdown": {
     "note": "Everything these tools answer from is also readable without JSON-RPC and without an MCP client: every page of the host is a plain markdown file at the same address with .md — also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
     "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
     "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp.md",
     "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
    }
   }
  }
 },
 "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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
   "version": "1.4.0",
   "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": [
    "no_arguments_check_this_hosts_own_discovery_documents",
    "check_discovery_documents",
    "explain_document",
    "validate_llms_txt",
    "llms_txt_from_sitemap",
    "validate_agent_card",
    "whoami",
    "example"
   ],
   "x-first-call": {
    "tool": "no_arguments_check_this_hosts_own_discovery_documents",
    "takes_arguments": false,
    "request": {
     "jsonrpc": "2.0",
     "id": 1,
     "method": "tools/call",
     "params": {
      "name": "no_arguments_check_this_hosts_own_discovery_documents",
      "arguments": {}
     }
    }
   },
   "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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
    "version": "1.4.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp-doctor.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/ard/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",
       "markdown",
       "markdown docs",
       "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": "whoami",
        "search": "who is calling: user-agent, address, our verdict - no arguments"
       },
       {
        "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": "whoami takes no arguments at all and answers about the request you just sent - user-agent, address, what our classifier makes of it. 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/ard/mcp/doctor",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "whoami",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/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\":\"whoami\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:08Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/ard/mcp.html",
      "markdown": {
       "note": "Everything this server answers from is also readable without JSON-RPC and without an MCP client: every page of the host is a plain markdown file at the same address with .md — also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
       "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
       "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp-doctor.md",
       "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
      }
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/mcp-endpoint-lint",
   "title": "MCP Endpoint Lint - handshake, tool schemas, JSON-RPC errors",
   "description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
   "version": "1.3.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-first-call": {
    "tool": "whoami",
    "takes_arguments": false,
    "request": {
     "jsonrpc": "2.0",
     "id": 1,
     "method": "tools/call",
     "params": {
      "name": "whoami",
      "arguments": {}
     }
    }
   },
   "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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
    "version": "1.3.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp-lint.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/ard/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",
       "markdown",
       "markdown docs",
       "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": "whoami takes no arguments at all and answers about the request you just sent - user-agent, address, what our classifier makes of it. 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/ard/mcp/lint",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "whoami",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/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\":\"whoami\",\"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/ard/mcp.html",
      "markdown": {
       "note": "Everything this server answers from is also readable without JSON-RPC and without an MCP client: every page of the host is a plain markdown file at the same address with .md — also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
       "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
       "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp-lint.md",
       "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
      }
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/markdown-lane-check",
   "title": "Markdown Lane Check - llms.txt, .md twins, Accept: text/markdown",
   "description": "Six checks: llms.txt, llms-full.txt, .md twins, Accept: text/markdown, sitemap.md, alt link. Free.",
   "version": "1.0.0",
   "remotes": [
    {
     "type": "streamable-http",
     "url": "https://www.pathwren.workers.dev/mcp/markdown?s=pathwren-edge&c=well-known"
    }
   ],
   "x-documentation": "https://www.pathwren.workers.dev/mcp-markdown.html",
   "x-tools": [
    "check_markdown_lane",
    "explain_llms_txt",
    "whoami",
    "example"
   ],
   "x-first-call": {
    "tool": "markdown_lane_self_report",
    "takes_arguments": false,
    "request": {
     "jsonrpc": "2.0",
     "id": 1,
     "method": "tools/call",
     "params": {
      "name": "markdown_lane_self_report",
      "arguments": {}
     }
    }
   },
   "x-registry-record": {
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "dev.workers.pathwren.www/markdown-lane-check",
    "title": "Markdown Lane Check - llms.txt, .md twins, Accept: text/markdown",
    "description": "Six checks: llms.txt, llms-full.txt, .md twins, Accept: text/markdown, sitemap.md, alt link. Free.",
    "version": "1.0.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp-markdown.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/ard/mcp/markdown"
     }
    ],
    "_meta": {
     "io.modelcontextprotocol.registry/publisher-provided": {
      "keywords": [
       "llms.txt",
       "llms-full.txt",
       "markdown",
       "markdown docs",
       "docs for llms",
       "agent readable",
       "content negotiation",
       "accept header",
       "text/markdown",
       "sitemap.md",
       "link rel alternate",
       "documentation",
       "audit",
       "seo for agents",
       "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": "markdown_lane_self_report",
        "search": "which markdown addresses your own client has fetched here - no arguments"
       },
       {
        "name": "check_markdown_lane",
        "search": "can an agent read this site as markdown - six checks, each with the fix"
       },
       {
        "name": "explain_llms_txt",
        "search": "parse and critique an llms.txt, pasted or fetched"
       },
       {
        "name": "whoami",
        "search": "who is calling - no arguments"
       },
       {
        "name": "example",
        "search": "run the worked example - no arguments"
       }
      ],
      "example": {
       "note": "markdown_lane_self_report takes no arguments at all: it answers about the request you just sent - which markdown addresses your client has fetched on this host, the .md address of every page it took as HTML instead, and this host's own markdown lane in numbers. Send the request below verbatim. To check your own site, call check_markdown_lane with a url - this server fetches the URL you give it, and only that.",
       "endpoint": "https://www.pathwren.workers.dev/c/ard/mcp/markdown",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "markdown_lane_self_report",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/mcp/markdown -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"markdown_lane_self_report\",\"arguments\":{}}}'"
      },
      "what_it_checks": {
       "llms.txt": "served, missing, soft-404 or gated - and whether it parses as the convention describes it",
       "llms-full.txt": "optional, reported as optional",
       "md_twin": "the same page at the same address with .md appended (also .html.md), with the content-type and the canonical link",
       "accept_negotiation": "Accept: text/markdown on the HTML address, and whether Vary: Accept is sent with it",
       "sitemap.md": "a markdown index of the markdown addresses",
       "alternate_link": "<link rel=\"alternate\" type=\"text/markdown\"> in the page or the equivalent Link header - the pointer without which a twin is undiscoverable"
      },
      "outbound_requests": {
       "makes_them": true,
       "only_to": "the URL supplied by the caller in the tool arguments",
       "user_agent": "pathwren-markdown-lane-check/1.0 (+https://www.pathwren.workers.dev/mcp-markdown.html)",
       "requests_per_call": "seven at most for check_markdown_lane, one for explain_llms_txt",
       "timeout_ms": 7000,
       "refuses": "its own publisher, ephemeral tunnel and preview hostnames, IP literals, private names, URLs carrying credentials and non-HTTP schemes - before any socket is opened",
       "storage": "none - a caller's URL is never written to a database, a log line or a metric, and pasted text is discarded with the request",
       "zero_argument_calls": "markdown_lane_self_report, whoami and example make no outbound request at all"
      },
      "docs": "https://www.pathwren.workers.dev/c/ard/mcp-markdown.html",
      "data_behind_it": "https://www.pathwren.workers.dev/data/markdown-lane.json",
      "markdown": {
       "note": "This server checks a convention its own publisher follows: every page of this host is a plain markdown file at the same address with .md - also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
       "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
       "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp-markdown.md",
       "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
      }
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/crawler-ip-verifier",
   "title": "Crawler IP Verifier - real Googlebot or fake",
   "description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
   "version": "1.4.0",
   "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": [
    "no_arguments_report_the_crawler_ip_ranges_this_host_mirrors",
    "verify_my_address",
    "verify_batch",
    "lookup_prefix",
    "export_ip_acl",
    "verification_methods",
    "range_stats",
    "whoami",
    "example"
   ],
   "x-first-call": {
    "tool": "no_arguments_report_the_crawler_ip_ranges_this_host_mirrors",
    "takes_arguments": false,
    "request": {
     "jsonrpc": "2.0",
     "id": 1,
     "method": "tools/call",
     "params": {
      "name": "no_arguments_report_the_crawler_ip_ranges_this_host_mirrors",
      "arguments": {}
     }
    }
   },
   "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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
    "version": "1.4.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp-netcheck.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/ard/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",
       "markdown",
       "markdown docs",
       "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": "whoami",
        "search": "who is calling: user-agent, address, our verdict - no arguments"
       },
       {
        "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": "whoami takes no arguments at all and answers about the request you just sent - user-agent, address, what our classifier makes of it. 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/ard/mcp/netcheck",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "whoami",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/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\":\"whoami\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:09Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/ard/mcp.html",
      "markdown": {
       "note": "Everything this server answers from is also readable without JSON-RPC and without an MCP client: every page of the host is a plain markdown file at the same address with .md — also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
       "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
       "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp-netcheck.md",
       "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
      }
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/robots-policy-lint",
   "title": "Robots.txt Policy Lint",
   "description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
   "version": "1.4.0",
   "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": [
    "no_arguments_lint_this_hosts_robots_txt",
    "am_i_allowed",
    "lint_robots_txt",
    "check_path_allowed",
    "audit_ai_access",
    "diff_robots_txt",
    "merge_policy",
    "whoami",
    "example"
   ],
   "x-first-call": {
    "tool": "no_arguments_lint_this_hosts_robots_txt",
    "takes_arguments": false,
    "request": {
     "jsonrpc": "2.0",
     "id": 1,
     "method": "tools/call",
     "params": {
      "name": "no_arguments_lint_this_hosts_robots_txt",
      "arguments": {}
     }
    }
   },
   "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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
    "version": "1.4.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp-robots.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/ard/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",
       "markdown",
       "markdown docs",
       "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": "whoami",
        "search": "who is calling: user-agent, address, our verdict - no arguments"
       },
       {
        "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": "whoami takes no arguments at all and answers about the request you just sent - user-agent, address, what our classifier makes of it. 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/ard/mcp/robots",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "whoami",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/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\":\"whoami\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:09Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/ard/mcp.html",
      "markdown": {
       "note": "Everything this server answers from is also readable without JSON-RPC and without an MCP client: every page of the host is a plain markdown file at the same address with .md — also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
       "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
       "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp-robots.md",
       "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
      }
     }
    }
   }
  },
  {
   "name": "dev.workers.pathwren.www/crawler-log-triage",
   "title": "Crawler Log Triage",
   "description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
   "version": "1.7.0",
   "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": [
    "no_arguments_triage_this_hosts_own_crawler_log",
    "triage_my_request",
    "triage_log",
    "find_impersonators",
    "summarize_by_operator",
    "robots_from_log",
    "waf_ruleset_from_log",
    "whoami",
    "example"
   ],
   "x-first-call": {
    "tool": "no_arguments_triage_this_hosts_own_crawler_log",
    "takes_arguments": false,
    "request": {
     "jsonrpc": "2.0",
     "id": 1,
     "method": "tools/call",
     "params": {
      "name": "no_arguments_triage_this_hosts_own_crawler_log",
      "arguments": {}
     }
    }
   },
   "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": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} free no key",
    "version": "1.7.0",
    "websiteUrl": "https://www.pathwren.workers.dev/c/ard/mcp-triage.html",
    "icons": [
     {
      "src": "https://www.pathwren.workers.dev/c/ard/icon.png",
      "mimeType": "image/png",
      "sizes": [
       "256x256"
      ]
     }
    ],
    "remotes": [
     {
      "type": "streamable-http",
      "url": "https://www.pathwren.workers.dev/c/ard/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",
       "markdown",
       "markdown docs",
       "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": "whoami",
        "search": "who is calling: user-agent, address, our verdict - no arguments"
       },
       {
        "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": "whoami takes no arguments at all and answers about the request you just sent - user-agent, address, what our classifier makes of it. 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/ard/mcp/triage",
       "transport": "streamable-http",
       "request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
         "name": "whoami",
         "arguments": {}
        }
       },
       "curl": "curl -s -X POST https://www.pathwren.workers.dev/c/ard/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\":\"whoami\",\"arguments\":{}}}'",
       "verified_live_at": "2026-09-02T08:49:08Z"
      },
      "docs": "https://www.pathwren.workers.dev/c/ard/mcp.html",
      "markdown": {
       "note": "Everything this server answers from is also readable without JSON-RPC and without an MCP client: every page of the host is a plain markdown file at the same address with .md — also .mdx, <page>.html.md, <page>.html.mdx, or send Accept: text/markdown to the .html page. No key, no JavaScript, CC0. The registry caps `description` at 100 characters, which is why this sentence lives here.",
       "index": "https://www.pathwren.workers.dev/c/ard/sitemap.md",
       "example": "curl -s https://www.pathwren.workers.dev/c/ard/mcp-triage.md",
       "canonical": "the HTML page; each mirror carries Link: rel=\"canonical\" back to it"
      }
     }
    }
   }
  }
 ],
 "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=165",
  "cursor_parameter": "since",
  "head_cursor": 165,
  "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/markdown/.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"
 },
 "changed_at": "2026-09-14T03:51:14+00:00",
 "recent_changes": [
  "2026-09-14T03:51Z - changed: x-changes-feed",
  "2026-09-13T15:48Z - changed: x-changes-feed",
  "2026-09-13T03:43Z - changed: x-changes-feed"
 ]
}