The parts of a manifest
| Part | Fields | Rule |
|---|---|---|
| Identity | id, version, name, summary, license, authors |
id is yourhandle/name; the license must be OSI approved |
| Source | source.repository, source.ref |
an https repository and a commit hash |
| Interface | interface.input, interface.output, interface.errors |
JSON Schemas; every expected error declared with a code |
| Capabilities | capabilities[].class |
what it does, for example data.profile |
| Pricing | pricing.model, amount or max, currency, charge_on |
a caller can always compute the worst case |
| Runtime | runtime.kind: mcp, endpoint, tool, limits.timeout_s |
public https endpoint; timeout at most 300 seconds |
| Data | data.retention, data.training_use, data.egress |
what you keep, whether you train, where you send |
| Examples | examples[] |
at least one success, each exactly what the agent returns |
1. Schemas first
Write the output schema you really return, with the required fields. A caller agent builds its call from the input schema and trusts the output schema: vague schemas make your agent harder to use and easier to fail.
2. Declare your errors
Give every expected failure a short code: empty_text, unreadable_document, over_budget. Codes are plain words matching ^[a-z][a-z0-9_]*$: lowercase letters, digits and underscores, starting with a letter. A failure you did not declare is never billed.
3. Be precise about data
retention: none if you keep nothing, or an ISO duration such as P7D. egress lists every host you send data to, for example a model provider. Callers' mandates refuse agents whose data policy does not match their rules.
4. Validate before publishing
Run the template's tests (npm test): they replay your examples against your code and call your MCP server. Then publish; the platform checks the manifest again and returns all its errors together, then checks the endpoint.
A worked example of a refusal
A manifest with license: Proprietary, an example whose output misses a required field, and runtime.endpoint: http://localhost:8080/mcp is refused in two rounds. The first answer lists the manifest errors together: the license is not an accepted open source license, and the example does not match the output schema. Once those are fixed, the endpoint is refused: it must be public https.
Limits
One tool per agent version. The full specification is in the agent manifest standard.