From 027ef17a2ecb8d59384bb79cdd05db42c0c078d1 Mon Sep 17 00:00:00 2001 From: Vaayne Date: Fri, 19 Sep 2025 21:51:33 +0800 Subject: [PATCH] feat(agents): enhance ClaudeCodeService to support MCP configurations and additional directories --- .../agents/services/claudecode/index.ts | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/services/agents/services/claudecode/index.ts b/src/main/services/agents/services/claudecode/index.ts index 42ac0747e6..7e76c5417f 100644 --- a/src/main/services/agents/services/claudecode/index.ts +++ b/src/main/services/agents/services/claudecode/index.ts @@ -2,9 +2,9 @@ import { EventEmitter } from 'node:events' import { createRequire } from 'node:module' -import { Options, query, SDKMessage } from '@anthropic-ai/claude-code' +import { McpHttpServerConfig, Options, query, SDKMessage } from '@anthropic-ai/claude-code' import { loggerService } from '@logger' -// import { config as apiConfig } from '@main/apiServer/config' +import { config as apiConfigService } from '@main/apiServer/config' import { validateModelId } from '@main/apiServer/utils' import { GetAgentSessionResponse } from '../..' @@ -68,9 +68,9 @@ class ClaudeCodeService implements AgentServiceInterface { } // TODO: use cherry studio api server config instead of direct provider config to provide more flexibility (e.g. custom headers, proxy, statistics, etc). - // const cfg = await apiConfig.get() - // process.env.ANTHROPIC_AUTH_TOKEN = cfg.apiKey - // process.env.ANTHROPIC_BASE_URL = `http://${cfg.host}:${cfg.port}` + const apiConfig = await apiConfigService.get() + // process.env.ANTHROPIC_AUTH_TOKEN = apiConfig.apiKey + // process.env.ANTHROPIC_BASE_URL = `http://${apiConfig.host}:${apiConfig.port}` process.env.ANTHROPIC_AUTH_TOKEN = modelInfo.provider.apiKey process.env.ANTHROPIC_BASE_URL = modelInfo.provider.apiHost @@ -81,10 +81,31 @@ class ClaudeCodeService implements AgentServiceInterface { stderr: (chunk: string) => { logger.info('claude stderr', { chunk }) }, + appendSystemPrompt: session.instructions, permissionMode: session.configuration?.permission_mode, maxTurns: session.configuration?.max_turns } + if (session.accessible_paths.length > 1) { + options.additionalDirectories = session.accessible_paths.slice(1) + } + + if (session.mcps && session.mcps.length > 0) { + // mcp configs + const mcpList: Record = {} + for (const mcpId of session.mcps) { + mcpList[mcpId] = { + type: 'http', + url: `http://${apiConfig.host}:${apiConfig.port}/v1/mcps/${mcpId}/mcp`, + headers: { + Authorization: `Bearer ${apiConfig.apiKey}` + } + } + } + options.mcpServers = mcpList + options.strictMcpConfig = true + } + if (lastAgentSessionId) { options.resume = lastAgentSessionId }