Tempo MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Tempo MCP ServerShow traces with HTTP 500 errors in the last hour"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Tempo MCP Server
An advanced Model Context Protocol (MCP) server for querying Grafana Tempo traces and spans with comprehensive filtering capabilities.
Features
Flexible Trace Search: Query traces using TraceQL or legacy tags
Span Filtering: Filter spans by service name, duration, attributes, errors
Detailed Span Analysis: Get complete span details with calculated durations
Span Statistics: Aggregate statistics grouped by service/operation/status
Tag-based Queries: Easy filtering by custom tags
Time Range Support: Query by absolute or relative time ranges
Duration Filtering: Filter by min/max duration at trace and span level
Related MCP server: OTEL MCP Server
Installation
cd ~/tempo-mcp-server
npm install
npm run buildConfiguration
Environment Variables
Create a .env file or set environment variables:
# Required
TEMPO_URL=http://localhost:3200
# Optional
TEMPO_USERNAME=admin
TEMPO_PASSWORD=secret
TEMPO_TOKEN=bearer_token_here
TEMPO_TIMEOUT=30000Claude Desktop Configuration
Add to your claude_desktop_config.json:
{
"mcpServers": {
"tempo-mcp": {
"command": "node",
"args": ["[YOUR-PROJECT-PATH]/dist/index.js"],
"env": {
"TEMPO_URL": "http://localhost:3200"
}
}
}
}Available Tools
1. tempo_search_traces
Search traces with flexible filtering options.
Parameters:
query(string): TraceQL query (e.g.,{.service.name="app-demo"})tags(string): Legacy tags format (e.g.,service.name=app-demo)minDuration(string): Minimum duration (e.g., "100ms", "1s")maxDuration(string): Maximum duration (e.g., "5s")limit(number): Max traces to return (default: 20)start(string): Start time (RFC3339 or Unix timestamp)end(string): End time (RFC3339 or Unix timestamp)
Example:
{
"query": "{.service.name=\"app-demo\" && span.http.status_code >= 400}",
"minDuration": "100ms",
"limit": 50,
"start": "2025-01-01T00:00:00Z"
}2. tempo_get_trace
Get complete trace data by ID.
Parameters:
traceId(string, required): The trace ID
3. tempo_get_trace_spans
Get all spans from a trace with optional filtering.
Parameters:
traceId(string, required): The trace IDserviceName(string): Filter by service namespanName(string): Filter by span name (partial match)minDuration(number): Min span duration in msmaxDuration(number): Max span duration in mshasError(boolean): Filter error spans onlyattributes(object): Filter by attributes (e.g.,{"http.method": "POST"})
Example:
{
"traceId": "1c4090cb9c90630901b167ad22c769aa",
"serviceName": "app-demo",
"minDuration": 100,
"attributes": {
"http.method": "POST"
}
}4. tempo_search_spans
Search traces and return matching spans across multiple traces.
Parameters:
Trace search params:
query,tags,minDuration,maxDuration,limit,start,endSpan filter params:
serviceName,spanName,spanMinDuration,spanMaxDuration,spanHasError,spanAttributes
Example:
{
"query": "{.service.name=\"app-demo\"}",
"limit": 10,
"spanName": "POST",
"spanMinDuration": 1000
}5. tempo_get_span_statistics
Get aggregated span statistics.
Parameters:
Search params:
query,tags,limit,start,endgroupBy(string): "service", "operation", or "status"
Returns:
Count, avg/min/max durations, p50/p95/p99 percentiles per group
Example:
{
"query": "{.service.name=\"app-demo\"}",
"limit": 100,
"groupBy": "service"
}6. tempo_query_by_tag
Query traces by custom tag filters (convenience method).
Parameters:
tagFilters(object, required): Tag key-value pairsserviceName(string): Service name filterminDuration,maxDuration,limit,start,end
Example:
{
"tagFilters": {
"customtag": "tagValue",
"environment": "production"
},
"limit": 20
}Usage Examples
Example 1: Find all traces for a custom tag
tempo_query_by_tag({
tagFilters: { "customtag": "tagValue" },
start: "2025-01-01T00:00:00Z",
end: "2025-01-02T00:00:00Z"
})Example 2: Get detailed span breakdown
tempo_get_trace_spans({
traceId: "abc123...",
serviceName: "app-demo"
})Example 3: Find slow database operations
tempo_search_spans({
query: "{.service.name=\"app-demo\"}",
spanName: "SELECT",
spanMinDuration: 1000 // > 1 second
})Example 4: Get service performance statistics
tempo_get_span_statistics({
query: "{.service.name=\"app-demo\"}",
start: "2025-01-01T00:00:00Z",
groupBy: "operation"
})Example 5: Find errors in a time range
tempo_search_traces({
query: "{span.http.status_code >= 400}",
start: "1704067200", // Unix timestamp
limit: 50
})TraceQL Query Examples
// By service name
{.service.name="app-demo"}
// By tag
{.customtag="tagValue"}
// HTTP status codes
{span.http.status_code >= 400}
// Duration
{duration > 1s}
Time Format Examples
// RFC3339
"2025-01-01T00:00:00Z"
"2025-01-01T00:00:00+05:30"
// Unix timestamp (seconds)
"1704067200"
1704067200
// Relative (in TraceQL)
"now-1h"
"now-24h"Development
# Watch mode
npm run watch
# Build
npm run build
# Run
npm startTroubleshooting
Connection Issues
Verify
TEMPO_URLis correctCheck Tempo is running:
curl http://localhost:3200/api/statusCheck firewall/network connectivity
Query Errors
Validate TraceQL syntax - queries must be wrapped in
{}Check time range is valid (RFC3339 or Unix seconds)
Ensure trace IDs are correct format (hex string)
Use
resource.service.nameinstead of.service.namefor service filteringFor debugging, set
TEMPO_DEBUG=truein environment
Performance
Reduce
limitparameter for faster queriesNarrow time ranges
Use specific filters to reduce data volume
Available Tools
6 toolstempo_get_span_statisticsB
Get aggregated statistics for spans grouped by service, operation, or status. Returns count, avg/min/max/percentile durations.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time | |
| tags | No | Tags query | |
| limit | No | Number of traces to analyze | |
| query | No | TraceQL query | |
| start | No | Start time | |
| groupBy | No | Group statistics by service, operation, or status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It states what is returned (count, avg/min/max/percentile durations) but omits important behaviors: relationship between limit and query parameters, what happens with no query specified, whether start/end are required in practice, time parsing format, or pagination behavior. For an aggregation tool with 6 optional parameters, this leaves significant uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core purpose and then specify return values. Zero filler or redundancy. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, no output schema, and no annotations, the description gives a reasonable purpose and mentions the return value shape (count, durations). However, it doesn't cover parameter interactions (query vs tags, start/end formats, limit semantics), which would be valuable for an agent selecting parameters. It's adequate but has clear gaps given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 6 parameters is documented in the schema itself. The description adds the grouping concept (service/operation/status) which maps to the groupBy enum. However, the description doesn't clarify how query/tags interact, what 'Number of traces to analyze' means for aggregation sampling, or time format expectations, which would add genuine value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (Get), resource (spans), and action (aggregated statistics grouped by service/operation/status). It distinguishes from siblings like tempo_get_trace and tempo_search_spans by focusing on aggregation rather than retrieval of individual traces or spans. However, it doesn't explicitly name sibling tools as contrasts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for retrieving aggregated stats versus other tracing tools, but does not explicitly state when to use this versus the sibling tools (tempo_search_spans, tempo_get_trace, etc.). No exclusions or alternative recommendations are given. The grouping dimension gives some hint of usage context, but it's implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_get_traceB
Get complete trace data by trace ID, including all spans with full details
| Name | Required | Description | Default |
|---|---|---|---|
| traceId | Yes | The trace ID to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It describes what data is returned but says nothing about payload size/volume (complete traces with all spans could be very large), potential performance implications, whether partial data can be returned, or what happens if the trace ID doesn't exist. A 'get complete trace data' tool that returns potentially massive payloads should warn about size/truncation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with zero waste. It efficiently communicates the core purpose and return scope. It could be slightly more structured with usage guidance added, but as-is it is concise and front-loaded with the key action ('Get complete trace data').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool requires only one parameter (traceId) with 100% schema coverage and no nested objects, so complexity is low. However, without annotations or an output schema to describe the return payload, and with five sibling tools that overlap in purpose, the description leaves gaps around what distinguishes this from tempo_get_trace_spans and whether trace retrieval has size limits or error behaviors. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the single traceId parameter is described as 'The trace ID to retrieve'). The description adds the semantics that this ID retrieves 'complete trace data' with 'all spans', which provides modest additional value by clarifying the scope of the return. This aligns with the baseline 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource combination: 'Get complete trace data by trace ID.' It covers what data is returned ('complete trace data' including 'all spans with full details'). It distinguishes from sibling tools somewhat by emphasizing 'complete trace data' with 'full details', though it doesn't explicitly contrast with tempo_get_trace_spans, which likely retrieves a subset of the same data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you have a trace ID and want complete data. However, it provides no explicit when-to-use guidance or distinctions from siblings like tempo_get_trace_spans (which may be lighter-weight when only spans are needed) or tempo_search_traces (for finding traces by criteria). The distinction between complete trace data and span-specific retrieval is implied but not made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_get_trace_spansB
Get all spans from a specific trace with optional filtering by service name, span name, duration, attributes, or error status
| Name | Required | Description | Default |
|---|---|---|---|
| traceId | Yes | The trace ID | |
| hasError | No | Filter spans with errors only | |
| spanName | No | Filter by span name (partial match) | |
| attributes | No | Filter by span attributes (e.g., {"http.method": "POST", "http.status_code": "500"}) | |
| maxDuration | No | Maximum span duration in milliseconds | |
| minDuration | No | Minimum span duration in milliseconds | |
| serviceName | No | Filter by service name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It's a read operation (fetching spans), so the readOnly nature is implied but not explicitly stated. The description doesn't disclose pagination limits (traces can have hundreds of spans), whether results are returned in any particular order, or what happens when no spans match the filters. For a potentially large-returning fetch tool with zero annotation coverage, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence that front-loads the core purpose (get spans from a trace) and then enumerates the filtering dimensions. Zero wasted words, no redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description might be expected to note the return shape—but for span retrieval this is reasonably self-evident. With 7 parameters, a complex nested 'attributes' object, and no annotations, the description is adequate but doesn't cover behavioral caveats like result limits, ordering, or default filter behavior. It's a minimum-viable description for a moderately complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 7 parameters are documented in the schema itself. The description summarizes the filtering dimensions (service name, span name, duration, attributes, error status) which roughly maps to the parameters. Since coverage is high, baseline 3 applies; the description adds little beyond naming the filter categories, not syntax or interaction rules between filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: 'Get all spans from a specific trace'. The scope is specific (from a trace, not a global search) and the sibling tools like tempo_search_spans (global span search) and tempo_search_traces (trace querying) are differentiated by this trace-scoped focus. It doesn't explicitly name alternatives but the phrase 'from a specific trace' implies the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what filtering dimensions are available (service, span name, duration, attributes, error status) which implies when this is appropriate—when you already have a traceId and want to drill down. However, it does not state any exclusion criteria (e.g., 'use tempo_search_spans for cross-trace filtering') or prerequisites beyond the required traceId being self-evident from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_query_by_tagB
Convenience method to query traces by specific tag/attribute filters. Useful for filtering by sometag, user.id, environment, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time | |
| limit | No | Max traces to return | |
| start | No | Start time | |
| tagFilters | Yes | Tag key-value pairs (e.g., {"sometag": "abc123", "environment": "prod"}) | |
| maxDuration | No | Maximum duration | |
| minDuration | No | Minimum duration | |
| serviceName | No | Filter by service name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It doesn't mention anything about read-only status, limits, pagination, error behavior, or what 'convenience' entails concretely. For a trace-query tool with zero annotation coverage, this is a significant transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that gets to the point quickly with concrete examples. No wasted words, though it could benefit from a brief note on relationship to sibling tools without losing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 7 parameters, a nested object (tagFilters), and no output schema, making it moderately complex. The description explains the primary mechanism (tag filter querying) but doesn't address how it differs from the numerous sibling search tools, nor does it explain temporal/duration parameter semantics. Adequate but with clear gaps for a moderately complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all 7 parameters. The description adds marginal value by explaining tagFilters usage with examples, but doesn't clarify semantics for start/end time formats, minDuration/maxDuration encoding, or how limit behaves. Baseline 3 is appropriate since the schema already covers parameter basics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a convenience method to query traces by tag/attribute filters. It names the resource (traces) and the mechanism (tag filters), with useful examples like user.id and environment. However, it doesn't explicitly distinguish from sibling tools like tempo_search_traces or tempo_search_spans, which could be ambiguous given the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes this is a 'convenience method' and gives example filter use cases (sometag, user.id, environment), implying it's for tag-based filtering. However, it provides no explicit when-to-use vs when-not-to-use guidance relative to siblings like tempo_search_traces or tempo_search_spans, leaving the selection decision ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_search_spansC
Search for traces and return all matching spans across multiple traces with filtering. Useful for finding specific operations across your system.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time for trace search | |
| tags | No | Tags query for trace search | |
| limit | No | Maximum number of traces to search | |
| query | No | TraceQL query for trace search | |
| start | No | Start time for trace search | |
| spanName | No | Filter spans by name | |
| maxDuration | No | Maximum trace duration | |
| minDuration | No | Minimum trace duration | |
| serviceName | No | Filter spans by service name | |
| spanHasError | No | Filter spans with errors | |
| spanAttributes | No | Filter by span attributes | |
| spanMaxDuration | No | Maximum span duration in ms | |
| spanMinDuration | No | Minimum span duration in ms |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure burden. The description mentions it returns spans across multiple traces and supports filtering, but doesn't disclose key behaviors such as whether it aggregates/fuses spans from different traces into one result, how results are ordered, whether it's read-only, pagination behavior, or how the various filtering dimensions (query, tags, serviceName, spanHasError) interact. Multiple filter parameters coexist without explaining precedence or combination semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, efficient and to the point. First sentence states core function and scope. Second sentence adds a use case. No wasted words, but could have used the space to convey more meaningful differentiation and behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 13 parameters, nested objects, no output schema, and no annotations. The description is inadequate for this complexity. It doesn't explain the interplay between the many filter dimensions, what the response format looks like (returns spans from multiple traces - but merged into what structure?), or how this compares to sibling tools that also deal with traces and spans. For a tool of this complexity, the description should provide substantially more guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter has a text description in the schema itself. However, the tool has 13 parameters including nested objects (spanAttributes), and the description provides no additional semantic context about how parameters like query, tags, minDuration/maxDuration, and span* filters relate to each other. The description adds modest value (mentions 'filtering' generally) but relies heavily on the schema. Some parameters like minDuration/maxDuration are ambiguous in format (seconds vs ms) while spanMinDuration/spanMaxDuration explicitly state ms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it searches for traces and returns matching spans across multiple traces with filtering. It uses a specific verb+resource (search traces/spans) but doesn't distinguish from sibling tools like tempo_search_traces or tempo_get_trace_spans, which appear closely related. The purpose is clear but ambiguous about how this differs from siblings that share overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives. The description says 'useful for finding specific operations across your system' which implies general use but offers no exclusions or comparison with siblings like tempo_search_traces, tempo_get_trace, or tempo_get_trace_spans. Given 5 sibling tools with overlapping purposes, explicit differentiation is needed and absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_search_tracesA
Search traces using TraceQL query language. Automatically handles various query syntax formats. The query parser will normalize your query to work with Tempo. Default time range: last 7 days.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time in RFC3339 format (e.g., "2025-10-06T23:59:59Z") or Unix timestamp. Defaults to now if not provided. | |
| tags | No | Legacy tags query format (e.g., "service.name=app-demo http.status_code=200") | |
| limit | No | Maximum number of traces to return (default: 20, max: 1000) | |
| query | No | TraceQL query. Supports multiple formats: - Service: {resource.service.name="app-demo"} or {.service.name="app-demo"} - Span name: {span.name="POST /api/endpoint"} - HTTP status: {span.http.status_code=200} - Duration: {duration>100ms} - Combined: {resource.service.name="app-demo" && span.http.status_code=200} The parser will automatically normalize attribute paths. | |
| start | No | Start time in RFC3339 format (e.g., "2025-09-29T00:00:00Z") or Unix timestamp. Defaults to 7 days ago if not provided. | |
| maxDuration | No | Maximum duration filter (e.g., "5s", "10s", "1m") | |
| minDuration | No | Minimum duration filter (e.g., "100ms", "1s", "500ms") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose that the parser normalizes queries automatically and that the default time range is 7 days, which is useful. However, it doesn't disclose behavior like rate limits, what happens on parse failures, whether results are paginated, or whether the legacy tags format still works fully or is deprecated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and reasonably tight. It front-loads the core purpose (search traces using TraceQL) and adds key behavioral notes (normalization, default time range). It's compact without being verbose, though the normalization point is partially redundant with the schema's query description which already mentions 'The parser will automatically normalize attribute paths.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter search tool with no output schema and no annotations, the description is moderately complete. It covers the core value proposition and default time range. However, given the richness of sibling tools (trace vs span search, tag-based query), and that TraceQL is a specialized query language, the description could explain more about what fields are searchable and how results relate to tempo_get_trace. The schema does carry substantial weight here via the query examples.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 7 parameters are documented in the schema. The description adds the automatic normalization context and the 7-day default, but doesn't go beyond the schema for start/end format details, maxDuration/minDuration units, or limit semantics. The query parameter's rich example set is entirely in the schema, not the description. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Search traces using TraceQL query language', establishes it handles various query syntax formats with automatic normalization. It's distinguished from siblings like tempo_search_spans (searching spans vs traces) and tempo_get_trace (fetching a specific trace by ID). The verb+resource+scope is specific and clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states it uses TraceQL and handles query normalization, plus a default time range. However, it doesn't explicitly say when to use this vs alternatives like tempo_search_spans or tempo_query_by_tag, nor does it warn against using the legacy tags format. Usage context is implied by the query language mention but lacks explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- First observed
tempo_get_span_statistics - First observed
tempo_get_trace - First observed
tempo_get_trace_spans - First observed
tempo_query_by_tag - First observed
tempo_search_spans - First observed
tempo_search_traces
TDQS
Scored across 6 tools
The tools are largely distinct: get_trace (full trace), search_traces (TraceQL), get_trace_spans (spans within a trace), search_spans (spans across traces), get_span_statistics (aggregations), query_by_tag (tag-based queries). The main overlap is between search_traces and query_by_tag—both retrieve traces—but the tool descriptions clarify their inputs. This is a modest overlap, not a severe one.
Naming follows a consistent pattern of tempo_ followed by action_noun: tempo_get_trace, tempo_search_traces, tempo_get_trace_spans, tempo_search_spans, tempo_get_span_statistics, tempo_query_by_tag. The verb/noun structure is uniform across all tools, making the API predictable. tempo_query_by_tag uses 'query' instead of 'search', a minor deviation, but overall the pattern is clear and consistent.
Six tools is a well-scoped set for a tracing query server. Each tool serves a distinct purpose: retrieving full traces, searching by query language, filtering spans, cross-trace span search, aggregations, and tag-based lookup. None feel redundant or unnecessary; the count is right for the domain scope.
The server covers trace lookup, searching (by TraceQL and tags), span retrieval, and statistics—a solid coverage of Tempo's core tracing query workflows. Missing operations like trace comparison or raw query execution are minor; the surface is reasonably complete for its domain. A notable gap is no direct capability to fetch recent traces without a query, relying on search having sensible defaults.
Maintenance
Related MCP Connectors
Query Honeycomb observability data: traces, events, metrics, SLOs, triggers, and boards.
Access New Relic observability data through MCP - query metrics, logs, traces, entities, and more
- SuperlogOAuthsh.superlog
Open-source agent that observes and fixes your application. Query logs, traces, metrics, incidents.
Query Checkly synthetic monitoring — checks, statuses, results, alerts, reporting and dashboards.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables natural language querying and analysis of OpenTelemetry traces, metrics, and logs stored in Elasticsearch/OpenSearch, allowing AI assistants to investigate performance issues, find root causes, and explore system behavior.12 npm14MIT
- AlicenseBqualityCmaintenanceEnables querying and analyzing distributed traces from Jaeger, including service discovery, trace inspection, and performance analysis, through MCP tools.72Apache 2.0
- AlicenseNot gradedqualityCmaintenanceProvides read-only access to Loki, Prometheus, and Tempo APIs, enabling natural language queries for logs, metrics, and traces. Supports multiple instances and authentication via bearer tokens.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query Grafana dashboards, alerts, and datasources for observability insights and incident investigation.MIT