ADK Go 入門 05 - MCP 工具整合
MCP(Model Context Protocol)是一套標準協定,讓 AI Agent 能夠與外部工具伺服器溝通。ADK 內建 MCP 支援,讓你把現有的 MCP 伺服器直接接入 Agent,無需自己解析協定。
MCP 是什麼
MCP 定義了一套標準介面:工具伺服器暴露工具定義與執行能力,客戶端(這裡是 ADK Agent)透過協定呼叫這些工具。
1 2 3 4 5 6 7 8
| ADK Agent │ (MCP Client) │ ▼ stdio / HTTP transport MCP 伺服器 ├──→ tool_1: 查詢資料庫 ├──→ tool_2: 寫入資料庫 └──→ tool_3: 匯出報表
|
優點:工具邏輯與 Agent 邏輯完全解耦,MCP 伺服器可以用任何語言撰寫。
Transport 類型
| Transport |
說明 |
適用情境 |
| stdio |
透過標準輸入輸出通訊 |
本地子行程、同機器部署 |
| HTTP/SSE |
透過網路通訊 |
遠端服務、跨機器部署 |
本地開發最常見的是 stdio transport:ADK 啟動一個 MCP 伺服器子行程,透過 stdin/stdout 交換訊息。
在 ADK Go 中接入 MCP(stdio)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import ( "os/exec" "google.golang.org/adk/tool/mcptoolset" "github.com/modelcontextprotocol/go-sdk/mcp" )
cmd := exec.CommandContext(ctx, "./bin/my-mcp-server")
transport := &mcp.CommandTransport{Command: cmd}
mcpToolset, err := mcptoolset.New(mcptoolset.Config{ Transport: transport, }) if err != nil { return err }
myAgent, _ := llmagent.New(llmagent.Config{ Name: "my_agent", Model: llm, Toolsets: []tool.Toolset{mcpToolset}, })
|
ADK 會自動從 MCP 伺服器取得工具清單,Agent 可以直接呼叫這些工具。
工具過濾
MCP 伺服器通常暴露很多工具,但某個 Agent 只需要其中幾個。使用 FilterToolset 限制:
1 2 3 4
| filteredTools := tool.FilterToolset( mcpToolset, tool.StringPredicate([]string{"get_item", "list_items"}), )
|
詳見 📝 實作:ADK Go 入門 04 - 讓 Agent 擁有工具能力(Go)。
建立 MCP 伺服器(Go)
MCP 伺服器本身是獨立的程式,使用 go-sdk/mcp 套件建立:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import "github.com/modelcontextprotocol/go-sdk/mcp"
server := mcp.NewServer("my-server", "1.0.0", nil)
mcp.AddTool(server, &mcp.Tool{ Name: "get_item", Description: "根據 ID 取得項目", }, func(ctx context.Context, args struct { ID string `json:"id"` }) (*mcp.CallToolResult, error) { return mcp.NewToolResultText("result"), nil })
server.Run(ctx, mcp.NewStdioTransport())
|
⚠️ 注意:MCP 伺服器的 stderr 需要轉發到主行程,否則錯誤訊息會消失,難以除錯。