上一篇我們加入了 Prompt Injection,了解 Agent 在使用外部資料時,除了要能取得資訊,也需要注意資料中的內容是否安全,前面我們也陸續做了 SQLite、Calculator、RAG、File System 等 MCP Tool。
不過目前我們大多都是一次測試一個功能,所以今天就來把前面做過的東西串起來,讓 Agent 面對一個比較完整的任務時,自己判斷要使用哪些 Tool,並一步一步完成。
這次我們給 Agent 一個完整的任務:
請幫我分析 CS 系的學生,找出成績低於 60 分的學生,使用 Calculator 計算 CS 系的平均成績,再參考知識庫中的學習建議,最後將完整的分析結果整理成
report.txt。
這個任務裡面其實包含了幾個步驟:
SQLite
↓
取得 CS 系學生資料
↓
Calculator
↓
計算平均成績
↓
RAG
↓
查詢學習建議
↓
File System
↓
寫入 report.txt
這次的重點不是我們在程式裡把順序全部寫死,而是讓 Agent 根據使用者的任務,自行決定需要使用哪些 Tool。
前面 File System MCP 已經可以讀取檔案,這次再加入一個 write_file Tool,讓 Agent 可以建立或修改檔案。
@server.tool()
def write_file(file_path: str, content: str) -> str:
"""在 sandbox 中建立或寫入檔案"""
path = SANDBOX / file_path
try:
path.resolve().relative_to(SANDBOX.resolve())
except ValueError:
return "錯誤:不允許寫入 sandbox 外的檔案。"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(content, encoding="utf-8")
return f"成功寫入檔案:{file_path}"
這樣 Agent 就多了一個可以實際「產生檔案」的 Tool。
這次除了原本的四則運算之外,我們也增加 average:
@server.tool()
def average(numbers: list[float]) -> float:
"""計算一組數字的平均值"""
if not numbers:
return 0
return sum(numbers) / len(numbers)
這樣 Agent 就可以把從 SQLite 查到的成績交給 Calculator 計算平均值,而不是直接由模型自己計算,也減少模型一直呼叫 Calculator 導致一分鐘請求次數達到上限
這次 Agent 會同時連接四個 MCP Server:
SQLite MCP
Calculator MCP
RAG MCP
File System MCP
每個 Server 負責不同的事情:
| MCP Server | 負責功能 |
|---|---|
| SQLite MCP | 查詢學生資料 |
| Calculator MCP | 計算平均成績 |
| RAG MCP | 查詢學習建議 |
| File System MCP | 建立 report.txt |
Agent 會先取得這些 Server 提供的 Tool,接著交給 Gemini 判斷目前任務需要使用哪些工具。
首先創建一個文件加入學習建議,接著執行 Agent,並讓它把建議加入RAG

然後開始測試這次的任務,可以看到 Agent 依序使用不同的 Tool

RAG 再從知識庫找到相關的學習建議,之後 Agent 將整理好的內容交給 write_file,下方圖片可以看到對話結果

最後可以在 day19/sandbox/report.txt 看到產生的分析報告。

到目前為止,我們已經把 SQLite、Calculator、RAG、File System 等不同 MCP Tool 串接起來,今天更進一步,讓 Agent 不只是「會使用 Tool」,而是可以根據一個完整任務,自行組合不同的 Tool,一步一步把事情完成。
這也是 MCP + AI Agent 很重要的一個應用方式:讓不同能力的 Tool 組合起來,共同完成一個任務。
iThome鐵人賽