langfuse-mcp-extended 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/server.ts","../src/client.ts","../src/tools/traces/listTraces.ts","../src/utils/errors.ts","../src/tools/registry.ts","../src/utils/pagination.ts","../src/tools/traces/getTrace.ts","../src/tools/traces/deleteTrace.ts","../src/tools/observations/listObservations.ts","../src/tools/observations/getObservation.ts","../src/tools/scores/createScore.ts","../src/tools/scores/listScores.ts","../src/tools/scores/getScore.ts","../src/tools/scores/deleteScore.ts","../src/tools/score-configs/createScoreConfig.ts","../src/tools/score-configs/listScoreConfigs.ts","../src/tools/score-configs/getScoreConfig.ts","../src/tools/datasets/createDataset.ts","../src/tools/datasets/listDatasets.ts","../src/tools/datasets/getDataset.ts","../src/tools/datasets/createDatasetItem.ts","../src/tools/datasets/listDatasetItems.ts","../src/tools/datasets/getDatasetItem.ts","../src/tools/datasets/deleteDatasetItem.ts","../src/tools/datasets/createDatasetRunItem.ts","../src/tools/datasets/listDatasetRuns.ts","../src/tools/datasets/getDatasetRun.ts","../src/tools/sessions/listSessions.ts","../src/tools/sessions/getSession.ts","../src/tools/index.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst ConfigSchema = z.object({\n langfuse: z.object({\n publicKey: z.string().min(1, \"LANGFUSE_PUBLIC_KEY is required\"),\n secretKey: z.string().min(1, \"LANGFUSE_SECRET_KEY is required\"),\n baseUrl: z.string().url().default(\"https://cloud.langfuse.com\"),\n }),\n server: z.object({\n enablePrompts: z.boolean().default(false),\n logLevel: z.enum([\"debug\", \"info\", \"warn\", \"error\"]).default(\"info\"),\n }),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport function loadConfig(): Config {\n const result = ConfigSchema.safeParse({\n langfuse: {\n publicKey: process.env.LANGFUSE_PUBLIC_KEY,\n secretKey: process.env.LANGFUSE_SECRET_KEY,\n baseUrl: process.env.LANGFUSE_BASE_URL || \"https://cloud.langfuse.com\",\n },\n server: {\n enablePrompts: process.env.MCP_ENABLE_PROMPTS === \"true\",\n logLevel: process.env.LOG_LEVEL || \"info\",\n },\n });\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`);\n throw new Error(`Configuration error:\\n${errors.join(\"\\n\")}`);\n }\n\n return result.data;\n}\n\nexport function createLogger(config: Config) {\n const levels = { debug: 0, info: 1, warn: 2, error: 3 };\n const currentLevel = levels[config.server.logLevel];\n\n return {\n debug: (msg: string, ...args: unknown[]) => {\n if (currentLevel <= 0) console.error(`[DEBUG] ${msg}`, ...args);\n },\n info: (msg: string, ...args: unknown[]) => {\n if (currentLevel <= 1) console.error(`[INFO] ${msg}`, ...args);\n },\n warn: (msg: string, ...args: unknown[]) => {\n if (currentLevel <= 2) console.error(`[WARN] ${msg}`, ...args);\n },\n error: (msg: string, ...args: unknown[]) => {\n if (currentLevel <= 3) console.error(`[ERROR] ${msg}`, ...args);\n },\n };\n}\n\nexport type Logger = ReturnType<typeof createLogger>;\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport type { Config, Logger } from \"./config.js\";\nimport { LangfuseClient } from \"./client.js\";\nimport { ToolRegistry, getAllTools } from \"./tools/index.js\";\n\nconst SERVER_NAME = \"langfuse-mcp-server\";\nconst SERVER_VERSION = \"0.1.0\";\n\n/**\n * Create and configure the MCP server\n */\nexport function createServer(config: Config, logger: Logger) {\n // Initialize Langfuse client\n const langfuseClient = new LangfuseClient(config, logger);\n\n // Initialize tool registry\n const toolRegistry = new ToolRegistry(langfuseClient, config, logger);\n\n // Register all tools\n toolRegistry.registerAll(getAllTools());\n\n // Create MCP server\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle list tools request\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n logger.debug(\"Received list tools request\");\n return {\n tools: toolRegistry.getTools(),\n };\n });\n\n // Handle call tool request\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n logger.info(`Tool called: ${name}`);\n\n const result = await toolRegistry.execute(name, args ?? {});\n return result;\n });\n\n // Handle server errors\n server.onerror = (error) => {\n logger.error(\"Server error:\", error);\n };\n\n return {\n server,\n langfuseClient,\n toolRegistry,\n };\n}\n\n/**\n * Run the MCP server with stdio transport\n */\nexport async function runServer(config: Config, logger: Logger): Promise<void> {\n logger.info(`Starting ${SERVER_NAME} v${SERVER_VERSION}`);\n logger.info(`Langfuse URL: ${config.langfuse.baseUrl}`);\n\n const { server, langfuseClient } = createServer(config, logger);\n\n // Create stdio transport\n const transport = new StdioServerTransport();\n\n // Handle shutdown\n const shutdown = async () => {\n logger.info(\"Shutting down server...\");\n await langfuseClient.shutdown();\n await server.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Connect and run\n await server.connect(transport);\n logger.info(\"Server connected and ready\");\n}\n","import Langfuse from \"langfuse\";\nimport type { Config, Logger } from \"./config.js\";\n\n/**\n * Wrapper around the Langfuse SDK that provides access to the API.\n * Uses Basic Auth with publicKey:secretKey for authentication.\n */\nexport class LangfuseClient {\n private langfuse: Langfuse;\n private logger: Logger;\n private baseUrl: string;\n private authHeader: string;\n\n constructor(config: Config, logger: Logger) {\n this.logger = logger;\n this.baseUrl = config.langfuse.baseUrl;\n\n // Create Basic Auth header\n const credentials = `${config.langfuse.publicKey}:${config.langfuse.secretKey}`;\n this.authHeader = `Basic ${Buffer.from(credentials).toString(\"base64\")}`;\n\n // Initialize Langfuse SDK\n this.langfuse = new Langfuse({\n publicKey: config.langfuse.publicKey,\n secretKey: config.langfuse.secretKey,\n baseUrl: config.langfuse.baseUrl,\n });\n\n this.logger.debug(`LangfuseClient initialized with baseUrl: ${this.baseUrl}`);\n }\n\n /**\n * Access the Langfuse SDK instance\n */\n get sdk(): Langfuse {\n return this.langfuse;\n }\n\n /**\n * Make a direct API request to Langfuse\n */\n async apiRequest<T>(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n this.logger.debug(`API Request: ${method} ${path}`);\n\n const response = await fetch(url, {\n method,\n headers: {\n Authorization: this.authHeader,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n this.logger.error(`API Error: ${response.status} - ${errorText}`);\n throw new LangfuseApiError(response.status, errorText, path);\n }\n\n // Handle empty responses (e.g., DELETE)\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n\n return JSON.parse(text) as T;\n }\n\n /**\n * Shutdown the client and flush any pending data\n */\n async shutdown(): Promise<void> {\n await this.langfuse.shutdownAsync();\n this.logger.debug(\"LangfuseClient shutdown complete\");\n }\n}\n\n/**\n * Custom error for Langfuse API errors\n */\nexport class LangfuseApiError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly body: string,\n public readonly path: string\n ) {\n super(`Langfuse API Error (${statusCode}) at ${path}: ${body}`);\n this.name = \"LangfuseApiError\";\n }\n\n get isNotFound(): boolean {\n return this.statusCode === 404;\n }\n\n get isUnauthorized(): boolean {\n return this.statusCode === 401;\n }\n\n get isRateLimited(): boolean {\n return this.statusCode === 429;\n }\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n name: z.string().optional().describe(\"Filter by trace name\"),\n userId: z.string().optional().describe(\"Filter by user ID\"),\n sessionId: z.string().optional().describe(\"Filter by session ID\"),\n tags: z.array(z.string()).optional().describe(\"Filter by tags (AND logic)\"),\n fromTimestamp: z.string().optional().describe(\"Start of time range (ISO 8601)\"),\n toTimestamp: z.string().optional().describe(\"End of time range (ISO 8601)\"),\n environment: z.string().optional().describe(\"Filter by environment\"),\n orderBy: z\n .enum([\"timestamp\", \"latency\", \"totalCost\"])\n .optional()\n .describe(\"Sort field\"),\n});\n\ninterface TraceListResponse {\n data: Array<{\n id: string;\n name?: string;\n timestamp: string;\n userId?: string;\n sessionId?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n latency?: number;\n totalCost?: number;\n observationCount?: number;\n scoreCount?: number;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listTraces = defineTool({\n name: \"listTraces\",\n description:\n \"List traces with filtering and pagination. Returns trace metadata including latency, cost, and observation/score counts.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listTraces called with:\", input);\n\n // Build query parameters\n const queryParams: Record<string, string | number | string[] | undefined> = {\n page: input.page,\n limit: input.limit,\n name: input.name,\n userId: input.userId,\n sessionId: input.sessionId,\n tags: input.tags,\n fromTimestamp: input.fromTimestamp,\n toTimestamp: input.toTimestamp,\n environment: input.environment,\n orderBy: input.orderBy,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<TraceListResponse>(\"GET\", `/api/public/traces${query}`);\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n return formatSuccess(response, summary);\n },\n});\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { LangfuseApiError } from \"../client.js\";\n\n/**\n * Format a successful tool result with optional summary\n */\nexport function formatSuccess<T>(data: T, summary?: string): CallToolResult {\n const content: CallToolResult[\"content\"] = [];\n\n if (summary) {\n content.push({ type: \"text\", text: summary });\n }\n\n content.push({\n type: \"text\",\n text: JSON.stringify(data, null, 2),\n });\n\n return { content };\n}\n\n/**\n * Format an error tool result\n */\nexport function formatError(message: string): CallToolResult {\n return {\n content: [{ type: \"text\", text: `Error: ${message}` }],\n isError: true,\n };\n}\n\n/**\n * Handle errors from tool handlers and format appropriately\n */\nexport function handleToolError(error: unknown): CallToolResult {\n // Langfuse API errors\n if (error instanceof LangfuseApiError) {\n if (error.isNotFound) {\n return formatError(`Resource not found: ${error.path}`);\n }\n if (error.isUnauthorized) {\n return formatError(\"Authentication failed. Check your API keys.\");\n }\n if (error.isRateLimited) {\n return formatError(\"Rate limited. Please try again later.\");\n }\n return formatError(`API Error (${error.statusCode}): ${error.body}`);\n }\n\n // Zod validation errors\n if (error instanceof Error && error.name === \"ZodError\") {\n return formatError(`Validation error: ${error.message}`);\n }\n\n // Generic errors\n if (error instanceof Error) {\n return formatError(error.message);\n }\n\n // Unknown errors\n console.error(\"Unexpected error:\", error);\n return formatError(\"An unexpected error occurred\");\n}\n\n/**\n * Wrapper to handle errors in tool handlers\n */\nexport function withErrorHandling<TInput, TOutput>(\n handler: (input: TInput) => Promise<TOutput>\n): (input: TInput) => Promise<CallToolResult> {\n return async (input: TInput): Promise<CallToolResult> => {\n try {\n const result = await handler(input);\n return result as unknown as CallToolResult;\n } catch (error) {\n return handleToolError(error);\n }\n };\n}\n","import type { z } from \"zod\";\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { LangfuseClient } from \"../client.js\";\nimport type { Config, Logger } from \"../config.js\";\nimport { handleToolError } from \"../utils/errors.js\";\n\n/**\n * Definition of an MCP tool with typed input schema\n */\nexport interface ToolDefinition<TInput = unknown> {\n name: string;\n description: string;\n inputSchema: z.ZodType<TInput>;\n handler: (\n input: TInput,\n client: LangfuseClient,\n logger: Logger\n ) => Promise<CallToolResult>;\n /**\n * Optional function to determine if tool should be enabled\n */\n enabled?: (config: Config) => boolean;\n}\n\n/**\n * Create a type-safe tool definition\n */\nexport function defineTool<TInput>(\n definition: ToolDefinition<TInput>\n): ToolDefinition<TInput> {\n return definition;\n}\n\n/**\n * Registry of all available tools\n */\nexport class ToolRegistry {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private tools: Map<string, ToolDefinition<any>> = new Map();\n private client: LangfuseClient;\n private config: Config;\n private logger: Logger;\n\n constructor(client: LangfuseClient, config: Config, logger: Logger) {\n this.client = client;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * Register a tool in the registry\n */\n register<TInput>(tool: ToolDefinition<TInput>): void {\n // Check if tool should be enabled\n if (tool.enabled && !tool.enabled(this.config)) {\n this.logger.debug(`Tool ${tool.name} is disabled by configuration`);\n return;\n }\n\n this.tools.set(tool.name, tool);\n this.logger.debug(`Registered tool: ${tool.name}`);\n }\n\n /**\n * Register multiple tools\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerAll(tools: ToolDefinition<any>[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /**\n * Get all registered tools in MCP format\n */\n getTools(): Tool[] {\n return Array.from(this.tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: this.zodToJsonSchema(tool.inputSchema) as Tool[\"inputSchema\"],\n }));\n }\n\n /**\n * Execute a tool by name\n */\n async execute(name: string, args: unknown): Promise<CallToolResult> {\n const tool = this.tools.get(name);\n\n if (!tool) {\n return {\n content: [{ type: \"text\", text: `Unknown tool: ${name}` }],\n isError: true,\n };\n }\n\n try {\n // Validate input\n const parseResult = tool.inputSchema.safeParse(args);\n if (!parseResult.success) {\n const errors = parseResult.error.errors\n .map((e) => `${e.path.join(\".\")}: ${e.message}`)\n .join(\", \");\n return {\n content: [{ type: \"text\", text: `Invalid input: ${errors}` }],\n isError: true,\n };\n }\n\n // Execute handler\n this.logger.debug(`Executing tool: ${name}`);\n return await tool.handler(parseResult.data, this.client, this.logger);\n } catch (error) {\n this.logger.error(`Error executing tool ${name}:`, error);\n return handleToolError(error);\n }\n }\n\n /**\n * Convert Zod schema to JSON Schema for MCP\n */\n private zodToJsonSchema(schema: z.ZodTypeAny): Record<string, unknown> {\n // Use zod-to-json-schema or manual conversion\n // For now, we extract the shape from Zod objects\n const jsonSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {},\n required: [] as string[],\n };\n\n // Handle ZodObject\n if (\"shape\" in schema && typeof schema.shape === \"object\") {\n const shape = schema.shape as Record<string, z.ZodTypeAny>;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = this.zodTypeToJsonSchema(value);\n\n // Check if required (not optional)\n if (!value.isOptional()) {\n required.push(key);\n }\n }\n\n jsonSchema.properties = properties;\n if (required.length > 0) {\n jsonSchema.required = required;\n }\n }\n\n return jsonSchema;\n }\n\n /**\n * Convert individual Zod type to JSON Schema\n */\n private zodTypeToJsonSchema(zodType: z.ZodTypeAny): Record<string, unknown> {\n const schema: Record<string, unknown> = {};\n\n // Get description if available\n if (zodType.description) {\n schema.description = zodType.description;\n }\n\n // Handle optional wrapper\n let innerType = zodType;\n if (\"unwrap\" in zodType && typeof zodType.unwrap === \"function\") {\n innerType = zodType.unwrap() as z.ZodTypeAny;\n }\n\n // Determine type\n const typeName = innerType._def?.typeName;\n\n switch (typeName) {\n case \"ZodString\":\n schema.type = \"string\";\n break;\n case \"ZodNumber\":\n schema.type = \"number\";\n break;\n case \"ZodBoolean\":\n schema.type = \"boolean\";\n break;\n case \"ZodArray\":\n schema.type = \"array\";\n if (innerType._def?.type) {\n schema.items = this.zodTypeToJsonSchema(innerType._def.type as z.ZodTypeAny);\n }\n break;\n case \"ZodObject\":\n schema.type = \"object\";\n break;\n case \"ZodEnum\":\n schema.type = \"string\";\n if (innerType._def?.values) {\n schema.enum = innerType._def.values;\n }\n break;\n default:\n schema.type = \"string\"; // Default fallback\n }\n\n return schema;\n }\n}\n","/**\n * Standard pagination parameters for list operations\n */\nexport interface PaginationParams {\n page?: number;\n limit?: number;\n}\n\n/**\n * Cursor-based pagination parameters\n */\nexport interface CursorPaginationParams {\n cursor?: string;\n limit?: number;\n}\n\n/**\n * Build query string from pagination params\n */\nexport function buildPaginationQuery(params: PaginationParams): string {\n const query = new URLSearchParams();\n\n if (params.page !== undefined) {\n query.set(\"page\", String(params.page));\n }\n if (params.limit !== undefined) {\n query.set(\"limit\", String(params.limit));\n }\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n/**\n * Build query string including any additional filters\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | string[] | undefined>\n): string {\n const query = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n\n if (Array.isArray(value)) {\n // Handle arrays (e.g., tags)\n for (const item of value) {\n query.append(key, item);\n }\n } else if (typeof value === \"boolean\") {\n query.set(key, value ? \"true\" : \"false\");\n } else {\n query.set(key, String(value));\n }\n }\n\n const queryString = query.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n/**\n * Format pagination info for response summary\n */\nexport function formatPaginationSummary(\n count: number,\n total?: number,\n page?: number,\n hasMore?: boolean\n): string {\n const parts: string[] = [];\n\n if (total !== undefined) {\n parts.push(`Showing ${count} of ${total} items`);\n } else {\n parts.push(`Found ${count} items`);\n }\n\n if (page !== undefined) {\n parts.push(`(page ${page})`);\n }\n\n if (hasMore) {\n parts.push(\"- more available\");\n }\n\n return parts.join(\" \");\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n traceId: z.string().min(1).describe(\"The unique trace identifier\"),\n});\n\ninterface TraceResponse {\n id: string;\n name?: string;\n timestamp: string;\n userId?: string;\n sessionId?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n input?: unknown;\n output?: unknown;\n latency?: number;\n totalCost?: number;\n observations?: Array<{\n id: string;\n type: string;\n name?: string;\n startTime: string;\n endTime?: string;\n model?: string;\n usage?: {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n };\n }>;\n scores?: Array<{\n id: string;\n name: string;\n value: number | string;\n dataType: string;\n }>;\n}\n\nexport const getTrace = defineTool({\n name: \"getTrace\",\n description: \"Get a specific trace with full details including all observations and scores.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getTrace called with:\", input);\n\n const response = await client.apiRequest<TraceResponse>(\n \"GET\",\n `/api/public/traces/${encodeURIComponent(input.traceId)}`\n );\n\n const observationCount = response.observations?.length ?? 0;\n const scoreCount = response.scores?.length ?? 0;\n const summary = `Trace \"${response.name || response.id}\" with ${observationCount} observations and ${scoreCount} scores`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n traceId: z.string().min(1).describe(\"The unique trace identifier to delete\"),\n});\n\nexport const deleteTrace = defineTool({\n name: \"deleteTrace\",\n description: \"Delete a specific trace. This action is irreversible.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"deleteTrace called with:\", input);\n\n await client.apiRequest(\"DELETE\", `/api/public/traces/${encodeURIComponent(input.traceId)}`);\n\n return formatSuccess(\n { deleted: true, traceId: input.traceId },\n `Successfully deleted trace: ${input.traceId}`\n );\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n cursor: z.string().optional().describe(\"Pagination cursor from previous response\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n traceId: z.string().optional().describe(\"Filter by trace ID\"),\n name: z.string().optional().describe(\"Filter by observation name\"),\n type: z\n .enum([\"GENERATION\", \"SPAN\", \"EVENT\"])\n .optional()\n .describe(\"Filter by observation type\"),\n parentObservationId: z.string().optional().describe(\"Filter by parent observation\"),\n fromStartTime: z.string().optional().describe(\"Start of time range (ISO 8601)\"),\n toStartTime: z.string().optional().describe(\"End of time range (ISO 8601)\"),\n userId: z.string().optional().describe(\"Filter by user ID\"),\n version: z.string().optional().describe(\"Filter by version\"),\n});\n\ninterface ObservationListResponse {\n data: Array<{\n id: string;\n traceId: string;\n type: string;\n name?: string;\n startTime: string;\n endTime?: string;\n model?: string;\n modelParameters?: Record<string, unknown>;\n input?: unknown;\n output?: unknown;\n usage?: {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n };\n level?: string;\n statusMessage?: string;\n parentObservationId?: string;\n promptId?: string;\n promptName?: string;\n promptVersion?: number;\n metadata?: Record<string, unknown>;\n calculatedTotalCost?: number;\n calculatedInputCost?: number;\n calculatedOutputCost?: number;\n latency?: number;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listObservations = defineTool({\n name: \"listObservations\",\n description:\n \"List observations (generations, spans, events) with cursor-based pagination. Includes usage metrics, costs, and latency.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listObservations called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n page: input.cursor ? parseInt(input.cursor, 10) : 1,\n limit: input.limit,\n traceId: input.traceId,\n name: input.name,\n type: input.type,\n parentObservationId: input.parentObservationId,\n fromStartTime: input.fromStartTime,\n toStartTime: input.toStartTime,\n userId: input.userId,\n version: input.version,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<ObservationListResponse>(\n \"GET\",\n `/api/public/observations${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n // Add next cursor if there are more pages\n const result = {\n ...response,\n nextCursor:\n response.meta.page < response.meta.totalPages\n ? String(response.meta.page + 1)\n : undefined,\n };\n\n return formatSuccess(result, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n observationId: z.string().min(1).describe(\"The unique observation identifier\"),\n});\n\ninterface ObservationResponse {\n id: string;\n traceId: string;\n type: string;\n name?: string;\n startTime: string;\n endTime?: string;\n completionStartTime?: string;\n model?: string;\n modelParameters?: Record<string, unknown>;\n input?: unknown;\n output?: unknown;\n usage?: {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n input?: number;\n output?: number;\n total?: number;\n unit?: string;\n };\n level?: string;\n statusMessage?: string;\n parentObservationId?: string;\n promptId?: string;\n promptName?: string;\n promptVersion?: number;\n metadata?: Record<string, unknown>;\n calculatedTotalCost?: number;\n calculatedInputCost?: number;\n calculatedOutputCost?: number;\n latency?: number;\n timeToFirstToken?: number;\n}\n\nexport const getObservation = defineTool({\n name: \"getObservation\",\n description:\n \"Get a specific observation with all details including input/output, usage, costs, and timing.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getObservation called with:\", input);\n\n const response = await client.apiRequest<ObservationResponse>(\n \"GET\",\n `/api/public/observations/${encodeURIComponent(input.observationId)}`\n );\n\n const typeLabel = response.type.toLowerCase();\n const modelInfo = response.model ? ` using ${response.model}` : \"\";\n const summary = `${typeLabel} \"${response.name || response.id}\"${modelInfo}`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n traceId: z.string().min(1).describe(\"ID of the trace to score\"),\n observationId: z.string().optional().describe(\"Optional: ID of specific observation to score\"),\n name: z.string().min(1).describe(\"Name of the score (e.g., 'accuracy', 'relevance')\"),\n value: z\n .union([z.number(), z.string()])\n .describe(\"Score value - numeric for NUMERIC type, string for CATEGORICAL/BOOLEAN\"),\n dataType: z\n .enum([\"NUMERIC\", \"CATEGORICAL\", \"BOOLEAN\"])\n .optional()\n .describe(\"Type of score value\"),\n comment: z.string().optional().describe(\"Optional comment explaining the score\"),\n configId: z.string().optional().describe(\"Optional score config ID for validation\"),\n id: z.string().optional().describe(\"Optional custom ID for idempotency\"),\n});\n\ninterface ScoreCreateResponse {\n id: string;\n traceId: string;\n observationId?: string;\n name: string;\n value: number | string;\n dataType: string;\n source: string;\n comment?: string;\n configId?: string;\n timestamp: string;\n}\n\nexport const createScore = defineTool({\n name: \"createScore\",\n description:\n \"Create a score for a trace or observation. Supports numeric, boolean, and categorical score types.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"createScore called with:\", input);\n\n const response = await client.apiRequest<ScoreCreateResponse>(\"POST\", \"/api/public/scores\", {\n traceId: input.traceId,\n observationId: input.observationId,\n name: input.name,\n value: input.value,\n dataType: input.dataType,\n comment: input.comment,\n configId: input.configId,\n id: input.id,\n });\n\n const targetDesc = input.observationId\n ? `observation ${input.observationId}`\n : `trace ${input.traceId}`;\n const summary = `Created score \"${input.name}\" = ${input.value} for ${targetDesc}`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n traceId: z.string().optional().describe(\"Filter by trace ID\"),\n observationId: z.string().optional().describe(\"Filter by observation ID\"),\n name: z.string().optional().describe(\"Filter by score name\"),\n source: z\n .enum([\"API\", \"ANNOTATION\", \"EVAL\"])\n .optional()\n .describe(\"Filter by score source\"),\n dataType: z\n .enum([\"NUMERIC\", \"CATEGORICAL\", \"BOOLEAN\"])\n .optional()\n .describe(\"Filter by data type\"),\n configId: z.string().optional().describe(\"Filter by score config ID\"),\n fromTimestamp: z.string().optional().describe(\"Start of time range (ISO 8601)\"),\n toTimestamp: z.string().optional().describe(\"End of time range (ISO 8601)\"),\n userId: z.string().optional().describe(\"Filter by user ID who created the trace\"),\n operator: z\n .enum([\"<\", \">\", \"<=\", \">=\", \"!=\", \"=\"])\n .optional()\n .describe(\"Comparison operator for value filter\"),\n value: z.number().optional().describe(\"Value to compare against (requires operator)\"),\n});\n\ninterface ScoreListResponse {\n data: Array<{\n id: string;\n traceId: string;\n observationId?: string;\n name: string;\n value: number | string;\n dataType: string;\n source: string;\n comment?: string;\n configId?: string;\n timestamp: string;\n stringValue?: string;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listScores = defineTool({\n name: \"listScores\",\n description: \"List scores with filtering. Supports both trace and observation scores.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listScores called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n page: input.page,\n limit: input.limit,\n traceId: input.traceId,\n observationId: input.observationId,\n name: input.name,\n source: input.source,\n dataType: input.dataType,\n configId: input.configId,\n fromTimestamp: input.fromTimestamp,\n toTimestamp: input.toTimestamp,\n userId: input.userId,\n operator: input.operator,\n value: input.value,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<ScoreListResponse>(\n \"GET\",\n `/api/public/v2/scores${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n scoreId: z.string().min(1).describe(\"The unique score identifier\"),\n});\n\ninterface ScoreResponse {\n id: string;\n traceId: string;\n observationId?: string;\n name: string;\n value: number | string;\n dataType: string;\n source: string;\n comment?: string;\n configId?: string;\n timestamp: string;\n stringValue?: string;\n authorUserId?: string;\n queueId?: string;\n}\n\nexport const getScore = defineTool({\n name: \"getScore\",\n description: \"Get a specific score by ID.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getScore called with:\", input);\n\n const response = await client.apiRequest<ScoreResponse>(\n \"GET\",\n `/api/public/v2/scores/${encodeURIComponent(input.scoreId)}`\n );\n\n const summary = `Score \"${response.name}\" = ${response.value} (${response.dataType})`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n scoreId: z.string().min(1).describe(\"The unique score identifier to delete\"),\n});\n\nexport const deleteScore = defineTool({\n name: \"deleteScore\",\n description: \"Delete a specific score. This action is irreversible.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"deleteScore called with:\", input);\n\n await client.apiRequest(\"DELETE\", `/api/public/scores/${encodeURIComponent(input.scoreId)}`);\n\n return formatSuccess(\n { deleted: true, scoreId: input.scoreId },\n `Successfully deleted score: ${input.scoreId}`\n );\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst categorySchema = z.object({\n value: z.number().describe(\"Numeric value for this category\"),\n label: z.string().describe(\"Display label for this category\"),\n});\n\nconst inputSchema = z.object({\n name: z.string().min(1).describe(\"Unique name for the score configuration\"),\n dataType: z\n .enum([\"NUMERIC\", \"CATEGORICAL\", \"BOOLEAN\"])\n .describe(\"Type of score values this config accepts\"),\n minValue: z\n .number()\n .optional()\n .describe(\"Minimum allowed value (NUMERIC only)\"),\n maxValue: z\n .number()\n .optional()\n .describe(\"Maximum allowed value (NUMERIC only)\"),\n categories: z\n .array(categorySchema)\n .optional()\n .describe(\"Category definitions (CATEGORICAL only)\"),\n description: z.string().optional().describe(\"Description of what this score measures\"),\n});\n\ninterface ScoreConfigCreateResponse {\n id: string;\n name: string;\n dataType: string;\n minValue?: number;\n maxValue?: number;\n categories?: Array<{ value: number; label: string }>;\n description?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const createScoreConfig = defineTool({\n name: \"createScoreConfig\",\n description:\n \"Create a score configuration that defines validation rules for scores. Supports numeric ranges, categorical values, and boolean types.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"createScoreConfig called with:\", input);\n\n const response = await client.apiRequest<ScoreConfigCreateResponse>(\n \"POST\",\n \"/api/public/score-configs\",\n {\n name: input.name,\n dataType: input.dataType,\n minValue: input.minValue,\n maxValue: input.maxValue,\n categories: input.categories,\n description: input.description,\n }\n );\n\n let summary = `Created score config \"${input.name}\" (${input.dataType})`;\n if (input.dataType === \"NUMERIC\" && (input.minValue !== undefined || input.maxValue !== undefined)) {\n summary += ` with range [${input.minValue ?? \"-∞\"}, ${input.maxValue ?? \"∞\"}]`;\n } else if (input.dataType === \"CATEGORICAL\" && input.categories) {\n summary += ` with ${input.categories.length} categories`;\n }\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n});\n\ninterface ScoreConfigListResponse {\n data: Array<{\n id: string;\n name: string;\n dataType: string;\n minValue?: number;\n maxValue?: number;\n categories?: Array<{ value: number; label: string }>;\n description?: string;\n createdAt: string;\n updatedAt: string;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listScoreConfigs = defineTool({\n name: \"listScoreConfigs\",\n description: \"List all score configurations in the project.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listScoreConfigs called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n page: input.page,\n limit: input.limit,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<ScoreConfigListResponse>(\n \"GET\",\n `/api/public/score-configs${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n configId: z.string().min(1).describe(\"The unique score config identifier\"),\n});\n\ninterface ScoreConfigResponse {\n id: string;\n name: string;\n dataType: string;\n minValue?: number;\n maxValue?: number;\n categories?: Array<{ value: number; label: string }>;\n description?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const getScoreConfig = defineTool({\n name: \"getScoreConfig\",\n description: \"Get a specific score configuration by ID.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getScoreConfig called with:\", input);\n\n const response = await client.apiRequest<ScoreConfigResponse>(\n \"GET\",\n `/api/public/score-configs/${encodeURIComponent(input.configId)}`\n );\n\n let summary = `Score config \"${response.name}\" (${response.dataType})`;\n if (response.dataType === \"NUMERIC\") {\n const min = response.minValue ?? \"-∞\";\n const max = response.maxValue ?? \"∞\";\n summary += ` [${min}, ${max}]`;\n } else if (response.dataType === \"CATEGORICAL\" && response.categories) {\n summary += ` with ${response.categories.length} categories`;\n }\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n name: z.string().min(1).describe(\"Unique name for the dataset\"),\n description: z.string().optional().describe(\"Description of the dataset\"),\n metadata: z.record(z.unknown()).optional().describe(\"Additional metadata as key-value pairs\"),\n});\n\ninterface DatasetCreateResponse {\n id: string;\n name: string;\n description?: string;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const createDataset = defineTool({\n name: \"createDataset\",\n description:\n \"Create a new dataset for evaluation. Datasets contain items with expected inputs/outputs for testing LLM applications.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"createDataset called with:\", input);\n\n const response = await client.apiRequest<DatasetCreateResponse>(\n \"POST\",\n \"/api/public/v2/datasets\",\n {\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n }\n );\n\n const summary = `Created dataset \"${input.name}\"${input.description ? `: ${input.description}` : \"\"}`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n});\n\ninterface DatasetListResponse {\n data: Array<{\n id: string;\n name: string;\n description?: string;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listDatasets = defineTool({\n name: \"listDatasets\",\n description: \"List all datasets in the project.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listDatasets called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n page: input.page,\n limit: input.limit,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<DatasetListResponse>(\n \"GET\",\n `/api/public/v2/datasets${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n datasetName: z.string().min(1).describe(\"The name of the dataset to retrieve\"),\n});\n\ninterface DatasetResponse {\n id: string;\n name: string;\n description?: string;\n metadata?: Record<string, unknown>;\n items: Array<{\n id: string;\n input: unknown;\n expectedOutput?: unknown;\n metadata?: Record<string, unknown>;\n status: string;\n createdAt: string;\n updatedAt: string;\n }>;\n runs: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport const getDataset = defineTool({\n name: \"getDataset\",\n description: \"Get a dataset by name including its items and run names.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getDataset called with:\", input);\n\n const response = await client.apiRequest<DatasetResponse>(\n \"GET\",\n `/api/public/v2/datasets/${encodeURIComponent(input.datasetName)}`\n );\n\n const itemCount = response.items?.length ?? 0;\n const runCount = response.runs?.length ?? 0;\n const summary = `Dataset \"${response.name}\" with ${itemCount} items and ${runCount} runs`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n datasetName: z.string().min(1).describe(\"Name of the dataset to add the item to\"),\n input: z.unknown().describe(\"The input for this dataset item (any JSON value)\"),\n expectedOutput: z.unknown().optional().describe(\"The expected output for evaluation\"),\n metadata: z.record(z.unknown()).optional().describe(\"Additional metadata\"),\n sourceTraceId: z.string().optional().describe(\"Link to source trace that generated this item\"),\n sourceObservationId: z\n .string()\n .optional()\n .describe(\"Link to source observation (requires sourceTraceId)\"),\n id: z.string().optional().describe(\"Custom ID for idempotent upsert\"),\n status: z\n .enum([\"ACTIVE\", \"ARCHIVED\"])\n .optional()\n .describe(\"Item status (defaults to ACTIVE)\"),\n});\n\ninterface DatasetItemCreateResponse {\n id: string;\n datasetId: string;\n datasetName: string;\n input: unknown;\n expectedOutput?: unknown;\n metadata?: Record<string, unknown>;\n sourceTraceId?: string;\n sourceObservationId?: string;\n status: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const createDatasetItem = defineTool({\n name: \"createDatasetItem\",\n description:\n \"Create or upsert a dataset item. Use id parameter for idempotent updates.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"createDatasetItem called with:\", input);\n\n const response = await client.apiRequest<DatasetItemCreateResponse>(\n \"POST\",\n \"/api/public/dataset-items\",\n {\n datasetName: input.datasetName,\n input: input.input,\n expectedOutput: input.expectedOutput,\n metadata: input.metadata,\n sourceTraceId: input.sourceTraceId,\n sourceObservationId: input.sourceObservationId,\n id: input.id,\n status: input.status,\n }\n );\n\n const summary = `Created dataset item ${response.id} in \"${input.datasetName}\"`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n datasetName: z.string().min(1).describe(\"Name of the dataset to list items from\"),\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n sourceTraceId: z.string().optional().describe(\"Filter by source trace ID\"),\n sourceObservationId: z.string().optional().describe(\"Filter by source observation ID\"),\n});\n\ninterface DatasetItemListResponse {\n data: Array<{\n id: string;\n datasetId: string;\n datasetName: string;\n input: unknown;\n expectedOutput?: unknown;\n metadata?: Record<string, unknown>;\n sourceTraceId?: string;\n sourceObservationId?: string;\n status: string;\n createdAt: string;\n updatedAt: string;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listDatasetItems = defineTool({\n name: \"listDatasetItems\",\n description: \"List items in a dataset with optional filtering.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listDatasetItems called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n datasetName: input.datasetName,\n page: input.page,\n limit: input.limit,\n sourceTraceId: input.sourceTraceId,\n sourceObservationId: input.sourceObservationId,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<DatasetItemListResponse>(\n \"GET\",\n `/api/public/dataset-items${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n datasetItemId: z.string().min(1).describe(\"The unique dataset item identifier\"),\n});\n\ninterface DatasetItemResponse {\n id: string;\n datasetId: string;\n datasetName: string;\n input: unknown;\n expectedOutput?: unknown;\n metadata?: Record<string, unknown>;\n sourceTraceId?: string;\n sourceObservationId?: string;\n status: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const getDatasetItem = defineTool({\n name: \"getDatasetItem\",\n description: \"Get a specific dataset item by ID.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getDatasetItem called with:\", input);\n\n const response = await client.apiRequest<DatasetItemResponse>(\n \"GET\",\n `/api/public/dataset-items/${encodeURIComponent(input.datasetItemId)}`\n );\n\n const summary = `Dataset item ${response.id} from \"${response.datasetName}\" (${response.status})`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n datasetItemId: z.string().min(1).describe(\"The unique dataset item identifier to delete\"),\n});\n\nexport const deleteDatasetItem = defineTool({\n name: \"deleteDatasetItem\",\n description: \"Delete a specific dataset item. This action is irreversible.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"deleteDatasetItem called with:\", input);\n\n await client.apiRequest(\n \"DELETE\",\n `/api/public/dataset-items/${encodeURIComponent(input.datasetItemId)}`\n );\n\n return formatSuccess(\n { deleted: true, datasetItemId: input.datasetItemId },\n `Successfully deleted dataset item: ${input.datasetItemId}`\n );\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n runName: z.string().min(1).describe(\"Name of the dataset run\"),\n runDescription: z.string().optional().describe(\"Description of the run\"),\n datasetItemId: z.string().min(1).describe(\"ID of the dataset item being evaluated\"),\n traceId: z.string().min(1).describe(\"ID of the trace that processed this item\"),\n observationId: z.string().optional().describe(\"ID of specific observation (if applicable)\"),\n metadata: z.record(z.unknown()).optional().describe(\"Additional run item metadata\"),\n});\n\ninterface DatasetRunItemCreateResponse {\n id: string;\n datasetRunId: string;\n datasetRunName: string;\n datasetItemId: string;\n traceId: string;\n observationId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const createDatasetRunItem = defineTool({\n name: \"createDatasetRunItem\",\n description:\n \"Create a dataset run item linking a trace/observation to a dataset item for evaluation.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"createDatasetRunItem called with:\", input);\n\n const response = await client.apiRequest<DatasetRunItemCreateResponse>(\n \"POST\",\n \"/api/public/dataset-run-items\",\n {\n runName: input.runName,\n runDescription: input.runDescription,\n datasetItemId: input.datasetItemId,\n traceId: input.traceId,\n observationId: input.observationId,\n metadata: input.metadata,\n }\n );\n\n const summary = `Created run item in \"${input.runName}\" linking trace ${input.traceId} to item ${input.datasetItemId}`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n datasetName: z.string().min(1).describe(\"Name of the dataset to list runs from\"),\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n});\n\ninterface DatasetRunListResponse {\n data: Array<{\n id: string;\n name: string;\n description?: string;\n datasetId: string;\n datasetName: string;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listDatasetRuns = defineTool({\n name: \"listDatasetRuns\",\n description: \"List all runs for a specific dataset.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listDatasetRuns called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n page: input.page,\n limit: input.limit,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<DatasetRunListResponse>(\n \"GET\",\n `/api/public/datasets/${encodeURIComponent(input.datasetName)}/runs${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n datasetName: z.string().min(1).describe(\"Name of the dataset\"),\n runName: z.string().min(1).describe(\"Name of the run to retrieve\"),\n});\n\ninterface DatasetRunResponse {\n id: string;\n name: string;\n description?: string;\n datasetId: string;\n datasetName: string;\n metadata?: Record<string, unknown>;\n datasetRunItems: Array<{\n id: string;\n datasetItemId: string;\n traceId: string;\n observationId?: string;\n createdAt: string;\n updatedAt: string;\n }>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const getDatasetRun = defineTool({\n name: \"getDatasetRun\",\n description: \"Get a specific dataset run by name including its run items.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getDatasetRun called with:\", input);\n\n const response = await client.apiRequest<DatasetRunResponse>(\n \"GET\",\n `/api/public/datasets/${encodeURIComponent(input.datasetName)}/runs/${encodeURIComponent(input.runName)}`\n );\n\n const itemCount = response.datasetRunItems?.length ?? 0;\n const summary = `Run \"${response.name}\" with ${itemCount} items`;\n\n return formatSuccess(response, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\nimport { buildQueryString, formatPaginationSummary } from \"../../utils/pagination.js\";\n\nconst inputSchema = z.object({\n page: z.number().int().min(1).optional().describe(\"Page number (1-indexed)\"),\n limit: z.number().int().min(1).max(100).optional().default(50).describe(\"Items per page\"),\n fromTimestamp: z.string().optional().describe(\"Start of time range (ISO 8601)\"),\n toTimestamp: z.string().optional().describe(\"End of time range (ISO 8601)\"),\n});\n\ninterface SessionListResponse {\n data: Array<{\n id: string;\n createdAt: string;\n projectId: string;\n }>;\n meta: {\n page: number;\n limit: number;\n totalItems: number;\n totalPages: number;\n };\n}\n\nexport const listSessions = defineTool({\n name: \"listSessions\",\n description: \"List all sessions. Sessions group multiple traces from the same user interaction.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"listSessions called with:\", input);\n\n const queryParams: Record<string, string | number | undefined> = {\n page: input.page,\n limit: input.limit,\n fromTimestamp: input.fromTimestamp,\n toTimestamp: input.toTimestamp,\n };\n\n const query = buildQueryString(queryParams);\n const response = await client.apiRequest<SessionListResponse>(\n \"GET\",\n `/api/public/sessions${query}`\n );\n\n const summary = formatPaginationSummary(\n response.data.length,\n response.meta.totalItems,\n response.meta.page,\n response.meta.page < response.meta.totalPages\n );\n\n // Add next cursor if there are more pages\n const result = {\n ...response,\n nextCursor:\n response.meta.page < response.meta.totalPages\n ? String(response.meta.page + 1)\n : undefined,\n };\n\n return formatSuccess(result, summary);\n },\n});\n","import { z } from \"zod\";\nimport { defineTool } from \"../registry.js\";\nimport { formatSuccess } from \"../../utils/errors.js\";\n\nconst inputSchema = z.object({\n sessionId: z.string().min(1).describe(\"The unique session identifier\"),\n});\n\ninterface SessionResponse {\n id: string;\n createdAt: string;\n projectId: string;\n traces: Array<{\n id: string;\n timestamp: string;\n name?: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n release?: string;\n version?: string;\n input?: unknown;\n output?: unknown;\n tags?: string[];\n }>;\n}\n\nexport const getSession = defineTool({\n name: \"getSession\",\n description: \"Get a specific session by ID including its traces.\",\n inputSchema,\n handler: async (input, client, logger) => {\n logger.debug(\"getSession called with:\", input);\n\n const response = await client.apiRequest<SessionResponse>(\n \"GET\",\n `/api/public/sessions/${encodeURIComponent(input.sessionId)}`\n );\n\n const traceCount = response.traces?.length ?? 0;\n const summary = `Session ${response.id} with ${traceCount} traces`;\n\n return formatSuccess(response, summary);\n },\n});\n","import type { ToolDefinition } from \"./registry.js\";\n\n// Import all tools\nimport { listTraces, getTrace, deleteTrace } from \"./traces/index.js\";\nimport { listObservations, getObservation } from \"./observations/index.js\";\nimport { createScore, listScores, getScore, deleteScore } from \"./scores/index.js\";\nimport { createScoreConfig, listScoreConfigs, getScoreConfig } from \"./score-configs/index.js\";\nimport {\n createDataset,\n listDatasets,\n getDataset,\n createDatasetItem,\n listDatasetItems,\n getDatasetItem,\n deleteDatasetItem,\n createDatasetRunItem,\n listDatasetRuns,\n getDatasetRun,\n} from \"./datasets/index.js\";\nimport { listSessions, getSession } from \"./sessions/index.js\";\n\n// Export registry\nexport { ToolRegistry, defineTool, type ToolDefinition } from \"./registry.js\";\n\n/**\n * All available tools grouped by category\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const allTools: Record<string, ToolDefinition<any>[]> = {\n traces: [listTraces, getTrace, deleteTrace],\n observations: [listObservations, getObservation],\n scores: [createScore, listScores, getScore, deleteScore],\n scoreConfigs: [createScoreConfig, listScoreConfigs, getScoreConfig],\n datasets: [\n createDataset,\n listDatasets,\n getDataset,\n createDatasetItem,\n listDatasetItems,\n getDatasetItem,\n deleteDatasetItem,\n createDatasetRunItem,\n listDatasetRuns,\n getDatasetRun,\n ],\n sessions: [listSessions, getSession],\n // prompts: [], // TODO: Phase 5 (optional)\n};\n\n/**\n * Get all tools as a flat array\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getAllTools(): ToolDefinition<any>[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Object.values(allTools).flat() as ToolDefinition<any>[];\n}\n\n/**\n * Get tools by category\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getToolsByCategory(category: string): ToolDefinition<any>[] {\n return allTools[category] ?? [];\n}\n","import { loadConfig, createLogger } from \"./config.js\";\nimport { runServer } from \"./server.js\";\n\nasync function main(): Promise<void> {\n try {\n // Load configuration\n const config = loadConfig();\n const logger = createLogger(config);\n\n // Run the MCP server\n await runServer(config, logger);\n } catch (error) {\n console.error(\"Failed to start server:\", error);\n process.exit(1);\n }\n}\n\n// Run\nmain().catch(console.error);\n"],"mappings":"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","names":["z","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","z","inputSchema","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z","z","inputSchema","z"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "langfuse-mcp-extended",
3
+ "version": "0.1.0",
4
+ "description": "Comprehensive MCP server for Langfuse - Traces, Scores, Datasets",
5
+ "type": "module",
6
+ "main": "build/index.js",
7
+ "types": "build/index.d.ts",
8
+ "bin": {
9
+ "langfuse-mcp-extended": "build/index.js"
10
+ },
11
+ "files": [
12
+ "build",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "dev": "tsup --watch",
19
+ "start": "node build/index.js",
20
+ "lint": "eslint src --ext .ts",
21
+ "lint:fix": "eslint src --ext .ts --fix",
22
+ "format": "prettier --write \"src/**/*.ts\"",
23
+ "format:check": "prettier --check \"src/**/*.ts\"",
24
+ "test": "vitest run tests/unit",
25
+ "test:unit": "vitest run tests/unit",
26
+ "test:integration": "vitest run tests/integration",
27
+ "test:all": "vitest run",
28
+ "test:watch": "vitest",
29
+ "test:coverage": "vitest run --coverage",
30
+ "typecheck": "tsc --noEmit",
31
+ "prepublishOnly": "npm run build"
32
+ },
33
+ "keywords": [
34
+ "langfuse",
35
+ "mcp",
36
+ "model-context-protocol",
37
+ "llm",
38
+ "observability",
39
+ "tracing",
40
+ "ai"
41
+ ],
42
+ "author": "JaviMaligno",
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/JaviMaligno/langfuse-mcp-server.git"
47
+ },
48
+ "bugs": {
49
+ "url": "https://github.com/JaviMaligno/langfuse-mcp-server/issues"
50
+ },
51
+ "homepage": "https://github.com/JaviMaligno/langfuse-mcp-server#readme",
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ },
55
+ "dependencies": {
56
+ "@modelcontextprotocol/sdk": "^1.0.0",
57
+ "langfuse": "^3.0.0",
58
+ "zod": "^3.23.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^20.10.0",
62
+ "@typescript-eslint/eslint-plugin": "^7.0.0",
63
+ "@typescript-eslint/parser": "^7.0.0",
64
+ "@vitest/coverage-v8": "^1.6.0",
65
+ "eslint": "^8.57.0",
66
+ "eslint-config-prettier": "^9.1.0",
67
+ "prettier": "^3.2.0",
68
+ "tsup": "^8.0.0",
69
+ "typescript": "^5.4.0",
70
+ "vitest": "^1.6.0"
71
+ }
72
+ }