六、探索 Trae 技术实现-Trae 中集成自己MCP
什么是 mcp
MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。
mcp 与 Function Calling 的区别
Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使大模型与API无缝交互,而AI Agent是一个自主运行的智能系统,利用Function Calling和MCP来分析和执行任务,实现特定目标。
MCP 与 Function Calling 的区别:
- MCP(Model Context Protocol),模型上下文协议
- Function Calling,函数调用
- 这两种技术都旨在增强 AI 模型与外部数据的交互能力,但 MCP 不止可以增强 AI 模型,还可以是其他的应用系统。
MCP架构
MCP 采用客户端-服务器架构:
MCP 客户端(Client):通常是 AI 应用程序(如 Claude Desktop 或其他 LLM 工具),负责发起请求并与服务器通信。 MCP 服务器(Server):轻量级程序,负责暴露特定的数据源或工具功能,并通过标准化协议与客户端交互。 通信格式:基于 JSON-RPC 2.0,支持请求、响应和通知三种消息类型,确保通信的标准化和一致性。
MCP的关键组件
- 上下文管理:与传统API不同,MCP维护了一个丰富的动态上下文,该上下文在整个交互过程中不断发展。
- 工具定义:提供一种标准化的方式来描述和公开工具功能。
- 权限处理:为安全工具交互实现精细访问控制。
- 状态保存:跨复杂的多步骤交互跟踪和维护状态。
MCP如何增强AI工具集成
想象一下,我们在从事一个复杂的财务分析项目。使用传统工具,需要在不同的应用程序之间手动切换、复制粘贴数据并自己管理上下文。MCP通过创建一个智能、互联的生态系统来改变这种体验。
# MCP 工具定义示例:
const mcpToolDefinition = {
name: 'financial_analyzer',
description: 'Advanced financial data processing tool',
inputs: {
stockSymbol: 'string',
analysisType: 'enum[trend,volatility,prediction]'
},
permissions: {
read: ['stock_data'],
write: ['analysis_reports']
}
}
示例说明了MCP如何允许精确、结构化的工具定义。每个工具都成为一个定义良好、安全且可互操作的服务,可以与生态系统中的其他工具无缝通信。
MCP不仅仅是一个理论概念——它已经在改变开发人员使用AI助手的方式:
- Trae 实现更多上下文感知代码生成
- Trae 提供智能的、上下文感知的编码建议
- Trae 开发工作流优化:创建了解开发人员意图的无缝工具链
自定义 MCP Servers
先决条件:
- Node. js(v16.0.0或更高版本)
- npm(包管理器)
- TypeScript(推荐用于类型安全)
- Zod(用于输入验证)
1.项目初始化
mkdir mcp-server# Create project directory
mkdir mcp-node-server
cd mcp-node-server
# 初始化 npm 项目
npm init -y
# 安装所需依赖
npm install @anthropic-ai/sdk zod winston express
npm install -D typescript @types/node @types/express
2.配置TypeScript
目录中创建一个 tsconfig.json 文件, 设置TypeScript以代码编译到构建文件夹中:
// tsconfig.json
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"outDir": "./dist"
},
"include": ["src/**/*"]
}
3.核心MCP服务器实现
// src/mcpServer.ts
import express from 'express';
import { z } from 'zod';
// Tool Definition Schema
const ToolSchema = z.object({
name: z.string(),
description: z.string(),
execute: z.function()
});
class MCPServer {
private tools: Map<string, z.infer<typeof ToolSchema>> = new Map();
registerTool(tool: z.infer<typeof ToolSchema>) {
const validatedTool = ToolSchema.parse(tool);
this.tools.set(tool.name, validatedTool);
}
async executeTool(name: string, params: any) {
const tool = this.tools.get(name);
if (!tool) {
throw new Error(`Tool not found: ${name}`);
}
return tool.execute(params);
}
}
// Express Server Setup
const app = express();
const mcpServer = new MCPServer();
app.use(express.json());
app.post('/execute-tool', async (req, res) => {
try {
const { toolName, params } = req.body;
const result = await mcpServer.executeTool(toolName, params);
res.json({ success: true, result });
} catch (error) {
res.status(500).json({ success: false, error: error.message });
}
});
// 服务启动
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.info(`MCP Server running on port ${PORT}`);
});
4、MCP测试
为了验证您的MCP服务器,我们创建一个简单的工具检查器,帮助测试工具注册。
// 工具注册示例
mcpServer.registerTool({
name: 'price_calculator',
description: 'Calculate product pricing',
execute: async (params) => {
return { basePrice: params.basePrice * 1.2 };
}
});
测试策略:
- 验证检查:确保工具输入符合定义的模式
- 性能监控:跟踪工具执行时间
- 错误处理:捕获并记录工具执行中的错误
5、构建自定义MCP工具
自定义MCP工具是将通用服务器转变为强大的上下文感知开发生态系统。它们不仅仅是功能——它们是智能的、自描述的服务,可以在不同的人工智能平台上无缝交互。
6、使用zod进行高级工具定义
// 定义工具
import { z } from 'zod';
/**
* 使用Zod库定义严格的输入验证规则:
* - symbol: 股票代码(1-5个字符)
* - timeframe: 时间周期(日/周/月)
* - analysisType: 分析类型(趋势/波动率/预测)
* - confidenceLevel: 置信水平(0-1, 默认0.75)
*/
const StockAnalysisSchema = z.object({
symbol: z.string().min(1, 'Stock symbol required').max(5),
timeframe: z.enum(['daily', 'weekly', 'monthly']),
analysisType: z.enum(['trend', 'volatility', 'prediction']),
confidenceLevel: z.number().min(0).max(1).optional().default(0.75)
}).strict();
/**
* 定义MCP工具的标准结构:
* - name: 工具名称
* - description: 工具描述
* - permissions: 访问权限控制
* - execute: 核心执行方法
*/
const stockAnalysisTool = {
name: 'advanced_stock_analyzer',
description: 'Comprehensive stock market analysis tool',
permissions: {
read: ['market_data', 'historical_prices'],
write: ['analysis_reports']
},
/**
* 1. 使用Zod验证输入参数
* 2. 调用分析函数处理数据
* 3. 返回标准化结果或错误信息
*/
execute: async (input) => {
try {
// 验证输入参数是否符合Schema定义
const validatedInput = StockAnalysisSchema.parse(input);
// 执行股票分析逻辑
const analysisResult = await performStockAnalysis(validatedInput);
// 返回标准化成功响应
return {
status: 'success',
data: analysisResult,
metadata: {
processedAt: new Date(),
confidence: validatedInput.confidenceLevel
}
};
} catch (error) {
// 处理Zod验证错误
if (error instanceof z.ZodError) {
return {
status: 'validation_error',
errors: error.errors.map(err => ({
path: err.path.join('.'),
message: err.message
}))
};
}
// 其他类型错误直接抛出
throw error;
}
}
};
/**
* 执行股票分析(模拟实现)
* 根据输入参数生成模拟分析结果:
* - trend: 趋势分析(日线看涨,其他中性)
* - volatility: 随机波动率(0-100)
* - predictionConfidence: 基于置信水平的预测可信度
*/
async function performStockAnalysis(input) {
// 模拟复杂分析逻辑
return {
trend: input.timeframe === 'daily' ? 'bullish' : 'neutral',
volatility: Math.random() * 100,
predictionConfidence: input.confidenceLevel * 100
};
}
5、处理权限和安全性
有效的MCP工具需要强大的安全机制。这不仅仅是简单的权限改造——它是关于创建一个精细的、上下文感知的权限系统。
权限管理策略
- 基于角色的访问控制(RBAC)
- 上下文权限评估
- 动态权限范围
/**
* 权限管理中间件类
* 负责管理用户角色、工具权限,并提供权限验证功能
*/
class PermissionManager {
// 使用Map存储用户ID到角色列表的映射
private userRoles: Map<string, string[]> = new Map();
// 使用Map存储工具名称到所需权限列表的映射
private toolPermissions: Map<string, string[]> = new Map();
/**
* 注册用户角色
* @param userId 用户唯一标识
* @param roles 用户拥有的角色列表
*/
registerUserRole(userId: string, roles: string[]) {
this.userRoles.set(userId, roles);
}
/**
* 注册工具权限要求
* @param toolName 工具名称
* @param requiredPermissions 工具需要的权限列表
*/
registerToolPermissions(toolName: string, requiredPermissions: string[]) {
this.toolPermissions.set(toolName, requiredPermissions);
}
/**
* 检查用户是否有权限使用指定工具
* @param userId 用户ID
* @param toolName 工具名称
* @returns 是否有权限
*/
checkPermission(userId: string, toolName: string): boolean {
// 获取用户角色列表,默认为空数组
const userRoles = this.userRoles.get(userId) || [];
// 获取工具所需权限列表,默认为空数组
const requiredPermissions = this.toolPermissions.get(toolName) || [];
// 检查用户是否拥有所有所需权限
return requiredPermissions.every(permission =>
userRoles.some(role => this.hasPermissionForRole(role, permission))
);
}
/**
* 检查角色是否拥有特定权限
* @param role 角色名称
* @param permission 权限名称
* @returns 是否有权限
*/
private hasPermissionForRole(role: string, permission: string): boolean {
// 角色权限映射表
const rolePermissionMap = {
'admin': ['*'], // 管理员拥有所有权限
'developer': ['read_market_data', 'write_analysis'], // 开发者权限
'analyst': ['read_market_data'] // 分析师权限
};
// 检查角色是否有指定权限或通配符权限(*)
return rolePermissionMap[role]?.includes(permission) ||
rolePermissionMap[role]?.includes('*');
}
}
6、将MCP与AI助手集成
将 Trae 升级到最新版,使用 Trae 的 MCP 无缝集成时,MCP的真正力量就会显现出来。这种集成将开发工作流程从分散的体验转变为统一的智能生态系统。
如下图:
然后选择手动配置:
最后,我们在 Trae 的对话框中, 输入 @后选择 Builder With MCP