NewAgent Observability is live.
Back to directory
Jaeger logo

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.

Connector
Official, self-hosted
Coverage
Trace search, span detail, errors, topology, critical path, dependencies
Tools
9, all on once the endpoint is enabled
Biggest risk for an agent
A default search reads 10 traces, not all of them

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 workWhat Jaeger has hereCan an agent reach it
Code, tests & reviewNoneNo repository, test or review data. Jaeger stores spans emitted by running services
CI & releaseNoneNo pipeline tools. A deployment shows up only as a change in the traces themselves
Production observabilityTraces, spans, service names, dependency graphYes. Core strength. The nine tools cover discovery, structure, span detail and the critical path
Agent observability & evalsNoneNo model calls, evaluations or prompt versions. Jaeger stores request traces
AI cost managementNoneNo 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?

TaskToolsWorksWatch out for
Find out what is instrumentedget_services get_span_namesYesget_span_names also returns each span kind, such as SERVER or CLIENT
Find a slow or failed requestsearch_tracesYesSummaries only. The search depth defaults to 10 traces and stops at 100
See a trace's shape, and where its time wentget_trace_topology get_critical_pathYesThe 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 traceget_trace_errorsYesCompare total_error_count with the spans returned. Above 20, the list is cut
Inspect particular spansget_span_detailsYesVerbose per span. More than 20 span IDs in one call is refused, not trimmed
See what calls whatget_service_dependenciesYesEdges carry call counts over a window, the last 24 hours by default
Follow a documented procedureread_skillYesPlaybooks compiled into the binary. Start at SKILL.md, which links the rest
Read the metrics or logs behind a slow spanPrometheus, Grafana, OpenSearch or ElasticNo, separate serverJaeger 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. 1

    Add the ai.mcp block, or nothing is served

    It is absent from a default jaeger-query, and an empty mcp: {} under ai: is enough to register the route.

  2. 2

    Point clients at the query port, not 16687

    The standalone jaeger_mcp extension had its own listener and was retired in v2.20.0.

  3. 3

    Expect the limits to be fixed

    jaeger-query builds the tool configuration from DefaultConfig(), so 100 search results, 20 spans per detail call and a 512 KiB skill file are not tunable.

  4. 4

    Add your own playbooks with ai.mcp.skills_dir

    They are served under custom/ beside the built-in ones, and a missing SKILL.md there 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.

Terminal
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.

Terminal
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.

Terminal
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.

Terminal
{"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.

Terminal
[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.

Terminal
extensions:
  jaeger_query:
    ai:
      mcp:
        skills_dir: /etc/jaeger/skills
All-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.

Terminal
--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_details returns 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-query removed 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_skill reaches the disk when skills_dir is set

    It is bounded to the directory you name and to 512 KiB per file.

Troubleshooting

404 on /api/ai/mcp/
The ai.mcp block is missing. It is absent from a default configuration, and its presence is what registers the route. An empty mcp: {} under ai: is enough.
Connection refused on port 16687
That port belonged to the standalone jaeger_mcp extension, 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_traces uses a search depth of 10 traces when the caller leaves it unset, and the handler caps it at 100. Raise search_depth before reading an empty result as an absence.
Jaeger refuses to start after setting skills_dir
A skills_dir that cannot be opened, or whose SKILL.md cannot be read, is treated as broken configuration. Jaeger fails at startup rather than serving an incomplete skill set.

Jaeger MCP server: Reference

ItemValue
StatusShipped since v2.15.0 · merged into the jaegerquery extension in v2.20.0, 20 July 2026
Adoption23,170 stars on jaegertracing/jaeger. That is the whole project, not the connector
LicenseApache-2.0
DistributionCompiled into the jaeger binary and its container images
Endpoint<base_path>/api/ai/mcp/ on the query port
AuthNone of its own. Whatever the query port already enforces
Tools9, all on once ai.mcp is present, all read-only
Response limitsSearch depth 10 by default and 100 at most · 20 spans per detail call
SkillsTwo 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 checkedWhat it shows
Where it livesjaegertracing/jaeger, inside the jaegerquery extension
First shippedv2.15.0, 6 February 2026
Moved into jaegerqueryv2.20.0, 20 July 2026
Tools registered9
Tools that write0
Stars on the project repository23,170
LicenseApache-2.0
Third-party alternativemshegolev/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 observability

Frequently 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.

Changelog

  • 20 July 2026. v2.20.0 merged the jaegermcp extension into jaegerquery and retired the standalone port.
  • 13 May 2026. v2.18.0 removed a non-standard health tool and normalised span_kind input.
  • 30 March 2026. v2.17.0 enforced response limits and added system-prompt instructions for LLM clients.
  • 6 February 2026. v2.15.0 shipped the MCP server, adding get_span_names and implementing get_critical_path.

Sources

Every number on this page traces to one of these

  1. Tool registration from jaegertracing/jaeger · cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/server.go, read 1 September 2026
  2. Design decisions from the project's own docs/adr/002-mcp-server.md and docs/rfc/0012-mcp-server-extension.md
  3. Release dates and every MCP change from the project CHANGELOG and the v2.20.0 release on GitHub
  4. Defaults, limits and the ai.mcp block from mcptools/config.go and the query extension's own options
  5. Repository facts from the GitHub API · jaegertracing/jaeger, retrieved 1 September 2026

Jaeger’s own MCP documentation

Also tracing:

For metrics and logs beside traces: