How It Works
FastMCP uses the OpenTelemetry API for instrumentation. This means:- Zero configuration required - Instrumentation is always active
- No overhead when unused - Without an SDK, all operations are no-ops
- Bring your own SDK - You control collection, export, and sampling
- Works with any OTEL backend - Jaeger, Zipkin, Datadog, New Relic, etc.
Enabling Telemetry
The easiest way to export traces is usingopentelemetry-instrument, which configures the SDK automatically:
OpenTelemetry Python Documentation
Learn more about the OpenTelemetry Python SDK, auto-instrumentation, and available exporters.
Tracing
FastMCP creates spans for all MCP operations, providing end-to-end visibility into request handling.Server Spans
The server creates spans for each operation using MCP semantic conventions:
For mounted servers, an additional
delegate {name} span shows the delegation to the child server.
Client Spans
The FastMCP client creates spans for outgoing requests with the same naming pattern (tools/call {name}, resources/read, prompts/get {name}).
Span Hierarchy
Spans form a hierarchy showing the request flow. For mounted servers:Programmatic Configuration
For more control, configure the SDK in your Python code before importing FastMCP:Local Development
For quick local trace visualization, otel-desktop-viewer is a lightweight single-binary tool:Custom Spans
You can add your own spans using the FastMCP tracer:Where custom spans help most
Custom spans are most useful around work that is expensive or hard to debug:- External calls such as databases, vector stores, HTTP APIs, or queue operations
- Multi-step tool logic where one stage dominates latency
- Prompt or resource generation that fans out to other systems
- Sampling calls made from inside a tool via
ctx.sample(...)
Recommended naming and attributes
- Use
{tool_name}.{operation}or{resource_name}.{operation}for child spans such assearch.fetch,search.rank, ordocs.render - Add attributes that explain workload shape, such as counts, sizes, cache hits, or IDs
- Do not record secrets, prompts with sensitive user data, or raw tokens as span attributes
- Let exceptions propagate unless you have a specific recovery path; FastMCP’s server spans already mark failures and record exceptions
Instrumenting tools, prompts, and resources
Sampling calls inside tools
If your tool usesctx.sample(...), keep the LLM work nested under the tool span so traces show both application logic and model latency together.
For providers with their own OTEL integrations, prefer enabling that instrumentation rather than manually creating a span around every model call. For example, if you use Google GenAI, logfire.instrument_google_genai() will emit child spans with token and request metadata under the active FastMCP tool span.
Exporter choices
- For local debugging,
ConsoleSpanExporterorotel-desktop-viewergives quick feedback with minimal setup - For shared environments, use OTLP exporters to backends like Logfire, Jaeger, Tempo, Datadog, or New Relic
- If traces are too noisy, tune sampling in your OpenTelemetry SDK instead of removing FastMCP instrumentation
Error Handling
When errors occur, spans are automatically marked with error status and the exception is recorded:Attributes Reference
MCP Semantic Conventions
FastMCP implements the OpenTelemetry MCP semantic conventions:Auth Attributes
Standard identity attributes:FastMCP Custom Attributes
All custom attributes use thefastmcp. prefix for features unique to FastMCP:
Provider-specific attributes for delegation context:

