Card snapshot
www.pathwren.workers.dev
·
2026-09-11 23:59:10 UTC
·
edfc530ab28331367c0271762c7b4dfd0a1f5da9cf02dcbc5b0c8044d754a0c7
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": "robots.txt Policy Lint \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/robots 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. Take a robots.txt you already have and say what it actually does. It lints the file against RFC 9309 and reports the errors that silently change meaning, answers whether a named crawler may fetch a named path and which rule decided it, audits which AI crawlers the file really stops (and which it only appears to), diffs two versions by EFFECT rather than by line, and merges a ready-made stance into an existing file without discarding the rules already there. It reads the file you paste; it fetches nothing. robots.txt is a request, not an enforcement mechanism, and the audit says so where a crawler is known to ignore 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/robots (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/robots",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
}
],
"url": "https://www.pathwren.workers.dev/a2a/robots",
"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/robots",
"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/robots \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/robots",
"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/robots",
"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/robots -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_lint_this_hosts_robots_txt",
"name": "Lint this host's own robots.txt and ai.txt (no arguments)",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"no_arguments_lint_this_hosts_robots_txt\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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 lint this server runs on a robots.txt you paste, run instead on the two policy files THIS host publishes: every finding with its severity, line number and fix, an RFC 9309 verdict for six crawler tokens against three real paths naming the rule and the line that decided each one, a check that robots.txt and ai.txt still agree verdict by verdict, and a rollup of which AI crawlers in this host's index the file actually stops. The input schema is literally empty \u2014 `arguments: {}` and no arguments key at all both work. No key, no account, no OAuth, read-only. Nothing is fetched to build it: no request leaves this edge and none is made to you. Example: arguments={} returns the findings, the verdict table and the agreement check.",
"tags": [
"no arguments",
"robots.txt",
"rfc9309",
"lint",
"self"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"no_arguments_lint_this_hosts_robots_txt\\\"}\"}]}}}",
"{\"skill\":\"no_arguments_lint_this_hosts_robots_txt\"}",
"lint your own robots.txt"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "am_i_allowed",
"name": "What does this robots.txt say to me? (no arguments)",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"am_i_allowed\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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. Reads this host's own robots.txt against YOUR user-agent through the same RFC 9309 evaluator as check_path_allowed: the group that matches you, the line that decided it, that group verbatim, and an allowed/disallowed verdict for three real paths. No key, no account, no OAuth, read-only, nothing to invent. Example: arguments={} returns your matched group, the line it was matched on, and the verdicts.",
"tags": [
"no arguments",
"robots.txt",
"rfc9309",
"identify"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"am_i_allowed\\\"}\"}]}}}",
"{\"skill\":\"am_i_allowed\"}",
"am i allowed"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "lint_robots_txt",
"name": "Lint a robots.txt",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"lint_robots_txt\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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. Parse a robots.txt you paste and report every fault that makes it do something other than what it looks like: misspelled directives, a full UA string where a product token belongs, rules before any User-agent line, duplicate groups, noindex (unsupported since 2019), relative Sitemap URLs, BOM. Each finding carries the line number and the fix. Example: robots_txt='User-agent: GPTBot\\nDisallow: /\\n\\nUser-agent: *\\nAllow: /\\n' \u2014 paste the whole file, it is never fetched for you. Also callable without MCP, same implementation: GET https://www.pathwren.workers.dev/tools/robots-lint?robots_txt=<urlencoded>&s=client-dossiers \u2014 or POST the file as the raw body to the same URL.",
"tags": [
"robots.txt",
"lint",
"rfc9309",
"validation"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"lint_robots_txt\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\"}\"}]}}}",
"{\"skill\":\"lint_robots_txt\",\"robots_txt\":\"User-agent: GPTBot\\nDisallow: /\\n\\nUser-agent: *\\nAllow: /\\n\"}",
"User-agent: GPTBot\nDisallow: /"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "check_path_allowed",
"name": "Would this crawler fetch this path?",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"check_path_allowed\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\",\\\"user_agent\\\":\\\"GPTBot\\\",\\\"paths\\\":[\\\"/docs\\\",\\\"/\\\"]}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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. Evaluate a pasted robots.txt for one crawler and one or more paths under RFC 9309: longest token match for the group, longest path pattern for the rule, Allow breaking a tie, * and $ supported. Returns allowed/disallowed per path with the exact line that decided it, and flags the cases where a merge-groups parser and a first-group-wins parser would disagree. Example: user_agent='GPTBot', paths=['/', '/blog'], with your robots_txt pasted in. Also callable without MCP, same implementation: GET https://www.pathwren.workers.dev/tools/robots-allowed?robots_txt=<urlencoded>&ua=GPTBot&path=/blog&s=client-dossiers",
"tags": [
"robots.txt",
"crawlers",
"path",
"rules"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"check_path_allowed\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\",\\\"user_agent\\\":\\\"GPTBot\\\",\\\"paths\\\":[\\\"/docs\\\",\\\"/\\\"]}\"}]}}}",
"{\"skill\":\"check_path_allowed\",\"robots_txt\":\"User-agent: GPTBot\\nDisallow: /\\n\\nUser-agent: *\\nAllow: /\\n\",\"user_agent\":\"GPTBot\",\"paths\":[\"/docs\",\"/\"]}"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "audit_ai_access",
"name": "Which AI crawlers does this file actually stop?",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"audit_ai_access\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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. Evaluate a pasted robots.txt against every AI crawler in this index and return the two lists that matter: blocked and allowed, per operator and category. Also names the tokens in your file that match no known crawler (a typo blocks nothing) and separates the crawlers that document obedience from the ones observed ignoring robots.txt, which need an IP or WAF rule instead. Example: path='/' with your robots_txt pasted in \u2014 the verdict is per crawler, at that path. Also callable without MCP, same implementation: GET https://www.pathwren.workers.dev/tools/ai-access?robots_txt=<urlencoded>&s=client-dossiers",
"tags": [
"robots.txt",
"ai crawlers",
"audit",
"policy"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"audit_ai_access\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\"}\"}]}}}",
"{\"skill\":\"audit_ai_access\",\"robots_txt\":\"User-agent: GPTBot\\nDisallow: /\\n\\nUser-agent: *\\nAllow: /\\n\"}"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "diff_robots_txt",
"name": "Diff two robots.txt by effect",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"diff_robots_txt\\\",\\\"before\\\":\\\"User-agent: *\\\\nDisallow: /\\\",\\\"after\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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. Compare two versions of a robots.txt and report only the crawlers whose verdict actually changes at a given path \u2014 not the text difference. Answers 'did my edit do what I meant, and did it do anything else', including sitemap additions and whether the parse errors went up or down. Example: before='User-agent: *\\nAllow: /\\n', after=your edited file, path='/'.",
"tags": [
"robots.txt",
"diff",
"review",
"change"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"diff_robots_txt\\\",\\\"before\\\":\\\"User-agent: *\\\\nDisallow: /\\\",\\\"after\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\"}\"}]}}}",
"{\"skill\":\"diff_robots_txt\",\"before\":\"User-agent: *\\nDisallow: /\",\"after\":\"User-agent: GPTBot\\nDisallow: /\\n\\nUser-agent: *\\nAllow: /\\n\"}"
],
"inputModes": [
"application/json",
"text/plain"
],
"outputModes": [
"application/json",
"text/plain"
]
},
{
"id": "merge_policy",
"name": "Add a ready-made stance to an existing file",
"description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"merge_policy\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\",\\\"stance\\\":\\\"block-ai-training\\\"}\"}]}}} \u2014 POST that exact body to https://www.pathwren.workers.dev/a2a/robots 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. Merge one of eight maintained robots.txt stances (block-ai-training, allow-ai-search-only, block-all-ai, block-datasets, block-disputed, block-seo-tools, allow-all, maximum-ai-visibility) into a robots.txt you already have, without touching a single rule you wrote: a token you already name keeps your rules and the stance's version is reported instead of applied. Example: stance='block-ai-training', robots_txt='User-agent: *\\nAllow: /\\n'.",
"tags": [
"robots.txt",
"policy",
"generator",
"merge"
],
"examples": [
"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"ROLE_USER\",\"messageId\":\"1\",\"parts\":[{\"text\":\"{\\\"skill\\\":\\\"merge_policy\\\",\\\"robots_txt\\\":\\\"User-agent: GPTBot\\\\nDisallow: /\\\\n\\\\nUser-agent: *\\\\nAllow: /\\\\n\\\",\\\"stance\\\":\\\"block-ai-training\\\"}\"}]}}}",
"{\"skill\":\"merge_policy\",\"robots_txt\":\"User-agent: GPTBot\\nDisallow: /\\n\\nUser-agent: *\\nAllow: /\\n\",\"stance\":\"block-ai-training\"}"
],
"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/robots 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/robots 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:05:36+00:00",
"recent_changes": [
"2026-09-06T09:05Z - changed: skills 8->9; 22924->24968 bytes",
"2026-09-05T15:46Z - changed: skills; 22488->22924 bytes",
"2026-09-05T14:51Z - changed: skills; 22536->22488 bytes"
]
}