MCP (Model Context Protocol):AI应用连接外部世界的标准协议
随着大语言模型能力的不断增强,AI应用已不再局限于纯粹的文本对话,而是需要与外部世界进行深度交互------读写文件、查询数据库、调用第三方API、搜索网页等。然而,让AI应用对接外部系统一直是一个工程难题:每个服务接口不同、工具定义重复、集成成本高昂。
MCP(Model Context Protocol)的出现,正是为了系统性地解决这一问题。
1. 什么是MCP
MCP是由Anthropic于2024年底推出的开放标准协议,旨在为AI应用与外部系统之间提供统一的交互规范。
在MCP出现之前,开发者必须为每个外部服务手动定义Tool------编写函数签名、参数描述、调用逻辑等。这种方式存在两个核心痛点:
- 复用性差:不同Agent可能需要同样的工具(如文件操作、天气查询),但每次都需重复定义。
- 集成成本高:全球有数以万计的服务,接口各异,逐一适配工作量巨大。
MCP的角色可以类比为AI世界的USB接口协议:
- 服务提供方遵循MCP协议封装并发布自己的工具服务。
- AI应用方基于MCP协议直接对接任何兼容的外部服务,无需手动定义Tool。
这一设计从根本上解决了工具复用和服务集成的问题。
2. 核心概念
MCP的架构由三个核心角色组成:
| 概念 | 说明 |
|---|---|
| MCP Server | 提供工具服务的应用,可以是远程服务,也可以是本地服务 |
| MCP Client | 连接到MCP Server,读取工具信息,供Host使用 |
| MCP Host | 协调和管理多个MCP Client的AI应用,如LangChain Agent |
以一个典型的AI应用为例:该应用需要文件操作、数据库操作和Sentry远程监控三个能力。此时可以配置三个MCP Client,分别对接三个独立的MCP Server,各司其职,互不干扰。
┌─────────────────────────────────┐
│ MCP Host (AI应用) │
│ ┌──────────┬──────────┬──────┐ │
│ │MCP Client│MCP Client│MCP │ │
│ │(文件操作) │(数据库) │Client│ │
│ └────┬─────┴────┬─────┴──┬───┘ │
└───────┼──────────┼────────┼─────┘
│ │ │
┌────▼───┐ ┌───▼────┐ ┌▼────────┐
│MCP │ │MCP │ │MCP │
│Server │ │Server │ │Server │
│(本地) │ │(本地) │ │(远程) │
└────────┘ └────────┘ └─────────┘
通信方式
MCP Client与MCP Server之间支持两种通信方式:
stdio(标准输入输出)
Client将MCP Server脚本作为子进程运行,通过标准输入输出进行进程间通信。没有网络延迟,适合本地服务。脚本的启动方式通常有两种:
npx:基于Node.js的包管理工具uvx:基于Python的uv工具
SSE / HTTP(Server-Sent Events)
Client通过HTTP请求与远程MCP Server交互,存在网络延迟,适合云端服务。
3. 在LangChain中使用MCP
LangChain通过langchain-mcp-adapters库实现了对MCP的支持。
bash
uv add langchain-mcp-adapters
3.1 对接stdio类型服务------以Time MCP为例
Time MCP提供时间查询和时区转换功能,基于stdio通信。
python
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient(
{
"time": {
"transport": "stdio",
"command": "uvx",
"args": ["mcp-server-time", "--local-timezone=Asia/Shanghai"]
}
}
)
# MultiServerMCPClient是异步的,需要await
tools = await client.get_tools()
for tool in tools:
print(tool.name) # get_current_time, convert_time
print(tool.description)
获取工具后,即可正常创建Agent:
python
from langchain.agents import create_agent
from langchain_core.messages import HumanMessage
agent = create_agent("deepseek-chat", tools)
response = await agent.ainvoke({
"messages": [HumanMessage("现在几点了?")]
})
Agent会自动调用get_current_time工具,获取并返回当前时间。
3.2 对接HTTP类型服务------以Kiwi MCP为例
Kiwi Travel MCP提供航班搜索功能,基于HTTP通信,是少有的免费航班搜索MCP服务。
python
client = MultiServerMCPClient(
{
"kiwi-com-flight-search": {
"transport": "http",
"url": "https://mcp.kiwi.com"
}
}
)
tools = await client.get_tools()
agent = create_agent(
model="deepseek-chat",
tools=tools,
system_prompt="You are a travel agent. Help user find best flights. "
"If the user uses Chinese, use zh-cn as the locale value."
)
response = await agent.ainvoke({
"messages": [HumanMessage("查一下2026年5月15日晚上从北京飞杭州的航班。")]
})
注意 :Kiwi的地域参数(locale)中,中文需指定为
zh-cn而非zh,否则会导致报错。这一点Tool描述中未明确说明,需在系统提示词中额外声明。
对于国内航班查询,也可以考虑飞常准提供的MCP服务(https://mcp.variflight.com/),不过该服务是收费的。
3.3 同时对接多个MCP服务
MultiServerMCPClient本身就支持多服务配置,可以在一个Client中同时连接多个MCP Server:
python
client = MultiServerMCPClient(
{
"time": {
"transport": "stdio",
"command": "uvx",
"args": ["mcp-server-time", "--local-timezone=Asia/Shanghai"]
},
"kiwi-com-flight-search": {
"transport": "http",
"url": "https://mcp.kiwi.com"
}
}
)
tools = await client.get_tools()
# tools中包含来自两个MCP Server的所有工具
4. 自定义MCP Server
在企业内部,不同团队也可以将自身服务封装为MCP Server,供其他团队复用。
4.1 使用FastMCP创建服务
FastMCP是目前创建自定义MCP Server最简洁的方式:
bash
uv add fastmcp
以一个数学运算MCP Server为例(math_mcp_server.py):
python
from fastmcp import FastMCP
mcp = FastMCP("Math")
@mcp.tool()
def add(a: float, b: float) -> float:
"""Add two numbers"""
return a + b
@mcp.tool()
def multiply(a: float, b: float) -> float:
"""Multiply two numbers"""
return a * b
@mcp.tool()
def square_root(x: float) -> float:
"""Calculate the square root of a number"""
return x ** 0.5
if __name__ == "__main__":
mcp.run(transport="stdio")
FastMCP提供了三类装饰器:
| 装饰器 | 作用 | 常用程度 |
|---|---|---|
@mcp.tool() |
定义MCP工具(核心功能) | 必备 |
@mcp.resource() |
返回资源数据,类似扩展知识库 | 可选 |
@mcp.prompt() |
返回预设提示词 | 可选 |
通常只需定义tool即可满足绝大多数场景。
4.2 连接自定义MCP服务
由于是本地Python文件,启动命令使用python而非npx或uvx:
python
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio",
"command": "python",
"args": ["math_mcp_server.py"]
}
}
)
tools = await client.get_tools()
agent = create_agent(
model="deepseek-chat",
tools=tools,
system_prompt="You are a helpful agent. You must use tools to answer math questions."
)
response = await agent.ainvoke({
"messages": [HumanMessage("467和529的平方根之和是多少?")]
})
Agent会依次调用square_root计算两个数的平方根,再调用add求和,最终返回结果约44.6102。
关键点:采用stdio方式时,MCP Server文件无需手动启动,MCP Client会自动将其作为子进程加载运行。
5. 总结
| 维度 | 说明 |
|---|---|
| MCP是什么 | 开放协议,标准化AI应用获取外部工具的方式,类比AI世界的USB接口 |
| 架构 | Client-Server架构,Host管理多个Client,Client对接Server |
| 通信方式 | stdio(本地,无网络延迟)/ HTTP(远程,适合云服务) |
| 使用流程 | 配置MultiServerMCPClient → get_tools()获取工具 → 创建Agent调用 |
| 自定义Server | 使用FastMCP,通过@mcp.tool装饰器定义工具,mcp.run()启动服务 |
MCP的意义在于它将工具集成从"手工定制"推向了"即插即用"。随着越来越多服务提供方接入MCP生态,AI应用开发者将能够以极低的成本对接丰富的外部能力,而不再为重复的工具定义和接口适配所困扰。