大模型很聪明,但不知道你公司内部有什么。MCP 协议让 AI Agent 安全地访问企业文件、数据库、API,不再乱编数据
部署完 AI Agent,第一反应往往是:它能回答通用问题,但不知道公司制度、合同模板、项目进度、客服记录。
传统解法有两条路:
MCP 提供了第三条路:标准化协议层,像 USB 接口一样,让 AI Agent 即插即用地连接各种数据源,无需为每个数据源单独写集成代码。
MCP(Model Context Protocol)由 Anthropic 开源,核心思路:把 AI Agent 与数据源之间的通信方式标准化。
类比:USB 协议让电脑连接各种设备(鼠标、键盘、硬盘),不用为每个设备单独写驱动。MCP 让 AI Agent 连接各种数据源(文件、数据库、API),不用为每个数据源单独写集成。
MCP 协议包含三类核心组件:
| 组件 | 作用 | 类比 |
|---|---|---|
| Host(宿主) | AI 应用本身(如 Mule Agent) | 电脑 |
| Client(客户端) | 与每个数据源维持一个连接 | USB 控制器 |
| Server(服务端) | 每个数据源的 MCP 适配器 | 设备驱动 |
| Tools(工具) | Server 暴露给 Agent 的可调用能力 | 设备功能接口 |
# Python 环境(建议 3.10+)
pip install mcp
# Node.js 环境(如果用 JS/TS)
npm install @modelcontextprotocol/sdk
MCP 有 Python 和 TypeScript 两个官方 SDK,企业内部系统多用 Python 实现。
先用一个最简例子:让 AI Agent 能读取公司共享盘里的文件。
# file_server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("企业文件系统")
@mcp.tool()
def read_document(path: str) -> str:
"""读取指定路径的文档内容"""
import os
# 安全限制:只允许读取指定目录
ALLOWED_DIR = "/data/knowledge_base"
full_path = os.path.realpath(os.path.join(ALLOWED_DIR, path))
if not full_path.startswith(ALLOWED_DIR):
return "错误:路径不在允许范围内"
try:
with open(full_path, "r", encoding="utf-8") as f:
return f.read()[:8000] # 限制返回长度
except Exception as e:
return f"读取失败:{e}"
if __name__ == "__main__":
mcp.run()
os.path.realpath 做路径规范化,并检查最终路径是否在允许目录内。防止 Agent 通过 ../../../etc/passwd 读取系统文件。
# 方式 A:stdio 模式(本地进程通信,最简单)
python file_server.py
# 方式 B:SSE 模式(HTTP 长连接,适合远程)
python -m uvicorn file_server:app --port 8080
stdio 模式通过标准输入输出通信,适合本地集成。Mule Agent 可以直接通过 stdio 模式调用本地 MCP Server。
在 Mule Agent 后台添加 MCP 数据源:
# mule_agent_config.json
{
"mcp_servers": [
{
"name": "企业知识库",
"command": "python",
"args": ["/data/mcp/file_server.py"],
"description": "访问公司知识库文档"
}
]
}
配置完成后,AI Agent 在对话中就能自动发现并调用 read_document 工具,读取 /data/knowledge_base/ 目录下的文件。
向 AI Agent 提问:
"我们公司最新的年假制度是怎么规定的?请从知识库中找到相关文档并回答。"
Agent 会自动:
read_document("hr/vacation-policy-2026.md")全程在企业内部网络完成,数据不出公司,符合数据安全要求。
问题:如果不做路径检查,恶意 prompt 可以让 Agent 读取 /etc/passwd 或公司敏感文件。
if not realpath(full).startswith(ALLOWED_DIR): raise PermissionError()问题:大文档直接返回全部内容,消耗大量 token,成本飙升,响应变慢。
[:8000]),或用 top_k 参数只返回最相关片段。需要全文时再让 Agent 分段读取。问题:Server 进程挂了,Agent 沉默,用户不知道工具不可用,还以为 AI 在思考。
health_check_interval(MCP SDK 内置),定期探测 Server 状态。异常时在对话中主动告知用户:"当前无法访问知识库,请联系管理员"。问题:企业文档有 GBK 编码(Windows 系统导出文件),直接读 utf-8 报 UnicodeDecodeError。
encoding="utf-8", errors="replace" 自动替换无法解码的字符,或先尝试 GBK 再 fallback UTF-8:open(path, encoding="utf-8") or open(path, encoding="gbk")问题:Agent 不确定文档是否完整,连续调用 read_document 同一文件多次。
token_used 和 content_length 元信息,让 Agent 判断是否已获得完整内容。MCP 协议支持在 tool result 中返回 metadata。| 维度 | MCP | RAG |
|---|---|---|
| 适用场景 | 实时数据、频繁变更的文件、需要写操作的场景 | 大规模文档库、搜索型问答、历史归档数据 |
| 延迟 | 低(直接读文件/API) | 高(向量检索 + LLM 生成) |
| 实现成本 | 中(每个数据源要写 MCP Server) | 高(切块、向量化、建索引) |
| 数据一致性 | 实时(读取时就是最新) | 滞后(依赖索引更新时间) |
| 安全性 | 高(可在 MCP Server 加细粒度权限) | 中(向量数据库整体开放) |
实际推荐:两者可以叠加用。MCP 处理实时、敏感的读写操作;RAG 处理大规模文档搜索。典型架构:RAG 负责"找相关文档",MCP 负责"获取详细内容"。