Client 和 Server 的关系理解
client.py 和 server.py 是基于 MCP(Multi-Component Protocol)协议的客户端-服务端架构,二者的关系如下:
1. 角色分工
- server.py:服务端,负责注册和实现各种“工具函数”(如新闻检索、情感分析、邮件发送等),并通过 MCP 协议对外暴露这些工具,等待客户端调用。
- client.py:客户端,负责与用户交互,接收用户输入,将请求通过 MCP 协议发送给服务端,调用服务端的工具函数,并将结果返回给用户。
2. 通信方式
- 两者通过 MCP 协议(在你的代码中是 stdio 通道,即标准输入输出)进行通信。
- 客户端通过 MCP 的 ClientSession 和 stdio_client 连接到服务端,发送请求、接收响应。
3. 典型交互流程
- 服务端启动(server.py):
- 注册工具函数(如 search_google_news、analyze_sentiment、send_email_with_attachment)。
- 监听 MCP 通道,等待客户端请求。
- 客户端启动(client.py):
- 连接到服务端(通过 MCP 的 stdio 通道)。
- 获取服务端支持的工具列表。
- 用户输入问题,客户端根据问题和工具列表,自动规划调用哪些工具、以什么顺序调用。
- 客户端依次调用服务端的工具函数,收集结果。
- 客户端将最终结果展示给用户,并可保存为文件。
4. 代码中的具体体现
- server.py 通过 @mcp.tool() 装饰器注册工具,mcp.run(transport='stdio') 启动服务。
- client.py 通过 MCPClient 类的 connect_to_server 方法连接服务端,process_query 方法调用工具,plan_tool_usage 方法自动规划工具链。
5. 关系总结
- server.py 是“工具箱”,负责实现和暴露功能。
- client.py 是“指挥者”,负责与用户交互、调用工具箱里的功能,并把结果反馈给用户。
- 二者通过 MCP 协议(本例用 stdio 通道)实现解耦和灵活的工具链调用。