PluginBench
MCP Server
Active
MIT

Langfuse MCP MCP Server

io.github.avivsinai/langfuse-mcp

Debug Langfuse traces, sessions, and exceptions via natural language in Claude Code, Codex, or Cursor.

What is the Langfuse MCP MCP server?

The Langfuse MCP server provides local access to Langfuse telemetry data through 48 tools for querying traces, sessions, exceptions, prompts, datasets, and metrics. It enables AI agents to debug LLM applications by analyzing observability data via natural language queries, with first-class support for exception triage, route-decision analysis, and dataset management.

Langfuse MCP is a local debug server that connects Claude Code, Codex, Cursor, and other MCP clients to your Langfuse instance. It exposes tools for finding exceptions, analyzing traces and sessions, managing prompts and datasets, and querying metrics—all queryable in plain English. Use it to quickly triage errors, investigate latency, and manage LLM observability without leaving your editor.

How to install Langfuse MCP

Copy-paste configuration for popular MCP clients.

transport: stdio
Config generated by PluginBench — verify against the source before use.
Environment / auth
  • LANGFUSE_PUBLIC_KEY
    required
    secret

    Langfuse public API key

  • LANGFUSE_SECRET_KEY
    required
    secret

    Langfuse secret API key

  • LANGFUSE_HOST

    Langfuse API base URL (Cloud or self-hosted)

  • LANGFUSE_MCP_READ_ONLY

    Set true to disable write tools

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "langfuse-mcp": {
      "command": "uvx",
      "args": [
        "langfuse-mcp"
      ],
      "env": {
        "LANGFUSE_PUBLIC_KEY": "<YOUR_LANGFUSE_PUBLIC_KEY>",
        "LANGFUSE_SECRET_KEY": "<YOUR_LANGFUSE_SECRET_KEY>",
        "LANGFUSE_HOST": "<YOUR_LANGFUSE_HOST>",
        "LANGFUSE_MCP_READ_ONLY": "<YOUR_LANGFUSE_MCP_READ_ONLY>"
      }
    }
  }
}

Tools & capabilities

Tools this server exposes to the agent.

  • fetch_traces — Retrieve traces from Langfuse with optional filtering and pagination.
  • fetch_trace — Fetch a single trace with optional observation details.
  • fetch_observations — Query observations across traces.
  • fetch_observation — Retrieve a single observation.
  • find_route_decisions — Find router decisions in traces.
  • get_route_decision — Get details of a specific route decision.
  • summarize_route_decisions — Summarize route decision patterns.
  • find_low_confidence_route_decisions — Identify low-confidence routing decisions.
  • fetch_sessions — Retrieve user sessions.
  • get_session_details — Get detailed information about a session.
  • get_user_sessions — Fetch all sessions for a specific user.
  • find_exceptions — Find error-level observations grouped by file or other criteria.
  • find_exceptions_in_file — Get exceptions within a specific file.
  • get_exception_details — Retrieve full exception metadata and stacktrace.
  • get_error_count — Count error-level observations.
  • list_prompts — List all prompts in Langfuse.
  • get_prompt — Retrieve a specific prompt version.
  • get_prompt_unresolved — Get the latest unresolved prompt.
  • create_text_prompt — Create a new text prompt (write operation).
  • create_chat_prompt — Create a new chat prompt (write operation).

Use cases

  • Find and triage exceptions in your LLM application traces within the last day, grouped by file or error type.
  • Analyze latency and cost metrics across traces to identify slow or expensive inference calls.
  • Debug user sessions by fetching session details and associated traces to understand user-facing issues.
  • Manage and version prompts directly from your editor, creating and updating text and chat prompts.
  • Create and manage datasets for evaluation, including dataset items and experiment runs to track model performance.

Langfuse MCP MCP server FAQ

What is the Langfuse MCP server?

It's a local MCP server that connects your editor (Claude Code, Codex, Cursor) to Langfuse, exposing 48 tools for querying traces, exceptions, sessions, prompts, datasets, and metrics via natural language.

Is it free?

Yes, it's open-source (MIT license) and free to use. You need a Langfuse account (Cloud or self-hosted) and API keys to connect.

How do I install it in Cursor?

Create `.cursor/mcp.json` in your project with the server command `uvx langfuse-mcp` and set environment variables for `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, and `LANGFUSE_HOST`.

How do I install it in Claude Code?

Run `claude mcp add` with the `uvx langfuse-mcp` command and pass your Langfuse API keys as environment variables (`LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_HOST`).

What authentication is required?

You need Langfuse API credentials: a public key (pk-...) and secret key (sk-...) from your Langfuse Cloud or self-hosted instance, plus the instance URL.

Can I use read-only mode?

Yes, pass `--read-only` or set `LANGFUSE_MCP_READ_ONLY=true` to disable all write operations (prompt creation, dataset updates, etc.).

README (reference)

Source of truth, from the repository.

Langfuse MCP Server

<!-- mcp-name: io.github.avivsinai/langfuse-mcp -->

PyPI GitHub stars PyPI downloads Downloads Python 3.10–3.14 License: MIT

Usage: 12,518 PyPI downloads last month (pypistats, 2026-08-19). v0.10.1.

Local MCP server and skill for Langfuse. Debug traces, sessions, and exceptions from Claude Code, Codex, Cursor, or any MCP client.

Why this instead of native Langfuse MCP?

Use this for local debug: first-class traces, sessions, and exceptions; route-decision tools; compact / file-dump output; plus the included langfuse skill.

Use official Langfuse MCP for hosted, zero-install access to the broader API (score writes, comments, models, media).

As of June 2026:

langfuse-mcpNative Langfuse MCP
Primary fitLocal debug: traces, sessions, exceptionsHosted, zero-install API surface
DeploymentLocal stdio or HTTP, via the Langfuse Python SDKNative streamable HTTP at /api/public/mcp
Trace / session / exception toolsFirst-classObservation/API-oriented access
Route-decision toolsYesNo
Token & output controlCompact summaries, truncation, file-dump mode, tool-group gatingHosted tool response + client
Metrics & dataset runsYesYes
Prompt, dataset, queue & score readsYesYes
Score writes, comments, models, mediaNoYes

langfuse-mcp for local debug. Native MCP for hosted breadth.

See a failing trace in 2 minutes

Install is uvx langfuse-mcp plus Langfuse API keys — Quick Start for Claude Code, Codex, Cursor, or Docker.

After the client restarts, ask:

find exceptions in the last day

That maps to existing tools:

find_exceptions(age=1440, group_by="file")
find_exceptions_in_file(filepath="<file from the grouping>", age=1440)
get_exception_details(trace_id="<trace_id from the file results>")

find_exceptions returns {group, count, observation_id, trace_id} (top 50 groups) — each group carries a representative observation/trace ID, and find_exceptions_in_file also yields full error records. Then optionally:

fetch_trace(trace_id="<trace_id>", include_observations=true)

The exception tools detect errors by observation level == "ERROR" (strict; a non-empty status_message alone does not count). Counts describe error-level observations, not individual exception events — get_error_count returns exception_count: null for that reason. Exception details come from recorded metadata (exception.type / exception.message / exception.stacktrace, top-level or under metadata.attributes); absent values are null. Results are not a point-in-time snapshot.

Project Links

Quick Start

Requires uv (for uvx) and Python 3.10 or newer. CI verifies Python 3.10 through 3.14.

Get credentials from Langfuse Cloud → Settings → API Keys. If self-hosted, use your instance URL for LANGFUSE_HOST.

# Claude Code (project-scoped, shared via .mcp.json)
claude mcp add \
  -e LANGFUSE_PUBLIC_KEY=pk-... \
  -e LANGFUSE_SECRET_KEY=sk-... \
  -e LANGFUSE_HOST=https://cloud.langfuse.com \
  --scope project \
  langfuse -- uvx langfuse-mcp

# Codex CLI (user-scoped, stored in ~/.codex/config.toml)
codex mcp add langfuse \
  --env LANGFUSE_PUBLIC_KEY=pk-... \
  --env LANGFUSE_SECRET_KEY=sk-... \
  --env LANGFUSE_HOST=https://cloud.langfuse.com \
  -- uvx langfuse-mcp

To pin a CI-verified interpreter explicitly, add --python 3.14 before langfuse-mcp.

Restart your CLI, then verify with /mcp (Claude Code) or codex mcp list (Codex).

Agent Skill

This repo ships a first-party langfuse skill for Claude Code and Codex. The skill gives agents concrete playbooks for trace debugging, exception triage, latency analysis, prompt management, and dataset work.

Install it when you want the agent to know when to reach for Langfuse and which MCP tools to call first.

Via skills (recommended):

npx skills add avivsinai/langfuse-mcp -g -y

Via skild:

npx skild install @avivsinai/langfuse -t claude -y

Manual install:

cp -r skills/langfuse ~/.claude/skills/   # Claude Code
cp -r skills/langfuse ~/.codex/skills/    # Codex CLI

After installing the skill, try:

help me debug langfuse traces
find exceptions in the last day
why was this user's session slow?

The MCP server provides the tools; the skill provides the agent-facing workflow. See skills/langfuse/SKILL.md, skills/langfuse/references/setup.md, and skills/langfuse/references/tool-reference.md.

Tools (48 total)

CategoryTools
Tracesfetch_traces, fetch_trace
Observationsfetch_observations, fetch_observation
Routingfind_route_decisions, get_route_decision, summarize_route_decisions, find_low_confidence_route_decisions
Sessionsfetch_sessions, get_session_details, get_user_sessions
Exceptionsfind_exceptions, find_exceptions_in_file, get_exception_details, get_error_count
Promptslist_prompts, get_prompt, get_prompt_unresolved, create_text_prompt, create_chat_prompt, update_prompt_labels
Datasetslist_datasets, get_dataset, list_dataset_items, get_dataset_item, create_dataset, create_dataset_item, delete_dataset_item, list_dataset_runs, get_dataset_run, list_dataset_run_items, create_dataset_run_item, delete_dataset_run
Annotation Queueslist_annotation_queues, create_annotation_queue, get_annotation_queue, list_annotation_queue_items, get_annotation_queue_item, create_annotation_queue_item, update_annotation_queue_item, delete_annotation_queue_item, create_annotation_queue_assignment, delete_annotation_queue_assignment
Scoreslist_scores_v2, get_score_v2
Metricsquery_metrics, get_metrics_schema
Schemaget_data_schema

On Observations API v2, traces are built from root observations. fetch_traces omits traces without a root observation, and fetch_trace cannot find traces with no observations.

Dataset-run reads use the experiments API when the installed Langfuse SDK exposes it (Python SDK 4.13.1+). The older routes remain a fallback for self-hosted servers that do not serve experiments. delete_dataset_run uses the legacy delete route while it works; after that route is removed, it deletes the run's traces only when you pass delete_traces=True. Trace deletion also removes observations and related scores. create_dataset_run_item still uses the legacy link API; when that API is gone, create experiment data through the SDK experiment runner or OTel ingestion.

Dataset Item Updates (Upsert)

Langfuse uses upsert for dataset items. To edit an existing item, call create_dataset_item with item_id. If the ID exists, it updates; otherwise it creates a new item.

create_dataset_item(dataset_name="qa-test-cases", item_id="item_123", input={"question": "What is 2+2?"}, expected_output={"answer": "4"})

Metrics Queries

query_metrics aggregates telemetry server-side (cost, latency, tokens, counts, score values) so agents can answer "what did inference cost?" or "what's p95 latency by model?" without pulling raw traces. Call get_metrics_schema for the full view/dimension/measure catalog.

query_metrics(
    view="observations",
    metrics=[{"measure": "totalCost", "aggregation": "sum"}, {"measure": "latency", "aggregation": "p95"}],
    dimensions=["providedModelName"],
    age=1440,  # last 24h; or pass from_timestamp / to_timestamp
)

High-cardinality fields (id, traceId, userId, sessionId) must be used in filters, not dimensions. The v2 metrics endpoint is Langfuse Cloud-only; self-hosted instances may return 404.

Selective Tool Loading

Load only the tool groups you need to reduce token overhead:

langfuse-mcp --tools traces,prompts

Available groups: traces, observations, routing, sessions, exceptions, prompts, datasets, annotation_queues, scores, metrics, schema

The routing group is router-neutral. It reads Langfuse span observations with metadata.schema_version: "mcp.route_decision.v1" and filters on route-decision fields stored in observation metadata, such as decision_id, router_name, provider, and capability_id.

Read-Only Mode

Disable all write operations for safer read-only access:

langfuse-mcp --read-only
# Or via environment variable
LANGFUSE_MCP_READ_ONLY=true langfuse-mcp

This disables: create_text_prompt, create_chat_prompt, update_prompt_labels, create_dataset, create_dataset_item, delete_dataset_item, create_dataset_run_item, delete_dataset_run, create_annotation_queue, create_annotation_queue_item, update_annotation_queue_item, delete_annotation_queue_item, create_annotation_queue_assignment, delete_annotation_queue_assignment

Default Output Mode

Set the MCP-exposed default output_mode so clients that omit the parameter automatically use your preferred mode:

langfuse-mcp --default-output-mode full_json_file
# Or via environment variable
LANGFUSE_MCP_DEFAULT_OUTPUT_MODE=full_json_file langfuse-mcp

Supported values: compact, full_json_string, full_json_file

This updates the default shown in MCP tool schemas. Clients can still override it per call by passing output_mode explicitly.

Other Clients

Cursor

Create .cursor/mcp.json in your project (or ~/.cursor/mcp.json for global):

{
  "mcpServers": {
    "langfuse": {
      "command": "uvx",
      "args": ["langfuse-mcp"],
      "env": {
        "LANGFUSE_PUBLIC_KEY": "pk-...",
        "LANGFUSE_SECRET_KEY": "sk-...",
        "LANGFUSE_HOST": "https://cloud.langfuse.com",
        "LANGFUSE_MCP_DEFAULT_OUTPUT_MODE": "full_json_file"
      }
    }
  }
}

Docker (single project)

docker run --rm -i \
  -e LANGFUSE_PUBLIC_KEY=pk-... \
  -e LANGFUSE_SECRET_KEY=sk-... \
  -e LANGFUSE_HOST=https://cloud.langfuse.com \
  ghcr.io/avivsinai/langfuse-mcp:latest

HTTP transport — shared server for multiple projects

Run one persistent server instance and route each MCP client to its own Langfuse project by passing credentials in the Authorization header.

# Start a shared server (binds to localhost by default)
docker run -d -p 127.0.0.1:8000:8000 \
  -e LANGFUSE_HOST=https://cloud.langfuse.com \
  ghcr.io/avivsinai/langfuse-mcp:latest \
  --transport streamable-http --bind-host 0.0.0.0

Security note: --bind-host 0.0.0.0 exposes the port on all interfaces. In production, place the server behind a TLS-terminating reverse proxy (nginx, Caddy, Cloudflare Tunnel) that enforces HTTPS. The Authorization header containing your keys is transmitted in plaintext over plain HTTP. If startup credentials are set, the proxy must enforce authentication; otherwise unauthenticated callers without an Authorization header can use the default project. For shared public HTTP deployments, omit default LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY credentials unless the fronting proxy authenticates every request.

Register each project separately in your MCP client, passing its credentials as a Basic auth header (base64(public_key:secret_key)):

# Generate the header value for each project:
echo -n "pk-lf-YOURKEY:sk-lf-YOURSECRET" | base64
# cGstbGYtWU9VUktFWTpzay1sZi1ZT1VSU0VDUkVU

# Register in Claude Code (one entry per project):
claude mcp add langfuse-audit \
  --transport http http://localhost:8000/mcp \
  -H "Authorization: Basic cGstbGYtWU9VUktFWTpzay1sZi1ZT1VSU0VDUkVU"

claude mcp add langfuse-staging \
  --transport http http://localhost:8000/mcp \
  -H "Authorization: Basic <base64 for staging project>"

Auth semantics: Basic here carries Langfuse API keys, not user passwords. An absent header falls back to startup env credentials (LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY). Any malformed header is rejected outright — there is no silent fallback to a different project.

Optional environment variables

VariableDefaultDescription
LANGFUSE_MAX_AGE_DAYS7Caps the lookback window for time-based tools (fetch_traces, fetch_observations, etc.). Set to match your Langfuse instance's data retention — e.g. 30 if your retention is 30 days.
LANGFUSE_MCP_TRACE_TIMEOUT_SECONDS120Per-request read timeout (seconds) for single-trace fetches (fetch_trace). Raise it if large traces with include_observations=True time out. Must be a positive integer.

Development

uv venv --python 3.14 .venv && source .venv/bin/activate
uv pip install -e ".[dev]"
pytest

License

MIT

Related MCP servers

AVAvo logo

Avo

Active

Define, ship & query your analytics tracking from one source of truth, trusted by humans and agents.

1
MIT
View repository →
AVavots logo

avots

Active

Image, video, audio, face-swap, talking avatars and chat across 300+ AI models, one balance.

0
MIT
View repository →

Evidence-backed MCP resolver for obsolete industrial parts and Siemens migration constraints.

Paid x402 MCP for evidence-backed industrial migration resolution. 1 USDC per call on Base.

PUPushEngage logo

Send push notifications, build audiences, and manage campaigns in PushEngage from any AI assistant.

8
TypeScript
MIT
View repository →

Token-auth Notion MCP server for Claude, Cursor & agents—read/write pages, databases, blocks, comments, files headless.

166
TypeScript
MIT
View repository →