1. 相关总结
总结内容 | 链接 |
---|---|
MCP之大模型Function Calling开发与原理 | https://blog.csdn.net/a82514921/article/details/147860120 |
MCP概念与server开发及调试-使用Python+SSE传输机制 | https://blog.csdn.net/a82514921/article/details/147860221 |
MCP client开发与日志分析-使用Python+SSE传输机制 | https://blog.csdn.net/a82514921/article/details/147860518 |
MCP细节与原理分析-使用Python+SSE传输机制 | https://blog.csdn.net/a82514921/article/details/147860541 |
MCP server支持在不同Python脚本中实现工具方法 | https://blog.csdn.net/a82514921/article/details/147860559 |
MCP client支持同时连接多个MCP server-使用Python开发 | https://blog.csdn.net/a82514921/article/details/147860587 |
2. 前言
MCP 提供的 Python SDK 开发的 server 代码示例使用@mcp.tool 方式注册工具,这种方式支持在当前 Python 脚本中注册工具
在实际开发过程中,可能需要使用多个 Python 脚本实现 MCP server 工具,可参考以下方式实现
3. 实现方式
3.1. 代码示例
以下示例代码可参考 https://github.com/Adrninistrator/MCP-DEMO
在主 Python 文件中创建 mcp.server.fastmcp.server.FastMCP 对象,并调用 run 方法启动
mcp = FastMCP(name="high_speed_railQuerySystem",
host="0.0.0.0",
port=8000,
sse_path="/sse",
message_path="/messages/")
mcpServer1A: MCPServer1A = MCPServer1A(mcp)
mcpServer1A.initialize()
mcpServer1B: MCPServer1B = MCPServer1B(mcp)
mcpServer1B.initialize()
if __name__ == "__main__":
MCPClientBase.init_logger(__file__)
MCPClientBase.set_sse_server_log_level()
mcp.run(transport="sse")
在其他多个 Python 文件中分别实现工具方法
class MCPServer1A:
def __init__(self, mcp: FastMCP):
self.mcp = mcp
def initialize(self):
self.mcp.add_tool(self.get_all_lines, name="get_all_lines",
description="获取所有高铁线路编号,需要首先调用当前接口")
self.mcp.add_tool(self.query_stations, description="根据高铁线路编号查询起始站点名称,可用于判断指定线路是否能从某个站点到达另一个站点")
def get_all_lines(self) -> list:
return railway_data.get_all_lines()
def query_stations(self, line_name: str = Field(..., description="高铁线路编号如 G1/G2")) -> Dict:
return railway_data.query_stations(line_name)
class MCPServer1B:
def __init__(self, mcp: FastMCP):
self.mcp = mcp
def initialize(self):
self.mcp.add_tool(self.query_duration, description="根据高铁线路编号查询运行时长")
self.mcp.add_tool(self.query_ticket_price, description="根据高铁线路编号查询最低票价")
def query_duration(self, line_name_request: LineNameRequest1 = Field(..., description="高铁线路编号请求类 1")) -> Dict:
return railway_data.query_duration(line_name_request)
def query_ticket_price(self, line_name_request: LineNameRequest2 = Field(..., description="高铁线路编号请求类 2")) -> Dict:
return railway_data.query_ticket_price(line_name_request)
3.2. 实现说明
@mcp.tool 对应的方法为 mcp.server.fastmcp.server.FastMCP.tool(),该方法会调用 mcp.server.fastmcp.server.FastMCP.add_tool() 方法
add_tool() 方法用于添加工具,与 tool() 方法的参数一致
因此可以将调用@mcp.tool 添加工具的方法修改为调用 add_tool() 方法
在其他需要创建 MCP 工具的类(mcp_demo.server_sse.server_sse_multi_part_1_a.MCPServer1A、mcp_demo.server_sse.server_sse_multi_part_1_b.MCPServer1B)的构造函数中接收 FastMCP 对象,并提供(initialize)初始化方法,用于调用 FastMCP 对象实例的 add_tool() 方法创建工具
首先在主 Python 文件中创建好 mcp.server.fastmcp.server.FastMCP 对象
再在主 Python 文件中创建以上其他类的实例,并调用初始化方法,以创建工具