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"
)

// 啟動 MCP 伺服器子行程
cmd := exec.CommandContext(ctx, "./bin/my-mcp-server")

// 建立 stdio transport
transport := &mcp.CommandTransport{Command: cmd}

// 建立 Toolset
mcpToolset, err := mcptoolset.New(mcptoolset.Config{
Transport: transport,
})
if err != nil {
return err
}

// 掛載到 Agent
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
})

// 以 stdio 模式執行
server.Run(ctx, mcp.NewStdioTransport())

⚠️ 注意:MCP 伺服器的 stderr 需要轉發到主行程,否則錯誤訊息會消失,難以除錯。