diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index fa412c55ba..f09ce39536 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -1126,7 +1126,7 @@ const migrateConfig = { '88': (state: RootState) => { try { if (state?.mcp?.servers) { - const hasAutoInstall = state.mcp.servers.some((server) => server.name === 'mcp-auto-install') + const hasAutoInstall = state.mcp.servers.some((server) => server.name === '@cherry/mcp-auto-install') if (!hasAutoInstall) { const defaultServer = mcpSlice.getInitialState().servers[0] state.mcp.servers = [{ ...defaultServer, id: nanoid() }, ...state.mcp.servers] diff --git a/src/renderer/src/utils/mcp-tools.ts b/src/renderer/src/utils/mcp-tools.ts index 95495b7d45..4a8987b143 100644 --- a/src/renderer/src/utils/mcp-tools.ts +++ b/src/renderer/src/utils/mcp-tools.ts @@ -2,14 +2,18 @@ import { ContentBlockParam, ToolUnion, ToolUseBlock } from '@anthropic-ai/sdk/re import { MessageParam } from '@anthropic-ai/sdk/resources' import { Content, FunctionCall, Part } from '@google/genai' import store from '@renderer/store' +import { addMCPServer } from '@renderer/store/mcp' import { MCPCallToolResponse, MCPServer, MCPTool, MCPToolResponse } from '@renderer/types' import type { MCPToolCompleteChunk, MCPToolInProgressChunk } from '@renderer/types/chunk' import { ChunkType } from '@renderer/types/chunk' +import { nanoid } from 'nanoid' import OpenAI from 'openai' import { ChatCompletionContentPart, ChatCompletionMessageParam, ChatCompletionMessageToolCall } from 'openai/resources' import { CompletionsParams } from '../providers/AiProvider' +const MCP_AUTO_INSTALL_SERVER_NAME = '@cherry/mcp-auto-install' + // const ensureValidSchema = (obj: Record) => { // // Filter out unsupported keys for Gemini // const filteredObj = filterUnsupportedKeys(obj) @@ -219,6 +223,23 @@ export async function callMCPTool(tool: MCPTool): Promise { name: tool.name, args: tool.inputSchema }) + if (tool.serverName === MCP_AUTO_INSTALL_SERVER_NAME) { + if (resp.data) { + const mcpServer: MCPServer = { + id: `f${nanoid()}`, + name: resp.data.name, + description: resp.data.description, + baseUrl: resp.data.baseUrl, + command: resp.data.command, + args: resp.data.args, + env: resp.data.env, + registryUrl: '', + isActive: false, + provider: 'CherryAI' + } + store.dispatch(addMCPServer(mcpServer)) + } + } console.log(`[MCP] Tool called: ${tool.serverName} ${tool.name}`, resp) return resp