diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eb6a2ba..cd0faa2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -91,7 +91,7 @@ jobs: SRH_TOKEN: example_token SRH_CONNECTION_STRING: "redis://redis:6379" env: - MCP_ROUTER_SERVER_URL: https://router.mcprouter.app/sse + MCP_ROUTER_SERVER_URL: https://router.mcprouter.app/stream MCP_ROUTER_SERVER_API_KEY: ${{ secrets.MCP_ROUTER_SERVER_API_KEY }} QSTASH_TOKEN: eyJVc2VySUQiOiJkZWZhdWx0VXNlciIsIlBhc3N3b3JkIjoiZGVmYXVsdFBhc3N3b3JkIn0 QSTASH_URL: http://localhost:8080 diff --git a/lib/ai/mcp.ts b/lib/ai/mcp.ts index 84e01cb..f4f8f4e 100644 --- a/lib/ai/mcp.ts +++ b/lib/ai/mcp.ts @@ -1,14 +1,16 @@ import { experimental_createMCPClient as createMCPClientSDK } from 'ai'; -export const createMCPClient = () => - createMCPClientSDK({ - transport: { - type: 'sse', - // biome-ignore lint/style/noNonNullAssertion: - url: process.env.MCP_ROUTER_SERVER_URL!, - headers: { - // biome-ignore lint/style/noNonNullAssertion: - 'x-api-key': process.env.MCP_ROUTER_SERVER_API_KEY!, - }, - }, +import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; + +export const createMCPClient = () => { + // biome-ignore lint/style/noNonNullAssertion: + const url = new URL(process.env.MCP_ROUTER_SERVER_URL!); + // add x-api-key to the url + // biome-ignore lint/style/noNonNullAssertion: + url.searchParams.set('x-api-key', process.env.MCP_ROUTER_SERVER_API_KEY!); + + const transport = new StreamableHTTPClientTransport(url, {}); + return createMCPClientSDK({ + transport, }); +}; diff --git a/package.json b/package.json index 7f26fbd..f8d0403 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@faker-js/faker": "^9.8.0", "@langchain/textsplitters": "^0.1.0", "@lexical/react": "^0.32.1", + "@modelcontextprotocol/sdk": "^1.13.2", "@monaco-editor/react": "^4.7.0", "@openrouter/ai-sdk-provider": "0.7.2", "@opentelemetry/api": "^1.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 129dc77..d85d468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,6 +59,9 @@ importers: '@lexical/react': specifier: ^0.32.1 version: 0.32.1(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021)(yjs@13.6.27) + '@modelcontextprotocol/sdk': + specifier: ^1.13.2 + version: 1.13.2 '@monaco-editor/react': specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) @@ -256,7 +259,7 @@ importers: version: 0.446.0(react@19.0.0-rc-45804af1-20241021) mem0ai: specifier: ^2.1.30 - version: 2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250610.0)(@google/genai@1.4.0(@modelcontextprotocol/sdk@1.12.1)(bufferutil@4.0.9)(encoding@0.1.13))(@langchain/core@0.3.57(openai@4.104.0(encoding@0.1.13)(ws@8.18.2(bufferutil@4.0.9))(zod@3.24.2)))(@mistralai/mistralai@1.7.1(zod@3.24.2))(@qdrant/js-client-rest@1.13.0(typescript@5.8.2))(@supabase/supabase-js@2.50.0(bufferutil@4.0.9))(@types/jest@29.5.14)(@types/pg@8.11.6)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.0.0)(sqlite3@5.1.7)(ws@8.18.2(bufferutil@4.0.9)) + version: 2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250610.0)(@google/genai@1.4.0(@modelcontextprotocol/sdk@1.13.2)(bufferutil@4.0.9)(encoding@0.1.13))(@langchain/core@0.3.57(openai@4.104.0(encoding@0.1.13)(ws@8.18.2(bufferutil@4.0.9))(zod@3.24.2)))(@mistralai/mistralai@1.7.1(zod@3.24.2))(@qdrant/js-client-rest@1.13.0(typescript@5.8.2))(@supabase/supabase-js@2.50.0(bufferutil@4.0.9))(@types/jest@29.5.14)(@types/pg@8.11.6)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.0.0)(sqlite3@5.1.7)(ws@8.18.2(bufferutil@4.0.9)) monaco-editor: specifier: ^0.52.2 version: 0.52.2 @@ -2424,8 +2427,8 @@ packages: peerDependencies: zod: '>= 3' - '@modelcontextprotocol/sdk@1.12.1': - resolution: {integrity: sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw==} + '@modelcontextprotocol/sdk@1.13.2': + resolution: {integrity: sha512-Vx7qOcmoKkR3qhaQ9qf3GxiVKCEu+zfJddHv6x3dY/9P6+uIwJnmuAur5aB+4FDXf41rRrDnOEGkviX5oYZ67w==} engines: {node: '>=18'} '@monaco-editor/loader@1.5.0': @@ -10492,9 +10495,9 @@ snapshots: '@gar/promisify@1.1.3': optional: true - '@google/genai@1.4.0(@modelcontextprotocol/sdk@1.12.1)(bufferutil@4.0.9)(encoding@0.1.13)': + '@google/genai@1.4.0(@modelcontextprotocol/sdk@1.13.2)(bufferutil@4.0.9)(encoding@0.1.13)': dependencies: - '@modelcontextprotocol/sdk': 1.12.1 + '@modelcontextprotocol/sdk': 1.13.2 google-auth-library: 9.15.1(encoding@0.1.13) ws: 8.18.2(bufferutil@4.0.9) zod: 3.25.57 @@ -11063,7 +11066,7 @@ snapshots: zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) - '@modelcontextprotocol/sdk@1.12.1': + '@modelcontextprotocol/sdk@1.13.2': dependencies: ajv: 6.12.6 content-type: 1.0.5 @@ -15908,11 +15911,11 @@ snapshots: media-typer@1.1.0: {} - mem0ai@2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250610.0)(@google/genai@1.4.0(@modelcontextprotocol/sdk@1.12.1)(bufferutil@4.0.9)(encoding@0.1.13))(@langchain/core@0.3.57(openai@4.104.0(encoding@0.1.13)(ws@8.18.2(bufferutil@4.0.9))(zod@3.24.2)))(@mistralai/mistralai@1.7.1(zod@3.24.2))(@qdrant/js-client-rest@1.13.0(typescript@5.8.2))(@supabase/supabase-js@2.50.0(bufferutil@4.0.9))(@types/jest@29.5.14)(@types/pg@8.11.6)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.0.0)(sqlite3@5.1.7)(ws@8.18.2(bufferutil@4.0.9)): + mem0ai@2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250610.0)(@google/genai@1.4.0(@modelcontextprotocol/sdk@1.13.2)(bufferutil@4.0.9)(encoding@0.1.13))(@langchain/core@0.3.57(openai@4.104.0(encoding@0.1.13)(ws@8.18.2(bufferutil@4.0.9))(zod@3.24.2)))(@mistralai/mistralai@1.7.1(zod@3.24.2))(@qdrant/js-client-rest@1.13.0(typescript@5.8.2))(@supabase/supabase-js@2.50.0(bufferutil@4.0.9))(@types/jest@29.5.14)(@types/pg@8.11.6)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.0.0)(sqlite3@5.1.7)(ws@8.18.2(bufferutil@4.0.9)): dependencies: '@anthropic-ai/sdk': 0.40.1(encoding@0.1.13) '@cloudflare/workers-types': 4.20250610.0 - '@google/genai': 1.4.0(@modelcontextprotocol/sdk@1.12.1)(bufferutil@4.0.9)(encoding@0.1.13) + '@google/genai': 1.4.0(@modelcontextprotocol/sdk@1.13.2)(bufferutil@4.0.9)(encoding@0.1.13) '@langchain/core': 0.3.57(openai@4.104.0(encoding@0.1.13)(ws@8.18.2(bufferutil@4.0.9))(zod@3.24.2)) '@mistralai/mistralai': 1.7.1(zod@3.24.2) '@qdrant/js-client-rest': 1.13.0(typescript@5.8.2)