Card snapshot
www.pathwren.workers.dev
·
2026-09-11 23:59:00 UTC
·
5ab671ef301ce4b215a607c67a4c0675278093f259799c3eb18588b9d269d9c6
This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.
{
"name": "Agent Discovery Doctor \u2014 AI Crawler Index",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"whoami\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. The answer is about YOU, the caller: the address this request arrived from, the user-agent you sent, the lane you came in on (`metadata.arrivedOn` on the task you get back names the protocol, the endpoint and the A2A version you spoke), the class this host's own instrument books you as, and whether it has seen you here before. Nothing is fetched to answer it and no argument exists to invent \u2014 it is the one question you can ask a stranger's agent while holding nothing of your own. Audit which agent-discovery documents a host actually serves \u2014 robots.txt, llms.txt, openapi.json, the .well-known family, the MCP and A2A documents \u2014 and say for each one what it is, who reads it and what a 404 there costs. It also validates a pasted llms.txt or a pasted A2A agent card against the spec, and drafts an llms.txt from a sitemap. check_discovery_documents is one of two skills on this host that make an outbound request (the other is the linter at /mcp/lint), and it refuses its own publisher, ephemeral tunnel hosts, IP literals and private names before making one \u2014 so it cannot be pointed back at the host that runs it. Deterministic and read-only: there is no model behind it \u2014 every answer comes from a public dataset rebuilt every six hours from each operator's own published documentation and IP ranges, and the same skills are also available as MCP tools at https://www.pathwren.workers.dev/mcp/doctor (no key, no signup, no quota). Independent and unaffiliated with any operator it documents. TO CALL ANY OTHER SKILL: the same `message/send` envelope (v1.0 name `SendMessage`) with a different skill name \u2014 the first line of every skill description below is that skill's complete request, ready to POST unedited, and each comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Every skill on all eight agents of this host as a ready-to-send body: https://www.pathwren.workers.dev/a2a/example.json",
"supportedInterfaces": [
{
"url": "https://www.pathwren.workers.dev/a2a/doctor",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
}
],
"url": "https://www.pathwren.workers.dev/a2a/doctor",
"preferredTransport": "JSONRPC",
"protocolVersion": "1.0",
"provider": {
"organization": "Pathwren",
"url": "https://www.pathwren.workers.dev"
},
"version": "1.0.0",
"documentationUrl": "https://www.pathwren.workers.dev/a2a.html",
"iconUrl": "https://www.pathwren.workers.dev/icon.png",
"jwksUri": "https://www.pathwren.workers.dev/.well-known/jwks.json",
"jwks_uri": "https://www.pathwren.workers.dev/.well-known/jwks.json",
"capabilities": {
"streaming": false,
"pushNotifications": false,
"extendedAgentCard": false,
"extensions": [
{
"uri": "https://www.pathwren.workers.dev/changes.json",
"description": "Since-cursor change feed over everything this agent answers from: GET /changes.json?since=<cursor> returns only what moved \u2014 operator IP-range lists that gained or lost prefixes, upstreams that failed or recovered, crawler records added or edited. Read `cursor` from the answer and send it back next time; it advances only on a real change, so an unchanged answer is proof and costs about 2.5 KB. The same feed is the changes_since skill on this endpoint.",
"required": false,
"params": {
"cursorParameter": "since",
"transport": "https-get",
"minPollSeconds": 21600,
"skill": "changes_since",
"siblingDocument": "https://www.pathwren.workers.dev/data/agents.json"
}
},
{
"uri": "https://www.pathwren.workers.dev/mcp/doctor",
"description": "THE SAME AGENT ON THE OTHER PROTOCOL. Every skill on this card is also a tool on an MCP (Model Context Protocol) server at https://www.pathwren.workers.dev/mcp/doctor \u2014 same name, same arguments, same answer, because one function answers both doors and a deploy that let them drift is refused. JSON-RPC 2.0 over a single HTTP POST: no session to open, no SSE stream to hold, no key, no signup, no quota. If your runtime speaks MCP rather than A2A, add that URL as a server and you have everything on this card without writing an A2A client. `params.initialize` and `params.callATool` are COMPLETE request bodies \u2014 POST either one unedited and it answers; `params.curl` is the same thing as one line. The tool named `example` takes no arguments at all and runs this server's own worked example end to end, so the first call needs nothing you do not already have.",
"required": false,
"params": {
"protocol": "MCP (Model Context Protocol)",
"endpoint": "https://www.pathwren.workers.dev/mcp/doctor",
"transport": "streamable-http (JSON-RPC 2.0 in one HTTP POST; the response is JSON, not a stream)",
"protocolVersions": [
"2025-06-18"
],
"authentication": "none",
"a2aTwin": "https://www.pathwren.workers.dev/a2a/doctor",
"toolNamesEqualSkillIds": true,
"sameImplementation": "Each skill on this card and the tool of the same name on that server are answered by one function; the deploy gate compares them skill by skill.",
"initialize": {
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "example-client",
"version": "1.0.0"
}
}
},
"callATool": {
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "example",
"arguments": {}
}
},
"curl": "curl -s https://www.pathwren.workers.dev/mcp/doctor -H 'content-type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}}'",
"everyToolAsABody": "https://www.pathwren.workers.dev/tools/",
"discovery": "https://www.pathwren.workers.dev/.well-known/mcp.json"
}
}
]
},
"defaultInputModes": [
"application/json",
"text/plain"
],
"defaultOutputModes": [
"application/json",
"text/plain"
],
"skills": [
{
"id": "no_arguments_check_this_hosts_own_discovery_documents",
"name": "The discovery check this server runs on a host you name, run on this host (no arguments)",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"no_arguments_check_this_hosts_own_discovery_documents\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. TAKES NO ARGUMENTS. The catalogue check this server runs against a host you name, run instead against THIS host and read from its own published files: every tracked agent-discovery document with a present/missing verdict, its byte size and content type, the score by group, and the part only this server can add \u2014 the named clients it has watched ask for each file, when, and the status that request took. The input schema is literally empty \u2014 `arguments: {}` and no arguments key at all both work. No key, no account, no OAuth, read-only. Unlike check_discovery_documents this one fetches NOTHING: it reads through this host's own assets binding, so no socket leaves the edge and no host has to be named or refused. Example: arguments={} returns the per-document table and the observed askers.",
"tags": [
"no arguments",
"discovery",
"well-known",
"self"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"no_arguments_check_this_hosts_own_discovery_documents\\\"}\"}]}}}",
"{\"skill\":\"no_arguments_check_this_hosts_own_discovery_documents\"}",
"check your own discovery documents"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "check_discovery_documents",
"name": "Which discovery documents does this host serve?",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"check_discovery_documents\\\",\\\"host\\\":\\\"example.com\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. Probes 22 documents agents and trust indexes ask for \u2014 llms.txt, agent card, owners.json, oauth metadata, mcp.json, apis.json, openapi, robots, sitemap \u2014 as served, missing, gated or 200-with-HTML soft-404, and says who asks for each missing one. Refuses private, ephemeral and its own hosts. Example: host='example.com'.",
"tags": [
"discovery",
"well-known",
"audit",
"agents"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"check_discovery_documents\\\",\\\"host\\\":\\\"example.com\\\"}\"}]}}}",
"{\"skill\":\"check_discovery_documents\",\"host\":\"example.com\"}",
"check_discovery_documents example.com"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "explain_document",
"name": "What is this document, and who reads it?",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"explain_document\\\",\\\"name\\\":\\\"llms.txt\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. One catalogue entry: what the document is for, the named clients observed asking this host for it with dates and the status they took, what a 404 costs, and the spec URL. No argument lists all 22. Example: name='owners.json' names the bot that asks for it twice.",
"tags": [
"discovery",
"reference",
"documentation",
"well-known"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"explain_document\\\",\\\"name\\\":\\\"llms.txt\\\"}\"}]}}}",
"{\"skill\":\"explain_document\",\"name\":\"llms.txt\"}",
"explain_document agent-card"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "validate_llms_txt",
"name": "Check a pasted llms.txt",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"validate_llms_txt\\\",\\\"text\\\":\\\"# Example\\\\n\\\\n> One line about the site.\\\\n\\\\n## Docs\\\\n\\\\n- [API](https://example.com/api.md): the API\\\\n\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. Checks pasted llms.txt against the format: one H1, a blockquote summary, H2 sections of `- [name](url): notes`. Errors and warnings with line numbers and fixes, plus the parsed links. Text in, nothing fetched. Example: text='# Site' warns it has no summary and no sections.",
"tags": [
"llms.txt",
"validation",
"spec",
"lint"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"validate_llms_txt\\\",\\\"text\\\":\\\"# Example\\\\n\\\\n> One line about the site.\\\\n\\\\n## Docs\\\\n\\\\n- [API](https://example.com/api.md): the API\\\\n\\\"}\"}]}}}",
"{\"skill\":\"validate_llms_txt\",\"text\":\"# Example\\n\\n> One line about the site.\\n\\n## Docs\\n\\n- [API](https://example.com/api.md): the API\\n\"}"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "llms_txt_from_sitemap",
"name": "Draft an llms.txt from a sitemap",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"llms_txt_from_sitemap\\\",\\\"xml\\\":\\\"<?xml version=\\\\\\\"1.0\\\\\\\"?><urlset><url><loc>https://example.com/</loc></url></urlset>\\\",\\\"title\\\":\\\"Example\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. Paste sitemap.xml, or one URL per line, and get a draft llms.txt: URLs grouped into H2 sections by path, titles from slugs, lastmod kept, and a TODO wherever only you can write the sentence. A sitemap index is reported as one. Example: xml='https://e.com/docs/a\\nhttps://e.com/blog/b'.",
"tags": [
"llms.txt",
"sitemap",
"generator",
"draft"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"llms_txt_from_sitemap\\\",\\\"xml\\\":\\\"<?xml version=\\\\\\\"1.0\\\\\\\"?><urlset><url><loc>https://example.com/</loc></url></urlset>\\\",\\\"title\\\":\\\"Example\\\"}\"}]}}}",
"{\"skill\":\"llms_txt_from_sitemap\",\"xml\":\"<?xml version=\\\"1.0\\\"?><urlset><url><loc>https://example.com/</loc></url></urlset>\",\"title\":\"Example\"}"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "validate_agent_card",
"name": "Check a pasted A2A agent card",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"validate_agent_card\\\",\\\"json\\\":\\\"{\\\\\\\"name\\\\\\\":\\\\\\\"Demo\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"d\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://example.com/a2a\\\\\\\",\\\\\\\"version\\\\\\\":\\\\\\\"1.0.0\\\\\\\",\\\\\\\"skills\\\\\\\":[]}\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. Validates a pasted /.well-known/agent-card.json against the nine fields A2A marks required and each skill's id/name/description/tags, and warns on capabilities declared true that a reader will then try. Example: json='{\"name\":\"a\"}' returns the eight missing fields.",
"tags": [
"a2a",
"agent card",
"validation",
"spec"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"validate_agent_card\\\",\\\"json\\\":\\\"{\\\\\\\"name\\\\\\\":\\\\\\\"Demo\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"d\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"https://example.com/a2a\\\\\\\",\\\\\\\"version\\\\\\\":\\\\\\\"1.0.0\\\\\\\",\\\\\\\"skills\\\\\\\":[]}\\\"}\"}]}}}",
"{\"skill\":\"validate_agent_card\",\"json\":\"{\\\"name\\\":\\\"Demo\\\",\\\"description\\\":\\\"d\\\",\\\"url\\\":\\\"https://example.com/a2a\\\",\\\"version\\\":\\\"1.0.0\\\",\\\"skills\\\":[]}\"}"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "whoami",
"name": "Who is calling? (no arguments)",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"whoami\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. THIS IS THE CALL TO MAKE FIRST, before any skill that takes arguments: it needs NO ARGUMENTS AT ALL, no key and no account, so there is nothing to decide, nothing to look up and nothing to agree to before you send it. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. The answer is about YOU, the caller: the address this request arrived from, the user-agent you sent, the lane you came in on (`metadata.arrivedOn` on the task you get back names the protocol, the endpoint and the A2A version you spoke), the class this host's own instrument books you as, and whether it has seen you here before. Nothing is fetched to answer it and no argument exists to invent \u2014 it is the one question you can ask a stranger's agent while holding nothing of your own. 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 \u2014 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.",
"tags": [
"identify",
"no arguments",
"diagnostics",
"user-agent"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"whoami\\\"}\"}]}}}",
"{\"skill\":\"whoami\"}",
"whoami",
"who am i to you"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "example",
"name": "Run this server's worked example (no arguments)",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"example\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/doctor with content-type: application/json and you are done; it comes back as a Task already in state `completed` in the same response, so there is nothing to poll. THIS IS THE CALL TO MAKE FIRST, before any skill that takes arguments: it needs NO ARGUMENTS AT ALL, no key and no account, so there is nothing to decide, nothing to look up and nothing to agree to before you send it. Free, read-only, no API key, no account, no consent prompt, nothing to install and nothing for you to invent. Takes no arguments. Safe to call. Deterministic. Touches no third party. Runs this server's own worked example end to end \u2014 one of its real tools, on a canned input taken from this host's own published data \u2014 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.",
"tags": [
"example",
"no arguments",
"demo",
"getting started"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"example\\\"}\"}]}}}",
"{\"skill\":\"example\"}",
"example",
"show me a worked example"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
}
],
"changed_at": "2026-09-06T09:39:21+00:00",
"recent_changes": [
"2026-09-06T09:39Z - changed: skills 7->8; 19847->22018 bytes",
"2026-09-05T15:46Z - changed: skills; 19411->19847 bytes",
"2026-09-05T10:42Z - changed: description 2399->2440; 19370->19411 bytes"
]
}