Skip to content

Observability

Every JSON-RPC request that flows through mcpr lands in a local SQLite store at ~/.mcpr/store.db (override with MCPR_DB). Tool name, MCP method, latency, status, error code, request and response sizes, session ID, server and client info captured on initialize, and full tools/list / resources/list / prompts/list responses — all without instrumentation in your app.

There are two ways to read it: the file directly, or mcpr Cloud.

The store is the source of truth. For ad-hoc analysis, query it with sqlite3:

Terminal window
sqlite3 ~/.mcpr/store.db
sqlite> .tables
sqlite> SELECT mcp_method, tool, latency_us / 1000.0 AS latency_ms, status
FROM events
ORDER BY ts DESC
LIMIT 20;

Maintenance is what the CLI handles:

Terminal window
mcpr store stats # row counts, oldest/newest events, db size
mcpr store vacuum --before 7d

Stream events to the cloud project for a hosted dashboard. Add to mcpr.toml:

[cloud]
token = "mcpr_xxxxxxxx"
server = "my-server"

Once events are flowing, the server page in cloud.mcpr.app gives you:

TabWhat it shows
OverviewServer status, MCP schema snapshot, recent activity
LogsStructured log search — filter by tool, method, session, status, error code, time range
ToolsPer-tool calls, p50/p95/max latency, error rate, schema versions
Slow CallsTop slowest calls for performance debugging
SessionsPer-session drill-down to trace user conversations
AnalyticsTraffic, latency percentiles, error rate, client adoption over time

What the cloud computes from raw events is the same data the local store holds — Cloud just adds storage, retention, search, and visualization on top.

Every request emits one structured event with:

  • request_id, ts, proxy, session_id
  • HTTP method and path
  • Classified MCP method (tools/call, resources/read, etc.) and tool name when applicable
  • HTTP status code, JSON-RPC error code and message
  • latency_us (total) and upstream_us (time waiting on the upstream)
  • request_size / response_size in bytes
  • spans — per-stage timer breakdown for the per-request pipeline

initialize responses also produce session events with the AI client name, version, and platform.

Discovery responses (tools/list, resources/list, resources/templates/list, prompts/list) are captured as schema events. Cloud surfaces added/modified/removed entries over time and flags tools registered but never called.

See Event Schema for the full field specification.