一、什麼是 MCP
MCP(Model Context Protocol,模型上下文協議) 是一套標準化的協議,用來規範 AI 應用如何調用外部工具和數據源。
一句話定義:MCP = AI 調用外部工具的統一標準,就像 USB 統一了設備接口,MCP 統一了 AI 工具調用的接口。
用生活場景理解,類比:充電接口的演變
【沒有統一標準的時代】
諾基亞 → 圓口充電器
三星 → 扁口充電器
蘋果 → Lightning
華為 → Micro USB
出門帶 4 根線,煩死了!
【有了 Type-C 標準後】
所有手機 → Type-C
一根線走天下!
MCP 做的是同樣的事
【沒有 MCP 的 AI 世界】
高德地圖 API → REST + 自定義認證
天氣查詢 API → GraphQL + API Key
數據庫查詢 → SQL + 專用驅動
發送郵件 → SMTP + OAuth
每個工具都要單獨對接,累死了!
【有了 MCP 標準後】
所有工具 → 統一的 MCP 協議
一套規範接所有!
類比:就像以前每個手機品牌都有自己的充電口,現在統一用 Type-C,方便了所有人。
|
之前
|
現在(有 MCP)
|
|
每個 AI 應用自己對接工具
|
統一標準,一次開發到處使用
|
|
工具開發者要適配 N 個 AI |
只需實現 MCP 協議即可
|
|
AI 能力受限於內置功能
|
可無限擴展外部能力
|
二、MCP Server 能提供什麼
三種能力:MCP 定義了三種能力類型,理解它們只需記住:給什麼、做什麼、怎麼做。
1、Resources(資源)—— 給 AI “看”的東西
簡單説:只讀的數據源,AI 可以讀取但不能修改。
常見例子:(1)文件內容(代碼、文檔、配置)(2)數據庫記錄(用户數據、訂單信息)(3)API 響應(第三方服務返回的數據)
使用場景:”分析一下這個文件有什麼問題” → AI 讀取文件內容(Resource)→ 分析並給出建議
2、Tools(工具)—— AI 能”做”的事情
簡單説:可執行的函數,AI 調用後會產生實際效果。
常見例子:(1)查詢地理座標、規劃路線(2)發送郵件、創建日曆事件(3)讀寫數據庫、執行系統命令
使用場景:”幫我查北京的天氣” → AI 調用天氣查詢工具(Tool)→ 返回實時天氣數據
3、Prompts(提示詞模板)—— 標準化的工作流
簡單説:預定義的對話模板,用户一鍵觸發常見任務。
常見例子:(1)“代碼審查”:自動分析性能、安全、可讀性(2)“生成文檔”:根據代碼自動生成 README(3)“Bug 診斷”:系統化排查問題
使用場景:用户選擇”代碼審查”模板 → 自動填充代碼 → AI 按模板執行審查流程
一句話區分:
|
概念
|
一句話説明
|
最常見用途
|
|
Resources
|
AI 讀取的數據
|
讀取文件、查詢數據庫
|
|
Tools
|
AI 執行的操作
|
調用外部 API(最常用,佔比90%)
|
|
Prompts
|
用户觸發的模板
|
標準化工作流
|
Tip:實際使用中 Tools 佔 90% ,Resources 適合需要大量上下文的場景,Prompts 用於固定流程。
三、MCP 核心要點
1、MCP 的本質定位:MCP 是協議標準化,不是技術突破
MCP ≠ 新的 AI 技術
MCP = 工具調用的標準化協議
底層還是 Function Call,只是把接口規範統一了
通俗類比:
|
類比對象
|
作用
|
|
USB 之於硬件
|
統一了充電口/數據口
|
|
HTTP 之於網絡
|
統一了請求響應格式
|
|
MCP 之於 AI
|
統一了工具調用接口
|
關鍵認知:MCP 不會讓 AI 變聰明。該選錯工具還是會選錯,該提取錯參數還是會提取錯
2、MCP 解決的三個痛點:用一個智能客服系統的案例説明
需求:做一個能回答"我的訂單什麼時候到?"的 AI 客服
需要對接:
├── 內部訂單系統 (REST API)
├── 順豐物流 (SOAP XML)
├── 京東物流 (gRPC)
└── 企業微信 (自定義協議)
|
痛點
|
沒有 MCP
|
有了 MCP
|
|
接口格式
|
寫 4 套適配代碼
|
統一格式,寫 1 套
|
|
工具描述
|
每個開發者自己定義
|
標準化描述格式
|
|
團隊協作
|
前後端反覆對齊接口
|
看協議文檔就行
|
3、傳輸方式的選擇:非常實用的決策表
你的需求是什麼?
├─→ 操作本地文件/數據庫? ──→ 用 STDIO
│ └─ 例:文件搜索、SQLite 查詢
└─→ 調用遠程服務/API? ──→ 用 SSE
└─ 例:高德地圖、天氣 API、團隊共享工具
一句話總結:本地用 STDIO,遠程用 SSE。
4、務實的使用策略(最有價值):三個層次的建議
(1)❌ 不要盲目追新
如果你的項目:
- 工具就幾個,都是自己的 API
- 一個人開發,不需要團隊協作
- 對工具調用有深度定製需求
→ 直接用 Function Call 更合適
(2)❌ 不要一棍子打死
如果需要快速接入:
- 高德地圖、天氣這類現成服務
- 開源社區的 MCP Server
→ MCP 能省不少事
(3)✅ 混合策略最務實:用智能客服的例子
┌──────────────────────────────────────────────┐
│ 智能客服系統 │
├──────────────────────────────────────────────┤
│ 核心業務(自己實現 Function Call) │
│ ├── 查訂單狀態 ← 自己的數據庫 │
│ ├── 查庫存信息 ← 自己的庫存系統 │
│ └── 處理退款 ← 核心業務邏輯 │
├──────────────────────────────────────────────┤
│ 通用能力(用 MCP 快速接入) │
│ ├── 地圖導航 ← 高德 MCP │
│ ├── 天氣查詢 ← 天氣 MCP │
│ └── 發郵件/短信 ← 通知 MCP │
└──────────────────────────────────────────────┘
5、MCP 的真正價值:爭奪 AI 工具生態的話語權,類比 USB 標準的故事
6、正確認知
|
之前可能的誤解
|
正確認知
|
|
MCP 是革命性新技術
|
只是協議標準化,底層還是 Function Call
|
|
用 MCP 就不用寫代碼了
|
還是要寫,只是格式統一了
|
|
MCP 能讓 AI 更準確
|
不能,該出錯還會出錯
|
|
MCP Server 都免費
|
底層 API 該收費還是收費
|
|
必須全面擁抱 MCP
|
混合策略更務實
|
這篇文章不錯,可以參考:《MCP 爆火背後:是技術革命,還是精心包裝的“新瓶舊酒”?》-
四、MCP vs Function Call 核心區別
1、一句話説清楚關係:MCP = Function Call 的"標準化外殼",它們不是替代關係,而是包裝關係
┌─────────────────────────────────┐
│ MCP 協議 │ ← 標準化的接口規範
│ ┌─────────────────────────┐ │
│ │ Function Call │ │ ← 底層核心能力
│ │ (AI 的工具調用能力) │ │
│ └─────────────────────────┘ │
└─────────────────────────────────┘
對比表:
|
維度
|
Function Call
|
MCP
|
|
本質
|
AI 的原生能力
|
協議/規範
|
|
定位
|
"引擎"
|
"方向盤+儀表盤"
|
|
作用
|
讓 AI 能調用工具
|
讓工具調用標準化
|
|
開發方式
|
自己定義格式
|
遵循統一格式
|
|
生態
|
各自為戰
|
可複用、可共享
|
|
學習成本
|
需要讀各家 API 文檔
|
學一套協議通用
|
2、用案例説明 - 場景:讓 AI 查天氣
(1)方式一:直接用 Function Call(自己實現)
// 1. 自己定義工具格式
const tools = [{
name: "get_weather",
description: "查詢天氣",
parameters: {
type: "object",
properties: {
city: { type: "string", description: "城市名" }
}
}
}]
// 2. 調用 AI,讓它決定是否用工具
const response = await openai.chat.completions.create({
model: "gpt-4",
messages: [{ role: "user", content: "北京天氣怎麼樣" }],
tools: tools
})
// 3. 自己解析 AI 返回的工具調用
if (response.tool_calls) {
const args = JSON.parse(response.tool_calls[0].function.arguments)
// 4. 自己調用真實的天氣 API
const weather = await fetch(`https://api.weather.com?city=${args.city}`)
// 5. 把結果返回給 AI 生成最終回覆
}
特點:完全自己掌控,但每個項目都要重寫一遍。
(2)方式二:通過 MCP(使用標準協議)
// 只需配置一個 MCP Server
{
"mcpServers": {
"weather": {
"url": "https://mcp.weather.com/sse"
}
}
}
然後 AI 自動就能用了,不用寫調用代碼。
特點:標準化,接入快,但底層還是 Function Call。
3、流程對比圖
【Function Call 流程】(自己實現)
用户 → AI → 你的代碼解析 → 你調用 API → 你返回結果 → AI 生成回覆
↑ ↑
└──────── 全都要自己寫 ─────────────────────────┘
【MCP 流程】(標準化)
用户 → AI → MCP Client → MCP Server → 真實 API
↑ ↑ ↑
│ │ └── 按協議暴露工具(別人寫好的)
│ └── 按協議調用(框架處理)
└── 還是 Function Call(只是被封裝了)
4、核心區別總結
|
問題
|
Function Call
|
MCP
|
|
誰來定義工具格式?
|
你自己定
|
協議規定好了
|
|
誰來寫調用邏輯?
|
你自己寫
|
框架/Server 處理
|
|
能複用嗎?
|
不能,下個項目重寫
|
能,MCP Server 可共享
|
|
能讓 AI 更準?
|
取決於你的實現
|
不能,底層一樣
|
5、什麼時候用哪個?- 以下場景更適合用哪種就用哪種,不需要一刀切,混合策略才是最務實的
選擇 Function Call(自己實現):
├── 工具數量少(1-3個)
├── 需要深度定製邏輯
├── 對調用過程要完全掌控
└── 不需要和別人共享
選擇 MCP:
├── 需要快速接入多個第三方服務
├── 團隊協作,需要統一規範
├── 想複用社區已有的 MCP Server
└── 項目規模大,工具多
6、類比
Function Call = 自己組裝電腦
- 完全掌控每個零件
- 但每台都要從頭組裝
MCP = 買品牌整機 + 標準配件
- 插上就能用
- 但底層還是那些零件
核心認知:MCP 沒有讓 AI 變強,只是讓"接工具"這件事變簡單了。
五、Function Call 作用通俗講解
1、一句話定義:Function Call = 讓 AI 從"只會説"變成"能幹活"的能力
2、解決什麼問題?
(1)沒有 Function Call 的 AI:AI 很聰明,但是個"嘴強王者"——只會説,不會做。
你:北京現在幾度?
AI:抱歉,我無法獲取實時天氣信息,建議你查詢天氣網站...
(2)有了 Function Call 的 AI:AI 有了"手",能去查真實數據了
你:北京現在幾度?
AI:(內心活動:這個問題需要查天氣,我調用一下天氣工具)
→ 調用 get_weather(city="北京")
→ 獲得結果:15°C,晴
AI:北京現在 15°C,天氣晴朗。
3、工作流程(5 步圖解)- 用"查天氣"完整演示:
第 1 步:用户提問
用户:"北京今天天氣怎麼樣?"
↓
第 2 步:AI 分析 + 決策
AI 收到問題,同時看到可用工具列表:
可用工具:
├── get_weather(city) - 查詢天氣
├── send_email(to, content) - 發郵件
└── search_web(keyword) - 搜索網頁
AI 判斷:這是天氣問題 → 應該用 get_weather
AI 輸出:調用 get_weather,參數 city="北京"
↓
第 3 步:執行函數
你的代碼接收到 AI 的"指令":
{
"function": "get_weather",
"arguments": { "city": "北京" }
}
然後調用真實的天氣 API,獲得結果:{ "temp": "15°C", "weather": "晴", "wind": "北風3級" }
↓
第 4 步:結果返回給 AI
把天氣數據塞回對話:"工具執行結果:北京,15°C,晴,北風3級"
↓
第 5 步:AI 生成最終回覆
AI 根據工具返回的數據,組織自然語言回覆:"北京今天天氣晴朗,氣温 15°C,有北風 3 級,適合户外活動,記得帶件薄外套哦~"
代碼示例(簡化版)
// 1️⃣ 定義工具(告訴 AI 有什麼能力可用)
const tools = [{
type: "function",
function: {
name: "get_weather",
description: "查詢指定城市的實時天氣",
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "城市名稱,如:北京、上海"
}
},
required: ["city"]
}
}
}]
// 2️⃣ 調用 AI(帶上工具列表)
const response = await openai.chat.completions.create({
model: "gpt-4",
messages: [{ role: "user", content: "北京天氣怎麼樣" }],
tools: tools // ← 告訴 AI 可以用這些工具
})
// 3️⃣ AI 返回的不是文字,而是"調用指令"
// response.choices[0].message.tool_calls = [{
// function: {
// name: "get_weather",
// arguments: '{"city": "北京"}'
// }
// }]
// 4️⃣ 你來執行真實調用
const args = JSON.parse(response.choices[0].message.tool_calls[0].function.arguments)
const weatherData = await 調用真實天氣API(args.city)
// 5️⃣ 把結果喂回 AI,讓它生成最終回覆
const finalResponse = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{ role: "user", content: "北京天氣怎麼樣" },
{ role: "assistant", tool_calls: [...] },
{ role: "tool", content: JSON.stringify(weatherData) } // ← 工具結果
]
})
// 最終得到自然語言回覆
console.log(finalResponse.choices[0].message.content)
// → "北京今天 15°C,天氣晴朗,適合出行~"
4、核心要點
(1)AI 做什麼?
✅ 理解用户意圖
✅ 決定用哪個工具
✅ 提取參數(從用户的話裏)
✅ 根據結果生成回覆
❌ 不執行真實 API 調用(這是你的代碼做的)
(2)你的代碼做什麼?
✅ 定義有哪些工具可用
✅ 接收 AI 的調用指令
✅ 執行真實的 API/數據庫操作
✅ 把結果返回給 AI
5、形象類比:餐廳點餐
顧客(用户) :"我要一份宮保雞丁"
服務員(AI) :理解需求,寫菜單
→ 下單:宮保雞丁 × 1
廚房(你的代碼):收到訂單,真正去做菜
→ 返回:一盤宮保雞丁
服務員(AI) :把菜端給顧客,説"您的菜好了"
AI 是服務員:聽懂需求、決定點什麼、優雅地呈現結果
你的代碼是廚房:真正幹活的地方
6、常見問題
(1)AI 能直接調用 API 嗎?
不能。AI 只能"説"要調用什麼,真正的執行是你的代碼完成的
(2)AI 怎麼知道該用哪個工具?
工具描述。描述寫得越清楚,AI 判斷越準
// 好的描述
description: "查詢指定城市的實時天氣,返回温度、天氣狀況、風力等"
// 差的描述
description: "天氣" // AI 可能搞不清什麼時候該用
(3)AI 會判斷錯嗎?
會。這是 Function Call 的主要問題:(1)工具太多時容易選錯(2)複雜參數容易提取不準(3)一個問題涉及多個工具時處理困難
7、總結:Function Call 的本質
┌─────────────┐ ┌─────────────┐
│ 大腦 │ ──────► │ 手腳 │
│ (AI) │ 指令 │ (你的代碼) │
└─────────────┘ └─────────────┘
│ │
│ 理解 + 決策 │ 執行 + 返回
↓ ↓
"要查天氣" 真的去查天氣
= 讓 AI 從"只會説"升級到"能指揮幹活"