Skip to content

Inspector

The inspector (right panel, ⌘ I) streams everything Moka does, live.

A chat with MCP tool calls, then the paired JSON-RPC request and response in the inspector
TabShows
AllEverything
LLMRun start/finish and every model request/response step
ToolsTool calls, results, errors, skill loads, and generative UI traffic
RPCRaw MCP JSON-RPC messages, both directions, including the initialize handshake, plus failed HTTP requests (mcp.http) and requests that never got an answer (mcp.unanswered)
LogsConnection status changes, server stderr, warnings and errors

Use the search box to filter by title or payload content (e.g. a tool argument value).

Click any event to open it:

  • Payload — the full JSON: request bodies sent to the provider, tool inputs and outputs, JSON-RPC messages, usage.
  • This run — a waterfall of every step in the same run, so you can spot where time went (slow tool vs. slow model).

From a chat message, Inspect run → jumps straight to that run.

Moka matches every JSON-RPC response to its request by id, in both directions (so a server’s own requests, like sampling or elicitation, pair up too). Each request in the list shows what happened to it:

BadgeMeaning
17msThe response arrived after 17 ms
error · 17msThe server answered with a JSON-RPC error
timed out · 60.0sMoka gave up waiting (the server’s tool timeout)
cancelledMoka sent notifications/cancelled (for example, you stopped the run)
cancelled · late reply…and the server answered anyway, after the client had stopped listening
no responseThe connection closed while the request was still open
waiting…Still open

Click a request or response to see both payloads with their ids side by side, plus any cancellation or “no response” marker. Responses are titled after their request (result #5 · tools/call), so the list reads naturally.

When the model calls the same MCP tool again with the same arguments in one turn, Moka treats it as another attempt of the same call rather than a new one. Attempts share a lineage, matched by a fingerprint of the server, the tool, the tool’s input schema and the normalized arguments (key order doesn’t matter; a changed schema starts a new lineage).

Each failed attempt gets an error class:

ClassMeaning
timeoutMoka stopped waiting (tool timeout). The server may still have done the work
cancelledThe call was stopped (you pressed Stop)
transportThe connection broke: the server crashed or disconnected, or an HTTP or network error
protocolThe server answered with a JSON-RPC error
toolThe tool ran and reported an error (isError)
declinedYou declined it in the approval prompt
inputThe model’s arguments didn’t match the schema

For a tool that may change something (no readOnlyHint), timeout, cancelled and transport leave it unknown whether the write happened:

  • The tool card shows outcome unknown, and the error says so in the inspector.
  • The error the model receives says so too (“the tool may have run. Check whether it did before retrying”), so it doesn’t report a save as failed when it may have worked.
  • If the model retries and the retry succeeds, both may have written: the card shows may have run twice, and the result is a warning.
  • A plain repeat of a write that succeeded (or is still running) is flagged same call again. A retry after a clear error (protocol, tool, …) isn’t a warning.

Read-only tools are never flagged; repeats just show attempt 2, attempt 3. Neither are tools marked idempotentHint (repeating them has no extra effect): their retries show attempt 2 (idempotent), and a timeout still says outcome unknown, but a successful retry isn’t flagged as running twice.

Click any attempt (or its raw tools/call) to see Attempts: every attempt in the lineage with its outcome, duration and request id, linked to the RPC log. The trace download has the same data: lineage (id, attempt, fingerprint), errorClass and outcomeUnknown on tool events, and rpc.callId on the raw messages.

Open a tool call (or its raw tools/call) to see its arguments at each hop:

RowWhat it checks
Model outputThe arguments exactly as the model streamed them. “not valid JSON · truncated?” when the model’s output was cut off or malformed (the call fails with error class input, and nothing is sent)
Parsed by MokaWhat Moka made of them, with any differences listed by path
Sent to serverThe arguments in the tools/call request the server received, compared with the parsed ones

show raw shows the model’s raw text. Truncated arguments and rewritten tool calls are much easier to spot here than in the chat.

For AG-UI agents, events are nested under the step (graph node) that emitted them: tool calls, state deltas and messages sit under STEP_STARTED · <node>, and STEP_FINISHED shows how long the node took. See Remote agents.

The header totals tokens, tool calls and errors since the inspector was last cleared.

  • Pause freezes the list while new events keep buffering.
  • Clear wipes the server-side buffer (the last 2,000 events are kept by default).
  • Download trace saves all events as JSON — handy for bug reports and for diffing runs.

See the event reference for every event kind and its payload.