在前两篇博客中,我们认识了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"])

幕后发生了什么

  1. LangChain启动MCP Server子进程(stdio模式)

  2. 通过初始化握手获取Server提供的所有工具及参数Schema

  3. LLM根据工具描述决定调用哪个工具

  4. LangChain通过MCP协议将调用请求转发给Server

  5. Server执行真正的操作(如写文件),返回结果

  6. 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等:

  1. Ctrl+Shift+P打开命令面板

  2. 输入“MCP:添加服务器”并选择

  3. 选择HTTP类型,输入https://api.githubcopilot.com/mcp/

  4. 使用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再也不用为每个工具单独写适配代码了——一个标准接口,连接无限可能。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐