MCP(Model Context Protocol) 是由 Anthropic 推出的开源协议,旨在为大型语言模型(LLM)提供安全、可解释、可扩展的外部数据与工具集成方案。
1. 背景与动机:MCP 的意义何在?
在基于大语言模型构建应用时,一个核心痛点是 数据与工具的接入困难。模型虽然能力强大,但通常处于“沙盒”状态,无法直接访问外部环境。
为此,RAG(检索增强生成)、微调、插件等方案陆续诞生。而 MCP 的目标正是统一接口协议,以便标准化集成上下文、工具、服务与数据源。

相关资料
参考文章:
-
MCP、Function Calling 有什么区别?与 AI Agent 有什么关系? -
【转载】MCP(Model Context Protocol)全面研究报告:概念、实践与未来趋势 -
Cline 55k 系统提示词刷新了我对提示词工程的认知
✅ MCP 的愿景
-
提供标准协议:简化 LLM与外部系统的通信 -
安全可扩展:支持权限管理、细粒度访问控制 -
模块化生态:建立社区驱动的“ AI工具市场”
可以将
MCP看作AI世界的“软件版USB-C”。

官方资源:
-
MCP协议简介:https://modelcontext.org/ -
GitHub示例项目:https://github.com/modelcontextprotocol/servers
2. 如何用 LangChain 集成 MCP?
本节将通过实操演示,介绍如何将
LangChain与MCP工具集成,打造一个拥有算术能力的AI智能体。
注意:示例来自https://github.com/langchain-ai/langchain-mcp-adapters。
准备步骤概览:
| 步骤 | 内容 |
|---|---|
|
|
Python 虚拟环境 |
|
|
|
|
|
MCP Server(数学工具) |
|
|
LangChain 智能体 |
|
|
|
3. 环境准备与依赖安装
创建虚拟环境
python3 -m venv MCP_Demosource MCP_Demo/bin/activate
安装依赖:
pip install langchain-mcp-adapters langgraph langchain-openaiexport OPENAI_API_KEY=<your_api_key>
请将文本<your_api_key> 替换为您的OpenAI API密钥。
4. 编写 MCP Server(数学计算工具)
创建 math_server.py 文件:
from mcp.server.fastmcp import FastMCPmcp = FastMCP("Math")def add(a: int, b: int) -> int:return a + bdef multiply(a: int, b: int) -> int:return a * bif __name__ == "__main__":mcp.run(transport="stdio")
运行服务器:
python3 math_server.py
5. 编写客户端(集成 LangGraph 智能体)
创建 client.py:
from mcp import ClientSession, StdioServerParametersfrom mcp.client.stdio import stdio_clientfrom langchain_mcp_adapters.tools import load_mcp_toolsfrom langgraph.prebuilt import create_react_agentfrom langchain_openai import ChatOpenAIimport asynciomodel = ChatOpenAI(model="gpt-4o")server_params = StdioServerParameters(command="python",args=["math_server.py"], # 替换为绝对路径)async def run_agent():async with stdio_client(server_params) as (read, write):async with ClientSession(read, write) as session:await session.initialize()tools = await load_mcp_tools(session)agent = create_react_agent(model, tools)result = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})return resultif __name__ == "__main__":print(asyncio.run(run_agent()))
运行客户端:
python3 client.py
6. 消息交互流程解析
完整消息
客户端输出如下:
{'messages': [# 1. 用户原始提问HumanMessage(content="what's (3 + 5) x 12?",id='87a8b6b6-...', # 消息唯一标识metadata={...}),# 2. AI首次响应(工具调用)AIMessage(content='',tool_calls=[{'name': 'add', # 第一个工具调用:加法'args': {'a':3, 'b':5}, # 参数'id': 'call_1eyRzR...' # 工具调用ID},{'name': 'multiply', # 第二个工具调用:乘法'args': {'a':8, 'b':12},'id': 'call_q82CX...'}],token_usage={...}, # 本次调用的Token消耗finish_reason='tool_calls' # 终止原因:触发了工具调用),# 3. 工具执行结果返回ToolMessage(content='8', # add工具的执行结果name='add', # 对应工具名称tool_call_id='call_1eyRzR...' # 关联的工具调用ID),ToolMessage(content='96', # multiply工具的执行结果name='multiply',tool_call_id='call_q82CX...'),# 4. AI最终响应AIMessage(content='content=‘The result of (3 + 5) × 12 is 96.', # 最终自然语言答案finish_reason='stop', # 正常终止token_usage={ # 总Token消耗'input_tokens': 143,'output_tokens': 22,'total_tokens': 165})]}
执行流程说明
-
用户输入阶段
-
HumanMessage记录原始问题:"3加5乘12等于多少?" -
包含元数据:消息 ID、响应元数据等
-
AI推理阶段
-
第一步调用 add工具计算3+5 -
第二步调用 multiply工具计算8x12 -
AIMessage显示分步思考过程: -
finish_reason: tool_calls表示需要等待工具执行结果 -
工具执行阶段
-
add工具返回8(对应3+5) -
multiply工具返回96(对应8×12) -
ToolMessage包含工具执行结果: -
每个结果都通过 tool_call_id关联到对应的工具调用请求 -
最终响应阶段
-
新的 AIMessage生成自然语言答案 -
使用LaTeX格式展示数学表达式: -
finish_reason: stop表示正常结束 -
✅ 标准化接入:无需为每种数据源编写专属适配器 -
✅ 模块化复用:工具作为可组合单元,多智能体可复用 -
✅ 提升智能体能力:突破“模型只能聊天”的边界 -
✅ 安全可控:客户端-服务端通信可附带权限控制
7. 元数据与性能指标分析
关键字段说明
| 字段 | 说明 |
|---|---|
token_usage |
|
system_fingerprint |
|
tool_call_id |
|
finish_reason |
|
Token 使用情况示例:
| 阶段 | 输入
|
输出令牌 | 总计 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
| 总计 |
|
|
|


