大模型很聰明,但不知道你公司內部有什麼。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_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。問題:Agent 不確定文件是否完整,連續調用 read_document 同一文件多次。
token_used 和 content_length 元信息,讓 Agent 判斷是否已獲得完整內容。MCP 協議支持在 tool result 中返回 metadata。| 維度 | MCP | RAG |
|---|---|---|
| 適用場景 | 即時數據、頻繁變更的檔案、需要寫操作的場景 | 大規模文件庫、搜尋型問答、歷史歸檔數據 |
| 延遲 | 低(直接讀檔案/API) | 高(向量檢索 + LLM 生成) |
| 實現成本 | 中(每個數據源要寫 MCP Server) | 高(切塊、向量化、建索引) |
| 數據一致性 | 即時(讀取時就是最新) | 滯後(依賴索引更新時間) |
| 安全性 | 高(可在 MCP Server 加細粒度權限) | 中(向量數據庫整體開放) |
實際推薦:兩者可以疊加用。MCP 處理即時、敏感的讀寫操作;RAG 處理大規模文件搜尋。典型架構:RAG 負責「找相關文件」,MCP 負責「獲取詳細內容」。