MCP JSON-RPC decoder
Decode MCP JSON-RPC messages — requests, notifications, results, errors — explain error codes, pair each request with its response, find the version.
What it does
Paste MCP messages from a log or a capture — one per line, a JSON array, or a Server-Sent Events stream — and read them as a timeline. Each message is a request, a notification, a result or an error; each is explained, and each response is paired with the request it answers. Messages from the client lean left and the server's lean right, and a link jumps from a request to its answer and back.
Try it: a session, errors, and answers that match no request, or the 2026-07-28 revision.
How it reads a message
- A request or a notification is whatever the parser Salyro's own MCP Expose server uses says it is. A message with
id: nullis a notification there, and here: MCP says a request's id MUST NOT be null. - A message with
resultorerrorand nomethodis a response. It must carry the id of its request, of the same type —1and"1"are different ids — and never bothresultanderror. - A JSON array is a batch, wherever it sits in the paste: each member is a message. An empty
[]is an invalid request. JSON-RPC 2.0 allows batches; of the MCP revisions, only 2025-03-26 did. paramsgiven as a list (positional parameters) is valid JSON-RPC 2.0 but not valid MCP, which names every parameter; Salyro's MCP Expose server refuses it.- An event stream and plain JSON can be pasted together, as a
curl -vcapture shows them: thedata:lines are the server's events, and the request beside them is still read and paired. - Who sent it is read from the method, against the requests and notifications each dated revision's schema assigns to the client and to the server. A response goes the other way from its request.
pinggoes both ways; mark a line with>for the client or<for the server to say.
Error codes
- JSON-RPC's five:
-32700parse error,-32600invalid request,-32601method not found,-32602invalid params,-32603internal error. - MCP's own:
-32002resource not found (2025-11-25 and earlier),-32042URL elicitation required (2025-11-25), and from 2026-07-28-32020header mismatch,-32021missing required client capability and-32022unsupported protocol version. From-32000to-32019a code is implementation-defined: an SDK's own, with no meaning across implementations. - A tool that failed is not an error response. MCP reports it as a
tools/callresult withisError: true, so the model can read it and try again.
Protocol version
The revision is read from initialize — proposed by the client, chosen by the server — or, from 2026-07-28, from each request's _meta and from server/discover. When the server answers with another revision than the one proposed, the decoder says so: the specification lets a server answer with one it supports, and a client that does not support it should disconnect. For comparison, it names the revisions Salyro's MCP Connect proceeds with when it connects out to a server.
Tokens stay hidden
Every message is shown with its credentials masked, recognised the way Salyro's log redactor recognises one, and by names such as api_key or Authorization. A summary names a tool's arguments, never their values.
What it does not know
- What happened on the wire around the messages: HTTP status codes, headers, timing.
- Whether a server's answer is right, only whether it is well-formed.
- Revisions other than the five dated ones it describes: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25 and 2026-07-28.
FAQ
Why does a response say it answers no request?
No request with the same id, still waiting for an answer, comes before it in what was pasted — or the request's id has another type.
Does this talk to my server?
No. It reads what you paste, in your browser. A share link carries only which example was open, never your messages.
Sources
Methods, directions, error codes and version negotiation are Reference Data from the MCP specification's schema for each dated revision, read from its repository on GitHub, with the date. JSON-RPC's codes are the table Salyro's MCP Expose server answers with, from Salyro's shared package.
Where the numbers come from
- Facts about models and providers that are not in that catalogue carry their own source and the date they were checked, and are shown as unknown where no reliable source exists.
