六、探索 Trae 技术实现-Trae 中集成自己MCP

2,097 阅读7分钟

六、探索 Trae 技术实现-Trae 中集成自己MCP

什么是 mcp

MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。

mcp

mcp

mcp 与 Function Calling 的区别

Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使大模型与API无缝交互,而AI Agent是一个自主运行的智能系统,利用Function Calling和MCP来分析和执行任务,实现特定目标。

function call

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,支持请求、响应和通知三种消息类型,确保通信的标准化和一致性。

image.png

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 MCP

然后选择手动配置:

Trae MCP

最后,我们在 Trae 的对话框中, 输入 @后选择 Builder With MCP

Builder With MCP

相关文章