Observability for MCP servers
Every tool call, every packet, any language. No code changes.
The dedicated layer for Model Context Protocol (MCP) traffic, alongside the Datadog, Sentry, or New Relic you already run. Built for engineering teams shipping MCP servers in production.
curl -fsSL https://spanly.com/install.sh | shFree tier, no credit card · Open-source SDK & CLI on GitHub
| 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 |
| Timestamp | Server | Session | Level | Logger | Size |
|---|---|---|---|---|---|
| 8s ago | mcp-prod-east | sess_8f3a912b | info | mcp.server | 184 B |
| 14s ago | mcp-prod-west | sess_a14b09c2 | warning | tools.code_exec | 412 B |
| 38s ago | mcp-prod-east | sess_72c1ed40 | error | auth.session | 1.2 KB |
| 1m ago | mcp-edge-eu | sess_61f8c773 | debug | transport.http | 92 B |
| 2m ago | mcp-prod-east | sess_8f3a912b | info | tools.web_search | 256 B |
| 4m ago | mcp-dev | sess_d2e4a851 | notice | mcp.server | 218 B |
| 6m ago | mcp-prod-west | sess_a14b09c2 | critical | tools.code_exec | 2.1 KB |

< 1ms
SDK overhead per request.
99.9%
Uptime SLA for data ingestion.
2 regions
US and EU, with full data residency.
APM-ready
Correlate any MCP exchange with its APM trace.
SDK and CLI source on GitHub, Apache 2.0.
Wrap your server with the CLI or drop in the SDK. No code changes required. Spanly captures the protocol-shaped detail your APM doesn't.
Founding Partner Program · First 10 production MCP teams. 50% off Business for 12 months, locked in.
Don't APMs cover MCP now?
Sentry and New Relic ship MCP instrumentation in their SDKs. Datadog traces it from the client side. That works if your server runs a supported language and you can change its code.
Spanly works at the protocol level. An on-call engineer reads a failing tool call without piecing it together from spans.
We complement your existing stack. We don't replace it. Spanly is additive. Keep sending HTTP and infra telemetry to your APM, and send MCP-shaped traffic here. What is MCP observability?
What does Spanly monitor?
From real-time tracing to error tracking, Spanly captures every MCP request your server handles, from tools/call to resource reads.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. Recurring failures show up once, not a thousand times. Track error codes, frequencies, and stack traces across every server and client, all grouped automatically.
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.
Catch the bad deploy
Every request is tagged with the server and client version that handled it. Watch p50/p95/p99 split out by version, see the new release ride in alongside the old, and pinpoint the exact rollout that started the regression.
Your data, in your region
Pick US or EU when you create a project. Telemetry stays there. GDPR-friendly by design, with full data residency.
What do you ship to the on-call team?
Live status, alerts, session traces, and logs from your MCP server. Built for the team room, the pager, and the post-mortem.
Built for the office TV
Pin always-on status boards to any screen. Full-screen, auto-refresh, no chrome.
Alerts, before users notice
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
Logs, alongside your requests
Capture every notifications/message your MCP server emits. Filter by level or logger, jump from any log line straight to the session and request that produced it.
- 12:42:08infomcp.serverclient Cursor connected (protocol 2025-06-18)
- 12:41:55warningmcp.tools.code_execsandbox cold-start exceeded 800ms
- 12:39:21errormcp.transportstream closed unexpectedly mid-response
- 12:38:02debugmcp.resourcescache miss on /docs/api, fetched in 76ms
How fast can you be live?
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.
$ npm install @spanly/sdkimport express from "express";
import { spanly } from "@spanly/sdk";
const app = express();
app.use(spanly({ apiKey: process.env.SPANLY_API_KEY }));Query Spanly from your editor
Spanly ships its own MCP server. Point Claude Code, Cursor, or any MCP client at it to search traces and triage errors without leaving your IDE. Search traces and triage errors from your IDE.
$ claude mcp add --transport http spanly https://mcp.spanly.comStart monitoring your MCP servers
Engineering teams: add the MCP layer to your observability stack in under 5 minutes.