The same index again, spoken as A2A v1.0 instead of as files or as MCP. JSON-RPC 2.0 over HTTP POST, no key, no signup, no session. Every skill is read-only, and each one is executed by exactly the function that answers the identically-named MCP tool — two protocols, one implementation.
# it answers right now
curl -s https://www.pathwren.workers.dev/a2a -H 'content-type: application/json' -d '{
"jsonrpc":"2.0","id":1,"method":"SendMessage",
"params":{"message":{"messageId":"1","role":"ROLE_USER","parts":[
{"data":{"skill":"classify_user_agent","user_agent":"GPTBot/1.2"}}]}}}'
The agent card is at /.well-known/agent-card.json
(identical bytes at the legacy /.well-known/agent.json,
and from GET /a2a).
Six, named exactly as in the card. Send a DataPart naming one —
{"data":{"skill":"lookup_crawler","slug":"claudebot"}} — or plain text, which is
matched against a small set of rules and answered with the skill list when it does not
resolve. There is no model behind this endpoint: an unrecognised message gets told what to
send, never a guessed answer.
| Skill | Argument | What it answers |
|---|---|---|
classify_user_agent | user_agent | Which crawler is behind this raw User-Agent, who runs it, and what blocking it costs. |
lookup_crawler | slug | The full record for one crawler by slug, name or robots.txt token. |
list_crawlers | q, category, operator… | The 56 crawlers, filtered. |
generate_robots_txt | stance | A ready-to-paste robots.txt for one of 8 stances. |
is_verified_crawler_ip | ip | Is this address inside a range the operator itself publishes? 1887 IPv4 and 1056 IPv6 prefixes. |
whats_changed | since | Build time, per-source freshness, and what changed. |
No streaming (SendStreamingMessage → -32004), no push
notifications (-32003), no task store — this worker is stateless, so
SendMessage returns a Message rather than inventing a task id, and
GetTask answers -32001 for every id. No extended agent card
(-32007). Legacy v0.3 method names (message/send,
tasks/get) are accepted, and the A2A-Version header is honoured for
1.0 and 0.3.
Same data as /data/agents.json, /openapi.json and /mcp — pick whichever your client speaks.