一、什麼是 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 從"只會説"升級到"能指揮幹活"