MCP概述
当不同的项目都需要接入同一个工具的时候,由于接口格式不统一,需要为每个服务定制解析逻辑、多平台兼容性差、模型侧需硬编码⼯具定义 (如函数名、参数 schema ) ,缺乏动态发现能⼒等问题,MCP(模型上下文协议)应运而生。

MCP不替代Tool Calling,二者的关系为:
Tool Calling是决策行为,模型决定"要不要调用工具"、"调用哪个工具"、"传什么参数"
MCP是"通信协议",规定"如何描述工具"、"如何发起调用"、"如何传递结果"、"如何管理会话状态"。

MCP是什么,更多参考: Model Context Protocol (MCP)
MCP传输方式
MCP主要支持客户端-服务器的通信传输机制。主要有两种方式:HTTP(streamable-http)与stdio。
自定义MCP服务器
我们要使用FastMCP来创建服务器。
HTTP
首先,在你的pycharm终端上输入"pip install fastmcp",然后,我们利用FastMCP创建服务器,填入的"Weather"是服务器名。接着,创建工具,最后,利用mcp.run来运行,填入参数transport是传输方式,后跟"streamable-http",再接port端口号(随便设就行)。

执行结果:

stdio
基本逻辑是相同的,只是在mcp.run的transport参数后跟"stdio"即可。

定义MCP客户端
首先,在终端里输入命令pip install langchain-mcp-adapters,我们要使用langchain-mcp-adapters让langchain Agent调用MCP服务器上定义的工具。
一、创建MultiServerMCPClient,配置多个服务器。
这里的"Math"与"Weather"是服务器名,参数的键transport,如果值为stdio,一个要有command,后跟python,表示python实现的,另一个要有args键,值为列表,列表内要有服务器的绝对路径。
如果值为streamable-http,只需要添加url就可以,这个服务器的url,就在刚才服务器的执行结果中。

二、调用client.get_tools()获取所有工具。这里由于是异步方法,前面要加await。
三、将工具传入create_agent。
由于是异步的,要通过asyncio.run(异步方法名())来执行结果。

执行前,要在两个服务器都在运行的基础上执行客户端,执行结果为:

有状态对话
默认情况下,MultiServerMCPClient是无状态的,每次调用工具都会创建一个新的MCPClientSession,执行完毕工具之后立即清理。
这里可以使用client.session()来创建持久的ClientSession,使用client.session(服务器名)配合load_mcp_tools加载工具。
