Observability for MCP servers
The dedicated layer for MCP traffic, alongside the Datadog, Sentry, or New Relic you already run. Built for engineering teams shipping MCP servers in production.
Works with your existing APM via OpenTelemetry · Open-source SDK & CLI
| 1 | initialize | — | 15ms |
| 2 | Tool | echo | 8ms |
| 3 | Tool | non-exis…38317556 | 3ms |
| 4 | Prompt | echo | 3ms |
| 5 | Tool | non-exis…38313393 | 1ms |
| Server Name | Requests | Tools | Prompts | Resources | Sessions | Errors | P50 | P95 | P99 |
|---|---|---|---|---|---|---|---|---|---|
mcp-prod-east | 14,210 | 12 | 4 | 9 | 412 | 18 | 24ms | 142ms | 418ms |
mcp-prod-west | 9,842 | 12 | 4 | 9 | 288 | 7 | 22ms | 128ms | 362ms |
mcp-edge-eu | 6,521 | 9 | 3 | 6 | 184 | 4 | 38ms | 168ms | 402ms |
mcp-staging | 2,103 | 9 | 3 | 6 | 61 | 28 | 52ms | 241ms | 1,284ms |
mcp-dev | 184 | 14 | 5 | 12 | 8 | 6 | 18ms | 92ms | 218ms |
mcp-internal | 42 | 4 | 1 | 2 | 3 | 0 | 12ms | 34ms | 88ms |
| Client Name | Connections | P50 | P95 | P99 | Last Seen |
|---|---|---|---|---|---|
Claude Code | 82 | 24ms | 142ms | 418ms | just now |
Cursor | 61 | 32ms | 188ms | 521ms | 1m ago |
Codex CLI | 34 | 18ms | 92ms | 264ms | 2m ago |
Windsurf | 22 | 28ms | 161ms | 388ms | 7m ago |
Copilot | 18 | 38ms | 218ms | 612ms | 14m ago |
Zed | 7 | 52ms | 288ms | 824ms | 42m ago |
| Tool Name | Requests | Errors | P50 | P95 | P99 | Last Used |
|---|---|---|---|---|---|---|
| web_search | 4,210 | 12 | 88ms | 142ms | 418ms | 12s ago |
| code_exec | 2,841 | 4 | 142ms | 418ms | 982ms | 32s ago |
| file_read | 1,921 | 0 | 4ms | 12ms | 38ms | 1m ago |
| db_query | 814 | 2 | 28ms | 88ms | 184ms | 4m ago |
| git_diff | 312 | 0 | 18ms | 61ms | 142ms | 12m ago |
| Prompt Name | Requests | Errors | P50 | P95 | P99 | Last Used |
|---|---|---|---|---|---|---|
| summarize | 1,840 | 0 | 12ms | 38ms | 88ms | 22s ago |
| extract_entities | 962 | 0 | 8ms | 21ms | 52ms | 1m ago |
| classify | 481 | 1 | 6ms | 14ms | 34ms | 3m ago |
| search | 318 | 0 | 18ms | 52ms | 128ms | 8m ago |
| Resource URI | Requests | Errors | P50 | P95 | P99 | Last Used |
|---|---|---|---|---|---|---|
| /docs/api | 2,104 | 0 | 2ms | 6ms | 18ms | just now |
| /schema/openapi.json | 1,382 | 0 | 1ms | 4ms | 12ms | 12s ago |
| /users/{id} | 712 | 3 | 4ms | 11ms | 28ms | 38s ago |
| /orders | 284 | 0 | 6ms | 18ms | 42ms | 4m ago |
| Request ID | Server | Session ID | Method | Start Date | Duration | Input | Output |
|---|---|---|---|---|---|---|---|
req_8f3a912b07c2 | mcp-prod-east | sess_8f3a912b | tools/call>web_search | 3s ago | 142ms | 1.2 KB | 4.8 KB |
req_72c1ed40e391 | mcp-prod-east | sess_8f3a912b | resources/read>/docs/api | 8s ago | 6ms | 218 B | 12.4 KB |
req_a14b09c2f8d1 | mcp-prod-west | sess_72c1ed40 | prompts/get>summarize | 12s ago | 38ms | 482 B | 1.8 KB |
req_61f8c773aa20 | mcp-staging | sess_a14b09c2 | tools/call>code_exec | 21s ago | 2,841ms | 4.2 KB | 128 B |
req_d2e4a85117ff | mcp-edge-eu | sess_61f8c773 | initialize | 34s ago | 15ms | 128 B | 482 B |
req_9b1f37a8c402 | mcp-prod-east | sess_8f3a912b | tools/list | 52s ago | 4ms | 64 B | 2.1 KB |
req_4e07d92b1f88 | mcp-dev | sess_d2e4a851 | tools/call>db_query | 1m ago | 88ms | 218 B | 3.4 KB |
req_31ac0e4f7728 | mcp-prod-east | sess_8f3a912b | resources/list | 2m ago | 9ms | 64 B | 1.2 KB |
| Session ID | Client | Server | Requests | Errors | Start Date | Duration |
|---|---|---|---|---|---|---|
sess_8f3a912b | Claude Code | mcp-prod-east | 412 | 0 | 4m ago | 12m 30s |
sess_72c1ed40 | Cursor | mcp-prod-east | 218 | 2 | 9m ago | 8m 12s |
sess_a14b09c2 | Codex CLI | mcp-prod-west | 581 | 0 | 18m ago | 22m 04s |
sess_61f8c773 | Windsurf | mcp-edge-eu | 94 | 6 | 31m ago | 4m 47s |
sess_d2e4a851 | Copilot | mcp-dev | 312 | 0 | 1h ago | 17m 21s |
| Error | Method | Server | Session ID | Time | Duration |
|---|---|---|---|---|---|
Internal Error | tools/call>code_exec | mcp-staging | sess_a14b09c2 | 21s ago | 2,841ms |
Invalid Params | tools/call>db_query | mcp-dev | sess_d2e4a851 | 2m ago | 12ms |
Request Timeout | resources/read>/users/{id} | mcp-edge-eu | sess_61f8c773 | 12m ago | 30,000ms |
Rate Limited | prompts/get>classify | mcp-prod-west | sess_72c1ed40 | 38m ago | 8ms |
< 1ms
SDK overhead per request.
99.9%
Uptime SLA for data ingestion.
2 regions
US and EU, with full data residency.
OTel
Export to any OpenTelemetry APM via the CLI.
SDK and CLI source on GitHub, Apache 2.0.
Drop in the SDK. Send MCP traces to Spanly, your existing APM, or both.
Your APM sees HTTP. Spanly sees MCP.
Datadog, Sentry, and New Relic do an excellent job on requests, traces, and infrastructure. They don't model the MCP protocol. Spanly does, so an on-call engineer can read a failing tool call without piecing it together from raw spans.
We complement your existing stack. We don't replace it. Spanly's SDK is additive. Keep sending HTTP and infra telemetry to your APM, and send MCP-shaped traffic here.
Everything you need to monitor MCP
From real-time tracing to error tracking, Spanly captures every MCP request your server handles, from tools/call to resource reads.
| initialize | 30 | 2 | 1ms | 2ms | 15ms |
| tools/call | 10 | 4 | 1ms | 6ms | 8ms |
| resources/read | 6 | 2 | 1ms | 1ms | 1ms |
Real-time Traces
Visualize every request and response between clients and servers with detailed timing breakdowns. Drill into a single MCP call to see the full payload, the server that handled it, and where the milliseconds went.
| Error Code | Count | Last Occurred |
|---|---|---|
| Invalid Params | 24 | 2m ago |
| Internal Error | 11 | 14m ago |
| Request Timeout | 7 | 1h ago |
| Method Not Found | 5 | 3h ago |
| Connection Closed | 3 | 8h ago |
Error Tracking
Catch errors before your users do. Track error codes, frequencies, and stack traces across every server and client – grouped so a recurring failure shows up once, not a thousand times.
Performance Metrics
Monitor request durations, identify bottlenecks, and track performance trends over time. p50, p95, p99 broken down by server and tool, so you can tell a single slow tool apart from a regressing deployment.
Analytics
Aggregate usage across servers and clients to spot trends and tune performance. See which prompts, tools, and resources are actually getting used – and which ones aren't earning their keep.
Your data, in your region
Pick US or EU when you create a project. Telemetry stays in the region you chose. GDPR-friendly by design, with full data residency.
Built for the people on call
Live status for the team room, alerts before customers complain, session traces for fast root-cause, and an audit log of everything that happened.
Built for the office TV
Pin always-on status boards to any screen. Full-screen, auto-refresh, no chrome.
Alerts, before users notice
Set thresholds on error rate, p95/p99, or traffic, scoped to any server, client, or tool. Routed to email, Slack, and signed webhooks.
Trace every session, end to end
Group requests by session to see the full arc of an interaction: every tool call, every error, every retry.
- sess_72c1ed40· started 12m ago12m 04s40 req2 err
- sess_8a39f10c· started 3m ago3m 22s18 req0 err
- sess_5d20b4ee· ended 2h ago41m 18s112 req5 err
- sess_19b7cc28· ended 5h ago1m 02s7 req0 err
A receipt for every action
Tamper-evident trail of every MCP call and config change.
- 12:42:08AUTHuser@acme.comsigned in via SSO
- 12:41:55WRITEuser@acme.comchanged alert threshold on mcp-prod-east
- 12:39:21ADMINuser@acme.comrevoked API key k_8f3a…
- 12:38:02READagent:claude-codeaccessed session sess_72c1ed40
Live in 5 minutes
Drop the SDK into your MCP server. No schema to maintain, no agent process, no rebuild.
Instrument your MCP server
Drop the SDK into your TypeScript or Python server, wrap any binary with the CLI, or ship Spanly as a Docker sidecar. Every prompt, tool call, and resource gets traced – no schema, no agent process, no rebuild.
$ npm install @spanly/sdkimport { SpanlyClient } from "@spanly/sdk"
const spanly = new SpanlyClient({
apiKey: process.env.SPANLY_API_KEY,
})
spanly.monitor(mcpServer)Query Spanly from your editor
Spanly also ships an MCP server of its own. Point Claude Code, Cursor, or any MCP client at it to search traces and triage errors without leaving your IDE.
$ claude mcp add --transport http spanly https://mcp.spanly.com/mcpStart monitoring your MCP servers
Engineering teams: add the MCP layer to your observability stack in under 5 minutes.