8 endpoints. Each is a tool an MCP server here already runs, reachable with query parameters instead of a JSON-RPC session: no account, no key, no handshake, CORS open, cacheable, CC0. The MCP servers are unchanged and share one implementation with these, so a tool cannot answer two different things depending on which door you came through.
curl -s 'https://www.pathwren.workers.dev/tools/whoami?&s=client-dossiers' curl -s 'https://www.pathwren.workers.dev/tools/example?&s=client-dossiers' curl -s 'https://www.pathwren.workers.dev/tools/verify-crawler?ip=66.249.66.1&ua=Googlebot&s=client-dossiers' 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' 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' 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' 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' curl -s 'https://www.pathwren.workers.dev/tools/verification-methods?crawler=claudebot&s=client-dossiers'
In 24 hours, 97 of the 107 clients that touched an MCP or A2A surface on this host only
looked — GET, HEAD, OPTIONS, a card fetch, a
tool-definition read. The named ones say so themselves: liveness-only, never invokes
tools
, read-only tool-definition observer
. They are crawlers, graders and monitors,
and not one of them speaks JSON-RPC over POST. They can all speak GET. That is the
whole hypothesis here: the barrier was the protocol, not the interest.
| endpoint | what it answers | parameters | MCP tool it calls |
|---|---|---|---|
/tools/whoami | Who is calling? — the one endpoint that needs nothing from you | none | whoami |
/tools/example | A worked example, run for real — no arguments | none | example |
/tools/verify-crawler | Does this address really belong to the crawler it claims to be? | ip, ua | verify_batch |
/tools/robots-lint | Lint a robots.txt | robots_txt | lint_robots_txt |
/tools/robots-allowed | Would this crawler fetch this path? | robots_txt, ua, path | check_path_allowed |
/tools/ai-access | Which AI crawlers does this file actually stop? | robots_txt, path | audit_ai_access |
/tools/classify-ua | What is this user-agent? | ua | classify_user_agent |
/tools/verification-methods | Can this crawler be verified at all, and how? | crawler | verification_methods |
Allow header, and the MCP endpoint that
does take a POST. A bare 405 asserts a resource exists (RFC 9110 §15.5.6).ETag, max-age, and a 304 when you
send the validator back.| dataset | bytes |
|---|---|
/data/agents.csv | 24,812 |
/data/agents.json | 200,597 |
/data/ip-sources.json | 8,692 |
/data/observed-clients.csv | 42,154 |
/data/observed-clients.json | 1,031,230 |
/data/robots-tokens.txt | 2,174 |
/data/ua-regex.json | 9,647 |
/data/ua-regex.txt | 2,170 |
/data/user-agents.txt | 2,145 |