Skip to content

MCP 工具

MCP(Model Context Protocol,模型上下文协议)是 MyDeskBot 的扩展机制,允许连接到外部 MCP 服务器以获取额外的工具、资源和提示功能。

MCP 的工作原理

在 MyDeskBot 中,MCP 通过以下方法工作:

  1. 连接外部服务器:通过 stdio、HTTP 或 WebSocket 连接到 MCP 服务器
  2. 发现可用功能:自动发现服务器提供的工具、资源和提示
  3. AI 助手调用:AI 助手可以在对话中调用这些 MCP 功能
  4. 权限控制:每个连接独立配置以确保安全使用

配置文件位置

MCP 服务器配置位于您的 MyDeskBot 配置文件中:

yaml
# config.yaml
name: 我的 MyDeskBot 配置
version: 0.0.1
schema: v1

mcpServers:
  # MCP 服务器配置写在这里

连接类型

MyDeskBot 支持多种 MCP 服务器连接方法:

1. STDIO 连接(推荐用于本地工具)

yaml
mcpServers:
  - name: browser-automation
    command: npx
    args:
      - "@playwright/mcp@latest"
    env:
      NODE_ENV: production

2. HTTP/SSE 连接

yaml
mcpServers:
  - name: remote-api-server
    url: https://api.example.com/mcp
    type: sse
    apiKey: ${API_KEY}
    requestOptions:
      timeout: 30000
      headers:
        User-Agent: MyDeskBot/1.0

3. WebSocket 连接

yaml
mcpServers:
  - name: realtime-service
    url: wss://service.example.com/ws
    type: websocket
    apiKey: ${WEBSOCKET_KEY}

常用 MCP 服务器示例

1. 浏览器自动化工具

yaml
mcpServers:
  - name: browser-search
    command: npx
    args:
      - "@playwright/mcp@latest"

2. 文件系统增强

yaml
mcpServers:
  - name: filesystem-tools
    command: node
    args:
      - "./mcp-servers/filesystem-server.js"
    cwd: ${{ secrets.PROJECT_ROOT }}

3. 数据库连接

yaml
mcpServers:
  - name: database-tools
    command: python
    args:
      - "-m"
      - "mcp_database_server"
    env:
      DB_URL: postgresql://user:pass@localhost/mydb

在对话中使用

配置完成后,MCP 服务器功能在对话中自动可用:

示例对话 1:使用浏览器工具

用户

帮我打开百度首页并截取屏幕截图

AI 助手(自动调用 MCP 工具):

  1. 启动浏览器并访问百度首页
  2. 截取页面截图
  3. 保存到指定位置

示例对话 2:使用数据库工具

用户

查询用户表中有多少活跃用户

AI 助手(自动调用 MCP 数据库工具):

  1. 连接到数据库
  2. 执行查询:SELECT COUNT(*) FROM users WHERE status = 'active'
  3. 返回结果:当前有 523 个活跃用户

安全配置

1. 环境变量管理

MyDeskBot 使用双花括号格式来引用环境变量:

yaml
mcpServers:
  - name: secure-api
    url: https://api.example.com/mcp
    type: sse
    apiKey: ${{ secrets.API_SECRET_KEY }} # 从环境变量读取
    env:
      DEBUG: false

环境变量支持以下查找顺序:

  1. 用户存储的秘密
  2. 组织秘密
  3. 包秘密
  4. 本地 ~/.bytebuddy/.env 文件
  5. 工作区 .env 文件
  6. process.env(系统环境变量)

2. 连接超时配置

yaml
mcpServers:
  - name: timeout-example
    url: https://slow-api.example.com/mcp
    type: sse
    connectionTimeout: 60000 # 60 秒连接超时
    requestOptions:
      timeout: 120000 # 120 秒请求超时

3. 工作目录限制

yaml
mcpServers:
  - name: local-file-tools
    command: node
    args:
      - "./tools/file-server.js"
    cwd: /safe/workspace # 限制工作目录
    env:
      ALLOWED_PATHS: /safe/workspace
      SECRET_KEY: ${{ secrets.MY_SECRET_KEY }}

自定义 MCP 服务器

1. 创建 Node.js MCP 服务器

javascript
// custom-mcp-server.js
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server(
  {
    name: "custom-tools",
    version: "1.0.0",
  },
  {
    capabilities: {
      tools: {},
    },
  },
);

// 定义工具
server.setRequestHandler("tools/list", async () => ({
  tools: [
    {
      name: "get_weather",
      description: "获取指定城市的天气信息",
      inputSchema: {
        type: "object",
        properties: {
          city: {
            type: "string",
            description: "城市名称",
          },
        },
        required: ["city"],
      },
    },
  ],
}));

// 处理工具调用
server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "get_weather") {
    const { city } = request.params.arguments;
    // 在此处实现天气 API 调用逻辑
    return {
      content: [
        {
          type: "text",
          text: `${city} 当前天气:22°C,晴天`,
        },
      ],
    };
  }
});

// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);

2. 创建 Python MCP 服务器

python
# custom_mcp_server.py
import asyncio
from mcp.server import Server
from mcp.server.stdio import stdio_server

app = Server("custom-python-server")

@app.list_tools()
async def handle_list_tools():
    return [
        {
            "name": "calculate",
            "description": "执行数学计算",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "要计算的数学表达式",
                    },
                },
                "required": ["expression"],
            },
        }
    ]

@app.call_tool()
async def handle_call_tool(name: str, arguments: dict):
    if name == "calculate":
        expression = arguments["expression"]
        try:
            result = eval(expression)  # 注意:在生产环境中使用安全评估
            return {
                "content": [
                    {
                        "type": "text",
                        "text": f"结果:{result}",
                    }
                ]
            }
        except Exception as e:
            return {
                "content": [
                    {
                        "type": "text",
                        "text": f"错误:{str(e)}",
                    }
                ]
            }

async def main():
    async with stdio_server() as (read_stream, write_stream):
        await app.run(read_stream, write_stream)

if __name__ == "__main__":
    asyncio.run(main())

高级配置

1. 多服务器实例

yaml
mcpServers:
  - name: browser-automation
    command: npx
    args:
      - "@playwright/mcp@latest"
    env:
      BROWSER: chrome

  - name: filesystem-operations
    command: node
    args:
      - "./tools/filesystem-mcp.js"
    cwd: ${{ secrets.PROJECT_ROOT }}

  - name: remote-api-gateway
    url: https://api.gateway.com/mcp
    type: sse
    apiKey: ${{ secrets.GATEWAY_API_KEY }}

2. 条件服务器加载

yaml
mcpServers:
  - name: development-tools
    command: node
    args:
      - "./tools/dev-server.js"
    env:
      NODE_ENV: development
    # 仅在开发环境中启用
    disabled: ${{ secrets.ENVIRONMENT }} === "production"

3. 服务器健康检查

yaml
mcpServers:
  - name: critical-service
    url: https://critical.service.com/mcp
    type: sse
    apiKey: ${{ secrets.CRITICAL_API_KEY }}
    healthCheck:
      enabled: true
      interval: 30000 # 每 30 秒检查一次
      timeout: 5000 # 5 秒超时
      endpoint: /health

最佳实践

1. 安全考虑

  • 使用环境变量存储敏感信息
  • 限制文件系统访问的工作目录
  • 实施适当的身份验证和授权
  • 定期更新 MCP 服务器包

2. 性能优化

  • 为网络连接设置适当的超时
  • 对频繁访问的服务使用连接池
  • 监控服务器资源使用情况
  • 适当时缓存常用数据

3. 错误处理

  • 实现优雅的错误恢复
  • 提供有意义的错误消息
  • 记录错误以便调试
  • 设置监控和告警

故障排除

常见问题

连接失败

  1. 检查 MCP 服务器是否正在运行
  2. 验证连接参数(URL、API 密钥等)
  3. 检查网络连接
  4. 查看服务器日志中的错误消息

工具不可用

  1. 确保服务器实现了 tools/list 处理程序
  2. 检查工具是否正确注册
  3. 验证服务器能力配置
  4. 配置更改后重启 MyDeskBot

性能问题

  1. 检查服务器资源使用情况
  2. 优化网络请求
  3. 考虑缓存策略
  4. 审查超时配置

调试模式

启用调试模式以进行故障排除:

yaml
mcpServers:
  - name: debug-server
    command: node
    args:
      - "./tools/debug-server.js"
      - "--debug"
      - "--log-level=verbose"
    env:
      DEBUG: mcp:*

资源

通过正确的 MCP 配置,您可以显著扩展 MyDeskBot 的能力,并集成各种外部服务以创建更强大的 AI 助手。