Use the Agent Ready (agent-ready.dev) REST API to scan any public URL for AI agent-readability against the Vercel Agent Readability Spec, the llmstxt.org standard, and agent-protocol manifests (MCP server cards, A2A, agents.json, agent-permissions.json, UCP, x402, NLWeb). Activates for "scan this site for AI agent-readability", "run an Agent Ready scan on {URL}", "check the Agent Ready score for {URL}", "what's the agent-readability rating for {URL}", or any time the user wants a programmatic readability scan via HTTP. Picks this skill when the user does NOT have the Agent Ready MCP server installed — for MCP, use the `agent-ready-mcp` skill instead.
74
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
The shell flow in SKILL.md is the primary reference. These are full
start-and-poll equivalents in other languages — read this file only when you
are scripting in one of them.
const KEY = process.env.AGENT_READY_API_KEY!;
const base = "https://agent-ready.dev/api/v1";
const start = await fetch(`${base}/scans`, {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
}).then((r) => r.json());
// Terminal states are "completed" and "failed" — loop while it is "running",
// never until it equals "completed", or a failed scan spins forever.
let result = start;
while (result.status === "running") {
await new Promise((r) => setTimeout(r, 2_000));
result = await fetch(`${base}/scans/${start.id}`, {
headers: { Authorization: `Bearer ${KEY}` },
}).then((r) => r.json());
}
if (result.status !== "completed") {
throw new Error(`Scan ${result.status}: the site could not be read`);
}
console.log(
"Score:",
result.vercelScore,
`https://agent-ready.dev/scan/${result.shareToken}`,
);import os, time, requests
KEY = os.environ["AGENT_READY_API_KEY"]
base = "https://agent-ready.dev/api/v1"
h = {"Authorization": f"Bearer {KEY}"}
start = requests.post(
f"{base}/scans",
headers={**h, "Content-Type": "application/json"},
json={"url": "https://example.com"},
).json()
# Terminal states are "completed" and "failed" — loop while it is "running",
# never until it equals "completed", or a failed scan spins forever.
result = start
while result["status"] == "running":
time.sleep(2)
result = requests.get(f"{base}/scans/{start['id']}", headers=h).json()
if result["status"] != "completed":
raise SystemExit(f"Scan {result['status']}: the site could not be read")
print(
"Score:",
result["vercelScore"],
f"https://agent-ready.dev/scan/{result['shareToken']}",
)