{"version":3,"sources":["../../../src/bridges/mcp/server.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * MCP Bridge for GQP\n * Generates MCP server with single tool from GQP graph\n */\n\nimport type { GQP } from \"../../core/engine.js\";\nimport type { ToolCallParams } from \"../../core/types.js\";\n\n/**\n * MCP Tool Definition\n */\nexport interface MCPTool {\n    name: string;\n    description: string;\n    inputSchema: {\n        type: \"object\";\n        properties: Record<string, unknown>;\n        required?: string[];\n    };\n}\n\n/**\n * MCP Server Options\n */\nexport interface MCPServerOptions {\n    /** Server name */\n    name?: string;\n    /** Server version */\n    version?: string;\n    /** Tool customization */\n    tool?: {\n        /** Custom tool name */\n        name?: string;\n        /** Custom description */\n        description?: string;\n    };\n    /** Lifecycle hooks */\n    hooks?: {\n        beforeQuery?: (params: ToolCallParams) => Promise<ToolCallParams>;\n        afterQuery?: (result: unknown) => Promise<unknown>;\n        onError?: (error: Error) => Promise<void>;\n    };\n}\n\n/**\n * Create MCP tool definition from GQP\n */\nexport function createMCPTool(graph: GQP, options: MCPServerOptions = {}): MCPTool {\n    const toolDef = graph.getToolDefinition();\n\n    return {\n        name: options.tool?.name || toolDef.name,\n        description: options.tool?.description || toolDef.description,\n        inputSchema: toolDef.inputSchema as MCPTool[\"inputSchema\"],\n    };\n}\n\n/**\n * Create MCP tool handler\n */\nexport function createMCPHandler(\n    graph: GQP,\n    options: MCPServerOptions = {}\n): (params: unknown) => Promise<{ type: \"text\"; text: string }[]> {\n    return async (params) => {\n        try {\n            let toolParams = params as ToolCallParams;\n\n            // Run beforeQuery hook\n            if (options.hooks?.beforeQuery) {\n                toolParams = await options.hooks.beforeQuery(toolParams);\n            }\n\n            // Execute\n            let result = await graph.handleToolCall(toolParams);\n\n            // Run afterQuery hook\n            if (options.hooks?.afterQuery) {\n                result = (await options.hooks.afterQuery(result)) as any;\n            }\n\n            return [\n                {\n                    type: \"text\" as const,\n                    text: JSON.stringify(result, null, 2),\n                },\n            ];\n        } catch (error) {\n            // Run onError hook\n            if (options.hooks?.onError) {\n                await options.hooks.onError(error as Error);\n            }\n\n            return [\n                {\n                    type: \"text\" as const,\n                    text: JSON.stringify({\n                        error: true,\n                        message: (error as Error).message,\n                    }),\n                },\n            ];\n        }\n    };\n}\n\n/**\n * Serve GQP as MCP server\n *\n * This creates a complete MCP server with a single tool that consolidates\n * all data access into one navigable interface.\n *\n * @example\n * ```typescript\n * import { GQP } from '@mzhub/gqp';\n * import { serveMCP } from '@mzhub/gqp/mcp';\n * import { fromPrisma } from '@mzhub/gqp/prisma';\n *\n * const graph = new GQP({\n *   sources: { db: fromPrisma(prisma) }\n * });\n *\n * serveMCP(graph, {\n *   name: 'my-data-server',\n *   hooks: {\n *     beforeQuery: async (params) => {\n *       console.log('Query:', params);\n *       return params;\n *     }\n *   }\n * });\n * ```\n */\nexport async function serveMCP(\n    graph: GQP,\n    options: MCPServerOptions = {}\n): Promise<void> {\n    // Dynamic import to make @modelcontextprotocol/sdk optional\n    const { Server } = (await import(\"@modelcontextprotocol/sdk/server/index.js\" as any)) as any;\n    const { StdioServerTransport } = (await import(\n        \"@modelcontextprotocol/sdk/server/stdio.js\" as any\n    )) as any;\n\n    const serverName = options.name || \"gqp-data-server\";\n    const serverVersion = options.version || \"1.0.0\";\n\n    const server = new Server(\n        {\n            name: serverName,\n            version: serverVersion,\n        },\n        {\n            capabilities: {\n                tools: {},\n            },\n        }\n    );\n\n    const tool = createMCPTool(graph, options);\n    const handler = createMCPHandler(graph, options);\n\n    // Handle tool listing\n    server.setRequestHandler(\n        { method: \"tools/list\" } as { method: string },\n        async () => ({\n            tools: [tool],\n        })\n    );\n\n    // Handle tool calls\n    server.setRequestHandler(\n        { method: \"tools/call\" } as any,\n        async (request: any) => {\n            if (request.params.name !== tool.name) {\n                throw new Error(`Unknown tool: ${request.params.name}`);\n            }\n\n            const content = await handler(request.params.arguments || {});\n            return { content };\n        }\n    );\n\n    // Connect to stdio transport\n    const transport = new StdioServerTransport();\n    await server.connect(transport);\n\n    // Log startup\n    console.error(`[GQP] MCP server \"${serverName}\" started`);\n}\n\n/**\n * Create MCP server configuration for external use\n * Returns the configuration without starting the server\n */\nexport function getMCPConfig(graph: GQP, options: MCPServerOptions = {}): {\n    tool: MCPTool;\n    handler: (params: Record<string, unknown>) => Promise<{ type: \"text\"; text: string }[]>;\n    serverInfo: { name: string; version: string };\n} {\n    return {\n        tool: createMCPTool(graph, options),\n        handler: createMCPHandler(graph, options),\n        serverInfo: {\n            name: options.name || \"gqp-data-server\",\n            version: options.version || \"1.0.0\",\n        },\n    };\n}\n"]}