Tool annotations are a closed set of behavior hints. Resource annotation fields such as audience and priority do not belong here, and custom keys are not allowed. Remove those properties; author-reviewed server metadata can instead use the Tool’s _meta where the protocol version defines it.
Requirement
Section titled “Requirement”A Tool annotations object contains only title, readOnlyHint, destructiveHint, idempotentHint, and openWorldHint.
Details
Section titled “Details”Rule ID: mcp.tool-annotations.members
Owner: mcp
Surface: ToolAnnotations
Kind: structural
Requirement level: must
Document schema locations: #/$defs/toolAnnotations
Status: internal · Enforcement: internal
Protocol version applicability
Section titled “Protocol version applicability”2024-11-05 |
2025-03-26 |
2025-06-18 |
2025-11-25 |
2026-07-28 |
|---|---|---|---|---|
| not-applicable | applies | applies | applies | applies |
Required by
Section titled “Required by”- MCP Description 0.9.0, Section 9.6
- 9. Tools: req-tool-annotations-closed
-
- Tools: req-tool-annotations-fields
Based on
Section titled “Based on”- Tier 1 — MCP schema.ts and normative specification text: MCP 2025-03-26 to 2026-07-28 schema.ts, interface ToolAnnotations (no index signature)
Tool annotations are not available in MCP 2024-11-05; that boundary is checked separately.
Examples
Section titled “Examples”Valid example
Section titled “Valid example”Source: expected-valid/distinct-tool-and-resource-annotations.json · Selected: /tools/0/annotations
{ "title": "Inspect", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}Invalid example
Section titled “Invalid example”Source: expected-invalid/tool-annotations-unknown-property.json · Selected: /tools/0/annotations
{ "readOnlyHint": true, "audience": [ "user" ]}Rule Source Code
Section titled “Rule Source Code”annotations.yaml at immutable tag v0.9.0-rc.3.