本文介紹 AI 模型中的函式呼叫(Function Calling)與模型上下文協定(Model Context Protocol,MCP)之間的實際關係。網路上流傳著一些關於 MCP 能夠取代 Function Calling 的說法,但這樣的觀點並不準確。
MCP:標準化函式執行
事實上,MCP 並不是要取代 Function Calling,而是而是要標準化其中執行函式的步驟。回顧先前的增強型 LLM(一):工具使用文章,Function Calling 的流程包含以下五個主要步驟:
- 定義函式並發出請求:開發者設定一組函式,並要求模型執行特定的任務。
- 選擇函式:模型回傳訊息,內含選擇的函式名稱和對應的參數。
- 執行函式:開發者執行模型所選擇的函式。
- 返回結果:開發者將函式執行的結果回傳給模型。
- 描述結果:模型使用自然語言來解釋函式執行的結果,提供給使用者一個易於理解的答案或解釋。
圖片來源:OpenAI Platform
MCP 的作用,正是針對 Function Calling 流程中的第三步驟「函式執行」進行標準化。它提供了一種標準化的機制,讓開發者能夠以規範的方式來執行模型所建議的特定函式。這意味著,開發者可以使用 MCP 來確保 Function Calling 的過程是一致且可靠的,從而提高整個系統的效率和可靠性。
MCP Client:Function Calling 的實作
MCP 協定中的 MCP 客戶端(MCP Client)其實就是 Function Calling 的實作,包含工具定義並對 AI 模型發出請求、AI 模型建議使用的工具、向 MCP 伺服端(MCP Server)要求執行函式、從 MCP Server 得到執行結果、將執行結果回傳給 AI 模型,最後 AI 模型總結結果給 MCP Client。
以下提供一個簡易的 MCP Client 實作範例,展示 MCP Client 如何實作 Function Calling。完整的程式碼已發布於筆者的 GitHub 專案 evanxd/mcp-client,歡迎參考。
步驟一:定義工具並發出請求
async def list_tools():
client = MultiServerMCPClient(
{
"mcp-yahoo-finance": {
"command": "uvx",
"args": ["mcp-yahoo-finance"],
"transport": "stdio",
},
}
)
return await client.get_tools()
配置 mcp-yahoo-finance
,MCP Server 並取得其工具列表,當使用者發出請求時,讓 AI 模型將評估是否運用此工具滿足使用者的請求。
tools = await list_tools()
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
google_api_key=os.getenv("GOOGLE_API_KEY")
)
llm_with_tools = llm.bind_tools(tools)
messages = [{"role": "user", "content": "What is current price of Tesla?"}]
result = await llm_with_tools.ainvoke(messages)
步驟二:要求使用工具
AI 模型在處理使用者查詢 Tesla 股價的請求時,會要求 MCP Client 端調用 MCP Server 中的 get_current_stock_price
工具。
if result.tool_calls:
print(result.tool_calls[0]["name"]) #get_current_stock_price
messages.append({
"role": "assistant", "content": "", "tool_calls": result.tool_calls
})
步驟三:執行工具
依據 AI 模型的要求,MCP Client 會通知 MCP Server 執行 get_current_stock_price('TSLA')
,以獲取即時的 Tesla 股價。
print(result.tool_calls[0]["args"]) #{'symbol': 'TSLA'}
price = await tools[0].ainvoke(result.tool_calls[0]["args"])
步驟四:傳回執行結果
MCP Client 將工具執行結果傳回給 AI 模型。
messages.append({
"role": "tool",
"tool_call_id": result.tool_calls[0]["id"],
"content": price
})
result = await llm_with_tools.ainvoke(messages)
步驟五:生成總結
最後,AI 模型會根據使用者請求與工具執行結果,生成最終回覆:「The current price of Tesla is $339.34」。
messages.append({"role": "assistant", "content": result.content})
print(messages[-1]["content"]) #The current price of Tesla is $339.34.
總結
- MCP 不是要取代 Function Calling。
- MCP 的主要作用是標準化 Function Calling 流程中的第三步驟「函式執行」,提供一種規範化且可靠的機制來執行 AI 模型建議的函式。
- MCP Client 就是 Function Calling 的實作,負責處理從定義工具、向 AI 模型發出請求、執行函式到最終總結結果的全部流程。