diff --git a/src/main/services/MCPService.ts b/src/main/services/MCPService.ts index 3cb78488..21a518aa 100644 --- a/src/main/services/MCPService.ts +++ b/src/main/services/MCPService.ts @@ -5,7 +5,7 @@ import { isLinux, isMac, isWin } from '@main/constant' import { getBinaryName, getBinaryPath } from '@main/utils/process' import { Client } from '@modelcontextprotocol/sdk/client/index.js' import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js' -import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js' +import { getDefaultEnvironment, StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js' import { nanoid } from '@reduxjs/toolkit' import { MCPServer, MCPTool } from '@types' import { app } from 'electron' @@ -69,13 +69,8 @@ class McpService { } else if (server.command) { let cmd = server.command - if (server.command === 'npx') { + if (server.command === 'npx' || server.command === 'bun' || server.command === 'bunx') { cmd = await getBinaryPath('bun') - - if (cmd === 'bun') { - cmd = 'npx' - } - Logger.info(`[MCP] Using command: ${cmd}`) // add -x to args if args exist @@ -83,25 +78,20 @@ class McpService { if (!args.includes('-y')) { !args.includes('-y') && args.unshift('-y') } - if (cmd.includes('bun') && !args.includes('x')) { + if (!args.includes('x')) { args.unshift('x') } } - } - if (server.command === 'uvx') { - cmd = await getBinaryPath('uvx') - } - - Logger.info(`[MCP] Starting server with command: ${cmd} ${args ? args.join(' ') : ''}`) - - if (server.registryUrl) { - if (cmd.includes('npx') || cmd.includes('bun') || cmd.includes('bunx')) { + if (server.registryUrl) { server.env = { ...server.env, NPM_CONFIG_REGISTRY: server.registryUrl } - } else if (cmd.includes('uvx') || cmd.includes('uv')) { + } + } else if (server.command === 'uvx' || server.command === 'uv') { + cmd = await getBinaryPath(server.command) + if (server.registryUrl) { server.env = { ...server.env, UV_DEFAULT_INDEX: server.registryUrl, @@ -110,12 +100,14 @@ class McpService { } } + Logger.info(`[MCP] Starting server with command: ${cmd} ${args ? args.join(' ') : ''}`) // Logger.info(`[MCP] Environment variables for server:`, server.env) transport = new StdioClientTransport({ command: cmd, args, env: { + ...getDefaultEnvironment(), PATH: this.getEnhancedPath(process.env.PATH || ''), ...server.env } @@ -251,6 +243,7 @@ class McpService { `${homeDir}/.npm-global/bin`, `${homeDir}/.yarn/bin`, `${homeDir}/.cargo/bin`, + `${homeDir}/.cherrystudio/bin`, '/opt/local/bin' ) } @@ -264,12 +257,18 @@ class McpService { `${homeDir}/.npm-global/bin`, `${homeDir}/.yarn/bin`, `${homeDir}/.cargo/bin`, + `${homeDir}/.cherrystudio/bin`, '/snap/bin' ) } if (isWin) { - newPaths.push(`${process.env.APPDATA}\\npm`, `${homeDir}\\AppData\\Local\\Yarn\\bin`, `${homeDir}\\.cargo\\bin`) + newPaths.push( + `${process.env.APPDATA}\\npm`, + `${homeDir}\\AppData\\Local\\Yarn\\bin`, + `${homeDir}\\.cargo\\bin`, + `${homeDir}\\.cherrystudio\\bin` + ) } // 只添加不存在的路径 diff --git a/src/renderer/src/hooks/useMCPServers.ts b/src/renderer/src/hooks/useMCPServers.ts index 553df561..65bc729d 100644 --- a/src/renderer/src/hooks/useMCPServers.ts +++ b/src/renderer/src/hooks/useMCPServers.ts @@ -11,7 +11,7 @@ ipcRenderer.on('mcp:servers-changed', (_event, servers) => { export const useMCPServers = () => { const mcpServers = useAppSelector((state) => state.mcp.servers) - const activedMcpServers = useAppSelector((state) => state.mcp.servers?.filter((server) => server.isActive)) + const activedMcpServers = mcpServers.filter((server) => server.isActive) const dispatch = useAppDispatch() return {