An open protocol for websites to declare their capabilities to AI agents. One file. Any framework. Zero crawling.
Choose what applies to you.
There is no standard for a website to declare itself to an AI agent. Every agent that visits your site discovers it the way a human does — loading page after page.
Serve agents.json at /.well-known/agents.json. Any AI agent reads it once and knows exactly what your site can do — no crawling required.
{
"w2a": "1.0",
"site": { "name": "Acme Store", "type": "ecommerce" },
"capabilities": [
{
"id": "search_products",
"intent": "find products by query or category",
"action": "GET /api/search",
"input": { "q": "string", "category": "string?" },
"output": { "items": "Product[]", "total": "int" },
"auth": "none"
},
{
"id": "checkout",
"intent": "complete a purchase",
"action": "POST /api/orders",
"input": { "cart_id": "string", "payment_token": "string" },
"output": { "order_id": "string", "status": "string" },
"auth": "session"
}
],
"policies": {
"rate_limit": "60/min",
"allowed_agents": ["*"]
}
}
Every website can be agent-ready in under two minutes. Every agent can read any W2A-enabled site in one line of code.
# 1. Go to the generator w2a-protocol.org/tools # 2. Enter your URL — auto-detects OpenAPI, Schema.org, # Open Graph, sitemaps, and HTML forms # 3. Download and place at: /.well-known/agents.json # Vercel / Next.js → public/.well-known/agents.json # WordPress → public_html/.well-known/agents.json # Any other host → root folder → .well-known/
# Install pip install w2a # Discover any W2A-enabled site from w2a import discover site = await discover("yoursite.com") print(site.name, f"— {len(site.skills)} skills") for skill in site.public_skills: print(skill.id, "—", skill.intent) # Call a skill directly result = await client.call(site, "search_products", q="shoes")
// Install npm install w2a-client // Discover any W2A-enabled site import { discover } from 'w2a-client' const site = await discover('yoursite.com') console.log(`${site.name} — ${site.skills.length} skills`) // Find a skill by intent fragment const skill = site.findSkill('search') // Call it const result = await client.call(site, skill.id, { q: 'shoes' })
// Add to ~/.claude/claude_desktop_config.json { "mcpServers": { "w2a": { "command": "npx", "args": ["w2a-mcp", "--url", "https://yoursite.com"] } } } // Every W2A skill becomes a Claude tool automatically. // No coding required.
W2A completes the agentic web stack alongside MCP and A2A. Each protocol solves a distinct layer. None overlap.
{
"w2a": "1.0",
"a2a_profile": {
"name": "Acme Store Agent",
"url": "https://acme.com/.well-known/agents.json",
"version": "1.0"
}
// ... capabilities
}
Each generation of the web needed a standard to make it machine-readable. W2A is the one for the agent era.
Full specification in the GitHub repository. Core capability schema:
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | Unique slug — e.g. "search_products" |
intent | string | yes | Plain-English description the agent reads to understand what this capability does |
action | string | yes | HTTP method and path — e.g. "GET /api/search" |
input | object | no | Named input parameters with types: string string? int float bool object[] |
output | object | no | Named output fields with types |
auth | string | yes | none · session · bearer · apikey |
Full spec including site fields, policies, and federation → spec/v0.1.md
W2A is maintained by The Order AI and open to contributions. The goal is a protocol no single company controls — the same model as A2A under the Linux Foundation.