MCP 工具
MCP(Model Context Protocol,模型上下文协议)是 MyDeskBot 的扩展机制,允许连接到外部 MCP 服务器以获取额外的工具、资源和提示功能。
MCP 的工作原理
在 MyDeskBot 中,MCP 通过以下方法工作:
- 连接外部服务器:通过 stdio、HTTP 或 WebSocket 连接到 MCP 服务器
- 发现可用功能:自动发现服务器提供的工具、资源和提示
- AI 助手调用:AI 助手可以在对话中调用这些 MCP 功能
- 权限控制:每个连接独立配置以确保安全使用
配置文件位置
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: production2. 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.03. 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 工具):
- 启动浏览器并访问百度首页
- 截取页面截图
- 保存到指定位置
示例对话 2:使用数据库工具
用户:
查询用户表中有多少活跃用户
AI 助手(自动调用 MCP 数据库工具):
- 连接到数据库
- 执行查询:
SELECT COUNT(*) FROM users WHERE status = 'active' - 返回结果:当前有 523 个活跃用户
安全配置
1. 环境变量管理
MyDeskBot 使用双花括号格式来引用环境变量:
yaml
mcpServers:
- name: secure-api
url: https://api.example.com/mcp
type: sse
apiKey: ${{ secrets.API_SECRET_KEY }} # 从环境变量读取
env:
DEBUG: false环境变量支持以下查找顺序:
- 用户存储的秘密
- 组织秘密
- 包秘密
- 本地
~/.bytebuddy/.env文件 - 工作区
.env文件 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. 错误处理
- 实现优雅的错误恢复
- 提供有意义的错误消息
- 记录错误以便调试
- 设置监控和告警
故障排除
常见问题
连接失败
- 检查 MCP 服务器是否正在运行
- 验证连接参数(URL、API 密钥等)
- 检查网络连接
- 查看服务器日志中的错误消息
工具不可用
- 确保服务器实现了 tools/list 处理程序
- 检查工具是否正确注册
- 验证服务器能力配置
- 配置更改后重启 MyDeskBot
性能问题
- 检查服务器资源使用情况
- 优化网络请求
- 考虑缓存策略
- 审查超时配置
调试模式
启用调试模式以进行故障排除:
yaml
mcpServers:
- name: debug-server
command: node
args:
- "./tools/debug-server.js"
- "--debug"
- "--log-level=verbose"
env:
DEBUG: mcp:*资源
通过正确的 MCP 配置,您可以显著扩展 MyDeskBot 的能力,并集成各种外部服务以创建更强大的 AI 助手。