MCP协议与无状态更新:AI智能体动态扩展工具能力的标准方案
如果你正在开发或使用 AI 智能体,尤其是那些需要连接数据库、调用 API、操作文件或执行搜索的智能体,那么你一定遇到过这样的困境:如何让智能体安全、可控地访问外部工具和数据?
传统的做法是硬编码 API 调用、编写大量胶水代码,或者依赖特定框架的插件系统。这不仅让智能体变得臃肿、难以维护,更关键的是,每次新增一个工具(比如从连接 SQLite 换成连接 PostgreSQL,或者增加一个天气查询接口),你都需要修改智能体的核心代码,重新部署,甚至重新训练。这完全违背了现代软件工程中“高内聚、低耦合”和“关注点分离”的原则。
而MCP(Model Context Protocol)的出现,正是为了解决这个核心痛点。它不是一个具体的 AI 模型或 Agent 框架,而是一个协议。你可以把它理解为智能体世界的“USB 协议”或“HTTP 协议”。它定义了一套标准,让智能体(客户端)能够以统一、安全的方式发现和调用外部工具与服务(服务器),而无需关心这些工具的具体实现。
更值得关注的是 MCP 提出的“无状态更新”理念。这并非指服务器本身无状态,而是指智能体能力的扩展可以像即插即用一样动态、无感知地完成。你不需要重启智能体,不需要修改其核心推理逻辑,只需要在配置文件中添加一个新的 MCP 服务器地址,智能体就能立刻获得新的工具能力。
本文将深入解析 MCP 协议,特别是其“无状态更新”特性如何从根本上改变我们构建和扩展 AI 智能体基础设施的方式。我们会从概念原理讲起,并通过一个完整的实战示例,演示如何为你的 AI 智能体动态添加一个 SQLite 数据库操作能力。你会发现,让智能体学会“查数据库”,就像给它插上一个新U盘一样简单。
1. MCP 与无状态更新:解决智能体扩展的根本难题
在深入技术细节之前,我们必须先理解 MCP 和无状态更新要解决的到底是什么问题。这不仅仅是“方便”,而是关乎智能体架构的范式转变。
传统智能体工具扩展的“有状态”困境:想象一下,你开发了一个客服智能体,最初它只能回答产品FAQ。现在你想让它能查询用户订单状态。传统做法是:
- 在智能体代码中,硬编码连接数据库的库(如
sqlite3或psycopg2)。 - 编写一个专门的函数
query_order(order_id)。 - 修改智能体的提示词(Prompt),告诉它现在可以调用这个新函数。
- 重新部署整个智能体应用。
这个过程存在几个明显问题:
- 耦合性高:智能体的核心逻辑(推理、对话)与工具实现(数据库操作)紧密绑定。
- 更新成本高:每次增加、修改或下线一个工具,都需要动核心代码。
- 安全性差:数据库凭证、API密钥等敏感信息可能直接暴露在智能体代码中。
- 复用性差:为智能体A写的数据库工具,很难直接给智能体B用。
MCP 的“无状态更新”解决方案:MCP 通过清晰的客户端-服务器(Client-Server)模型解决了上述问题。在这个模型下:
- 智能体(Client):只负责核心的推理和决策。它通过 MCP 协议向服务器“询问”当前可用的工具列表。
- 工具服务(Server):独立进程,提供具体的工具能力,如操作数据库、调用搜索引擎、读写文件等。它向客户端宣告自己提供了哪些“工具”(Tools)和“资源”(Resources)。
“无状态更新”就体现在这里:当一个新的 MCP 服务器启动并配置到智能体后,智能体在下一次与服务器握手时,就能自动发现新工具。智能体本身(客户端)无需任何代码修改或状态重置。它的“状态”是其核心模型和对话历史,而这些与工具集是解耦的。工具集的变更,不会影响智能体的既有状态。
这就好比你的电脑(智能体)通过USB接口(MCP协议)连接了一个新硬盘(MCP服务器)。电脑不需要重启,系统就能识别并使用这个新硬盘。MCP 协议就是这个标准化的“USB接口”。
2. MCP 核心概念与协议原理拆解
理解了价值,我们再来拆解 MCP 的核心组成部分。MCP 协议主要围绕几个核心概念展开,它们共同构成了智能体与工具交互的“语言”。
2.1 核心组件
- MCP 客户端(Client):通常是 AI 智能体或 AI 应用(如 Claude Desktop、Cursor、Windsurf)。它发起请求,使用工具。
- MCP 服务器(Server):提供具体能力的独立服务。例如:
filesystem-mcp:提供文件读写能力。sqlite-mcp:提供 SQLite 数据库操作能力。brave-search-mcp:提供网络搜索能力。
- 传输层(Transport):客户端与服务器通信的通道。常见的有:
- stdio(标准输入输出):最简单,服务器作为子进程启动。
- SSE(Server-Sent Events):适用于服务器是独立 HTTP 服务的情况。
- 工具(Tools):服务器向客户端暴露的可调用函数。每个工具都有名称、描述、输入参数模式(JSON Schema)。例如,一个 SQLite 服务器可能提供
execute_sql工具,参数是{“query”: “string”}。 - 资源(Resources):服务器向客户端提供的可读(有时可写)数据实体,用 URI 标识。例如,
file:///path/to/file.txt可以是一个文件资源。客户端可以“读取”资源内容作为上下文。 - 提示词(Prompts):服务器可以预定义一些提示词模板,客户端可以获取并用于构建对话。
2.2 协议交互流程
一个典型的 MCP 会话流程如下:
- 初始化(Initialize):客户端与服务器建立连接,交换基础信息(协议版本、能力)。
- 列出工具(ListTools):客户端请求服务器告知所有可用工具。这是“无状态更新”的关键:客户端每次需要时都可以重新获取工具列表。
- 列出资源(ListResources):客户端请求服务器告知所有可用资源。
- 调用工具(CallTool):客户端发送
CallTool请求,指定工具名和参数。服务器执行并返回结果。 - 读取资源(ReadResource):客户端发送
ReadResource请求,指定资源 URI。服务器返回资源内容。
整个通信基于 JSON-RPC 2.0,消息是结构化的 JSON 对象。这种设计使得协议清晰、易于实现和调试。
2.3 MCP 与 Function Calling 的区别
很多人会混淆 MCP 和大型语言模型的“函数调用(Function Calling)”功能。它们有关联,但层级不同:
- Function Calling:是 LLM(如 GPT-4)的一个能力。模型根据对话,决定是否以及如何调用一个预设的函数。它发生在模型推理内部。
- MCP:是管理这些“函数”从哪里来、如何被调用的基础设施和协议。它定义了工具如何被注册、发现和调用,与具体的 LLM 解耦。
简单说,Function Calling 是“智能体想做什么”,而 MCP 是“智能体能用什么以及怎么用”。一个支持 MCP 的客户端,会动态地将从 MCP 服务器获取的工具列表,转换成对应 LLM 所能理解的 Function Calling 定义。
3. 环境准备:构建你的第一个 MCP 实验环境
理论讲完了,我们动手搭建一个环境。为了让示例足够清晰,我们选择最经典的组合:使用Claude Desktop作为 MCP 客户端(它原生支持 MCP),并配置一个SQLite MCP 服务器,让 Claude 获得查询数据库的能力。
前置条件:
- 一台 macOS 或 Windows 电脑(Linux 也可,但 Claude Desktop 官方主要支持前两者)。
- 基本的命令行操作知识。
- 能够访问互联网以下载工具。
环境搭建步骤:
3.1 安装 Claude Desktop
这是我们的 MCP 客户端。从 Anthropic 官网下载并安装 Claude Desktop 应用。安装后正常登录即可。
3.2 准备 MCP 服务器配置目录
Claude Desktop 通过一个 JSON 配置文件来加载 MCP 服务器。我们需要找到或创建这个配置目录。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
如果目录或文件不存在,就手动创建它。
3.3 安装 SQLite MCP 服务器
我们将使用一个由社区维护的、简单的 SQLite MCP 服务器。它通常是一个 Python 脚本。我们需要准备 Python 环境。
首先,确保你安装了 Python 3.8+ 和 pip。然后,我们创建一个虚拟环境并安装依赖(这里以mcp-server-sqlite为例,你可能需要搜索当前活跃的项目)。
# 1. 创建一个项目目录 mkdir mcp-demo && cd mcp-demo # 2. 创建 Python 虚拟环境(推荐) python3 -m venv venv # 3. 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: # venv\Scripts\activate # 4. 安装 MCP 核心库和 SQLite 服务器示例 # 注意:这里假设有一个名为 `mcp-server-sqlite` 的包,实际可能需要从 GitHub 克隆 # 这里我们用一个简化的本地服务器脚本代替,以演示原理。 pip install mcp由于标准的mcp库只提供协议实现,不包含具体服务器,我们接下来自己编写一个最简单的 SQLite MCP 服务器脚本。
4. 实战:编写并配置一个 SQLite MCP 服务器
我们将创建一个最简单的、能提供 SQL 查询工具的 MCP 服务器。这个服务器将作为一个独立的子进程,通过 stdio 与 Claude Desktop 通信。
4.1 创建 SQLite 数据库和示例数据
首先,我们创建一个包含示例数据的数据库。
# 在 mcp-demo 目录下 sqlite3 demo.db <<EOF CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL, department TEXT ); INSERT INTO users (name, email, department) VALUES ('张三', 'zhangsan@example.com', '研发部'), ('李四', 'lisi@example.com', '市场部'), ('王五', 'wangwu@example.com', '研发部'), ('赵六', 'zhaoliu@example.com', '人力资源部'); CREATE TABLE orders ( order_id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT, amount REAL, order_date DATE, FOREIGN KEY (user_id) REFERENCES users(id) ); INSERT INTO orders (user_id, product, amount, order_date) VALUES (1, '笔记本电脑', 8999.00, '2024-03-15'), (2, '办公软件授权', 1999.00, '2024-03-18'), (1, '显示器', 2499.00, '2024-03-20'), (3, '键盘', 599.00, '2024-03-21'); EOF4.2 编写 MCP 服务器脚本 (sqlite_server.py)
现在,我们编写一个 Python 脚本,实现一个符合 MCP 协议的 SQLite 服务器。
#!/usr/bin/env python3 """ 一个简单的 SQLite MCP 服务器示例。 通过 stdio 传输,提供 SQL 查询工具。 """ import json import sqlite3 import sys from typing import Any, Dict, List from mcp import Server, NotificationOptions import mcp.server.stdio from mcp.server.models import Tool, Argument # 初始化 MCP 服务器 server = Server("sqlite-demo-server") # 定义数据库路径(简单起见,使用固定路径) DB_PATH = "demo.db" @server.list_tools() async def handle_list_tools() -> List[Tool]: """列出服务器提供的所有工具""" return [ Tool( name="execute_sql", description="执行一条 SQL 查询语句(只读,支持 SELECT)。请确保SQL语法正确。", inputSchema={ "type": "object", "properties": { "query": { "type": "string", "description": "要执行的 SQL SELECT 查询语句" } }, "required": ["query"] } ) ] @server.call_tool() async def handle_call_tool(name: str, arguments: Dict[str, Any]) -> List[Dict[str, Any]]: """处理工具调用请求""" if name == "execute_sql": query = arguments.get("query", "") if not query.strip().upper().startswith("SELECT"): # 安全限制:只允许 SELECT 查询 return [{ "type": "text", "text": f"错误:出于安全考虑,只允许执行 SELECT 查询。您的查询是:{query}" }] try: conn = sqlite3.connect(DB_PATH) # 将结果以字典形式返回,更易读 conn.row_factory = sqlite3.Row cursor = conn.cursor() cursor.execute(query) rows = cursor.fetchall() column_names = [description[0] for description in cursor.description] if cursor.description else [] # 格式化结果为文本表格 if not rows: result_text = "查询成功,但结果为空。" else: # 简单的 Markdown 表格格式化 header = "| " + " | ".join(column_names) + " |" separator = "|" + "|".join(["---"] * len(column_names)) + "|" data_rows = [] for row in rows: data_rows.append("| " + " | ".join(str(item) for item in row) + " |") result_text = "\n".join([header, separator] + data_rows) conn.close() return [{ "type": "text", "text": f"查询成功!\n\n{result_text}" }] except sqlite3.Error as e: return [{ "type": "text", "text": f"SQL 执行错误:{e}" }] except Exception as e: return [{ "type": "text", "text": f"未知错误:{e}" }] else: return [{ "type": "text", "text": f"未知工具:{name}" }] async def main(): """主函数,启动 stdio 服务器""" async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): await server.run(read_stream, write_stream, NotificationOptions()) if __name__ == "__main__": import asyncio asyncio.run(main())关键代码解释:
Server(“sqlite-demo-server”):创建一个 MCP 服务器实例。@server.list_tools():装饰器,用于处理客户端ListTools请求。这里返回一个Tool对象列表,定义了工具名、描述和输入参数模式(JSON Schema)。@server.call_tool():装饰器,用于处理客户端CallTool请求。根据工具名(name)执行相应逻辑。- 在
handle_call_tool中,我们只处理execute_sql工具,并做了简单的安全限制(只允许SELECT),防止数据被意外修改或删除。 - 查询结果被格式化为 Markdown 表格,便于在 Claude 等客户端中清晰显示。
mcp.server.stdio.stdio_server():创建基于标准输入输出的传输层,这是与 Claude Desktop 集成最简单的方式。
4.3 配置 Claude Desktop 加载我们的 MCP 服务器
接下来,我们需要编辑 Claude Desktop 的配置文件,告诉它启动我们这个 Python 脚本作为 MCP 服务器。
打开或创建配置文件(路径见 3.2 节)claude_desktop_config.json,内容如下:
{ "mcpServers": { "sqlite-demo": { "command": "/absolute/path/to/your/mcp-demo/venv/bin/python", "args": [ "/absolute/path/to/your/mcp-demo/sqlite_server.py" ], "env": { "PYTHONPATH": "/absolute/path/to/your/mcp-demo" } } } }重要提示:
- 你必须将
/absolute/path/to/your/mcp-demo替换成你电脑上mcp-demo目录的绝对路径。 command指向的是你虚拟环境中的 Python 解释器路径。args指向我们刚写的sqlite_server.py脚本。env部分确保了 Python 能找到mcp库(如果安装在虚拟环境中)。
Windows 用户注意:
command可能类似C:\Users\YourName\mcp-demo\venv\Scripts\python.exe。- 路径中使用双反斜杠
\\或正斜杠/。 args中的脚本路径同样需要是绝对路径。
保存配置文件。
5. 运行与验证:在 Claude Desktop 中体验无状态更新
现在,激动人心的时刻到了。我们将启动 Claude Desktop 并验证我们的 MCP 服务器是否正常工作。
5.1 启动与连接
- 完全关闭Claude Desktop 应用(如果它正在运行)。
- 重新启动Claude Desktop。
- 应用启动时,会自动读取
claude_desktop_config.json配置文件,并尝试按照配置启动sqlite-demo这个 MCP 服务器(即运行我们的 Python 脚本)。
如何确认服务器启动成功?
- 查看日志(推荐):Claude Desktop 通常会在其日志中输出 MCP 服务器的连接状态。日志位置因系统而异(如 macOS 可能在
~/Library/Logs/Claude/)。查找包含 “MCP”、“sqlite-demo” 或 “初始化” 字样的日志行。 - 观察行为:如果服务器启动失败,Claude Desktop 可能静默失败或弹出一个简短的错误提示。如果配置正确,通常不会有明显提示,但工具已经可用。
5.2 在对话中测试工具
打开 Claude Desktop,新建一个对话。现在,你可以尝试让 Claude 查询数据库了。
示例对话:
你:你好,请帮我查一下数据库里有哪些用户。
Claude:(在思考后,它应该会识别到可用的
execute_sql工具,并可能会向你确认,或者直接生成调用该工具的请求。在支持 MCP 的客户端中,这通常是自动的。最终它会返回类似下面的结果)我使用
execute_sql工具查询了用户表,结果如下:
id name department 1 张三 zhangsan@example.com 研发部 2 李四 lisi@example.com 市场部 3 王五 wangwu@example.com 研发部 4 赵六 zhaoliu@example.com 人力资源部 数据库中共有 4 位用户。
进行更复杂的查询:
你:请列出所有订单,并关联上用户姓名。
Claude:(它应该会构造一个 JOIN 查询)
我执行了以下 SQL 查询来关联订单和用户信息:
SELECT o.order_id, u.name, o.product, o.amount, o.order_date FROM orders o JOIN users u ON o.user_id = u.id结果如下:
order_id name product amount order_date 1 张三 笔记本电脑 8999.0 2024-03-15 2 李四 办公软件授权 1999.0 2024-03-18 3 张三 显示器 2499.0 2024-03-20 4 王五 键盘 599.0 2024-03-21
这就是“无状态更新”的体现:Claude Desktop(客户端)在启动时加载了配置,发现了新的 MCP 服务器,并动态获取了execute_sql这个工具。在整个过程中,Claude 的核心模型、对话历史、界面都没有任何改变。我们只是通过一个外部的配置文件,为它“注入”了新的能力。
6. 深入理解:MCP 无状态更新的优势与典型场景
通过上面的实战,你应该已经感受到了 MCP 无状态更新的威力。我们来系统性地总结一下它的优势,以及它最适合的应用场景。
6.1 核心优势
- 解耦与模块化:智能体核心逻辑与工具实现彻底分离。工具可以独立开发、测试、部署和版本化管理。
- 动态能力扩展:新增、移除或升级工具服务,无需修改或重启智能体客户端。只需更新配置文件。
- 安全性提升:敏感操作(如数据库访问、文件写入、网络请求)被隔离在独立的服务器进程中。可以对这些服务器实施更严格的权限控制和审计。
- 语言无关性:MCP 服务器可以用任何语言编写(Python, Node.js, Go, Rust等),只要遵循 JSON-RPC 协议即可。智能体客户端无需关心服务器的实现语言。
- 复用与共享:一个写好的 MCP 服务器(如
sqlite-mcp)可以被任何支持 MCP 的智能体(Claude Desktop, Cursor, Windsurf等)使用,避免了重复开发。 - 标准化生态:协议标准化促进了工具生态的发展。开发者可以专注于编写好用的工具服务器,而不必为每个智能体框架做适配。
6.2 典型应用场景
- 企业知识库问答:部署一个连接内部 Wiki、Confluence 或数据库的 MCP 服务器,智能体即可安全地查询企业内部信息,而无需将敏感数据直接暴露给 LLM。
- 开发助手增强:为代码助手(如 Cursor)动态添加项目专属工具,如运行特定测试脚本、查询项目 API 文档、检查部署状态等。
- 自动化工作流:智能体可以通过 MCP 调用各种自动化服务,如发送邮件、创建日历事件、操作 CRM 系统等,成为个人或团队的工作流中枢。
- 多模态能力集成:通过 MCP 服务器集成图像生成、语音识别、文档解析等能力,让以文本为核心的智能体获得多模态处理能力。
- 安全沙箱环境:将高风险操作(如执行 Shell 命令、访问生产数据库)放在受严格监控和资源限制的 MCP 服务器中,为智能体的操作加上安全护栏。
7. 常见问题与排查思路
在实际使用 MCP 时,你可能会遇到一些问题。下面是一个快速排查指南。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Claude Desktop 启动后,无法使用新工具。 | 1. 配置文件路径或格式错误。 2. MCP 服务器启动失败。 3. Python 路径或依赖错误。 | 1. 检查claude_desktop_config.json路径是否正确,JSON 格式是否合法。2. 查看 Claude Desktop 应用日志。 3. 手动在终端运行配置中的命令,看服务器能否独立启动并打印日志。 | 1. 使用 JSON 校验工具检查配置文件。 2. 确保 command和args中的路径是绝对路径且存在。3. 在虚拟环境中手动运行 python sqlite_server.py,看是否有导入错误。 |
| 工具调用后返回“未知工具”或超时错误。 | 1. 服务器list_tools实现有误,返回的工具名不匹配。2. 传输层通信中断。 | 1. 在服务器代码中添加日志,打印收到的CallTool请求。2. 检查服务器 handle_call_tool函数中工具名判断逻辑。 | 1. 确保@server.list_tools返回的Tool对象中name字段与@server.call_tool中判断的name完全一致。2. 简化服务器逻辑,确保没有未处理的异常导致进程崩溃。 |
| 服务器进程启动后立即退出。 | 1. Python 脚本语法错误。 2. 缺少 mcp等依赖库。3. 脚本中 __main__部分缺失或错误。 | 1. 在命令行手动执行python -m py_compile sqlite_server.py检查语法。2. 在虚拟环境中运行 `pip list | grep mcp确认库已安装。<br>3. 检查脚本最后是否有ifname== “main“:和asyncio.run(main())`。 |
| 可以调用工具,但 SQL 查询失败。 | 1. 数据库文件路径错误。 2. SQL 语法错误。 3. 数据库权限问题。 | 1. 在服务器代码中打印DB_PATH的绝对路径,确认文件存在。2. 将用户发送的 SQL 语句打印到日志中,手动在 SQLite 客户端中测试。 3. 检查文件读写权限。 | 1. 使用os.path.abspath(DB_PATH)确保路径正确。2. 在服务器代码中增加更详细的 SQL 错误捕获和返回信息。 3. 确保运行 Claude Desktop 的用户有权限读取数据库文件。 |
| 想同时使用多个 MCP 服务器(如 SQLite + 搜索)。 | 配置文件只配置了一个服务器。 | 检查claude_desktop_config.json中mcpServers对象。 | mcpServers是一个对象,可以包含多个键值对。为每个服务器分配一个唯一的 key(如“sqlite”,“search”),并分别配置其command和args。 |
8. 最佳实践与进阶指南
当你开始在生产环境或更复杂的场景中使用 MCP 时,以下最佳实践能帮助你走得更稳、更远。
8.1 安全性是第一要务
- 最小权限原则:每个 MCP 服务器只授予其完成任务所必需的最小权限。例如,数据库服务器只给只读权限,文件服务器限制在特定目录。
- 输入验证与净化:像我们示例中一样,在服务器端对输入进行严格校验。对于 SQL 服务器,除了限制
SELECT,还可以使用参数化查询来防止 SQL 注入。 - 访问控制:考虑为 MCP 服务器添加认证层,确保只有受信的客户端可以连接。虽然 stdio 模式通常在本地运行,但在 SSE 模式下尤为重要。
- 日志与审计:记录所有工具调用请求和结果(注意脱敏),便于事后审计和问题排查。
8.2 工程化与部署
- 将服务器容器化:使用 Docker 封装 MCP 服务器及其依赖,确保环境一致性,简化部署。Claude Desktop 可以通过配置调用
docker run命令来启动服务器。 - 使用进程管理工具:对于生产环境,使用 systemd, supervisord 或 Kubernetes 来管理 MCP 服务器进程,确保其高可用。
- 版本化管理配置:将
claude_desktop_config.json等配置文件纳入版本控制(Git),方便团队共享和回滚。 - 开发 vs 生产配置:为开发和生产环境准备不同的配置文件,指向不同的服务器地址或数据库。
8.3 设计健壮的 MCP 服务器
- 提供清晰的工具描述:
Tool对象的description和参数的description要尽可能清晰,这有助于 LLM 理解何时以及如何使用该工具。 - 处理边界和错误:服务器代码要健壮,能处理各种异常输入和边界情况,并返回对人类和 AI 都友好的错误信息。
- 考虑性能:如果工具调用涉及网络请求或复杂计算,要考虑超时、重试和缓存机制。
- 实现资源(Resources):除了工具,积极利用 MCP 的“资源”概念。例如,一个数据库服务器除了提供查询工具,还可以将“数据库 schema”作为一个资源暴露,让智能体在规划查询前先了解表结构。
8.4 探索更丰富的生态
- 社区服务器:积极寻找和尝试社区已经开发好的 MCP 服务器,如
tavily-mcp(搜索)、filesystem-mcp(文件系统)、github-mcp(GitHub 操作)等,避免重复造轮子。 - SSE 传输模式:当你需要让智能体连接到一个远程服务(如公司内网的 API 网关)时,就需要使用 SSE 模式。这需要服务器实现一个 HTTP 端点来处理 SSE 连接。
- 与 AI 应用框架集成:除了 Claude Desktop,研究如何在你使用的其他 AI 应用或框架(如 LangChain, LlamaIndex, Dify 等)中集成 MCP 客户端,让你的智能体项目也能享受协议带来的好处。
MCP 协议及其倡导的无状态更新模式,正在将 AI 智能体从封闭、僵化的“全能单体”,转变为开放、灵活、可组装的“核心+生态”。它解决的不仅是工具调用的问题,更是智能体时代的基础设施标准化问题。
作为开发者,我们的角色也在发生变化:从编写智能体内部的每一个功能,转变为设计和编排一系列专业、安全、可复用的工具服务。下一次,当你需要为智能体增加一个新能力时,不妨先问自己:这个功能,是否可以抽象成一个独立的 MCP 服务器?
从今天开始,尝试将你的下一个智能体功能外置为一个 MCP 服务器。你会发现,智能体的边界,从此可以被无限扩展。
