如果你是一名有程序服务开发经验的开发者,你可能已经接触过各种 API 和集成方案。模型上下文协议 (MCP) 是一种新兴的开放标准,它为 AI 助手与数据源和工具的安全连接提供了一种更优雅、更强大的方式。本文将带你深入了解 MCP 的架构、核心概念,以及一些实际案例,让你更好地理解 MCP 的价值以及如何将其应用到你的服务中。
什么是 MCP?
MCP (Model Context Protocol) 是一种协议,旨在为大型语言模型 (LLM) 提供安全、可控的方式来访问外部数据源和工具。它允许 LLM (例如 Claude) 与服务器进行交互,以获取信息、执行操作并完成更复杂的任务,而无需直接访问底层系统或数据。 MCP 主要解决的问题是:
- 安全性: 通过定义明确的接口和访问控制,MCP 减少了 LLM 执行恶意操作或访问未经授权的数据的风险。
- 可控性: MCP 允许用户或客户端应用程序控制 LLM 可以使用的工具和资源,从而确保 LLM 的行为符合预期。
- 可扩展性: MCP 提供了一种标准化的方式来集成各种数据源和工具,使得扩展 LLM 的功能变得更加容易。
MCP 的核心架构与主要组件
要理解 MCP 的工作原理,首先需要了解其架构中的关键组件以及它们之间的关系:
协议层 (Protocol Layer): 处理消息的格式化、请求/响应的关联以及高级通信模式。它定义了请求 (Request)、响应 (Result)、错误 (Error) 和通知 (Notification) 等消息类型。
传输层 (Transport Layer): 负责在客户端和服务器之间传输消息。MCP 提供了两种内置的传输类型:标准输入/输出 (stdio) 和服务器发送事件 (SSE)。也可以实现自定义传输方式。
MCP 主机 (Hosts):这是 AI 应用的载体,例如 Claude Desktop、IDE 或其他 AI 工具。主机希望通过 MCP 访问数据和工具。
MCP 客户端 (Clients): 客户端驻留在主机内部,与 MCP 服务器建立一对一的连接。客户端负责与服务器进行通信,并处理数据的传输和转换.
MCP 服务器 (Servers): 服务器是轻量级的应用程序,它们通过 MCP 协议暴露特定的功能。服务器可以连接到各种数据源(如数据库、文件系统、API)。
资源 (Resources): 资源是服务器暴露的数据和内容,客户端可以读取这些数据和内容,并将其用作 LLM 交互的上下文。例如文件、数据库或 API 等,拿一个博客服务来讲,博客文章的内容、用户信息、评论数据等都可以作为资源暴露。
工具 (Tools): 服务器提供的可供 LLM 调用的功能,用于执行特定操作。每个工具都定义了输入参数的 JSON Schema。例如,创建博客文章、更新博客文章、删除博客文章等都可以作为工具暴露。
提示 (Prompts): 提示是服务器定义的可重用提示模板和工作流程,客户端可以轻松地呈现给用户和 LLM。例如,生成博客文章标题、生成博客文章摘要、生成博客文章标签等都可以作为提示暴露。
抽样 (Sampling): 允许服务器请求来自 LLM 的补全,并可以对 LLM 的行为进行控制。例如,服务器可以要求客户端通过大语言模型生成博客文章
数据流
数据从数据源流向主机需要经过各个组件的协同工作,它们之间的数据流转过程如下:
- 主机端应用希望访问特定的数据,例如查询数据库
- 主机端应用通过客户端将请求发送给服务器
- 服务器接收到来自客户端的请求
- 服务器处理请求,从数据源中获取数据
- 服务器将数据发送给客户端
- 客户端将数据发送给主机端应用
MCP 解决什么问题?未来畅想
一个生活中的例子,有了 MCP 这类 AI AGENT 之间的标准协议,未来我们的手机上不再需要安装那么多 App。通过一个类似 Siri 的“超级 App”或 AI Agent,所有服务和工具都能通过统一平台访问。我们有任何需求,只需拿起手机告诉它即可。
拿出门旅游来说,如果所有 APP 服务都能通过 MCP 无缝交互,那么我从深圳去黄山旅游的整个过程都将发生彻底变革。一个超级 App 或 AI Agent 将成为我们的私人管家,不再需要分别打开滴滴叫车、携程订酒店、12306 抢火车票,甚至支付宝和微信的支付,一切都由 AI 自动搞定。
出行前:一键搞定
只需要告诉超级 App:“我要去黄山,3 天自由行,预算 5K。”然后超级 App 为你制作攻略、规划行程,通过各种服务提供的 MCP 接口为你安排妥当。
不再需要打开携程、飞猪、12306 来回对比价格,AI 会帮你选最划算、最舒适的选项,甚至提前抢票、锁定特价座位。
出发当天,滴滴再见!超级 App 会在我出门时自动预约网约车(甚至可能是未来的无人驾驶汽车),不需要打开滴滴等打车 APP,车子已经在家门口等你了,支付直接走 AI 账户。
酒店更无需操心,AI 会综合你的住宿偏好(比如:离景区近、早餐要好吃)直接下单。
旅途中的无缝衔接
从深圳飞黄山,因为可能晚点,我们一般都是到了目的地再打车,但在 AI 时代,AI 通过飞常准、航旅纵横等 MCP 接口获取达到时间然后调用携程 MCP 接口根据你的喜好预定酒店,再调用滴滴的 MCP 给你打车。
落地瞬间,行程全安排好。你下飞机后啥也不用干,车就在机场出口等你了,酒店已确认,甚至你落地时已经收到消息:“房间空调已调至最适温度。”
旅行中:没有攻略,不代表没有掌控
以前,想规划黄山的行程,你可能会:
📖 打开 小红书,搜索“黄山旅游攻略” ⛰️ 研究 百度地图 or 高德地图,看哪条登山路线最适合 ☔ 切换到 墨迹天气,确认明天要不要带伞
但超级 App 已经替你想好了:
✅ 实时推荐最佳登山路线:AI 会综合你的体力、天气和人流情况,智能规划行程。比如,你刚到景区,它会提醒:“今天云海概率 80%,建议先去光明顶。” ✅ 随时智能调整行程:如果天气突变,AI 甚至会主动提醒:“后山步道湿滑,建议改走西海大峡谷。”,还能结合你的饮食习惯推荐美食,大众点评 or 美团可以卸载了。
未来所有服务都由 AI 自动处理,当然,实现这一切的前提是解决 隐私、安全和准确性 的问题。如果 AI 足够可靠,你甚至连“我要去黄山”这句话都不需要说,它会根据你的历史数据和兴趣,在合适的时间问你:“这个季节的黄山云海很美,你要不要去看看?”
通过 MCP 的标准化,可以让所有服务都能和 AI 交互,那么,如何实现一个 MCP 服务器,又应该如何使用它呢?
实际案例:一个支持 MCP 的 Web 博客服务
构建一个博客系统的 MCP 服务器
以 Python 语言为例,构建博客系统 MCP 服务器可参考以下简化步骤:
1. 安装 MCP SDK:
pip install mcp
2. 定义服务器:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-blog-server")
3. 实现资源:
@mcp.resource
async def get_blog_post(post_id: str) -> str:
"""获取指定 ID 的博客文章内容"""
# 从数据库或文件系统中获取博客文章内容
content = ...
return content
4. 实现工具:
@mcp.tool
async def create_blog_post(title: str, content: str, tags: list) -> str:
"""创建新的博客文章"""
# 将博客文章保存到数据库或文件系统中
post_id = ...
return post_id
5. 运行服务器:
if __name__ == "__main__":
mcp.run(transport='stdio')
MCP 服务器的使用方式和流程
假设您已经按照 Python 示例为您的博客实现了 MCP 服务器,以下是如何使用的具体步骤和详细说明:
1. 环境准备
安装 Claude for Desktop: 访问 Anthropic 官网下载并安装。确保您使用的是最新版本。MCP 目前仅支持桌面客户端。
安装 Python 和必要依赖: 确保您的系统安装了 Python 3.10 或更高版本。 使用 uv
或 pip
安装 MCP SDK 和其他依赖。
uv venv
source .venv/bin/activate
uv add "mcp[cli]" httpx
配置 MCP 服务器: 确认您的 MCP 服务器已正确配置并运行。包括设置命令、参数和环境变量。
获取 Anthropic API Key: 访问 Anthropic Console 获取 API Key,并将其存储在 .env
文件中,确保安全。
2. 配置 Claude for Desktop
打开配置文件: 打开 Claude for Desktop 的配置文件 claude_desktop_config.json
。该文件通常位于:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
%APPDATA%\Claude\claude_desktop_config.json
如果文件不存在,请手动创建。
添加服务器配置: 在 mcpServers
键下添加示例博客的 MCP 服务器配置。例如:
{
"mcpServers": {
"blog_server": {
"command": "uv",
"args": [
"--directory",
"/ABSOLUTE/PATH/TO/YOUR/BLOG/SERVER",
"run",
"your_blog_server.py"
]
},
...
}
}
确保将 /ABSOLUTE/PATH/TO/YOUR/BLOG/SERVER
替换为您的服务器的实际路径。
如果 uv
命令无法识别,需要填写 uv
可执行文件的完整路径。
通过这个配置文件,Claude Desktop 知道有哪些 MCP 服务器可用。
保存配置文件后,重启 Claude for Desktop。
3. 测试 MCP 服务器连接
打开 Claude for Desktop,点击输入框底部的锤子图标 ,查看博客服务器是否成功加载,并列出了所有可用的工具。
如果服务器未显示,请检查 Claude 的日志文件,定位问题。日志文件位于:
- macOS:
~/Library/Logs/Claude
- Windows:
%APPDATA%\Claude\logs
mcp.log
记录了 MCP 连接和连接失败的通用日志。 mcp-server-SERVERNAME.log
记录了指定服务器的错误日志。
常见问题:
- 路径问题: 确保服务器可执行文件的路径正确,并使用绝对路径。
- 环境变量问题: 确保服务器所需的环境变量已正确设置。
- 端口冲突: 确保服务器使用的端口没有被其他程序占用。
4. 使用 MCP 服务器
在 Claude for Desktop 中,使用自然语言与 Claude 交互,请求其使用博客服务器的功能。
示例指令:
- “帮我生成一篇关于 [主题] 的博客文章,标题是 [关键词],摘要是 [关键词]”
- “查找包含 [关键词] 的博客文章”
- “将博客文章 [文章 ID] 的标题修改为 [新的标题]”
- “总结最近一周的博客访问数据”
5. 调试和优化
使用 MCP Inspector 工具测试和调试 MCP 服务器。
npx @modelcontextprotocol/inspector
最佳实践:
- 服务器日志: 在服务器端添加详细的日志记录,方便调试和问题排查。
- 客户端日志: 启用客户端的 debug 日志,监控网络流量和消息交换。
- 验证输入: 验证所有输入参数,防止恶意输入。
- 错误处理: 实现完善的错误处理机制,确保服务器在出现错误时能够优雅地处理并返回有用的错误信息。
- 性能测试: 对服务器进行性能测试,确保其能够处理高并发请求。
- 监控: 监控服务器的运行状态,及时发现和解决问题。
MCP 服务器的工作流程
MCP 服务器通过 ListToolsRequestSchema
暴露其提供的工具列表。每个工具都有一个唯一的名称(name
)、描述(description
)以及输入参数的 JSON Schema(inputSchema
)。Claude Desktop 在启动时或服务器连接后,会获取这些工具的定义。
当在 Claude Desktop 中输入指令后,Claude 会分析指令内容。根据指令的语义和上下文,判断需要使用哪个工具来完成任务。在执行敏感操作(例如,发布或修改博客文章)时,Claude 会请求您的授权。
一旦 Claude 确定了需要调用的工具,它会构建一个 CallToolRequestSchema
请求。这个请求包含了工具的名称(name
)和输入参数(arguments
)。Claude Desktop 将这个请求发送给相应的 MCP 服务器。
MCP 服务器接收到 CallToolRequestSchema
请求后,会执行相应的工具。 服务器将工具的执行结果封装在 content
字段中,并返回给 Claude Desktop。如果工具执行过程中发生错误,服务器应在结果中设置 isError
为 true
,并包含错误信息。
Claude Desktop 接收到 MCP 服务器返回的结果后,会将结果以自然语言的形式呈现给用户。
举例说明
假设我们的博客 MCP 服务器提供了一个名为 create_blog_post
的工具,用于创建新的博客文章。这个工具需要两个参数:title
(文章标题)和 content
(文章内容)。
当在 Claude Desktop 中输入以下指令:
帮我生成一篇博客文章,标题是 "MCP 的优势",内容是 "MCP 能够提升 AI 应用的效率和安全性。"
Claude 会分析这个指令,识别出我是希望创建一个新的博客文章,并确定应该调用 create_blog_post
工具。
Claude 会构建一个 CallToolRequestSchema
请求,如下所示:
{
"method": "call_tool",
"params": {
"name": "create_blog_post",
"arguments": {
"title": "MCP 的优势",
"content": "MCP 能够提升 AI 应用的效率和安全性。"
}
}
}
Claude 将这个请求发送给博客 MCP 服务器。服务器执行 create_blog_post
工具,创建一个新的博客文章,并将结果返回给 Claude。
Claude 将结果以自然语言的形式呈现,例如:
已成功创建博客文章,标题为 "MCP 的优势"。
通过这个流程,Claude Desktop 能够智能地调用 MCP 服务器提供的工具,完成各种复杂的任务。
你的服务要不要支持 MCP?
如果以下任何一个问题的答案是肯定的,那么你的服务可能需要支持 MCP。
- 你的服务是否需要与 AI 助手集成,以提供更智能的功能?例如,你的服务是否可以利用 AI 来提高用户体验、自动化任务或提供更个性化的服务?
- 你的服务是否包含大量的数据,这些数据可以被 LLM 利用来生成更有价值的内容?例如,你的服务是否包含用户数据、产品数据、知识库等?
- 你是否希望为你的用户提供一种更自然、更便捷的方式来访问和管理你的服务?例如,用户是否可以通过语音或文本与 AI 助手交互,从而完成各种任务?
- 你的服务是否需要与其他 AI 应用和服务进行互操作?例如,你的服务是否需要与其他 AI 助手、LLM 提供商或数据分析工具进行集成?
- 你是否希望在你的服务中实现更高级的 AI 工作流程?例如,你的服务是否需要支持多步骤的 AI 任务、自动化决策或智能推荐?
总结
MCP 提供了一个通用、开放的标准,使得 AI 系统能够以标准化的方式连接到各种数据源、工具和服务,这减少了为每个数据源构建单独连接器的需求,简化了 AI 集成过程。
当前的非智能服务可以通过 MCP 将自身功能暴露为“工具”,供 LLM(大型语言模型)调用,这使得 LLM 能够与现有系统交互,执行任务,而无需对现有系统进行重大修改。在 LLM 的驱动下,可以在一定程度上将普通服务转变为 AI Agent。
总结来说,MCP 的核心意义在于为 AI 系统与各种数据源、工具和服务之间建立桥梁,实现互联互通,从而赋能 AI 应用,提高效率和安全性,并促进 AI 生态系统的发展。
希望本文能够帮助你更深入地理解 MCP,并为你的服务赋能 AI 提供一些有价值的指导。