Jaeger MCP server: nine read-only tools, off by default
Jaeger's own connector, compiled into the query service. Every one of the nine tools reads, and none is served until a configuration block turns the endpoint on.
Last verified 1 September 2026 · from Jaeger's own source, its architecture decision record and its CHANGELOG
This page is one of 90 in a directory of monitoring and developer tools. Each page checks what an AI coding agent can get out of the tool through its MCP server, the connector that lets the agent query the tool directly.
Summary
The Jaeger MCP server is first-party code. It lives inside the jaeger-query service rather than in a package of its own, and release v2.20.0 on 20 July 2026 merged it into the jaegerquery extension. A connected agent gets 9 tools.
Every one of the nine reads. Nothing writes a span, edits a trace or changes a setting. Eight tools are wired to Jaeger's query service, which only queries, and the ninth reads markdown playbooks from disk.
The endpoint does not exist until you ask for it. The ai.mcp block is absent from a default configuration, and its presence is what registers the route at /api/ai/mcp/ on the query port.
What is the Jaeger MCP server?
Jaeger is a distributed tracing backend, and this server hands that store to an agent. It uses the Model Context Protocol, so Claude Code or Cursor can walk a trace without a browser.
The tools are shaped for drilling down rather than for mirroring the query API. Jaeger's own instructions tell the model to start broad with get_services or search_traces, then take a structural view with get_trace_topology, and only then ask for verbose span data.
One tool is not telemetry at all. read_skill serves markdown playbooks compiled into the binary, starting at SKILL.md. Two ship as standard, one for spotting N+1 query patterns and one for walking a failed trace to its root cause.
Jaeger sits in production observability. It reaches nothing in code review, CI and release, agent observability or AI cost management.
| Part of the work | What Jaeger has here | Can an agent reach it |
|---|---|---|
| Code, tests & review | None | No repository, test or review data. Jaeger stores spans emitted by running services |
| CI & release | None | No pipeline tools. A deployment shows up only as a change in the traces themselves |
| Production observability | Traces, spans, service names, dependency graph | Yes. Core strength. The nine tools cover discovery, structure, span detail and the critical path |
| Agent observability & evals | None | No model calls, evaluations or prompt versions. Jaeger stores request traces |
| AI cost management | None | No spend data of any kind |
For an agent, that means Jaeger answers where a request spent its time and which service called which. There are no metrics and no logs, because Jaeger stores neither, so a full investigation needs a second connector. The critical path is worked out by Jaeger itself, in Go, not by the client.
What can an AI agent do with Jaeger?
| Task | Tools | Works | Watch out for |
|---|---|---|---|
| Find out what is instrumented | get_services get_span_names | Yes | get_span_names also returns each span kind, such as SERVER or CLIENT |
| Find a slow or failed request | search_traces | Yes | Summaries only. The search depth defaults to 10 traces and stops at 100 |
| See a trace's shape, and where its time went | get_trace_topology get_critical_path | Yes | The topology is a flat, depth-first list with a path field and no attributes. The critical path ranks by self_time_us, computed in Jaeger |
| Read the errors in a trace | get_trace_errors | Yes | Compare total_error_count with the spans returned. Above 20, the list is cut |
| Inspect particular spans | get_span_details | Yes | Verbose per span. More than 20 span IDs in one call is refused, not trimmed |
| See what calls what | get_service_dependencies | Yes | Edges carry call counts over a window, the last 24 hours by default |
| Follow a documented procedure | read_skill | Yes | Playbooks compiled into the binary. Start at SKILL.md, which links the rest |
| Read the metrics or logs behind a slow span | Prometheus, Grafana, OpenSearch or Elastic | No, separate server | Jaeger stores spans, never samples or log lines |
Start with search_traces and get_trace_topology. Both are cheap in context, and Jaeger's own system prompt tells the model to use them before asking for verbose span data.
9 tools registered, all on by default once the `ai.mcp` block enables the endpoint
- Discovery3
get_servicesget_span_namessearch_traces- Trace structure3
get_trace_topologyget_critical_pathget_service_dependencies- Span detail2
get_span_detailsget_trace_errors- Playbooks1
read_skill
Read on 1 September 2026 from the tool registration in mcptools/server.go, which holds exactly nine mcp.AddTool calls. There is no remainder and no toolset to switch on. The grouping above follows the drill-down order the server's own instructions describe, because the code registers the nine as a flat list.
Jaeger MCP server limits: where answers come back incomplete
The three limits below are about the size of an answer rather than about damage. Every tool reads, so nothing here can change what Jaeger holds.
The agent says: “There are no slow traces in that window.” The search looked at ten.
search_traces sets its search depth to 10 when the caller leaves it unset, and the handler caps the value at the 100-result maximum. A window holding thousands of traces is answered from a sample.
The tool returns summaries only, with no spans and no attributes. An agent that stops at this step has seen very little of the trace.
Guard: Require the agent to state the search depth it used before it reports an absence.
The agent says: “The trace has twenty errors.” Twenty is the cap.
get_trace_errors shares the 20-span limit that bounds get_span_details. Its own description says "Results may be truncated to the server limit" and tells the caller to compare total_error_count with the number of spans returned.
That limit comes from DefaultConfig(), and jaeger-query passes it through unchanged, so no setting raises it.
Guard: Have the agent quote total_error_count beside any count of errors it reports.
The agent says: “This is an N+1 query problem.” That may be the playbook talking.
read_skill serves markdown compiled into the binary, and 2 playbooks ship as standard: one for detecting N+1 query patterns, one for error root-cause analysis. Those files are procedure and hold no data from your system.
An operator can add more through ai.mcp.skills_dir, which appear under custom/ in the same list, so a reader cannot tell built-in from local by the name alone.
Guard: Ask the agent to name the trace and the spans behind any diagnosis it drew from a playbook.
How to configure Jaeger MCP for agents
- 1
Add the
ai.mcpblock, or nothing is servedIt is absent from a default
jaeger-query, and an emptymcp: {}underai:is enough to register the route. - 2
Point clients at the query port, not 16687
The standalone
jaeger_mcpextension had its own listener and was retired in v2.20.0. - 3
Expect the limits to be fixed
jaeger-querybuilds the tool configuration fromDefaultConfig(), so 100 search results, 20 spans per detail call and a 512 KiB skill file are not tunable. - 4
Add your own playbooks with
ai.mcp.skills_dirThey are served under
custom/beside the built-in ones, and a missingSKILL.mdthere stops Jaeger from starting.
Paste this into your agent’s instructions
Every tool reads, so the risk is not damage. It is an agent reporting a truncated or shallow result as though it were the whole picture.
When you answer using Jaeger MCP tools, state: - The service, the trace ID and the time window the answer covers. - The search_depth you used. It defaults to 10 traces and stops at 100. - For get_trace_errors, whether total_error_count matches the number of spans returned. Above 20 the list is cut. - Whether a claim came from a trace or from a read_skill playbook. A playbook is procedure, not measurement. Never state that data does not exist. State that no traces matched the query above. Write your answer in ASD-STE100 Simplified Technical English. Use short sentences with one idea in each.
Do you need the MCP server at all?
Yes, on a Jaeger of v2.20.0 or later, if anyone on the team reads traces by hand. It installs nothing, it costs one configuration block, and the nine tools do the drilling down that the Jaeger interface makes you click through.
The HTTP query API is still the right route inside a script. A fixed query repeated on a schedule needs no model, and GET /api/traces is what the agent would be told to call anyway.
Grafana's connector fits better when the question crosses from traces into metrics and logs, because it reaches Tempo and other datasources through one connection.
What MCP adds is the critical path: get_critical_path runs an algorithm the HTTP API does not expose, ported into Go from the Jaeger interface specifically so this server could offer it.
Enable it on the Jaeger you already run. Keep the query API for calls that are scripted and repeated.
Jaeger MCP server setup
There is nothing to install. The server is compiled into jaeger-query, so a Jaeger of v2.20.0 or later already carries it.
Add the ai.mcp block to the jaeger_query extension and restart. The endpoint then answers at <base_path>/api/ai/mcp/ on the query port, which Jaeger's own configuration example writes as 16686.
Jaeger, to enable the endpoint
This is the server side, and it comes first. Without this block every client below gets a 404.
No credentials appear in this block. The endpoint inherits whatever the query port already enforces.
extensions:
jaeger_query:
ai:
mcp: {}Claude Code
The transport is streamable HTTP, so the URL goes in directly. No credentials belong here for a query port reached inside a cluster.
claude mcp add --transport http jaeger \ http://jaeger-query:16686/api/ai/mcp/
Cursor
In ~/.cursor/mcp.json. Add a header block only if your own query port sits behind authentication, since the server requires no credentials of its own.
{"mcpServers":{"jaeger":{
"url":"http://jaeger-query:16686/api/ai/mcp/"}}}Codex CLI
Codex reads TOML, so the JSON block above will not transfer. No credentials belong here either.
[mcp_servers.jaeger] url = "http://jaeger-query:16686/api/ai/mcp/"
Every other client
Each block below is the configuration for one client, with the file path and the key that client expects.
Your own skill playbooks
ai.mcp.skills_dir names a directory on the query server's disk. Its contents are served by read_skill under custom/, beside the built-in playbooks, and no credentials appear in the block.
A SKILL.md at the root of that directory is required. An agent reads it first and chooses what to open from the links it finds there.
extensions:
jaeger_query:
ai:
mcp:
skills_dir: /etc/jaeger/skillsAll-in-one
The all-in-one configuration is not externally editable, but the field can still be set on it from the command line. No credentials are involved.
--set extensions.jaeger_query.ai.mcp.skills_dir=/etc/jaeger/skills
Read-only access, permissions and security
Every tool reads
The nine cover discovery, trace structure, span detail, the critical path and skill files. None writes to Jaeger and none changes a setting.
Traces carry whatever your services put in them
get_span_detailsreturns attributes, events, links and status for a span, and all of it reaches the model.The endpoint inherits the query port's protection, and nothing else
Folding it into
jaeger-queryremoved a listener along with its own TLS and authentication settings.Multi-tenancy is enforced at the transport
Tenant extraction wraps the MCP handler, so a tenant header is required wherever Jaeger is configured for one.
read_skillreaches the disk whenskills_diris setIt is bounded to the directory you name and to 512 KiB per file.
Troubleshooting
- 404 on /api/ai/mcp/
- The
ai.mcpblock is missing. It is absent from a default configuration, and its presence is what registers the route. An emptymcp: {}underai:is enough. - Connection refused on port 16687
- That port belonged to the standalone
jaeger_mcpextension, retired in v2.20.0. The tools now serve on the query port under/api/ai/mcp/. - get_span_details returns an error instead of spans
- More than 20 span IDs in one call is refused with
span_ids exceeds maximum limit. The cap is fixed at 20, so split the call rather than looking for a setting. - A search finds nothing that should be there
search_tracesuses a search depth of 10 traces when the caller leaves it unset, and the handler caps it at 100. Raisesearch_depthbefore reading an empty result as an absence.- Jaeger refuses to start after setting skills_dir
- A
skills_dirthat cannot be opened, or whoseSKILL.mdcannot be read, is treated as broken configuration. Jaeger fails at startup rather than serving an incomplete skill set.
Jaeger MCP server: Reference
| Item | Value |
|---|---|
| Status | Shipped since v2.15.0 · merged into the jaegerquery extension in v2.20.0, 20 July 2026 |
| Adoption | 23,170 stars on jaegertracing/jaeger. That is the whole project, not the connector |
| License | Apache-2.0 |
| Distribution | Compiled into the jaeger binary and its container images |
| Endpoint | <base_path>/api/ai/mcp/ on the query port |
| Auth | None of its own. Whatever the query port already enforces |
| Tools | 9, all on once ai.mcp is present, all read-only |
| Response limits | Search depth 10 by default and 100 at most · 20 spans per detail call |
| Skills | Two built-in playbooks, plus your own via ai.mcp.skills_dir |
What engineers report
The finding here is that the connector is Jaeger's own, and has been since v2.15.0. The counts below describe the project repository, because the server has no repository of its own.
| What was checked | What it shows |
|---|---|
| Where it lives | jaegertracing/jaeger, inside the jaegerquery extension |
| First shipped | v2.15.0, 6 February 2026 |
Moved into jaegerquery | v2.20.0, 20 July 2026 |
| Tools registered | 9 |
| Tools that write | 0 |
| Stars on the project repository | 23,170 |
| License | Apache-2.0 |
| Third-party alternative | mshegolev/jaeger-mcp, 1 star, pushed 12 August 2026 |
The tool list was read on 1 September 2026 from mcptools/server.go in jaegertracing/jaeger, which holds nine mcp.AddTool calls. Release history comes from the project's own CHANGELOG. The community package mshegolev/jaeger-mcp still exists, at 1 star, and is not the subject of this page.
Should you connect an agent to Jaeger?
Yes. Best for a Jaeger you already operate, with the agent required to state the search depth behind any absence.
- Strongest fit
- Teams already running Jaeger v2.20.0 or later who want an agent to walk a trace without a browser.
- Main advantage
- It is the project's own code, already inside the binary you deploy, and every tool reads.
- Main weakness
- Traces only. There are no metrics and no logs, and the response limits are fixed rather than tunable.
- Operational risk
- Low. Nothing writes. The real risk is a truncated or shallow answer read as a complete one.
From Oodle
One platform for agent traces and infrastructure
Agent traces usually sit in a different product from the rest of your telemetry, so when a slow database makes an agent slow the symptom is in one tool and the cause is in another. Oodle keeps both in one query surface, from $10 per million spans.
See agent observabilityFrequently asked questions
Is there an official Jaeger MCP server?
Yes. It is built into the jaeger-query service in the jaegertracing/jaeger repository. Release v2.20.0 merged it into the jaegerquery extension on 20 July 2026.
How many tools does it have?
Nine, all on by default once the endpoint is enabled. Read on 1 September 2026 from the nine mcp.AddTool calls in the server's own registration file.
Can an agent change anything through it?
No. All nine tools read. Eight are wired to Jaeger's query service, which only queries, and the ninth reads markdown playbooks from disk.
Why does the endpoint return 404?
The ai.mcp configuration block is absent by default, and its presence is what registers the route. An empty mcp block under ai is enough to turn it on.
What happened to port 16687?
That was the standalone jaeger_mcp extension. Release v2.20.0 retired it, and the tools now serve under /api/ai/mcp/ on the query port.