什么是 MCP?一文读懂模型上下文协议
1. 引言
MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 于 2024 年 11 月发布的开放协议标准,旨在统一 AI 模型与外部数据源、工具之间的连接方式。本文将从诞生背景、核心架构、实际应用场景等维度,全面解析 MCP 协议的原理与实战。
MCP,全称 Model Context Protocol(模型上下文协议),是由 Anthropic 于 2024 年 11 月正式发布的一个开放协议标准。简单来说,它的目标是成为 AI 应用领域的"USB-C 接口"——让不同的 AI 模型和外部数据源、工具之间能够以一种标准化的方式连接和通信。
想象一下:你正在用 AI 写代码,它需要读取你本地的项目文件、查询数据库中的用户信息、再调用 Git API 查看提交历史。如果没有 MCP 协议,你需要为每个功能写一堆胶水代码,每个接口的认证方式、数据格式、错误处理都不一样;有了 MCP,AI 应用只需通过一个标准协议就能完成所有这些操作。这就是 MCP 要解决的核心问题。
MCP 的诞生背景
在 MCP 出现之前,AI 应用与外部世界的交互方式主要有以下几种:
- Function Calling:OpenAI 等模型提供的函数调用能力,允许模型输出结构化的函数调用参数,但需要开发者自行实现函数执行逻辑和认证管理。
- 插件系统:如 ChatGPT Plugin,但每个插件有自己独立的 API 规范和认证方式,缺乏统一标准。
- 自定义 Agent 框架:如 LangChain、AutoGPT 等,虽然提供了工具调用能力,但工具的定义和调用方式各不相同,难以跨框架复用。
MCP 正是在这种碎片化的背景下诞生的,它试图为 AI 工具集成提供一个统一的、标准化的协议层。
谁在使用 MCP?
目前 MCP 已经获得了广泛的生态支持:
- Claude Desktop:Anthropic 官方桌面客户端原生支持 MCP,可以直接配置 MCP 服务器。
- VS Code 扩展:通过 Continue.dev 等插件,VS Code 中的 AI 助手可以连接 MCP 服务器。
- JetBrains IDE:同样通过插件支持 MCP 协议。
- 自定义应用:开发者可以在自己的 AI 应用中集成 MCP 客户端 SDK(支持 Python、TypeScript、Java 等语言)。
截至 2025 年中,MCP 生态中已有超过 1000 个公开的 MCP 服务器实现,覆盖数据库、文件系统、云服务、开发工具、办公协作等各个领域。
2. 为什么需要 MCP?——传统 AI 工具集成的痛点
在过去,开发一个 AI 应用(比如一个能查询数据库的聊天机器人)通常需要为每个数据源或工具编写大量的定制化代码。这种"点对点"的连接方式不仅开发成本高,而且难以维护和扩展。MCP 协议正是为了解决 AI 工具集成中的这些核心痛点而诞生。
传统方式的痛点
举个例子:假设你要让 AI 助手能同时查询 MySQL 数据库、读取本地 CSV 文件、调用公司内部的 API 获取订单数据。传统做法是分别为这三个数据源编写独立的接口代码:
# 传统方式:每个数据源独立实现
# 1. 查询 MySQL
def query_mysql(sql):
import pymysql
conn = pymysql.connect(host="localhost", user="root", password="xxx", database="sales")
cursor = conn.cursor()
cursor.execute(sql)
return cursor.fetchall()
# 2. 读取 CSV
def read_csv(filepath):
import pandas as pd
return pd.read_csv(filepath).to_dict("records")
# 3. 调用内部 API
def call_internal_api(endpoint, params):
import requests
headers = {"Authorization": "Bearer xxx"}
return requests.get(f"https://api.company.com/{endpoint}", params=params, headers=headers).json()
每个接口的认证方式、数据格式、错误处理都不一样。如果后续要换成 PostgreSQL 或增加一个 Redis 缓存,又得重新写一遍。更麻烦的是,AI 模型需要知道什么时候调用哪个函数、传什么参数,这通常需要复杂的提示词工程来引导。
MCP 的解决思路
MCP 的出现就是为了解决这个问题。它提供了一个通用的"中间层",让 AI 模型不再需要关心背后连接的是哪个数据库、哪个 API 或哪个文件系统,只需通过 MCP 协议进行标准化的请求和响应即可。
使用 MCP 后的对比:
| 维度 | 传统方式 | MCP 方式 |
|---|---|---|
| 接入新数据源 | 编写定制化接口代码 | 配置一个 MCP 服务器 |
| 认证管理 | 每个接口独立处理 | 统一在 MCP 服务器层管理 |
| 错误处理 | 各自实现 | 标准化的错误码和重试机制 |
| 跨应用复用 | 不可复用 | 一个 MCP 服务器可被多个 AI 应用使用 |
| 维护成本 | 随数据源数量线性增长 | 一次开发,长期受益 |
一次接入,到处可用——这就是 MCP 最核心的价值主张。
MCP 与 Function Calling 的关系
很多开发者会问:MCP 和 OpenAI 的 Function Calling 有什么区别?简单来说:
- Function Calling 是模型层面的能力,让模型能输出结构化的函数调用参数。
- MCP 是应用层面的协议,定义了客户端和服务器之间如何通信、如何发现可用工具、如何执行调用。
两者可以协同工作:AI 模型通过 Function Calling 决定调用哪个工具,而 MCP 负责将这个调用路由到对应的服务器并返回结果。MCP 实际上是对 Function Calling 的上层封装和标准化。
3. MCP 的核心架构——客户端-服务器协议详解
MCP 采用经典的 客户端-服务器(Client-Server) 架构,但在此基础上增加了几个关键角色。理解 MCP 架构是掌握 MCP 协议的基础。
架构角色详解
- MCP 主机(Host):通常是用户直接交互的 AI 应用,比如 Claude Desktop、VS Code 插件等。它是发起请求的一方,负责管理用户会话和多个 MCP 客户端的生命周期。
- MCP 客户端(Client):内嵌在主机中,负责与 MCP 服务器建立一对一的连接。每个 MCP 服务器对应一个独立的客户端实例。客户端负责协议协商、请求序列化和响应反序列化。
- MCP 服务器(Server):一个轻量级的程序,它通过标准化的协议暴露特定的功能,比如"查询数据库"、“读取本地文件”、"调用某个 API"等。服务器可以独立部署,也可以作为子进程运行。
通信协议
MCP 支持两种传输层协议:
- stdio(标准输入输出):MCP 服务器作为子进程运行,通过标准输入输出与客户端通信。这种方式配置简单,适合本地开发场景。
- SSE(Server-Sent Events):MCP 服务器作为 HTTP 服务运行,客户端通过 HTTP 请求发送指令,服务器通过 SSE 推送结果。这种方式适合远程部署和多人共享。
工作流程
下面是一个完整的 MCP 交互流程:
协议生命周期
MCP 连接的生命周期分为三个阶段:
- 初始化阶段:客户端和服务器进行版本协商、能力声明。服务器告诉客户端它支持哪些功能(资源、工具、提示等)。
- 运行阶段:客户端发送请求(如列出可用工具、调用工具、读取资源),服务器执行并返回结果。
- 关闭阶段:任意一方发起关闭请求,清理资源,断开连接。
一个简单的 MCP 服务器示例
下面是一个用 Python 编写的 MCP 服务器示例,它暴露了一个"获取天气"的工具:
# weather_server.py
from mcp.server import Server, NotificationOptions
from mcp.server.models import InitializationOptions
import mcp.server.stdio
import httpx
# 创建 MCP 服务器实例
server = Server("weather-server")
# 注册工具:获取天气
@server.list_tools()
async def handle_list_tools():
return [
{
"name": "get_weather",
"description": "获取指定城市的当前天气信息",
"inputSchema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如 北京、上海"
}
},
"required": ["city"]
}
}
]
# 执行工具调用
@server.call_tool()
async def handle_call_tool(name: str, arguments: dict):
if name == "get_weather":
city = arguments["city"]
# 调用外部天气 API
async with httpx.AsyncClient() as client:
resp = await client.get(
f"https://api.weather.com/v1/city/{city}",
params={"key": "your-api-key"}
)
data = resp.json()
return {
"content": [
{
"type": "text",
"text": f"{city}当前天气:{data['temperature']}°C,{data['condition']}"
}
]
}
# 启动服务器(通过 stdio)
async def main():
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
await server.run(
read_stream,
write_stream,
InitializationOptions(
server_name="weather-server",
server_version="1.0.0"
)
)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
配置 MCP 服务器
在 Claude Desktop 中配置上述天气服务器,只需在配置文件 claude_desktop_config.json 中添加:
{
"mcpServers": {
"weather": {
"command": "python",
"args": ["/path/to/weather_server.py"]
}
}
}
启动 Claude Desktop 后,AI 助手就能自动发现并使用这个天气查询工具了。
4. MCP 能做什么?——三大核心能力详解
MCP 的核心能力可以概括为三大类,每一类都有非常具体的应用场景。了解这些能力有助于你更好地规划 MCP 服务器的开发方向。
4.1 资源(Resources)——让 AI 拥有"眼睛"和"耳朵"
资源能力让 AI 模型能够读取和访问外部数据。实际能做什么?
- 读取本地文件:AI 可以直接读取你电脑上的代码文件、日志文件、配置文件,帮你分析 Bug 或总结代码逻辑。比如你写了一个 Python 脚本报错了,AI 能直接读取脚本内容和报错日志,定位问题。
- 查询数据库:AI 可以连接 MySQL、PostgreSQL、MongoDB 等数据库,执行 SQL 查询并返回结果。比如你问"上个月销售额最高的产品是什么?",AI 自动查询数据库并给出答案。
- 访问网页内容:AI 可以抓取指定 URL 的网页内容,用于信息提取、竞品分析或文档总结。
- 读取 API 响应:AI 可以调用 REST API 获取实时数据,比如天气信息、股票价格、GitHub 仓库状态等。
4.2 工具(Tools)——让 AI 拥有"手"和"脚"
工具能力让 AI 模型能够执行外部操作,而不仅仅是"读"。实际能做什么?
- 发送邮件和消息:AI 可以帮你撰写并发送邮件、在 Slack 上发消息、创建钉钉通知。比如你说"给团队发一封周报邮件",AI 自动生成内容并发送。
- 操作文件系统:AI 可以创建、修改、删除文件,帮你整理目录结构、批量重命名文件、生成项目脚手架。
- 调用第三方 API:AI 可以调用 GitHub API 创建 Issue、调用 Jira API 创建任务、调用飞书 API 发送审批。比如你说"给这个仓库提一个 Bug Issue",AI 直接帮你创建。
- 执行代码和命令:AI 可以在安全沙箱中运行代码片段、执行 Shell 命令,帮你做数据分析、图片处理、自动化脚本执行。
- 创建日历事件:AI 可以读取你的日程安排,帮你创建会议邀请、设置提醒。
4.3 提示(Prompts)——让交互更高效
提示能力提供预定义的、可复用的交互模板。实际能做什么?
- 代码审查模板:定义一个"代码审查"提示模板,每次 AI 审查代码时自动按固定格式输出:问题类型、严重级别、修改建议。
- 周报生成模板:定义一个"周报生成"模板,AI 自动从你的 Git 提交记录、任务管理工具中提取信息,生成结构化周报。
- 数据分析模板:定义一个"数据分析"模板,AI 自动按"数据概览→趋势分析→异常检测→建议"的流程输出分析报告。
一个完整的实际场景
假设你是一名后端开发者,正在用 AI 助手排查线上问题:
- 读取日志(资源):AI 通过 MCP 读取服务器上的错误日志文件。
- 查询数据库(资源):AI 查询数据库中的用户订单记录,确认受影响的数据范围。
- 执行诊断脚本(工具):AI 运行一个诊断 Shell 脚本,获取当前系统状态。
- 创建 Jira 任务(工具):AI 自动在 Jira 上创建一个 Bug 修复任务,附上日志和诊断结果。
- 发送通知(工具):AI 在团队 Slack 频道发送一条告警通知。
整个过程,AI 通过 MCP 协议与多个系统交互,而你只需要用自然语言下达指令。
5. 总结
MCP(Model Context Protocol,模型上下文协议) 是一个旨在标准化 AI 模型与外部世界交互方式的开放协议。它通过客户端-服务器架构,将 AI 应用与各种数据源和工具解耦,从而极大地降低了开发复杂度,提升了 AI 系统的可扩展性和互操作性。对于正在构建 AI Agent 或智能应用的开发者来说,掌握 MCP 协议已经成为一项越来越重要的技能。
MCP 带来的实际价值
- 对开发者:不再需要为每个数据源写定制化接口,一次开发 MCP 服务器,所有兼容的 AI 应用都能使用。开发效率提升 5-10 倍,维护成本降低 80% 以上。
- 对用户:AI 助手不再只是一个"聊天框",而是能真正帮你操作文件、查询数据、发送消息、管理任务的智能助手。你只需要用自然语言下达指令。
- 对企业:可以统一管理 AI 能访问的数据和工具权限,安全可控。MCP 服务器的认证、授权、审计都可以集中管理,满足合规要求。
快速上手建议
如果你对 MCP 感兴趣,可以按以下步骤快速上手:
- 安装 Claude Desktop:下载并安装 Claude Desktop 客户端,体验 MCP 协议的原生支持。
- 尝试内置 MCP 服务器:Claude Desktop 内置了文件系统、终端等基础 MCP 服务器,可以直接体验 MCP 的工作流程。
- 配置第三方 MCP 服务器:从 MCP 生态中挑选你需要的服务器(如数据库、GitHub、Slack 等),按文档配置。
- 开发自己的 MCP 服务器:使用官方 SDK(Python/TypeScript)开发自定义 MCP 服务器,满足特定业务需求。
- 参与社区:在 GitHub 上搜索
awesome-mcp-servers,发现更多社区贡献的 MCP 服务器实现,也可以贡献自己的实现。
未来展望
可以预见,随着生态的成熟,MCP 将成为构建下一代智能 AI 应用的关键基础设施——就像 USB-C 统一了充电接口一样,MCP 正在统一 AI 与世界的连接方式。
未来的 AI 应用将不再是一个个孤立的"聊天机器人",而是能够深度融入我们的工作流、自动完成复杂任务的智能助手。MCP 正是实现这一愿景的关键拼图。如果你正在学习或使用 AI 开发,现在就是了解 MCP 协议的最佳时机。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)