Conformance
Minimal BEST Compliance
A BEST-compliant endpoint must:
- Expose
GET /.well-known/bestreturning a valid manifest - Include at least one service in the manifest
- List all supported capabilities with valid schema URLs
- Implement the HTTP API for every listed capability
- Return valid JSON conforming to the referenced schemas
- Use standard HTTP status codes and the BEST error response format — except
deviceAuthorizationUrlandtokenUrl, which answer errors per RFC 6749 §5.2 (Agent Registration) - Declare authentication requirements in the manifest
authenticationblock (or omit it for public endpoints); never silently reject requests with an undocumented 401 - Reference every declared service from at least one capability — in the same manifest or, for a multi-tenant root, in its tenant manifests
- Keep every manifest
descriptionwithin 500 characters and free of mechanics — no URLs or templates, header names or credential formats, operation names, or step-by-step instructions - Publish no second machine-readable or agent-directed description of the service (
llms.txtrestating operations, skill or prompt files, client snippets carrying behaviour, an OpenAPI document of the BEST endpoints) - Where
deviceAuthorizationUrlis declared, carry the sign-in guidance verbatim: the manifest text as thatauthenticationblock'snote, the device text as the device answer'snote, the token text at the start of the token answer'snote— in the words of the version the manifest declares, or of a later one (a 0.9.14 service may carry 0.9.14's; a service that declares 0.9.17 carries 0.9.17's); acceptconnectionin the device request and give it back as the token answer'sname, keying themcpentry by it (SPEC.md — Agent Registration)
Items 8–10, the pseudo-tenant rule and accepting application/cloudevents+json on POST /commands are required from 0.10.0. 0.9.11 states them and validators report violations as warnings, so every implementer has one version of grace. Item 11 is required now. Normative text: SPEC.md — Manifest Discipline.
Capability-Level Compliance
For each capability an endpoint claims to support:
| Capability | Required Endpoints |
|---|---|
agents.commands |
GET /commands, POST /commands |
agents.events |
GET /events |
agents.queries |
GET /queries, GET /queries/{schema}/{version}, GET /queries/{schema} |
agents.workflows |
GET /workflows, GET /workflows/{id} |
Path resolution: All paths above are relative to the
http.endpointbase URL declared in the discovery manifest. For example, ifhttp.endpointishttps://app.example.com/BEST/, thenGET /commandsresolves tohttps://app.example.com/BEST/commands. The paths are never relative to the domain root unlesshttp.endpointitself is the domain root.
Partial Capabilities
A capability declared with status: "partial" is exempt from the full endpoint requirements above. Consumers must not assume that all required endpoints for a partial capability exist. Implementers must document which endpoints are available in the capability's endpoints array in the manifest.
A capability declared with status: "active" (or with no status field) must implement all required endpoints in the table above. Declaring a capability active while returning 404 or 501 on required routes is a conformance violation.
Root Manifest Rules (Multi-Tenant Hosts)
When a host serves multiple tenants and uses the tenants.manifest pattern, the root manifest (at /.well-known/best) has additional conformance requirements:
- The root manifest MUST include a
tenants.manifestURI template if tenant-scoped capabilities exist. - The root manifest MUST NOT declare tenant-scoped capabilities (e.g.
io.best.agents.commands,io.best.agents.events) — these belong only in tenant manifests. - The root manifest MAY declare root-level capabilities it can fulfill directly without a tenant context (e.g. a tenant listing endpoint).
- The root manifest MUST return
200without authentication. Auth is not required to discover that a tenant ID is needed. - The tenant manifest (returned at the expanded
tenants.manifestURI) MUST be a self-contained, fully-resolved manifest with no{tenantId}placeholders in any URI field and notenantsblock of its own. - Tenant manifest endpoints (
/.well-known/best/{tenantId}) MUST NOT require a tenant ID header or query parameter — the tenant ID is already in the URL path. At most, the API key credential declared in the rootauthenticationblock is required. - Where a service announced at the root for its tenants has, in the root manifest, the
http.endpointits tenant manifests' endpoints extend with/{tenantId}— its tenants root — aGETon that URL SHOULD answer, with a credential,200and the tenants it opens (tenant_id,endpoint,manifest); without one, the401a tenant endpoint gives; where the service cannot tell, a BEST error saying where the consumer finds its tenant. Never a bare404(SPEC.md — Multi-Tenancy rule 6).
Why this matters for agents: An AI agent hitting a root manifest that has an empty capabilities array but no tenants.manifest cannot proceed — it has no signal for what to do next. A root manifest that follows these rules gives any agent unambiguous guidance: check capabilities → if absent, check tenants.manifest → ask user for tenant ID → fetch tenant manifest.
All BEST HTTP endpoints must use standard HTTP status codes. The following are required:
| Status | When |
|---|---|
| 200 | Success with body |
| 201 | Created (command accepted and durably queued) |
| 202 | Accepted (async processing without durability guarantee) |
| 400 | Invalid request body (schema validation failure) |
| 401 | Authentication required or credentials invalid (only when authentication.type is not none) |
| 404 | Resource not found |
| 409 | Conflict (duplicate command id with different payload) |
| 422 | Semantic error (capability not supported) |
| 500 | Internal runtime error |
A 401 response must be returned when a request lacks valid credentials and the endpoint declares a non-none authentication type. The /.well-known/best endpoint is exempt and must always return 200 without requiring credentials.
What Compliance Does NOT Require
- A specific programming language or framework
- A specific internal architecture
- A specific event transport (Kafka, RabbitMQ, etc.)
- MCP support (HTTP is the baseline)
- AI/LLM capabilities (agents can be purely deterministic, human-operated, or anything else)