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.
Local SQLite
Section titled “Local SQLite”The store is the source of truth. For ad-hoc analysis, query it with sqlite3:
sqlite3 ~/.mcpr/store.dbsqlite> .tablessqlite> 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:
mcpr store stats # row counts, oldest/newest events, db sizemcpr store vacuum --before 7dmcpr Cloud
Section titled “mcpr Cloud”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:
| Tab | What it shows |
|---|---|
| Overview | Server status, MCP schema snapshot, recent activity |
| Logs | Structured log search — filter by tool, method, session, status, error code, time range |
| Tools | Per-tool calls, p50/p95/max latency, error rate, schema versions |
| Slow Calls | Top slowest calls for performance debugging |
| Sessions | Per-session drill-down to trace user conversations |
| Analytics | Traffic, 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.
What gets recorded
Section titled “What gets recorded”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.) andtoolname when applicable - HTTP status code, JSON-RPC error code and message
latency_us(total) andupstream_us(time waiting on the upstream)request_size/response_sizein bytesspans— 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.
