Skip to content

Commit fb3c8e5

Browse files
committed
feat(mcp): 重构MCP模块并添加OAuth认证支持
重构MCP模块架构,移除旧配置系统,引入新的项目级配置管理 添加OAuth 2.0认证支持,包括令牌存储和自动刷新功能 实现健康监控系统,支持周期性检查和自动重连 扩展MCP命令行工具,支持服务器管理和项目配置 添加.mcp.json项目配置加载器,支持交互式确认
1 parent 647ae4c commit fb3c8e5

19 files changed

Lines changed: 3226 additions & 775 deletions

docs/MCP_IMPROVEMENTS.md

Lines changed: 445 additions & 0 deletions
Large diffs are not rendered by default.

docs/development/planning/MCP_IMPLEMENTATION_PLAN.md

Lines changed: 772 additions & 0 deletions
Large diffs are not rendered by default.

src/agent/Agent.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import { ExecutionPipeline } from '../tools/execution/ExecutionPipeline.js';
3636
import { ToolRegistry } from '../tools/registry/ToolRegistry.js';
3737
import type { Tool, ToolResult } from '../tools/types/index.js';
3838
import { getEnvironmentContext } from '../utils/environment.js';
39+
import { loadProjectMcpConfig } from '../mcp/loadProjectMcpConfig.js';
40+
import { McpRegistry } from '../mcp/McpRegistry.js';
3941
import { ExecutionEngine } from './ExecutionEngine.js';
4042
import {
4143
type LoopDetectionConfig,
@@ -1254,9 +1256,67 @@ export class Agent extends EventEmitter {
12541256
.join(', ')}`
12551257
);
12561258
this.emit('toolsRegistered', builtinTools);
1259+
1260+
// 注册 MCP 工具
1261+
await this.registerMcpTools();
12571262
} catch (error) {
12581263
logger.error('Failed to register builtin tools:', error);
12591264
throw error;
12601265
}
12611266
}
1267+
1268+
/**
1269+
* 注册 MCP 工具
1270+
*/
1271+
private async registerMcpTools(): Promise<void> {
1272+
try {
1273+
// 1. 加载 .mcp.json(如果存在)
1274+
const loadedFromMcpJson = await loadProjectMcpConfig({
1275+
interactive: false, // Agent 初始化时不启用交互
1276+
silent: true, // 静默模式
1277+
});
1278+
1279+
if (loadedFromMcpJson > 0) {
1280+
logger.debug(`✅ Loaded ${loadedFromMcpJson} servers from .mcp.json`);
1281+
}
1282+
1283+
// 2. 获取所有 MCP 服务器配置
1284+
const configManager = ConfigManager.getInstance();
1285+
const mcpServers = await configManager.getMcpServers();
1286+
1287+
if (Object.keys(mcpServers).length === 0) {
1288+
logger.debug('📦 No MCP servers configured');
1289+
return;
1290+
}
1291+
1292+
// 3. 连接所有 MCP 服务器并注册工具
1293+
const registry = McpRegistry.getInstance();
1294+
1295+
for (const [name, config] of Object.entries(mcpServers)) {
1296+
try {
1297+
logger.debug(`🔌 Connecting to MCP server: ${name}`);
1298+
await registry.registerServer(name, config);
1299+
logger.debug(`✅ MCP server "${name}" connected`);
1300+
} catch (error) {
1301+
logger.warn(`⚠️ MCP server "${name}" connection failed:`, error);
1302+
// 继续处理其他服务器,不抛出错误
1303+
}
1304+
}
1305+
1306+
// 4. 获取所有 MCP 工具(包含冲突处理)
1307+
const mcpTools = await registry.getAvailableTools();
1308+
1309+
if (mcpTools.length > 0) {
1310+
// 5. 注册到工具注册表
1311+
this.executionPipeline.getRegistry().registerAll(mcpTools);
1312+
logger.debug(`✅ Registered ${mcpTools.length} MCP tools`);
1313+
logger.debug(
1314+
`[MCP Tools] ${mcpTools.map((t) => t.name).join(', ')}`
1315+
);
1316+
}
1317+
} catch (error) {
1318+
logger.warn('Failed to register MCP tools:', error);
1319+
// 不抛出错误,允许 Agent 继续初始化
1320+
}
1321+
}
12621322
}

0 commit comments

Comments
 (0)