jaeger-mcp
This server is a read-only MCP interface for Jaeger distributed tracing, providing 12 tools to query, analyze, and forecast trace data:
jaeger_list_services– List all instrumented services Jaeger has observed.jaeger_list_operations– List operation names (HTTP routes, gRPC methods, etc.) for a specific service.jaeger_search_traces– Search traces with filters: service, operation, tags (e.g.{"http.status_code":"500"}), time range, duration bounds, and limit.jaeger_get_trace– Retrieve full trace detail: all spans, per-service stats, parent/child relationships, and execution tree.jaeger_get_dependencies– Get the directed service-to-service call graph with call counts over a configurable lookback window.jaeger_compare_traces– Structural diff between two traces showing added, removed, and changed spans with duration/tag deltas.jaeger_span_statistics– Per-operation latency percentiles (p50, p95, p99) and error rates aggregated across multiple traces.jaeger_critical_path– Identify the longest span chain and rank bottleneck spans by exclusive self-time.jaeger_compare_windows– Compare aggregate trace behavior between two time periods to detect regressions or improvements.jaeger_detect_anomalies– Statistically detect latency spikes or error-rate increases vs. historical baselines, with severity scoring.jaeger_predict_degradation– Forecast performance degradation 2–24 hours ahead based on recent trace trends.jaeger_forecast_capacity– Project future throughput demands and resource requirements from trace data.
Provides read-only access to Jaeger distributed tracing data, enabling search for traces, inspection of spans, and mapping of service dependencies through the Jaeger API.
Click on "Install 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., "@jaeger-mcpshow me traces with errors in the payment service from 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.
jaeger-mcp
MCP server for Jaeger distributed tracing. Give Claude (or any MCP-capable agent) read access to your trace data — search traces, inspect spans, compare traces, compute span statistics, map service dependencies, predict performance issues, and forecast capacity needs — without leaving the conversation.
Why another Jaeger MCP?
The existing Jaeger integrations require a running UI or custom scripts. This server:
Speaks the standard Model Context Protocol over stdio — works with Claude Desktop, Claude Code, Cursor, and any MCP client.
Is read-only: all 15 tools carry
readOnlyHint: true— zero risk of modifying trace data.Returns dual-channel output: structured JSON (
structuredContent) for programmatic use + Markdown (content) for human-readable display.Has actionable error messages that name the exact env var to fix and suggest a next step.
Supports Bearer token, HTTP Basic auth, or no auth (common for internal deployments).
Includes OpenAPI specification documenting the underlying Jaeger Query API (
openapi.yaml).
Related MCP server: Kubernetes + Prometheus SRE MCP Server
Tools
Tool | Endpoint | Description |
|
| List all instrumented services |
|
| List operation names for a service |
|
| Search traces with rich filters |
|
| Full trace detail with span tree |
|
| Service-to-service call graph |
|
| Structural diff between two traces |
|
| Per-operation latency and error stats |
|
| Longest-duration span chain and bottleneck ranking |
|
| Aggregate trace behavior diff between two time periods |
|
| Statistical latency/error-rate spike detection per operation |
|
| Predict performance degradation 2-24 hours in advance |
|
| Forecast throughput demands and resource requirements |
|
| Correlate a test run to its traces by tag query (Allure/pytest/custom) |
|
| Classify per-operation regressions between two time windows |
|
| Per-operation latency hotspots for a tagged test run |
Installation
pip install jaeger-mcpOr run directly without installing:
uvx jaeger-mcpConfiguration
All configuration is via environment variables:
Variable | Required | Default | Description |
| Yes | — | Jaeger query service URL, e.g. |
| No | — | Bearer token (takes precedence over Basic auth) |
| No | — | HTTP Basic auth username |
| No | — | HTTP Basic auth password |
| No |
| Set |
| No |
| HTTP request timeout in seconds |
| No |
| Retry count for transient failures (0 to disable) |
| No |
| TTL in seconds for discovery endpoint cache (0 to disable) |
Copy .env.example to .env and fill in your values.
Claude Desktop / Claude Code setup
Add to your MCP config (claude_desktop_config.json or .claude/mcp.json):
{
"mcpServers": {
"jaeger": {
"command": "jaeger-mcp",
"env": {
"JAEGER_URL": "https://jaeger.example.com",
"JAEGER_TOKEN": "your-token-here"
}
}
}
}Or with uvx (no install required):
{
"mcpServers": {
"jaeger": {
"command": "uvx",
"args": ["jaeger-mcp"],
"env": {
"JAEGER_URL": "https://jaeger.example.com"
}
}
}
}Docker
docker run --rm -e JAEGER_URL=https://jaeger.example.com jaeger-mcpExample queries
Once configured, ask Claude:
"What services does Jaeger know about?"
"Find traces with HTTP 500 errors in
order-servicefrom the last hour""Show me the slowest traces (over 2 seconds) for
GET /checkout""What caused the error in trace
abcdef1234567890?""Map the service dependency graph for the last 7 days"
"Which services call
postgresmost frequently?""Compare trace
abc123against tracedef456— what spans changed?""What are the p95 latencies per operation in
order-service?"
Tool usage guide
jaeger_list_services
Returns all service names Jaeger has seen. Start here when you don't know which services are instrumented. Output is capped at 500 services with a truncation hint.
jaeger_list_operations
Returns all operation names for a given service (e.g. HTTP route names, gRPC method names). Use to discover valid operation names before filtering jaeger_search_traces.
jaeger_search_traces
The main search tool. Filters:
service(required) — service name fromjaeger_list_servicesoperation— narrow to a specific endpointtags— JSON string of tag filters, e.g.{"http.status_code":"500"}or{"error":"true"}start/end— time range in microseconds UTCmin_duration/max_duration— duration strings like"100ms","1.5s","2m"limit— default 20, max 1500
Returns trace summaries with trace_id, duration_us, span_count, service_count, root_operation, errors_count.
jaeger_get_trace
Full trace detail. Accepts a trace_id (hex string, 16-32 chars) and returns:
All spans with tags, service names, parent/child relationships
Per-service statistics (span count, total duration, error count)
Execution tree (each node lists its child span IDs)
Error spans are identified by tags["error"] = "true".
jaeger_get_dependencies
Service topology graph. Returns directed edges (parent → child) with call_count. Use lookback_hours (default 24, max 720) to control the window.
jaeger_compare_traces
Structural diff between two traces. Accepts two trace_id hex strings and matches spans by (operationName, serviceName, parentOperation) — not span ID. Reports:
Added spans — present in trace B but not trace A
Removed spans — present in trace A but not trace B
Changed spans — matched but differ in duration or tags (shows deltas)
Unchanged count — number of identical spans
Use to compare a slow trace against a fast one, or to see what changed between deployments.
jaeger_span_statistics
Per-operation latency percentiles and error rates. Fetches up to limit traces (default 20, max 100) for a service and aggregates all spans by operation name. Reports per operation:
count— total spans observedp50_duration_us,p95_duration_us,p99_duration_us— latency percentileserror_count,error_rate— errors (identified bytags["error"] = "true")
Use to find the slowest or most error-prone operations in a service.
jaeger_critical_path
Identifies the longest-duration span chain from root to leaf in a trace (the critical path) and ranks spans by self-time to find performance bottlenecks.
Reports:
Critical path spans with operation, service, duration, and percentage-of-total
Bottleneck spans ranked by exclusive duration (self-time)
Use to answer "Why is this trace so slow?" and "Which operations consume the most CPU/self-time?"
jaeger_compare_windows
Compares aggregate trace behavior between two time periods for a service to detect performance regressions or improvements across deployments.
Reports:
Per-operation diff summary showing added, removed, faster, slower operations
Deviation scoring with numeric scores per operation and overall
Latency percentile changes (p50, p95) and error rate deltas
Use to answer "Did our latest deployment affect performance?" and "Which operations got slower after the database upgrade?"
jaeger_detect_anomalies
Scans for statistically significant latency spikes or error-rate increases in a service's recent traces compared to historical baselines.
Reports:
Flagged operations with anomaly type (latency or error_rate)
Severity classification (low to critical) with z-scores
Current vs baseline values for affected metrics
Use to proactively identify performance degradations and reliability issues before they impact users.
Library facade (in-process use)
jaeger-mcp can also be used as a Python library without an MCP server:
from jaeger_mcp import JaegerClient
client = JaegerClient.from_env() # reads JAEGER_URL from env
trace = client.get_trace("abcdef1234567890abcdef1234567890")
for span in trace.spans:
if span.error:
print(f"{span.service_name}: {span.operation} at {span.start_utc}")
print(f" tags: {span.tags}")Available methods: get_trace(), search_traces(), list_services(), get_dependencies(), compare_traces(), span_statistics(), critical_path(), compare_windows(), detect_anomalies(), predict_degradation(), forecast_capacity(), find_test_traces(), regression_diff(), test_profile().
Domain objects: Span, Trace, TraceSummary, ServiceDep, TraceComparison, SpanIdentity, SpanChange, SpanStatisticsResult, OperationStatResult, CriticalPathOutput, CriticalPathSpan, BottleneckSpan, WindowComparisonOutput, OperationDiff, AnomalyDetectionOutput, OperationAnomaly — all with typed fields.
API Documentation
This project includes comprehensive OpenAPI specifications in the docs/ directory:
Jaeger Query Service API (
openapi.yaml) - Documents the actual Jaeger API endpointsMCP Tools API (
docs/mcp-tools-openapi.yaml) - Documents the MCP tools as conceptual HTTP endpoints
These specifications are useful for:
Understanding the underlying API calls made by each tool
Developing alternative integrations
Debugging API interactions
Generating client libraries or documentation
See docs/README.md for more details on both specifications.
Performance characteristics
All tools use a single persistent
requests.Sessionwith connection pooling.The session has
trust_env = Falseto bypass environment proxies (Jaeger is typically an internal service).Requests time out after 30 seconds (configurable via
JAEGER_TIMEOUT).Transient HTTP errors (429/5xx) are retried with exponential backoff (configurable via
JAEGER_RETRY_ATTEMPTS).list_servicesandlist_operationsresponses are cached for 120 seconds (configurable viaJAEGER_CACHE_TTL).jaeger_search_tracespasseslimitdirectly to Jaeger — avoid requesting more traces than needed.jaeger_get_tracefetches the full trace in one call — large traces (thousands of spans) may be slow.jaeger_get_dependenciesaggregates over the full lookback window; large windows may be slow on busy clusters.
Development
git clone https://github.com/mshegolev/jaeger-mcp
cd jaeger-mcp
pip install -e '.[dev]'
pytest tests/ -v
ruff check src tests
ruff format src testsLicense
MIT — see LICENSE.
Available Tools
15 toolsjaeger_compare_tracesARead-onlyIdempotent
Compare two traces structurally — find added, removed, and changed spans.
Fetches both traces from Jaeger and performs a structural diff by matching
spans on (operationName, serviceName, parentOperation) — not span IDs,
which differ across traces. Reports duration deltas and tag differences for
changed spans.
Examples:
- Use when: "What changed between a fast and slow request?"
→ pass the trace IDs of both requests; inspect changed_spans
for duration deltas.
- Use when: "Did a deployment add new service calls?"
→ compare a pre-deploy trace with a post-deploy trace; check
added_spans for new operations.
- Use when: "Are these two traces structurally identical?"
→ if added_spans, removed_spans, and changed_spans
are all empty, the traces have the same structure.
- Don't use when: You want aggregate statistics across many traces
(use jaeger_span_statistics instead, once available).
- Don't use when: You only have one trace — use jaeger_get_trace
for single-trace inspection.
Returns:
dict with trace_id_a / trace_id_b / added_spans /
removed_spans / changed_spans (with duration + tag deltas) /
unchanged_count.
| Name | Required | Description | Default |
|---|---|---|---|
| trace_id_a | Yes | First trace ID (baseline) as a hex string (16 or 32 hex chars). Obtain from jaeger_search_traces. | |
| trace_id_b | Yes | Second trace ID (comparison) as a hex string (16 or 32 hex chars). Obtain from jaeger_search_traces. |
Output Schema
| Name | Required | Description |
|---|---|---|
| trace_id_a | Yes | |
| trace_id_b | Yes | |
| added_spans | Yes | |
| changed_spans | Yes | |
| removed_spans | Yes | |
| unchanged_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false. The description adds behavioral details: it fetches traces, matches on (operationName, serviceName, parentOperation), and reports duration/tag deltas, providing transparency beyond annotations.
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?
Well-structured with examples and a returns section; front-loaded purpose. Every sentence is useful, no wasted words.
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 tool complexity, output schema existence, and rich annotations, the description fully covers matching logic, use cases, and return structure, leaving no gaps.
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% with descriptions for both parameters. The description adds value by mentioning 'Obtain from jaeger_search_traces' and context on hex format, slightly improving over the baseline 3.
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 'Compare two traces structurally — find added, removed, and changed spans.' It uses specific verbs and resources, and distinguishes from sibling tools by explicitly contrasting with aggregate statistics and single-trace inspection.
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?
Provides explicit when-to-use examples (e.g., 'What changed between a fast and slow request?') and when-not-to-use with alternatives (e.g., 'use jaeger_get_trace'), giving clear context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_compare_windowsARead-onlyIdempotent
Compare aggregate trace behavior between two time periods for a service.
Fetches traces from both time windows, aggregates span statistics per operation, then compares the aggregate behavior to detect performance changes.
Examples: - Use when: "Did our latest deployment affect performance?" → compare pre-deploy and post-deploy time windows for the service. - Use when: "Which operations got slower after the database upgrade?" → check the comparison_p95_us and p95_delta_pct columns for increases. - Use when: "Are we seeing new error patterns?" → look for operations with increased error_rate_delta. - Use when: "Did we add or remove any API endpoints?" → check added_count and removed_count in the summary. - Don't use when: You want to compare two specific traces (use jaeger_compare_traces instead). - Don't use when: You want full span detail for a single trace (use jaeger_get_trace instead).
Returns: WindowComparisonOutput with per-operation diffs and summary statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum traces to fetch per window (default 100). | |
| service | Yes | Service name to compare across time windows. | |
| operation | No | Optional operation name filter. | |
| baseline_end | Yes | Baseline window end time (Unix timestamp in microseconds). | |
| baseline_start | Yes | Baseline window start time (Unix timestamp in microseconds). | |
| comparison_end | Yes | Comparison window end time (Unix timestamp in microseconds). | |
| comparison_start | Yes | Comparison window start time (Unix timestamp in microseconds). |
Output Schema
| Name | Required | Description |
|---|---|---|
| service | Yes | |
| operations | Yes | |
| added_count | Yes | |
| baseline_end | Yes | |
| faster_count | Yes | |
| slower_count | Yes | |
| removed_count | Yes | |
| baseline_start | Yes | |
| comparison_end | Yes | |
| comparison_start | Yes | |
| total_operations | Yes | |
| overall_deviation_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds context about fetching traces, aggregating per operation, and comparing, without contradiction.
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?
Well-structured: purpose sentence, what it does, bullet-pointed usage scenarios, and exclusions. Front-loaded and concise.
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 7 params (5 required), 100% schema coverage, output schema present, and rich annotations, the description covers all necessary context without gaps.
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 baseline is 3. The description adds meaning through usage examples that implicitly reference parameters (e.g., pre/post-deploy windows), though it doesn't describe each parameter explicitly.
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's purpose: compare aggregate trace behavior between two time periods for a service. It uses specific verbs and distinguishes from siblings like jaeger_compare_traces and jaeger_get_trace.
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?
Explicitly provides when to use (e.g., deployment impact, database upgrade) and when not to use (specific trace comparison, full span detail), with alternative sibling tools mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_critical_pathARead-onlyIdempotent
Identify the critical path and top bottlenecks in a trace.
Finds the longest-duration span chain (critical path) from root to leaf, and ranks spans by self-time to find actual performance bottlenecks.
Examples: - Use when: "Why is this trace so slow?" → call with the slow trace ID; examine the critical_path_duration_us and critical_path_percentage to see how much of the total time is spent on the longest path. - Use when: "Which operations are consuming the most CPU/self-time?" → check the bottlenecks list sorted by self_time_us descending. - Use when: Debugging performance regressions — compare critical path percentages before/after changes. - Don't use when: You want aggregate statistics across many traces (use jaeger_span_statistics for that). - Don't use when: You need to compare two traces structurally (use jaeger_compare_traces for that).
Returns: dict with trace metadata, critical path spans, and bottleneck ranking.
| Name | Required | Description | Default |
|---|---|---|---|
| trace_id | Yes | Trace ID as a hex string (16 or 32 hex chars). Obtain from jaeger_search_traces. |
Output Schema
| Name | Required | Description |
|---|---|---|
| trace_id | Yes | |
| bottlenecks | Yes | |
| critical_path | Yes | |
| root_operation | Yes | |
| bottleneck_count | Yes | |
| total_duration_us | Yes | |
| critical_path_percentage | Yes | |
| critical_path_duration_us | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable context: it finds the longest-duration span chain, ranks spans by self-time, and returns a dict with trace metadata, critical path spans, and bottleneck ranking. No contradictions.
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 concise, front-loaded with the purpose, and structured with bullet points for usage examples, non-usage cases, and return value. Every sentence adds value.
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 the tool's moderate complexity, single parameter, existing output schema, and thorough annotations, the description is complete enough for an agent to understand when and how to use it.
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% for the single trace_id parameter, which is well-described in the schema. The tool description adds no extra parameter information beyond what the schema provides, so 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 identifies the critical path and top bottlenecks in a trace. It distinguishes from siblings by explicitly noting when not to use (e.g., for aggregate statistics or comparing traces) and naming alternative tools.
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?
Multiple 'Use when' examples are provided, each with a clear scenario and expected action. 'Don't use when' cases specify alternative sibling tools (jaeger_span_statistics, jaeger_compare_traces), offering explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_detect_anomaliesARead-onlyIdempotent
Detect latency and error-rate anomalies for a service by comparing recent behavior to historical baseline.
Fetches traces from a historical baseline window and a recent observation window, computes per-operation statistics for both, then identifies statistically significant deviations that may indicate performance issues or reliability problems.
Examples:
- Use when: "Are there any new performance issues in order-service?"
→ service='order-service' (uses default 60-minute baseline, 5-minute current).
- Use when: "Be more sensitive to subtle changes"
→ set sensitivity=1.5 (lower threshold).
- Use when: "Check for issues over the last 24 hours against previous week"
→ baseline_duration_minutes=10080, current_duration_minutes=1440.
- Don't use when: You want to compare two specific time periods
(use jaeger_compare_windows instead).
- Don't use when: You want full span detail for a single trace
(use jaeger_get_trace instead).
Returns: AnomalyDetectionOutput with flagged operations and severity scores.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service name to detect anomalies for. | |
| sensitivity | No | Anomaly sensitivity threshold (1.0-5.0, default 2.0). Lower = more sensitive. | |
| current_duration_minutes | No | Current observation window in minutes (1-60, default 5). | |
| baseline_duration_minutes | No | Historical baseline duration in minutes (5-1440, default 60). |
Output Schema
| Name | Required | Description |
|---|---|---|
| service | Yes | |
| anomalies | Yes | |
| current_end | Yes | |
| sensitivity | Yes | |
| baseline_end | Yes | |
| current_start | Yes | |
| baseline_start | Yes | |
| total_anomalies | Yes | |
| latency_anomalies | Yes | |
| error_rate_anomalies | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds how it fetches traces and computes statistics, which is useful context. No contradictions or missing disclosures.
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?
Concise with clear sections: purpose, process, examples with usage, returns. No wasted words; front-loaded with key information.
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?
Covers all necessary aspects: purpose, parameters, examples, alternatives, return type. No unexplained gaps given the tool's complexity and existing annotations.
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 baseline is 3. The description adds value by providing concrete examples of using parameters (e.g., sensitivity, duration windows) beyond the schema definitions.
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 it detects latency and error-rate anomalies for a service by comparing recent behavior to historical baseline. It uses specific verb 'detect' and resource 'anomalies for a service', and distinguishes from siblings like jaeger_compare_windows and jaeger_get_trace.
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?
Provides explicit 'Use when' examples with parameter suggestions and 'Don't use when' with alternative tool names, giving clear guidance on when to use this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_find_test_tracesARead-onlyIdempotent
Find Jaeger traces matching the supplied tag query.
Accepts any tag key-value schema (Allure, pytest, custom) without normalization. When service is omitted, searches all known services concurrently (capped at 20). Results are sorted newest-first.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tag key-value pairs to filter traces. Any framework tag schema works — e.g. {'allure.id': 'TC-42'} or {'test.run_id': 'abc123'}. | |
| limit | No | Maximum traces to return total. | |
| service | No | Jaeger service name. If omitted, all services (up to 20) are searched concurrently. | |
| lookback_hours | No | Hours back from now to search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| traces | Yes | |
| tag_query | Yes | |
| total_count | Yes | |
| service_filter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the annotations: 'Accepts any tag key-value schema without normalization' indicates flexibility and a lack of preprocessing, while 'searches all known services concurrently (capped at 20)' and 'sorted newest-first' disclose performance and ordering traits. These enrich the annotation-provided readOnly and idempotent hints without contradiction.
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 concise, front-loaded with the main action, and uses three clear sentences. Every sentence earns its place: purpose, tag flexibility, and key behaviors.
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 the rich schema, annotations, and presence of an output schema, the description covers the essential behavioral aspects. It lacks explicit differentiation from the similarly named 'jaeger_search_traces', which could cause selection ambiguity, but is otherwise 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 coverage is 100%, so the baseline is 3. The description adds some context (e.g., tag schema flexibility, service omission behavior) but does not significantly deepen understanding of individual parameters beyond the schema. It is adequate, not outstanding.
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 'Find Jaeger traces matching the supplied tag query', which is a specific verb+resource. However, it does not explicitly distinguish itself from the sibling tool 'jaeger_search_traces', which may serve a similar purpose.
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 provides clear context on when to use it (tag-based query, any tag schema) and notes that service is optional with a fallback to all services. It does not explicitly mention alternatives or exclusions, but the context is clear enough for an agent to infer use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_forecast_capacityARead-onlyIdempotent
Forecast future throughput demands and resource requirements for a service.
Provides predictions for the next 7-30 days with confidence intervals to enable infrastructure scaling decisions.
Args: service: Service name to forecast capacity for days_ahead: Number of days to forecast ahead (default: 30 days)
Returns: ForecastResult with throughput predictions and resource requirements
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service name to forecast capacity for | |
| days_ahead | No | Number of days to forecast ahead (1-90) |
Output Schema
| Name | Required | Description |
|---|---|---|
| service_name | Yes | Name of the service |
| forecast_period_end | Yes | End of forecast period |
| predicted_throughput | Yes | Predicted throughput (requests per time unit) |
| forecast_period_start | Yes | Start of forecast period |
| resource_requirements | No | Resource requirements |
| confidence_interval_low | Yes | Lower bound of confidence interval |
| confidence_interval_high | Yes | Upper bound of confidence interval |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details (confidence intervals, 7-30 day range) beyond annotations, but contains an inconsistency: it states 'next 7-30 days' while the schema allows days_ahead from 1-90. This misstatement reduces transparency.
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 concise with two clear paragraphs: purpose and parameters. It is front-loaded and well-structured, though the range inconsistency could be clarified.
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 the presence of an output schema and annotations, the description provides adequate context (throughput, resource requirements, confidence intervals). The inconsistency in the forecast range is a minor gap.
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 baseline is 3. The description repeats schema info (service name, default days_ahead) but adds no new semantic value beyond what the schema already provides. The mention of 7-30 days could mislead regarding the valid range.
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's purpose: forecasting future throughput and resource requirements for a service. It uses specific verbs (forecast) and nouns (capacity for a service), and distinguishes it from sibling tools like prediction and anomaly detection.
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 for infrastructure scaling decisions, providing context. However, it does not explicitly state when not to use or direct users to alternative tools like jaeger_predict_degradation for degradation-specific predictions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_get_dependenciesARead-onlyIdempotent
Retrieve the service-to-service call graph from Jaeger.
Wraps GET /api/dependencies. Returns directed edges (parent → child)
with call_count — the number of spans where parent called child in
the lookback window.
Use this to understand service topology, find high fan-out services, or verify that a new service is connected as expected.
Examples:
- Use when: "What services does order-service call?"
→ check edges where parent='order-service'.
- Use when: "Map the full service dependency graph for the last 7 days"
→ lookback_hours=168.
- Use when: "Which services are called most frequently?"
→ sort edges by call_count descending.
- Don't use when: You want detailed span timings (use
jaeger_search_traces + jaeger_get_trace instead).
- Don't use when: You need real-time data — Jaeger's dependency graph
is aggregated and may lag by minutes.
Returns:
dict with end_ts_us / lookback_hours / edge_count /
edges (list of {parent, child, call_count}).
| Name | Required | Description | Default |
|---|---|---|---|
| end_ts | No | End timestamp in microseconds since Unix epoch UTC (optional). Defaults to now. Example: 1713400000000000. | |
| lookback_hours | No | Number of hours to look back from end_ts (1-720, default 24). |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | |
| end_ts_us | Yes | |
| edge_count | Yes | |
| lookback_hours | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint; the description adds that the dependency graph is aggregated and may lag by minutes, and that it wraps GET /api/dependencies. It also discloses the return structure including fields like end_ts_us, lookback_hours, edge_count, and edges.
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 concise and well-structured: brief intro, clear bullet points for use cases, explicit don't-use cases, and a return format summary. Every sentence adds value without redundancy.
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 the tool's low complexity (2 parameters, all optional), the description covers all necessary aspects: purpose, usage guidelines, behavioral caveats, and return format. It is fully adequate for an agent to select and invoke the tool correctly.
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% with both parameters well-documented. The description adds value by providing concrete examples of parameter usage (e.g., lookback_hours=168 for 7 days), but the schema alone already explains the parameters adequately, so this is slightly above baseline.
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 'Retrieve' and specific resource 'service-to-service call graph from Jaeger'. It distinguishes from sibling tools by providing explicit use cases and when not to use it, e.g., 'Don't use when: You want detailed span timings (use jaeger_search_traces + jaeger_get_trace instead)'.
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 provides explicit guidance on when to use this tool with concrete examples (e.g., 'What services does order-service call?', 'Map the full service dependency graph for the last 7 days'), and when not to use it with alternatives, such as for real-time data or detailed span timings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_get_traceARead-onlyIdempotent
Retrieve full trace detail with all spans, service breakdown, and execution tree.
Wraps GET /api/traces/{traceID}. Returns every span in the trace,
per-service statistics, and a flat execution tree (each node lists its
child span IDs) that summarises the call hierarchy.
Error spans are identified by tags["error"] = "true".
Examples:
- Use when: "Why is trace abc123... slow — show me the span breakdown"
→ trace_id='abc123...'; inspect services for the heaviest service
and execution_tree for the call hierarchy.
- Use when: "Which service caused the error in trace xyz...?"
→ check spans where is_error=true.
- Use when: You found a slow/failed trace in jaeger_search_traces
and need full detail.
- Don't use when: You don't have a specific traceID — use
jaeger_search_traces to find one first.
- Don't use when: You only want aggregate data across many traces
(use jaeger_search_traces with filters instead).
Returns:
dict with trace_id / span_count / service_count /
root_operation / root_service / start_time_us /
total_duration_us / errors_count / services (per-service stats) /
spans (all spans) / execution_tree.
| Name | Required | Description | Default |
|---|---|---|---|
| trace_id | Yes | Trace ID as a hex string (16 or 32 hex chars). Example: 'abcdef1234567890abcdef1234567890'. Obtain from jaeger_search_traces. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spans | Yes | |
| services | Yes | |
| trace_id | Yes | |
| span_count | Yes | |
| errors_count | Yes | |
| root_service | Yes | |
| service_count | Yes | |
| start_time_us | Yes | |
| execution_tree | Yes | |
| root_operation | Yes | |
| total_duration_us | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, so behavior is well-covered. The description adds useful context like error span identification ('tags["error"] = "true"'), return structure details (services, execution_tree), and API endpoint mapping. No contradiction with annotations.
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 well-structured with clear sections: purpose, API endpoint, return details, examples, and don't-use guidance. Every sentence adds value, and there is no redundancy. The examples are concise yet informative.
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 single-parameter tool with rich annotations and an output schema described in the description (listing all return fields), the description is complete. It covers all necessary information for an agent to correctly invoke and interpret results.
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% with detailed constraints (pattern, minLength, maxLength, description). The description repeats the format and examples but does not add significant meaning beyond the schema. 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 'Retrieve full trace detail with all spans, service breakdown, and execution tree.' The verb 'Retrieve' and resource 'full trace detail' are specific. It effectively distinguishes from sibling tools like jaeger_search_traces (which finds traces) and others by explicitly contrasting use cases.
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?
Explicit examples of when to use (e.g., 'Why is trace abc123... slow') and when not to use (e.g., 'Don't use when: You don't have a specific traceID — use jaeger_search_traces to find one first') are provided. Alternatives are named clearly, and the examples demonstrate suitable scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_list_operationsARead-onlyIdempotent
List all operation names Jaeger has seen for a given service.
Wraps GET /api/services/{service}/operations. Useful for discovering
which operation names to pass as filters to jaeger_search_traces.
Output is capped at 500 operations.
Examples:
- Use when: "What HTTP endpoints does order-service expose in tracing?"
→ service='order-service'.
- Use when: You want to search for a specific slow operation but need
the exact name — list operations first, then pass it to
jaeger_search_traces.
- Use when: Auditing which gRPC methods a service traces.
- Don't use when: You don't have a specific service — start with
jaeger_list_services first.
- Don't use when: You want to search traces immediately (skip this
step if you already know the operation name).
Returns:
dict with service / operations_count / truncated /
operations (sorted alphabetically).
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service name exactly as returned by jaeger_list_services. |
Output Schema
| Name | Required | Description |
|---|---|---|
| service | Yes | |
| truncated | Yes | |
| operations | Yes | |
| operations_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent), the description adds that output is capped at 500 operations and details the return dict structure. No contradiction with annotations.
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?
Efficiently structured: summary, API wrap, usage guidance, examples, return format. No superfluous text; every sentence adds value.
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 single parameter and simple operation, description fully explains purpose, usage, constraints (500 cap), output structure, and relationship to sibling tools.
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?
The single parameter 'service' is described in schema with 100% coverage. Description adds context that the name must match exactly as returned by jaeger_list_services, adding value beyond 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 'List' and resource 'operation names' for a given service. It distinguishes from siblings like jaeger_list_services and jaeger_search_traces.
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?
Provides explicit when-to-use examples (discovering operation names for filtering) and when-not-to-use (when service unknown or name already known), with alternatives suggested (jaeger_list_services).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_list_servicesARead-onlyIdempotent
List all services that Jaeger has observed traces for.
Wraps GET /api/services. Jaeger returns all services at once — no
pagination. Output is capped at 500 services with a truncation hint.
Use this first to discover valid service names before calling
jaeger_list_operations or jaeger_search_traces.
Examples:
- Use when: "What services does Jaeger know about?"
→ call with no parameters; read the services list.
- Use when: "Is payment-service instrumented?"
→ check if payment-service appears in the services list.
- Use when: Starting a debugging session — list services first,
then pick one for jaeger_list_operations or
jaeger_search_traces.
- Don't use when: You already know the service name and want to
search its traces (call jaeger_search_traces directly).
- Don't use when: You want the dependency graph between services
(call jaeger_get_dependencies).
Returns:
dict with keys services_count / truncated / services.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| services | Yes | |
| truncated | Yes | |
| services_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds context beyond that: no pagination, output capped at 500 services with truncation hint, and wraps a GET endpoint. No contradiction with annotations.
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 well-structured with a clear opening, a technical note, sections for examples and returns. Every sentence is informative, and it is front-loaded with the main purpose.
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 the tool's simplicity (no parameters, output schema provided), the description covers all necessary aspects: behavior, usage, limitations, and return format. It is complete and self-contained.
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?
The input schema has no parameters, and schema description coverage is 100%, so baseline is 3. However, the description adds value by explicitly stating there are no parameters needed and how to call it, making it more helpful than the baseline.
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 lists all services observed by Jaeger, using a specific verb and resource. It distinguishes itself from sibling tools by explaining when to use it and when not to, such as referencing jaeger_list_operations and jaeger_search_traces.
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?
Explicit usage guidelines are provided, including when to use (e.g., discovering service names, checking if a service is instrumented) and when not to use (e.g., when service name is known or need dependency graph). It also names alternatives like jaeger_search_traces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_predict_degradationARead-onlyIdempotent
Predict potential performance degradation events for a service.
Analyzes historical trace data patterns, critical path trends, and anomaly detection results to forecast likely performance issues 2-24 hours in advance.
Args: service: Service name to analyze for potential degradation hours_back: Number of hours of historical data to analyze (default: 168 hours/1 week)
Returns: PredictionResult with degradation forecast, confidence level, and recommendations
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service name to analyze for potential degradation | |
| hours_back | No | Number of hours of historical data to analyze (1-720) |
Output Schema
| Name | Required | Description |
|---|---|---|
| service_name | Yes | Name of the service |
| recommendations | No | Recommended actions |
| confidence_level | Yes | Confidence level (0.0 to 1.0) |
| contributing_factors | No | Factors contributing to prediction |
| predicted_degradation_time | Yes | Predicted time of degradation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, providing a safe profile. The description adds value by detailing the analysis approach (historical trace data, critical path trends, anomaly detection) and the prediction horizon (2-24 hours), which goes beyond the annotations and clarifies behavioral traits.
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 concise with a clear structure: purpose sentence, analysis approach, parameter list, and return overview. Every sentence earns its place, and critical information is front-loaded.
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 the tool's simplicity (2 parameters, no nested objects) and the presence of an output schema, the description is complete. It explains the purpose, input parameters, and return value (degradation forecast, confidence, recommendations), fitting the context well.
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%, with both 'service' and 'hours_back' having descriptions and constraints. The description repeats these but adds no new semantics beyond the schema. Baseline 3 is appropriate as the schema does the heavy lifting.
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 predicts potential performance degradation events for a service, using historical trace data. The verb 'predict' and resource 'degradation' are specific, and the content distinguishes it from siblings like jaeger_detect_anomalies or jaeger_forecast_capacity by focusing on forecasting issues 2-24 hours in advance.
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 for predicting degradation but does not explicitly state when to use this tool versus alternatives like anomaly detection or capacity forecasting. No exclusions or when-not-to-use scenarios are mentioned, leaving the agent to infer context from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_regression_diffARead-onlyIdempotent
Compare two Jaeger time windows and classify per-operation regressions.
Fetches traces from the baseline and comparison windows, then classifies each operation as regressed, recovered, appeared, or removed. Results are sorted by severity score (0-100) descending for easy triage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum traces to fetch per window. | |
| service | Yes | Jaeger service name to analyse for regressions. | |
| baseline_end | Yes | Baseline window end time (Unix microseconds). | |
| baseline_start | Yes | Baseline window start time (Unix microseconds). | |
| comparison_end | No | Comparison window end time (Unix microseconds). Defaults to now. | |
| comparison_start | No | Comparison window start time (Unix microseconds). Defaults to now minus 15 minutes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| service | Yes | |
| operations | Yes | |
| baseline_end | Yes | |
| removed_count | Yes | |
| appeared_count | Yes | |
| baseline_start | Yes | |
| comparison_end | Yes | |
| recovered_count | Yes | |
| regressed_count | Yes | |
| comparison_start | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly, idempotent, and non-destructive. The description adds behavioral context by explaining that it fetches traces from both windows, classifies operations into four categories, and sorts results by severity score. This goes beyond the annotation hints and helps the agent understand the processing flow and output ordering.
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 concise, consisting of three sentences with no filler. The first sentence is a clear front-loaded summary; the following sentences add relevant detail about the classification categories and severity sorting. Every sentence contributes to understanding the tool's behavior.
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 description is complete for a read-only analysis tool with a rich schema and an output schema available. It explains the core process (fetch, classify, sort) and the classification labels, which covers the main behavior. Some could argue it doesn't mention default window behaviors, but those are already documented in the schema, and the output schema explains return values, so the description is sufficiently 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 covers 100% of parameters with descriptions, so the baseline is 3. The tool description adds minimal parameter-specific meaning beyond the schema; it implies the time parameters pertain to baseline and comparison windows but does not elaborate on syntax or interactions. The schema already provides sufficient semantic detail for each parameter.
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's function: comparing two Jaeger time windows and classifying per-operation regressions. It enumerates specific classification outcomes (regressed, recovered, appeared, removed) and mentions sorting by severity score, distinguishing it from siblings like jaeger_compare_windows which may only compare windows without classification.
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 implicitly conveys when to use the tool: when you need to compare two time windows to identify regressions and related operation changes. However, it does not explicitly mention alternative tools or provide exclusions (e.g., when to use jaeger_compare_windows instead). The context is clear but lacks explicit guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_search_tracesARead-onlyIdempotent
Search Jaeger traces with rich filters.
Wraps GET /api/traces. Returns a list of trace summaries — use
jaeger_get_trace to drill into a specific trace for span details.
The tags parameter accepts a JSON string so the LLM can construct
arbitrary tag filters. Durations (min_duration/max_duration) are
forwarded as-is to Jaeger (e.g. '100ms', '1.5s').
Examples:
- Use when: "Show me recent 500 errors in order-service"
→ service='order-service', tags='{"http.status_code":"500"}'.
- Use when: "Find slow traces (>1s) for checkout endpoint"
→ service='checkout', operation='POST /checkout',
min_duration='1s'.
- Use when: "Give me the last 5 traces in the last hour"
→ limit=5, set start to (now - 3600s) in microseconds.
- Don't use when: You already have a traceID and want full details
(call jaeger_get_trace directly — one fewer round trip).
- Don't use when: You want service dependency topology
(call jaeger_get_dependencies).
Returns:
dict with service / operation / returned / truncated /
traces (list of :class:TraceSummary).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time in microseconds since Unix epoch UTC (optional). If omitted and start is set, defaults to now. | |
| tags | No | JSON string of tag key-value pairs to filter by (optional). Example: '{"http.status_code":"500"}' to find 5xx errors, or '{"error":"true"}' for any error spans. | |
| limit | No | Maximum number of traces to return (1-1500, default 20). | |
| start | No | Start time in microseconds since Unix epoch UTC (optional). Example: 1713400000000000 for 2024-04-18 00:00:00 UTC. | |
| service | Yes | Service name to search traces for (required). Use jaeger_list_services to discover valid names. | |
| operation | No | Operation name filter (optional). Use jaeger_list_operations to discover valid names. Example: 'GET /api/orders' or 'grpc.health.v1.Health/Check'. | |
| max_duration | No | Maximum trace duration filter (optional). Format: '100ms', '500ms'. Use to find fast traces or exclude outliers. | |
| min_duration | No | Minimum trace duration filter (optional). Format: '100ms', '1.5s', '2m'. Use to find slow traces. |
Output Schema
| Name | Required | Description |
|---|---|---|
| traces | Yes | |
| service | Yes | |
| returned | Yes | |
| operation | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent behavior. The description adds that it wraps a GET API, returns trace summaries, details on parameter formats (JSON tags, duration strings), and mentions truncation. Does not conflict with annotations.
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?
Well-structured with intro, parameter details, examples, and usage notes. Slightly verbose but every sentence adds value; could be more concise.
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 the complexity (8 parameters, high schema coverage, good annotations, and output schema hinted), the description is comprehensive. It covers usage, parameter formats, examples, and limits, leaving minimal gaps.
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?
Since schema_description_coverage is 100%, the baseline is 3. The description adds value by explaining how tags and durations are interpreted, and provides concrete examples mapping user intents to parameter values.
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 it searches Jaeger traces with rich filters, uses a specific verb, and distinguishes from sibling tools like jaeger_get_trace and jaeger_get_dependencies.
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?
Explicitly provides when-to-use examples (e.g., recent errors, slow traces) and when-not-to-use conditions (if you already have a trace ID or need dependency topology), along with naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_span_statisticsARead-onlyIdempotent
Compute per-operation latency percentiles and error rates across recent traces.
Fetches up to limit traces for the given service (optionally filtered
by operation), then aggregates all spans by operation name. For each
operation reports: span count, p50/p95/p99 duration in microseconds,
error count, and error rate.
Duration values are in microseconds (integer). Error rate is
error_count / span_count (float, 0.0–1.0).
Examples:
- Use when: "What are the p95 latencies for each endpoint in order-service?"
→ service='order-service'; inspect each operation's p95_duration_us.
- Use when: "How often does the POST /checkout endpoint error?"
→ service='checkout-svc', operation='POST /checkout'; check
error_rate in the stats.
- Use when: "Compare latency distributions across operations"
→ look at p50 vs p99 spread to identify high-variance operations.
- Use when: "Get a larger sample for more accurate stats"
→ limit=100 for higher confidence percentiles.
- Don't use when: You want to compare two specific traces
(use jaeger_compare_traces instead).
- Don't use when: You want full span detail for a single trace
(use jaeger_get_trace instead).
Returns:
dict with service / operation / trace_count /
stats (list of per-operation stats with count, p50/p95/p99
duration_us, error_count, error_rate).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of traces to fetch and analyze (1-100, default 20). | |
| service | Yes | Service name to compute statistics for (required). Use jaeger_list_services to discover valid names. | |
| operation | No | Operation name filter (optional). When set, only traces matching this operation are fetched. Use jaeger_list_operations to discover valid names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stats | Yes | |
| service | Yes | |
| operation | Yes | |
| trace_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read. The description adds rich behavioral context: it aggregates spans by operation name, reports p50/p95/p99 in microseconds, error rate formula, and the return structure. No contradictions with annotations.
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 well-organized: a one-sentence summary, then calculation details, units, examples, exclusions, and return value. Every section earns its place—no wasted words, and the 'Returns' block clarifies expected output even though an output schema exists.
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 the tool's complexity (aggregation, multiple metrics, parameter combinations) and the presence of an output schema and annotations, the description is thorough. It covers use cases, parameter effects, output format, and explicitly lists sibling tools for alternatives, leaving little ambiguity for the agent.
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% with each parameter described, so the baseline is 3. The description adds value by explaining how 'limit' affects sample size/accuracy and that 'operation' filters traces before aggregation. It also gives parameter-specific examples (e.g., service='order-service'), but it doesn't fully replace the schema's role.
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 opens with a specific verb+resource+scope: 'Compute per-operation latency percentiles and error rates across recent traces.' It clearly distinguishes from siblings by stating 'Don't use when: You want to compare two specific traces (use jaeger_compare_traces instead)' and similarly for jaeger_get_trace.
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?
Explicit 'Use when' and 'Don't use when' sections provide concrete example queries with parameter settings and alternative tool names. This gives the agent clear decision rules for when to select this tool versus siblings like jaeger_compare_traces and jaeger_get_trace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jaeger_test_profileARead-onlyIdempotent
Aggregate per-operation latency hotspots across all traces matching the supplied tag query.
Operations are ranked by total wall time descending so the most expensive appear first.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tag key-value pairs scoping the test run — e.g. {'test.run_id': 'abc123'} or {'allure.id': 'TC-42'}. | |
| limit | No | Maximum traces to aggregate. | |
| service | No | Jaeger service name. If omitted, all services (up to 20) are searched concurrently. | |
| lookback_hours | No | Hours back from now to search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tag_query | Yes | |
| operations | Yes | |
| trace_count | Yes | |
| service_filter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description adds useful behavioral context by stating operations are ranked by descending total wall time. This goes beyond what annotations provide and does not contradict them.
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 with the main action in the first and ranking behavior in the second—no filler or redundancy. The description is front-loaded and efficient.
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 read-only aggregation tool with a full schema and an output schema, the description provides the core behavior and ranking detail. It is complete enough, though it could benefit from clarifying when to prefer this over sibling analysis tools, which is already penalized in other dimensions.
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 descriptions cover 100% of parameters with clear explanations (tags, limit, service, lookback_hours), so the description needn't add details. It only references 'tag query' which aligns with the tags parameter, adding no extra 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 tool aggregates per-operation latency hotspots across traces matching a tag query, using specific terminology ('per-operation', 'latency hotspots', 'ranked by total wall time') that distinguishes it from siblings like jaeger_search_traces or jaeger_span_statistics.
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 is provided on when to use this tool versus the 14 sibling tools. It does not mention alternatives or exclusions, leaving the agent to infer usage from the name and description.
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. Dates show when Glama detected each change.
4 tool updates
v0.6.2- Added
jaeger_find_test_traces - Added
jaeger_regression_diff - Changed
jaeger_span_statistics3 fields changed- added
Output schema / $defs / OperationStats / properties / mean_duration_usAdded value: +{ + "title": "Mean Duration Us", + "type": "integer" +} - added
Output schema / $defs / OperationStats / properties / total_duration_usAdded value: +{ + "title": "Total Duration Us", + "type": "integer" +} - changed
Output schema / $defs / OperationStats / requiredPrevious value: -[ - "operation", - "count", - "p50_duration_us", - "p95_duration_us", - "p99_duration_us", - "error_count", - "error_rate" -]New value: +[ + "operation", + "count", + "p50_duration_us", + "p95_duration_us", + "p99_duration_us", + "error_count", + "error_rate", + "total_duration_us", + "mean_duration_us" +]
- Added
jaeger_test_profile
9 tool updates
v0.1.2- Added
jaeger_compare_traces - Added
jaeger_compare_windows - Added
jaeger_critical_path - Added
jaeger_detect_anomalies - Added
jaeger_forecast_capacity - Changed
jaeger_get_trace1 field changed- added
Input schema / properties / trace_id / patternAdded value: +"^[0-9a-fA-F]+$"
- Changed
jaeger_list_operations1 field changed- added
Input schema / properties / service / patternAdded value: +"^[a-zA-Z0-9._:\\-]+$"
- Added
jaeger_predict_degradation - Added
jaeger_span_statistics
5 tool updates
v0.1.1- First observed
jaeger_get_dependencies - First observed
jaeger_get_trace - First observed
jaeger_list_operations - First observed
jaeger_list_services - First observed
jaeger_search_traces
TDQS
Several tools have overlapping purposes. jaeger_search_traces and jaeger_find_test_traces both search traces with tag filters, and jaeger_compare_windows, jaeger_detect_anomalies, and jaeger_regression_diff all compare two time windows to identify performance changes, making it easy for an agent to select the wrong one. The differences between these are subtle and not clearly delineated.
All tools share the jaeger_ prefix and use snake_case, but the naming pattern is inconsistent: some are verb_noun (list_services, search_traces) while others are noun_phrase (span_statistics, critical_path, test_profile). This mixed convention is readable but lacks the predictability of a uniform verb_noun scheme.
15 tools is at the upper boundary of a well-scoped set, but the advanced analytics tools (predict_degradation, forecast_capacity, detect_anomalies) expand the server's capability beyond basic tracing. The count is reasonable, though some tools could be merged without losing functionality.
The core Jaeger read operations are fully covered: service discovery, operation listing, trace search, trace detail, and dependency graph. Advanced analytics like comparisons, anomaly detection, and predictions provide extra depth, leaving few obvious gaps for a tracing-focused server.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Query application logs, traces, and metrics from your AI coding assistant via Foam's MCP server.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
- SpanlyOAuthcom.spanly
MCP observability. Query live traffic, errors, duration, and alerts from your AI agent.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseBqualityDmaintenanceModel Context Protocol server for Langfuse observability. Query traces, analyze accuracy, detect failures, track costs, debug latency, manage prompts and datasets.582MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language Kubernetes cluster operations, SLO monitoring, and PromQL queries via Claude using the Model Context Protocol.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables to interact with Jaeger distributed tracing system through the MCP protocol. Supports querying traces, services, and operations via natural language.11318MIT
- AlicenseAqualityDmaintenanceMCP server that gives AI agents access to your application's OpenTelemetry traces for querying, analysis, and debugging.5162MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mshegolev/jaeger-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server