{
 "name": "Zero-setup HTTP twins of this host's read-only MCP tools",
 "what": "Every one of these is a read-only tool an MCP server here already runs, reachable with a URL and query parameters instead of a JSON-RPC session. No account, no key, no handshake. CORS open, cacheable, CC0-1.0.",
 "generated_at": "2026-09-02T05:01:38+00:00",
 "count": 8,
 "tools": [
  {
   "id": "whoami",
   "endpoint": "https://www.pathwren.workers.dev/tools/whoami",
   "title": "Who is calling? — the one endpoint that needs nothing from you",
   "summary": "Takes no arguments at all. It answers about the request you just made: the user-agent you sent, the address you came from, whether the crawler index recognises you, whether any operator publishes a prefix containing your address, the class this host's own instrument books you as, and whether we have seen you here before and what you fetched. Every fact comes from your own request headers or from a file this host already publishes; nothing is fetched and nothing about you is invented.",
   "docs": "https://www.pathwren.workers.dev/tools/whoami.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/whoami.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/whoami?&s=client-dossiers'",
   "parameters": [],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp",
    "tool": "whoami"
   }
  },
  {
   "id": "example",
   "endpoint": "https://www.pathwren.workers.dev/tools/example",
   "title": "A worked example, run for real — no arguments",
   "summary": "Takes no arguments at all. It runs this host's flagship tool (classify_user_agent) on a canned input from our own published log — the busiest client we have seen — and returns exactly the answer a real call returns, not a mock. Use it to see the shape of an answer before deciding what to send.",
   "docs": "https://www.pathwren.workers.dev/tools/example.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/example.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/example?&s=client-dossiers'",
   "parameters": [],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp",
    "tool": "example"
   }
  },
  {
   "id": "verify-crawler",
   "endpoint": "https://www.pathwren.workers.dev/tools/verify-crawler",
   "title": "Does this address really belong to the crawler it claims to be?",
   "summary": "Check one or more IP addresses against every crawler prefix the operators themselves publish (Google, OpenAI, Anthropic, Microsoft, Apple, Perplexity, Amazon and the rest, remirrored every six hours), and — when you name the crawler the client claimed to be — say whether the range that contains it belongs to that operator or to a different one.",
   "docs": "https://www.pathwren.workers.dev/tools/verify-crawler.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/verify-crawler.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/verify-crawler?ip=66.249.66.1&ua=Googlebot&s=client-dossiers'",
   "parameters": [
    "ip",
    "ua"
   ],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp/netcheck",
    "tool": "verify_batch"
   }
  },
  {
   "id": "robots-lint",
   "endpoint": "https://www.pathwren.workers.dev/tools/robots-lint",
   "title": "Lint a robots.txt",
   "summary": "Paste a robots.txt and get every fault that makes it do something other than what it looks like: misspelled directives, a whole User-Agent string where a product token belongs, rules before any User-agent line, duplicate groups, noindex (unsupported since 2019), relative Sitemap URLs, a byte-order mark. Each finding carries the line number and the fix.",
   "docs": "https://www.pathwren.workers.dev/tools/robots-lint.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/robots-lint.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/robots-lint?robots_txt=User-agent%3A%20GPTBot%0ADisallow%3A%20%2F%0ANoindex%3A%20%2Fprivate%0A&s=client-dossiers'",
   "parameters": [
    "robots_txt"
   ],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp/robots",
    "tool": "lint_robots_txt"
   }
  },
  {
   "id": "robots-allowed",
   "endpoint": "https://www.pathwren.workers.dev/tools/robots-allowed",
   "title": "Would this crawler fetch this path?",
   "summary": "Evaluate a pasted robots.txt for one crawler and one or more paths under RFC 9309 — longest token match for the group, longest pattern for the rule, Allow breaking a tie, * and $ supported — and get allowed/disallowed per path with the exact line that decided it, plus a flag on the cases where a merge-groups parser and a first-group-wins parser would disagree.",
   "docs": "https://www.pathwren.workers.dev/tools/robots-allowed.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/robots-allowed.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/robots-allowed?robots_txt=User-agent%3A%20*%0ADisallow%3A%20%2F%0AAllow%3A%20%2Fblog%2F%0A&ua=GPTBot&path=/blog/post&path=/private&s=client-dossiers'",
   "parameters": [
    "robots_txt",
    "ua",
    "path"
   ],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp/robots",
    "tool": "check_path_allowed"
   }
  },
  {
   "id": "ai-access",
   "endpoint": "https://www.pathwren.workers.dev/tools/ai-access",
   "title": "Which AI crawlers does this file actually stop?",
   "summary": "Evaluate a pasted robots.txt against every AI crawler in this index and get the two lists that matter — blocked and allowed, per operator and category — plus the tokens in your file that match no known crawler (a typo blocks nothing), and the separation between crawlers that document obedience and the ones observed ignoring robots.txt, which need an IP or WAF rule instead.",
   "docs": "https://www.pathwren.workers.dev/tools/ai-access.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/ai-access.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/ai-access?robots_txt=User-agent%3A%20GPTBot%0ADisallow%3A%20%2F%0A&path=/&s=client-dossiers'",
   "parameters": [
    "robots_txt",
    "path"
   ],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp/robots",
    "tool": "audit_ai_access"
   }
  },
  {
   "id": "classify-ua",
   "endpoint": "https://www.pathwren.workers.dev/tools/classify-ua",
   "title": "What is this user-agent?",
   "summary": "Identify the crawler behind a raw User-Agent header: operator, category, robots.txt token and stance, how it can be verified, and what blocking it costs. An unmatched string is reported as unmatched, with a labelled substring heuristic and never an identification.",
   "docs": "https://www.pathwren.workers.dev/tools/classify-ua.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/classify-ua.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/classify-ua?ua=Mozilla%2F5.0%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko%3B%20compatible%3B%20GPTBot%2F1.2%3B%20%2Bhttps%3A%2F%2Fopenai.com%2Fgptbot)&s=client-dossiers'",
   "parameters": [
    "ua"
   ],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp",
    "tool": "classify_user_agent"
   }
  },
  {
   "id": "verification-methods",
   "endpoint": "https://www.pathwren.workers.dev/tools/verification-methods",
   "title": "Can this crawler be verified at all, and how?",
   "summary": "Before you read anything into a miss from /tools/verify-crawler: which crawlers can be verified by published prefix, which document forward-confirmed reverse DNS instead (with the exact two dig commands to run), and which publish no verification method at all — with the mirror's own counts and fetch dates.",
   "docs": "https://www.pathwren.workers.dev/tools/verification-methods.html?s=client-dossiers",
   "spec": "https://www.pathwren.workers.dev/tools/verification-methods.json?s=client-dossiers",
   "example": "curl -s 'https://www.pathwren.workers.dev/tools/verification-methods?crawler=claudebot&s=client-dossiers'",
   "parameters": [
    "crawler"
   ],
   "mcp_twin": {
    "endpoint": "https://www.pathwren.workers.dev/mcp/netcheck",
    "tool": "verification_methods"
   }
  }
 ],
 "also_published_here": {
  "dossiers": {
   "count": 123,
   "index": "https://www.pathwren.workers.dev/bot/index.html?s=client-dossiers",
   "all_in_one_request": "https://www.pathwren.workers.dev/data/observed-clients.json?s=client-dossiers",
   "window": {
    "first_request": "2026-08-31T20:58:11+00:00",
    "last_request": "2026-09-02T04:57:09+00:00",
    "hours": 32.0
   }
  },
  "datasets": [
   {
    "path": "/data/agents.csv",
    "url": "https://www.pathwren.workers.dev/data/agents.csv?s=client-dossiers",
    "bytes": 24812
   },
   {
    "path": "/data/agents.json",
    "url": "https://www.pathwren.workers.dev/data/agents.json?s=client-dossiers",
    "bytes": 200597
   },
   {
    "path": "/data/ip-sources.json",
    "url": "https://www.pathwren.workers.dev/data/ip-sources.json?s=client-dossiers",
    "bytes": 8692
   },
   {
    "path": "/data/observed-clients.csv",
    "url": "https://www.pathwren.workers.dev/data/observed-clients.csv?s=client-dossiers",
    "bytes": 41144
   },
   {
    "path": "/data/observed-clients.json",
    "url": "https://www.pathwren.workers.dev/data/observed-clients.json?s=client-dossiers",
    "bytes": 1005180
   },
   {
    "path": "/data/robots-tokens.txt",
    "url": "https://www.pathwren.workers.dev/data/robots-tokens.txt?s=client-dossiers",
    "bytes": 2174
   },
   {
    "path": "/data/ua-regex.json",
    "url": "https://www.pathwren.workers.dev/data/ua-regex.json?s=client-dossiers",
    "bytes": 9647
   },
   {
    "path": "/data/ua-regex.txt",
    "url": "https://www.pathwren.workers.dev/data/ua-regex.txt?s=client-dossiers",
    "bytes": 2170
   },
   {
    "path": "/data/user-agents.txt",
    "url": "https://www.pathwren.workers.dev/data/user-agents.txt?s=client-dossiers",
    "bytes": 2145
   }
  ]
 },
 "license": "CC0-1.0",
 "independent": true
}