给Agent装上“万能接口”:MCP工具接入完全指南
在前两篇博客中,我们认识了AI Agent的核心概念,也学会了如何用LangChain为它定义Tools(工具)。你可能会想:如果每个工具都要单独定义一遍,那该多麻烦?更不用说不同AI应用(Claude、ChatGPT、本地模型)的工具调用方式还不一样——这就是典型的碎片化问题。
MCP(Model Context Protocol,模型上下文协议) 正是为解决这个问题而生的。它是一套开放标准,让AI模型通过统一的接口调用任何遵循MCP协议的工具服务器。简单来说,MCP就是AI世界的“USB-C接口”——一个标准,连接所有外设。
本文将带你从MCP是什么开始,深入理解其架构、工作流程和传输协议,并手把手教你如何编写MCP服务并在LangChain和VS Code中接入它。
1. MCP是什么?
MCP(Model Context Protocol) 是一个面向AI Agent的统一工具调用协议,由Anthropic(Claude背后的公司)发起并开源。它定义了一套与模型无关的标准化通信语言,让任意AI模型(Claude、ChatGPT、本地开源模型等)都能通过同一套接口调用外部工具和数据源。
你可以把MCP理解为:
-
对工具提供方:只需编写一个MCP Server,任何支持MCP的客户端都能直接使用,无需重复适配。
-
对AI应用开发者:无需为每个工具编写定制的集成代码,只需接入MCP Server,即可“即插即用”社区提供的海量工具。
2. 为什么要用MCP?
在MCP出现之前,AI应用调用外部工具存在三大痛点:
| 痛点 | 具体表现 |
|---|---|
| 碎片化 | 每个模型需单独适配工具——OpenAI有Function Calling,Claude有Tool Use,写法各不相同 |
| 高耦合 | 工具逻辑与模型代码深度绑定,难以复用和升级 |
| 上下文丢失 | 多轮工具调用时,状态管理非常复杂 |
MCP的核心价值在于标准化:一套协议,所有模型和工具通用。这意味着:
-
开发效率提升:社区已有大量现成的MCP Server(文件系统、GitHub、SQLite、Slack等),拿来即用。
-
安全可控:MCP提供了明确的权限控制机制,客户端可以限制Agent能访问哪些工具和数据。
-
解耦与复用:工具与模型代码分离,工具可独立升级,模型可随意替换。
3. MCP的架构
MCP采用经典的 Client/Server 解耦架构:
+------------------------------------------+
| AI应用(MCP Client) |
| (Claude Desktop / VS Code / LangChain) |
+---------------------+----------------------+
| MCP协议(JSON-RPC)
v
+------------------------------------------+
| MCP Server(工具提供方) |
| (文件系统 / GitHub / SQLite / 自定义) |
+------------------------------------------+
核心角色:
-
MCP Client:AI应用端,发起工具调用请求。如Claude Desktop、VS Code、LangChain Agent等。
-
MCP Server:工具提供方,暴露标准化能力。一个Server可以提供多个工具(Tools)。
-
协议层:基于JSON-RPC格式通信,支持上下文传递、工具动态发现、流式响应等特性。
关键设计:Client和Server是双向解耦的——Server只管“我有什么工具”,Client只管“我要用什么工具”,两者通过标准协议沟通,互不依赖。
4. MCP的工作流程
一个典型的MCP调用流程包含三个步骤:
步骤1:工具发现(Discovery)
Client启动时,向Server请求工具清单(通过/registry或初始化握手),获取每个工具的名称、描述和参数Schema。这样Client就知道“对方能干什么”。
步骤2:发起调用(Request)
Client发送结构化JSON请求到Server,包含:
-
context:上下文信息(用户ID、会话历史、状态等) -
tool_name:要调用的工具名称 -
parameters:调用参数
{
"context": {"user_id": "u123", "session_id": "s456"},
"tool_name": "get_weather",
"parameters": {"city": "北京", "unit": "celsius"}
}
步骤3:流式返回(Response)
Server执行工具后,通过SSE(Server-Sent Events) 流式返回结果,支持大数据量分块传输。Client收到结果后返回给LLM,LLM生成最终答案。
整个流程中,上下文(Context) 的持续传递是关键——它保证了多轮对话中状态不丢失,实现了“有记忆的智能体”。
5. 传输协议
MCP目前定义了两种标准传输机制:
stdio(标准输入/输出)
-
工作机制:Client将MCP Server作为子进程启动,通过stdin发送请求,从stdout读取响应。
-
优点:无需网络端口,适合本地开发;进程生命周期由Client管理。
-
典型场景:VS Code、Claude Desktop等本地IDE和桌面应用。
Client --(stdin)--> Server Process Client <--(stdout)-- Server Process Client <--(stderr)-- 日志输出(可选)
HTTP + SSE
-
工作机制:Server作为独立进程运行(可远程),Client通过HTTP POST发送请求,通过SSE连接接收流式响应。
-
优点:支持多客户端并发连接,适合生产环境部署。
-
典型场景:云端MCP服务、多租户系统。
text
Client ----(SSE连接)----> Server Client --(HTTP POST)----> Server Client <--(SSE message)-- Server
自定义传输
协议本身是传输无关的,开发者可以根据需要实现自己的传输机制(如WebSocket、gRPC等)。
选择建议:本地开发和调试推荐stdio;生产环境推荐HTTP+SSE。
6. 编写MCP服务:从Studio到自定义
6.1 极速上手:用@studio-mcp/studio把任何CLI变成MCP工具
如果你不想写Python/Node.js代码,@studio-mcp/studio提供了一个最简单的方式:将任何命令行工具一键包装为MCP Server。
npx -y @studio-mcp/studio echo "{text # 你想说的话}"
studio使用类Mustache模板语法定义参数:
-
{name # description}:必填字符串参数 -
[name]:可选参数 -
[args...]:可选数组参数 -
[--flag]:可选布尔标志
配置到Claude Desktop(claude_desktop_config.json):
json
{
"mcpServers": {
"echo": {
"command": "npx",
"args": ["-y", "@studio-mcp/studio", "echo", "{text # 你想说的话}"]
}
}
}
6.2 编写自定义MCP Server(Python示例)
如果需要更复杂的逻辑,可以编写原生MCP Server。以下是一个简化的自定义Server示例,使用fast-mcp库:
python
# demo_tools.py
from fast_mcp import mcp_tool
@mcp_tool(name="get_weather")
def weather_api(city: str, unit: str = "celsius") -> dict:
"""查询城市天气"""
# 调用真实天气API
return {"city": city, "temp": 22, "unit": unit, "condition": "sunny"}
@mcp_tool(name="calculate")
def calculate(expression: str) -> float:
"""计算数学表达式"""
return eval(expression)
启动MCP Server:
bash
pip install fast-mcp fast-mcp --tools demo_tools.py
Server启动后,会暴露/registry(工具发现)和/execute(工具调用)端点,任何MCP Client都可以连接使用。
7. LangChain接入MCP:让Agent“即插即用”
LangChain提供了对MCP的一流支持。核心步骤非常简单:
步骤1:导入模块并创建MCP会话
python
from langchain.tools.mcp import create_mcp_tool, MCPClientSession, MCPServerParameters
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
# 定义MCP服务器参数(以filesystem为例)
server_params = MCPServerParameters(
command="filesystem", # MCP Server命令
args=["--directory", "/tmp"] # 启动参数
)
# 创建MCP客户端会话
session = MCPClientSession(server_params=server_params)
步骤2:从MCP Server动态生成LangChain工具
python
# 自动发现并转换所有工具
tools = create_mcp_tool(session, name="mcp-filesystem-tools")
# tools是一个List[Tool],包含read_file、write_file等
# 查看有哪些工具可用
for tool in tools:
print(f"工具: {tool.name} | 描述: {tool.description}")
步骤3:构建Agent并执行
python
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个文件管理助手,可以读写文件。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
async def main():
async with session: # 管理MCP会话生命周期
result = await executor.ainvoke({
"input": "在/tmp目录下创建hello.txt并写入'Hello MCP'"
})
print(result["output"])
幕后发生了什么:
-
LangChain启动MCP Server子进程(stdio模式)
-
通过初始化握手获取Server提供的所有工具及参数Schema
-
LLM根据工具描述决定调用哪个工具
-
LangChain通过MCP协议将调用请求转发给Server
-
Server执行真正的操作(如写文件),返回结果
-
LangChain将结果返回给LLM,生成最终回答
整个过程,LangChain完全不关心工具内部实现,只负责按MCP协议转发——这就是标准化的力量。
8. 本地VS Code接入MCP工具
VS Code从2025年开始原生支持MCP,可以通过.vscode/mcp.json配置MCP Server。
8.1 配置MCP Server(以SQL MCP Server为例)
微软官方提供了SQL MCP Server的完整教程。以下是核心配置步骤:
步骤1:创建.vscode/mcp.json
stdio模式(推荐本地开发,VS Code自动管理进程生命周期):
json
{
"servers": {
"sql-mcp-server": {
"type": "stdio",
"command": "dab",
"args": [
"start",
"--mcp-stdio",
"role:anonymous",
"--loglevel", "error",
"--config", "${workspaceFolder}/dab-config.json"
]
}
}
}
HTTP模式(Server独立运行):
json
{
"servers": {
"sql-mcp-server": {
"type": "sse",
"url": "http://localhost:5000/mcp"
}
}
}
步骤2:配置数据源(以SQL Server为例)
bash
# 创建环境文件 .env
MSSQL_CONNECTION_STRING=Server=localhost;Database=ProductsDb;Trusted_Connection=True
# 初始化配置
dab init --database-type mssql --connection-string "@env('MSSQL_CONNECTION_STRING')" --config dab-config.json
# 添加数据实体
dab add Products --source dbo.Products --permissions "anonymous:read" --description "商品库存信息"
步骤3:在VS Code中使用
配置完成后,在VS Code的Copilot Chat中可以直接调用MCP工具:
text
@sql-mcp-server 查询库存低于20的商品有哪些
Copilot会自动识别并调用SQL MCP Server的查询工具,返回数据库结果。
8.2 配置GitHub MCP Server
VS Code还支持一键配置GitHub MCP Server,用于管理Issue、PR等:
-
按
Ctrl+Shift+P打开命令面板 -
输入“MCP:添加服务器”并选择
-
选择
HTTP类型,输入https://api.githubcopilot.com/mcp/ -
使用OAuth授权GitHub账号
配置完成后,Copilot可以直接帮你创建Issue、查看PR状态、分析代码等。
总结
MCP正在成为连接AI Agent与外部世界的“通用语言”。回顾本文:
| 章节 | 核心要点 |
|---|---|
| 1. MCP是什么 | 面向AI Agent的统一工具调用协议,解决碎片化问题 |
| 2. 为什么用MCP | 标准化、解耦、安全、开发效率高 |
| 3. 架构 | Client/Server解耦设计,协议与模型无关 |
| 4. 工作流程 | 工具发现 → 发起调用 → 流式返回,上下文持续传递 |
| 5. 传输协议 | stdio(本地)和HTTP+SSE(远程)两种标准 |
| 6. 编写MCP | @studio-mcp/studio极速上手,或fast-mcp自定义开发 |
| 7. LangChain接入 | 通过create_mcp_tool动态生成工具,即插即用 |
| 8. VS Code本地 | 通过mcp.json配置,Copilot Chat直接调用 |
有了MCP,你的Agent再也不用为每个工具单独写适配代码了——一个标准接口,连接无限可能。
更多推荐



所有评论(0)