Error Code Registry¶
When cMCP refuses a request or fails, it returns a short code such as POLICY_DENY that says why. This page is the full list, with the HTTP status and log level for each code and the page that defines it. Use it to look up an error you have seen or to handle errors in your own code.
This is the normative registry for all error codes used across the cMCP Runtime. Every error code MUST be registered here before it is referenced in code, configuration, or other spec documents. Implementations MUST NOT emit error codes that do not appear in this registry.
Runtime Errors¶
| error_code | HTTP status | log level | description | spec reference |
|---|---|---|---|---|
ATTESTATION_REPORT_UNAVAILABLE | 503 | FATAL | TEE provider did not return an attestation report within timeout | failure-modes.md FM-1 |
ATTESTATION_PROVIDER_UNSUPPORTED | 500 | FATAL | No supported TEE provider detected and CMCP_DEV_MODE is not set | attestation.md §1.1 |
POLICY_HASH_MISMATCH | 500 | FATAL | Measured policy bundle hash does not match deployment manifest | failure-modes.md FM-4 |
POLICY_RELOAD_PINNED_HASH | 500 | FATAL | policy_reload_interval_seconds > 0 configured alongside a pinned CMCP_POLICY_HASH. Every reload is validated against that hash, so a changed bundle could never be installed; refused at startup rather than appearing to work | policy-hot-reload.md |
POLICY_SIGNATURE_INVALID | 500 | FATAL | A policy bundle's manifest signature is absent, malformed, or does not verify under the pinned CMCP_POLICY_SIGNING_KEY; or its version did not increase, which would allow a genuinely signed older bundle to be replayed | policy-hot-reload.md |
POLICY_SIGNING_KEY_INVALID | 500 | FATAL | CMCP_POLICY_SIGNING_KEY or CMCP_POLICY_SUCCESSOR_SIGNING_KEY is not a 32-byte Ed25519 public key, the two are equal, or a successor is set without a current key | configuration.md |
POLICY_SIGNING_KEY_REVOKED | 403 / startup | FATAL at startup, WARN at runtime | A policy bundle verifies only under a revoked policy signing key and is refused; or the policy in force was signed by a key revoked since it was installed, so every tool call is refused in every enforcement mode until a bundle signed by a trusted key is installed; or every pinned key is revoked | policy-hot-reload.md |
POLICY_KEY_REVOCATION_INVALID | none (logged) | WARN | A statement in signing-key-revocations.json was refused: malformed, not signed by the current or successor key, or naming a key other than the current one. It is skipped; other statements and the bundle reload still proceed | policy-hot-reload.md |
CONFORMANCE_PROFILE_UNSATISFIED | 500 | FATAL | A named conformance_profile requires something the deployment has not configured; aarm requires an Agent Manifest binding (AARM R6) | STATUS.md |
CATALOG_HASH_MISMATCH | 500 | FATAL | Measured catalog hash does not match deployment manifest | attestation.md §5 |
CATALOG_RESTART_REQUIRED | startup | FATAL | Runtime catalog mutation was configured, but routing authority remains immutable until a newly pinned gateway restart | catalog-lifecycle.md |
AGENT_MANIFEST_BINDING_FAILED | 500 | FATAL | Signed Agent Manifest signature, authenticated subject, policy hash, or catalog hash did not match the runtime session inputs | session-policy.md |
TOOL_NOT_IN_CATALOG | 403 | WARN | Agent requested a tool not present in the attested catalog | cedar-policy.md |
POLICY_DENY | 403 | INFO | Cedar policy evaluation returned deny for this call | cedar-policy.md |
CATALOG_TOOL_NAME_COLLISION | 500 | FATAL | Two catalog entries register the same tool_name | tool-identity.md |
CATALOG_DRIFT_DETECTED | 409 | ERROR | Upstream server changed a tool definition since catalog was sealed | attestation.md §5 |
MCP_PARSE_FAILURE | 400 | WARN | Incoming MCP JSON-RPC message failed to parse | failure-modes.md FM-5 |
MCP_INVALID_REQUEST | 400 | WARN | Parsed JSON is not a valid JSON-RPC request shape | failure-modes.md FM-5 |
RESPONSE_SIZE_EXCEEDED | 413 | WARN | Tool response exceeds max_response_size_bytes | response-inspection.md Stage 1 |
RESPONSE_INJECTION_DETECTED | 403 | ERROR | Response inspection detected indirect injection pattern | response-inspection.md Stage 4 |
RESPONSE_SCHEMA_VIOLATION_STRICT | 409 | WARN | Tool response contains fields outside approved output_schema (strict mode) | response-inspection.md Stage 2 |
SESSION_SENSITIVITY_POLICY_DENY | 403 | INFO | Call denied due to session sensitivity state | session-policy.md |
SESSION_RESET_REQUIRED | 428 | INFO | Agent attempted call that requires session reset first | session-policy.md |
SESSION_STATE_STORE_UNAVAILABLE | startup | FATAL | A configured session_state_path could not be opened, so the gateway would run without the cross-instance session-state persistence the operator configured | configuration.md |
TEE_FAULT | 500 | ERROR | TEE process fault during call execution | failure-modes.md FM-3 |
ATTESTATION_STALE | 412 | WARN | Attestation report validity period has expired | attestation.md §3 |
BREAK_GLASS_ACTIVE | 200 | WARN | Call allowed via catalog exception (break-glass procedure active) | tool-identity.md |
Verification Library Errors¶
The following error codes are defined and documented in verification-library.md. They are listed here for cross-reference completeness; the verification library spec is authoritative for their semantics.
| error_code |
|---|
UNSUPPORTED_PROVIDER |
SIGNATURE_INVALID |
PUBLIC_KEY_NOT_BOUND |
POLICY_HASH_MISMATCH |
CATALOG_HASH_MISMATCH |
AGENT_MANIFEST_MISMATCH |
ATTESTATION_STALE |
CHAIN_BROKEN |
CLAIM_MALFORMED |
EXTERNAL_EVIDENCE_VERIFICATION_FAILED |
Note:
POLICY_HASH_MISMATCH,CATALOG_HASH_MISMATCH, andATTESTATION_STALEappear in both tables. The Runtime emits them during startup or request handling; the verification library emits them during offline or client-side verification. The semantics are consistent across both contexts.