web/src/features/mcp/README.md
Model Context Protocol (MCP) server for Langfuse, enabling AI assistants to interact with Langfuse prompts and read observation data programmatically.
Get API Keys
http://localhost:3000/project/{project-id}/settingspk-lf-... and sk-lf-...)Encode Credentials
echo -n "pk-lf-xxx:sk-lf-xxx" | base64
Output:
// Example. Real token will be much longer
cGstbGYteHh4OnNrLWxmLXh4eA==
Add to Claude Code
claude mcp add --transport http langfuse http://localhost:3000/api/public/mcp \
--header "Authorization: Basic {your-base64-token}"
Verify prompt tools
In Claude Code: List all prompts in the project
Verify observation tools
In Claude Code: List recent Langfuse observations
The MCP server provides prompt-management tools and read-only observation tools.
getPrompt - Fetch a specific prompt by name with optional label or version (fully resolved with dependencies)getPromptUnresolved - Fetch a specific prompt WITHOUT resolving dependencies (useful for prompt composition analysis)listPrompts - List all prompts in the project with filtering (name/label/tag/updatedAt range) and paginationcreateTextPrompt - Create a new text prompt versioncreateChatPrompt - Create a new chat prompt version (OpenAI-style messages)updatePromptLabels - Add/move labels across prompt versionsImplementation: See /web/src/features/mcp/features/prompts/tools/ for detailed schemas, parameters, and examples for each prompt tool.
Observation tools read from the events table v2 and are project-scoped to the authenticated API key.
listObservations - Find observations in the current project with filters, field projection, and cursor paginationgetObservation - Fetch one observation by observation IDgetObservationFieldSchema - List fields that can be requested from listObservations and getObservationgetObservationFilterSchema - List fields and operators that can be used in listObservations advanced filtersgetObservationFilterValues - Discover available values for supported filter fields, such as names, types, levels, environments, model names, tags, users, or sessionsImplementation: See /web/src/features/mcp/features/observations/tools/ for detailed schemas and handlers.
getPrompt vs getPromptUnresolvedLangfuse supports prompt composition where prompts can reference other prompts via dependency tags like @@@langfusePrompt:name=xxx|label=yyy@@@. The MCP server provides two tools for fetching prompts with different resolution behaviors:
getPrompt (Fully Resolved)Input: "You are helpful. @@@langfusePrompt:name=base-rules|label=production@@@"
Output: "You are helpful. Always be kind and respectful."
getPromptUnresolved (Raw)@@@langfusePrompt:...@@@ tags preservedInput: "You are helpful. @@@langfusePrompt:name=base-rules|label=production@@@"
Output: "You are helpful. @@@langfusePrompt:name=base-rules|label=production@@@"
Use Cases for getPromptUnresolved:
Observation tools let MCP clients inspect traces at the observation level: generations, spans, events, agent steps, tool calls, model usage, cost, latency, payloads, and metadata.
Typical workflow:
getObservationFieldSchemagetObservationFilterSchemalistObservations with time, trace, type, level, environment, or advanced filtersgetObservation with the returned observation IDField projection controls response size:
fields for compact defaultsfields: ["*"] for all available fields["id", "name", "type", "latency", "totalCost"] for focused responsesPayload and metadata fields can be large and may contain sensitive application data. MCP clients should request input, output, metadata, and modelParameters only when needed.
The Langfuse MCP server uses a stateless per-request architecture:
This design:
1. Client sends request with Authorization header
↓
2. API endpoint validates BasicAuth (PUBLIC_KEY:SECRET_KEY)
↓
3. Verify API key has project-level scope
↓
4. Build ServerContext from API key metadata
↓
5. Create fresh MCP server with context in closure
↓
6. Handle request (context auto-injected to handlers)
↓
7. Discard server instance
ServerContext:
{
projectId: "proj-123", // Auto-injected from API key
orgId: "org-456", // Auto-injected from API key
apiKeyId: "key-789", // For audit logging
accessLevel: "project", // Required for MCP
publicKey: "pk-lf-..." // For reference
}
Tools include hints for clients about their behavior:
readOnlyHint: true: Safe operations that don't modify data (getPrompt, getPromptUnresolved, listPrompts, all observation tools)destructiveHint: true: Operations that create/modify data (createTextPrompt, createChatPrompt, updatePromptLabels)Clients like Claude Code can use these annotations to:
All write operations (createTextPrompt, createChatPrompt, updatePromptLabels) automatically create audit log entries with before/after snapshots. Observation tools are read-only and do not create audit log entries.
All clients require BasicAuth authentication using your Langfuse API keys.
Encode your Langfuse API keys (Public Key:Secret Key) to base64:
echo -n "pk-lf-your-public-key:sk-lf-your-secret-key" | base64
This outputs your BasicAuth token (e.g., cGstbGYt...).
Langfuse Cloud:
https://cloud.langfuse.comhttps://us.langfuse.comhttps://hipaa.langfuse.comSelf-Hosted:
https://your-domain.comLocal Development:
http://localhost:3000Register the Langfuse MCP server:
# Langfuse Cloud (EU)
claude mcp add --transport http langfuse https://cloud.langfuse.com/api/public/mcp \
--header "Authorization: Basic {your-base64-token}"
# Langfuse Cloud (US)
claude mcp add --transport http langfuse https://us.langfuse.com/api/public/mcp \
--header "Authorization: Basic {your-base64-token}"
# Self-Hosted (HTTPS required)
claude mcp add --transport http langfuse https://your-domain.com/api/public/mcp \
--header "Authorization: Basic {your-base64-token}"
# Local Development
claude mcp add --transport http langfuse http://localhost:3000/api/public/mcp \
--header "Authorization: Basic {your-base64-token}"
Add to your Cursor MCP settings:
{
"mcp": {
"servers": {
"langfuse": {
"url": "https://cloud.langfuse.com/api/public/mcp",
"headers": {
"Authorization": "Basic {your-base64-token}"
}
}
}
}
}
Replace https://cloud.langfuse.com with your Langfuse URL (see Choose Your Langfuse URL).