See which tool failed.
Not just that one did.
Purpose-built tracing for MCP servers: classified failures, live progress on long-running tools, and every downstream call in context.
Built on the same pipeline you already trust
Failures, classified. Not counted.
A generic error rate collapses five different problems into one number. Each of these has a different owner and a different fix.
tool_error
Everything your tool code raised or returned as isError.
unknown_tool
The SDK rejected the call before your handler ran.
invalid_arguments
Schema validation failed against the tool's input.
protocol_error
An MCP-level failure below any single tool.
401 / 403
Auth flow states from the spec, never counted as failures.
Watch it while it runs.
A span exports when it ends, so a ten-minute tool stays silent for ten minutes unless progress reports its own.
Your database calls, in context.
One opt-in call finds whatever OpenTelemetry instrumentors you already installed and reports what it touched.
db
Redis, Postgres, MySQL, Mongo, SQLite
System, operation, table, and statement (redacted before storage).
http
httpx, requests, aiohttp
Method, status, host, and body/headers with instrument_httpx().
llm
OpenAI, Anthropic, Bedrock
System, model, and input/output token counts.
messaging
Kafka, RabbitMQ, SQS
Stored and rendered generically, same as everything else.
One line. That's the whole integration.
No middleware to wire, no config file to write first.
- Failure text is read once, reduced to an enum, then discarded.
- Tool arguments and results stay off by default.
- Works the same whether your server runs over stdio or HTTP.
# pip install mcpobs
from mcpobs import instrument
instrument(mcp) # that is the whole integrationCurrently invite-only, while we work directly with early teams.
Tell us about your MCP server and we'll set up your first organisation.
Request access