Preamble
Abstract
This proposal suggests documenting a lightweight, optional metadata convention that lets MCP servers expose advisory policy hints about their tools — such as effect type, idempotency, confirmation preference, and result sensitivity — so that clients, gateways, and proxies can make safer routing decisions without parsing natural-language descriptions.
Motivation
As MCP clients become more autonomous and tool catalogs grow, downstream systems increasingly need to answer questions before calling a tool:
- Is this tool read-only or does it mutate external state?
- Is it safe to call automatically, or should it require user approval?
- Is the call idempotent (safe to retry)?
- Does the result contain sensitive content that should be redacted before re-entering model context?
Today, each client infers these properties from tool names and descriptions, or invents its own metadata convention. This leads to inconsistent behavior across implementations.
Relationship to SEP-1075
SEP-1075 proposed a formal lattice-based security model (read_confidentiality, write_confidentiality, integrity) aimed at enforcing information-flow policies. That proposal was marked dormant due to concerns about complexity and fit with existing enterprise classification frameworks.
This proposal is intentionally different:
| SEP-1075 |
This proposal |
| Enforcement-oriented |
Advisory-only |
| Lattice-based formal model |
Simple hints |
| Requires policy engine |
Useful without enforcement infrastructure |
| Organization-specific labels |
Common vocabulary for interoperability |
| Tool-level classification |
Per-tool operational characteristics |
The two are complementary: this proposal covers "what does calling this tool do?" while 1075 covered "what security clearance is needed?"
Specification
Tools MAY include advisory metadata in the _meta field of their tool definition (or via a future annotations extension). All fields are optional. Clients MUST NOT assume hints are present.
Proposed hints
| Key |
Type |
Values |
Description |
effect |
string |
"read", "write", "delete", "external" |
Primary side-effect of the tool |
idempotent |
boolean |
|
Whether repeated calls with same input produce same result |
requiresConfirmation |
boolean |
|
Server's preference for user confirmation before execution |
resultSensitivity |
string |
"public", "internal", "confidential", "restricted" |
Sensitivity of the tool's output content |
Example
{
"name": "delete_user",
"description": "Permanently delete a user account",
"inputSchema": { ... },
"_meta": {
"mcp.dev/effect": "delete",
"mcp.dev/idempotent": false,
"mcp.dev/requiresConfirmation": true,
"mcp.dev/resultSensitivity": "internal"
}
}
Semantics
- Advisory only: Hints do not replace authentication, authorization, or client-side policy. Clients MAY apply stricter local policies regardless of hints.
- No enforcement requirement: A client that ignores all hints is still a valid MCP client.
- Server-asserted: The server declares its own understanding of its tools. Gateways or deployers MAY override hints without violating the protocol.
- Stable across restarts: A tool's hints SHOULD NOT change between server restarts unless the tool's behavior changed.
Use cases
- Clients showing confirmation dialogs only for mutating tools.
- Gateways applying audit logging at different levels based on effect type.
- Proxies redacting tool results before they re-enter model context.
- Routing layers retrying only idempotent tools.
- CI checks verifying that destructive tools always declare
requiresConfirmation: true.
- Documentation generators producing safety tables from metadata.
Backward compatibility
All hints are optional. Servers and clients that do not implement this proposal continue to work unchanged. The _meta field is already available for extensibility in the current spec.
Non-goals
- Replacing OAuth, capability-based auth, or transport-level security.
- Defining a formal security lattice or information-flow enforcement.
- Requiring servers to expose internal security policies.
- Blocking clients from implementing stricter local policies.
- Defining organization-specific classification hierarchies.
Open questions
- Should
effect support multiple values (e.g., a tool that reads and writes)?
- Should there be a separate
inputSensitivity hint for tools that accept sensitive arguments?
- Should this live in
_meta with namespaced keys, or in a dedicated annotations or hints field?
- Should the spec recommend that
requiresConfirmation tools be excluded from automatic batch execution?
- Is there overlap with the existing
annotations field in the 2025-03-26 spec revision that should be reconciled?
Community discussion
- Is this lightweight enough to avoid the complexity concerns that made SEP-1075 dormant?
- Should the vocabulary be fixed or extensible (e.g., allow custom effect types)?
- Would SDK authors (Python SDK, TypeScript SDK) be willing to expose these hints in their tool decorators?
Preamble
Abstract
This proposal suggests documenting a lightweight, optional metadata convention that lets MCP servers expose advisory policy hints about their tools — such as effect type, idempotency, confirmation preference, and result sensitivity — so that clients, gateways, and proxies can make safer routing decisions without parsing natural-language descriptions.
Motivation
As MCP clients become more autonomous and tool catalogs grow, downstream systems increasingly need to answer questions before calling a tool:
Today, each client infers these properties from tool names and descriptions, or invents its own metadata convention. This leads to inconsistent behavior across implementations.
Relationship to SEP-1075
SEP-1075 proposed a formal lattice-based security model (
read_confidentiality,write_confidentiality,integrity) aimed at enforcing information-flow policies. That proposal was marked dormant due to concerns about complexity and fit with existing enterprise classification frameworks.This proposal is intentionally different:
The two are complementary: this proposal covers "what does calling this tool do?" while 1075 covered "what security clearance is needed?"
Specification
Tools MAY include advisory metadata in the
_metafield of their tool definition (or via a future annotations extension). All fields are optional. Clients MUST NOT assume hints are present.Proposed hints
effect"read","write","delete","external"idempotentrequiresConfirmationresultSensitivity"public","internal","confidential","restricted"Example
{ "name": "delete_user", "description": "Permanently delete a user account", "inputSchema": { ... }, "_meta": { "mcp.dev/effect": "delete", "mcp.dev/idempotent": false, "mcp.dev/requiresConfirmation": true, "mcp.dev/resultSensitivity": "internal" } }Semantics
Use cases
requiresConfirmation: true.Backward compatibility
All hints are optional. Servers and clients that do not implement this proposal continue to work unchanged. The
_metafield is already available for extensibility in the current spec.Non-goals
Open questions
effectsupport multiple values (e.g., a tool that reads and writes)?inputSensitivityhint for tools that accept sensitive arguments?_metawith namespaced keys, or in a dedicatedannotationsorhintsfield?requiresConfirmationtools be excluded from automatic batch execution?annotationsfield in the 2025-03-26 spec revision that should be reconciled?Community discussion