高级MCP(服务器和客户端)实践任务
使用MCP(模型上下文协议)工具和MCP服务器/客户端架构构建AI代理的Python实现。
🎯 任务概述
使用自定义工具创建并运行MCP服务器,然后使用MCP客户端实现AI代理,该代理利用创建的服务器中的工具。此任务演示了从服务器实现到客户端集成的完整MCP工作流程。
🎓 学习目标
通过完成这个项目,你将学习:
- MCP协议实现:了解模型上下文协议规范和JSON-RPC通信
- 服务器端工具开发:创建符合MCP标准的自定义工具
- 客户端集成:将AI代理连接到MCP服务器并处理工具执行
- 会话管理:实施适当的会话处理和状态管理
- 流媒体响应:使用服务器发送事件(SSE)进行实时通信
- 错误处理:在分布式系统中实施稳健的错误处理
🏗️ 建筑
├── agent/ # MCP Client Implementation
│ ├── clients/
│ │ ├── custom_mcp_client.py 🚧 TODO: Pure Python MCP client
│ │ ├── mcp_client.py ✅ Complete: Framework-based client
│ │ └── dial_client.py ✅ Complete: AI model integration
│ ├── models/
│ │ └── message.py ✅ Complete: Message structures
│ └── app.py 🚧 TODO: Test it with MCPClient and CustomMCPClient
└── mcp_server/ # MCP Server Implementation
├── models/
│ ├── request.py ✅ Complete: Request model
│ └── response.py ✅ Complete: Response model
├── services/
│ └── mcp_server.py 🚧 TODO: Implement core server logic
├── tools/
│ ├── base.py ✅ Complete: Abstract tool interface
│ ├── create_user_tool.py 🚧 TODO: Implement web search tool
│ ├── delete_user_tool.py 🚧 TODO: Implement web search tool
│ ├── update_user_tool.py 🚧 TODO: Implement web search tool
│ ├── get_user_by_id_tool.py 🚧 TODO: Implement web search tool
│ └── search_users.py 🚧 TODO: Implement web search tool
└── server.py 🚧 TODO: Implement FastAPI server📋 需求
- python:3.11或更高
- 依赖项:列在
requirements.txt - API访问:具有适当权限的DIAL API密钥
- 网络:用于内部API访问的EPAM VPN连接
- 可选的:API测试邮差
🔧 安装说明
- 创建虚拟环境
python -m venv .venv- 再进行
pip install -r requirements.txt- 环境变量
DIAL_API_KEY=您的_DIAL_API_KEY
获取DIAL API密钥:
- 连接到EPAM VPN
- 访问:https://support.epam.com/ess?id=sc_cat_item&table=sc_cat_item&sys_id=910603f1c3789e907509583bb001310c
- 按照说明获取API密钥
______________________________________________________________________
🚀 任务:
如果主分支中的任务对你来说很难,那么切换到 with-detailed-description 分支
创建MCP服务器:
- 跑
- 打开 mcp服务器 并回顾mcp服务器结构:
- 在 模型 持久化已实现的请求和响应模型,请求和响应的详细信息 官方文件 - 在 服务/mcp_server.py 您需要实现中描述的部分 TODO 章节 - 在 工具 你会发现简单的工具 - 最后,in 服务器.py 提供中描述的实现 TODO 章节
- 在本地运行MCP服务器
- 用Postman测试一下。导入 mcp.postman_collection.json 成为邮递员。 (
init->init-notification->tools/list->tools/call) - 打开 agent/app.py 并使用MCPClient在本地运行它并实现它
- 测试代理有以下疑问👇
- 提供中所述的实现
TODO部分为 custom_mcp_client.py - 使用以下查询再次测试代理👇
Check if Arkadiy Dobkin present as a user, if not then search info about him in the web and add him______________________________________________________________________
🔍 MCP协议详细信息
JSON-RPC结构
请求格式:
{
"jsonrpc": "2.0",
"id": "unique-request-id",
"method": "method_name",
"params": {
"parameter": "value"
}
}响应格式:
{
"jsonrpc": "2.0",
"id": "matching-request-id",
"result": {
"data": "response_data"
}
}MCP会话流
- 初始化:客户端发送
initialize请求 - 通知:客户端发送
notifications/initialized - 发现:客户电话
tools/list获取可用工具 - 行动:客户电话
tools/call使用特定的工具和论据 - 关机:
DELETE, {host}, Mcp-Session-Id: {Mcp-Session-Id},关机不在本实践中,但它是简单的REST请求
标头
Content-Type:application/jsonAccept:application/json, text/event-streamMcp-Session-Id:会话标识符(初始化后)
🎯 实施技巧
自定义MCP客户端实现
- 错误处理:始终检查HTTP会话初始化
- 会话管理:正确存储和重用会话ID
- SSE解析:寻找
data:前缀行,忽略[DONE] - JSON-RPC错误:检查
error响应中的字段 - 内容提取:工具结果在
result.content[0].text
常见问题
- 缺少接受标头:服务器需要JSON和SSE接受类型
- 会话ID丢失:大多数操作都需要有效的会话ID
- 工具参数:参数必须按照工具架构正确格式化
- 异步上下文:对HTTP请求使用适当的异步/等待模式
📚 额外资源
______________________________________________________________________
#
