← Docs

Agent Discovery Protocol v1.0

A simple web standard for making APIs discoverable by AI agents. One endpoint. One JSON format. That's the whole spec.

1. Endpoint#

Every service implementing the protocol MUST serve a JSON manifest at:

GET https://{domain}/.well-known/agent
  • Path: /.well-known/agent (following RFC 8615)
  • Method: GET
  • Content-Type: application/json
  • CORS: Recommended for public APIs
  • Cache: Cache-Control: max-age=3600 recommended

2. Manifest Format#

FieldTypeRequiredDescription
spec_versionstringYesProtocol version. Currently "1.0"
namestringYesHuman-readable service name
descriptionstringYes10-200 chars. What the service does
base_urlstringYesBase URL for relative detail_urls
authobjectYesAuthentication requirements
pricingobjectNoPricing model and plans
capabilitiesarrayYesList of capabilities (min 1)

Capability entry#

FieldTypeDescription
namestringsnake_case identifier
descriptionstringWhat this capability does
detail_urlstringURL for full details (absolute or relative to base_url)
Full manifest example
{
  "spec_version": "1.0",
  "name": "MailForge",
  "description": "Transactional email API with templates and analytics.",
  "base_url": "https://api.mailforge.dev",
  "auth": {
    "type": "api_key",
    "header": "X-Api-Key",
    "setup_url": "https://mailforge.dev/dashboard/api-keys"
  },
  "pricing": {
    "type": "freemium",
    "plans": [
      { "name": "Free", "price": "$0/mo", "limits": "100 emails/day" },
      { "name": "Pro", "price": "$29/mo", "limits": "10,000 emails/day" }
    ]
  },
  "capabilities": [
    {
      "name": "send_email",
      "description": "Send a transactional email with optional template",
      "detail_url": "/api/capabilities/send_email"
    },
    {
      "name": "get_analytics",
      "description": "Get email delivery analytics and open rates",
      "detail_url": "/api/capabilities/get_analytics"
    }
  ]
}

3. Auth Object#

FieldDescription
type"none" | "api_key" | "oauth2"
headerHeader name for api_key (default: "Authorization")
prefixPrefix for api_key (default: "Bearer")
setup_urlURL where users can get API keys
authorization_urlOAuth2 authorization endpoint
token_urlOAuth2 token endpoint
scopesOAuth2 scopes (string array)

4. Pricing Object#

FieldDescription
type"free" | "freemium" | "paid"
plansArray of { name, price, limits }
plans_urlURL to full pricing page

5. Capability Detail Format#

Each capability's detail_url returns a JSON object with everything an agent needs to call it:

FieldTypeDescription
namestringCapability identifier
descriptionstringDetailed description
endpointstringAPI endpoint path or full URL
methodstringHTTP method (GET, POST, etc.)
parametersarrayParameter definitions with name, type, description, required, example
request_exampleobjectFull example HTTP request
response_exampleobjectExample response with status and body
auth_scopesstring[]?Required OAuth2 scopes
rate_limitsobject?requests_per_minute, daily_limit

6. Discovery Flow#

The protocol uses lazy drill-down. Agents fetch only what they need, when they need it:

1. Agent asks: "I need to send an email"

2. Registry search: GET /api/discover?q=send+email

Returns: service names, domains, matching capability summaries

3. Agent picks a service, fetches manifest: GET https://api.mailforge.dev/.well-known/agent

Returns: full capability list, auth requirements, pricing

4. Agent drills into the capability it needs: GET /api/capabilities/send_email

Returns: endpoint, method, parameters, examples

5. Agent calls the capability with the right parameters

7. Requirements#

  • Manifest MUST be served at /.well-known/agent
  • Response MUST be valid JSON with Content-Type: application/json
  • spec_version MUST be "1.0"
  • description MUST be 10-200 characters
  • Capability names MUST be snake_case
  • At least one capability MUST be defined
  • Each capability MUST have a detail_url that returns valid JSON
  • Capability names MUST be unique within a manifest
  • base_url MUST start with https://

Full specification with additional examples available on GitHub:

View spec on GitHub →