JSON-RPC 2.0 and MCP-specific error codes.
This module provides constants and helper functions for working with error codes in the MCP protocol. All error codes follow the JSON-RPC 2.0 specification with MCP-specific extensions.
Standard JSON-RPC 2.0 Error Codes
-32700- Parse error: Invalid JSON was received-32600- Invalid Request: The JSON sent is not a valid Request object-32601- Method not found: The method does not exist or is not available-32602- Invalid params: Invalid method parameter(s)-32603- Internal error: Internal JSON-RPC error
MCP-Specific Error Codes
-32001- Request cancelled: The request was cancelled by the client-32002- Resource not found on legacy MCP versions-32003- Consent denied: User denied consent for the operation-32020- Header mismatch-32021- Missing required client capability-32022- Unsupported protocol version-32000- Generic server error: Catch-all for server-side errors
ExMCP-local Error Codes
-31002- Consent required-31003- Prompt processing error
Compatibility note
-32002 and -32042 are historical MCP codes. Legacy peers remain
decodable, but modern emitters use -32602 for a missing resource and must
not emit -32042. ExMCP-local consent and prompt errors live outside the
JSON-RPC reserved range so they cannot be confused with peer protocol
errors.
Usage
iex> ExMCP.Protocol.ErrorCodes.invalid_params()
-32602
iex> ExMCP.Protocol.ErrorCodes.error_message(:invalid_params)
"Invalid params"
iex> ExMCP.Protocol.ErrorCodes.is_protocol_error?(-32602)
true
Summary
Functions
Checks if the code is an ExMCP-local application error.
Returns an error code using the negotiated version for era-sensitive errors.
Consent denied: User denied consent for the operation
Consent required: User consent is required for the operation.
Returns a human-readable error message for the given error code or atom.
Creates an error response map with the given code and message.
Builds a version-aware error response for era-sensitive MCP errors.
Header mismatch between negotiated protocol state and the request
Internal error: Internal JSON-RPC error
Invalid params: Invalid method parameter(s)
Invalid Request: The JSON sent is not a valid Request object
Checks if the given error code is an MCP-specific error.
Checks if the given error code is a standard JSON-RPC protocol error.
Legacy ExMCP consent-required code retained only for decoding old local errors.
Method not found: The method does not exist or is not available
A required client capability was not declared
Parse error: Invalid JSON was received by the server
ExMCP-local prompt processing error
Request cancelled: The request was cancelled by the client
Legacy resource-not-found code used by MCP 2025-11-25 and earlier.
Returns the resource-not-found code appropriate for a protocol era or version.
Returns whether a code represents resource-not-found for the given era.
Generic server error: Catch-all for server-side errors
The requested protocol version is not supported
Legacy URL-elicitation-required code from MCP 2025-11-25.
Returns the URL-elicitation code for legacy peers and rejects modern emission.
Functions
Checks if the code is an ExMCP-local application error.
Returns an error code using the negotiated version for era-sensitive errors.
Consent denied: User denied consent for the operation
Consent required: User consent is required for the operation.
This is an ExMCP-local application error, not an MCP protocol error.
Returns a human-readable error message for the given error code or atom.
Examples
iex> ExMCP.Protocol.ErrorCodes.error_message(-32602)
"Invalid params"
iex> ExMCP.Protocol.ErrorCodes.error_message(:invalid_params)
"Invalid params"
Creates an error response map with the given code and message.
Examples
iex> ExMCP.Protocol.ErrorCodes.error_response(:invalid_params, "Missing required field: name")
%{code: -32602, message: "Invalid params: Missing required field: name"}
@spec error_response_for_version( atom(), :legacy | :modern | String.t(), String.t() | nil ) :: map() | {:error, :retired_error_code}
Builds a version-aware error response for era-sensitive MCP errors.
Header mismatch between negotiated protocol state and the request
Internal error: Internal JSON-RPC error
Invalid params: Invalid method parameter(s)
Invalid Request: The JSON sent is not a valid Request object
Checks if the given error code is an MCP-specific error.
Examples
iex> ExMCP.Protocol.ErrorCodes.is_mcp_error?(-32001)
true
iex> ExMCP.Protocol.ErrorCodes.is_mcp_error?(-32602)
false
Checks if the given error code is a standard JSON-RPC protocol error.
Examples
iex> ExMCP.Protocol.ErrorCodes.is_protocol_error?(-32602)
true
iex> ExMCP.Protocol.ErrorCodes.is_protocol_error?(-32001)
false
Legacy ExMCP consent-required code retained only for decoding old local errors.
Method not found: The method does not exist or is not available
A required client capability was not declared
Parse error: Invalid JSON was received by the server
ExMCP-local prompt processing error
Request cancelled: The request was cancelled by the client
Legacy resource-not-found code used by MCP 2025-11-25 and earlier.
New code should call resource_not_found/1 with the negotiated version or
protocol era.
Returns the resource-not-found code appropriate for a protocol era or version.
Returns whether a code represents resource-not-found for the given era.
:unknown accepts both encodings for clients that have not established the
peer's protocol era yet.
Generic server error: Catch-all for server-side errors
The requested protocol version is not supported
Legacy URL-elicitation-required code from MCP 2025-11-25.
@spec url_elicitation_required(:legacy | :modern | String.t()) :: integer() | {:error, :retired_error_code}
Returns the URL-elicitation code for legacy peers and rejects modern emission.