MCP Server 接入实战:将任何外部服务变成 Agent 的 Tool
MCP Server 接入实战:将任何外部服务变成 Agent 的 Tool
Function Tool 适合自建逻辑,但如果要把已有外部服务接入 Agent——MySQL 数据库、Redis 缓存、gRPC 服务——MCP(Model Context Protocol)是更优雅的方式。
什么是 MCP
MCP 是一个协议,定义了 Agent 如何与外部服务通信。它的设计理念是:把任何外部服务变成 Agent 可以调用的 Tool,不需要在 Agent 代码里写死的集成逻辑。
ADK Go Agent ← MCP Client ← MCP Protocol → MCP Server ← 外部服务
↓
MySQL / Redis / gRPC / HTTP
MCP 的核心概念
| 概念 | 说明 |
|---|---|
| MCP Server | 暴露外部服务的 MCP 端点 |
| MCP Client | ADK Go 连接 MCP Server 的客户端 |
| Resource | MCP Server 提供的数据资源 |
| Tool | MCP Server 暴露的可调用工具 |
| Prompt | MCP Server 提供的预设提示词 |
使用 MCP Tool
ADK Go 提供 mcp 包来接入 MCP Server:
import "google.golang.org/adk/tool/mcp"
mcpTool, err := mcp.NewMCPTool(ctx,
mcp.WithServerURL("http://localhost:8081/mcp"),
)
然后注册到 Agent:
Tools: []tool.Tool{
mcpTool, // 所有 MCP Server 暴露的 Tool
}
完整示例:接入一个天气 MCP Server
假设有一个 MCP Server 暴露了两个 Tool:
get_weather:查天气get_forecast:查预报
1. 启动 MCP Server
MCP Server 可以用任何语言实现,这里以 Python 为例:
# mcp_server.py
from mcp.server import MCPServer
server = MCPServer("weather-service")
@server.tool("get_weather")
def get_weather(city: str) -> str:
return f"Weather in {city}: sunny, 22°C"
@server.tool("get_forecast")
def get_forecast(city: str, days: int) -> str:
return f"{city} {days}-day forecast: sunny, rainy, cloudy"
if __name__ == "__main__":
server.run()
启动:
python mcp_server.py --port 8081
2. Go 端接入
mcpTool, err := mcp.NewMCPTool(ctx,
mcp.WithServerURL("http://localhost:8081/mcp"),
)
if err != nil {
log.Fatalf("Failed to connect to MCP server: %v", err)
}
agent, _ := llmagent.New(llmagent.Config{
Name: "weather_assistant",
Model: model,
Instruction: "你是天气助手,用工具查询天气信息。",
Tools: []tool.Tool{
mcpTool, // 注册 MCP Tool
},
})
Agent 就会自动识别 MCP Server 暴露的两个 Tool,可以直接调用。
MCP 的优势
vs 手动写 Tool
| 方式 | 优点 | 缺点 |
|---|---|---|
| 手动写 Function Tool | 完全可控 | 每个集成都要写代码 |
| MCP | 声明式配置,Server 升级 Tool 自动可用 | 需要 Server 支持 MCP |
vs REST API 直连
| 方式 | 优点 | 缺点 |
|---|---|---|
| REST API 直连 | 简单直接 | Tool 实现分散在代码里 |
| MCP | Tool 定义在 Server,Agent 只管调用 | 多一个协议层 |
MCP 安全考虑
认证
MCP Server 可以加认证:
mcpTool, err := mcp.NewMCPTool(ctx,
mcp.WithServerURL("http://localhost:8081/mcp"),
mcp.WithAuth(mcp.BearerToken("your-token")),
)
网络隔离
不要把内部 MCP Server 直接暴露到公网。用 VPC 或 VPN:
mcp.WithTLS(true), // 强制 TLS
mcp.WithServerURL("https://internal-mcp.vpc.local/mcp"),
常见问题
Q:MCP Server 无响应
A:检查 Server 是否正常运行:curl http://localhost:8081/mcp/health。确认网络连通性。
Q:MCP Tool 没被 Agent 识别 A:确认 MCP Server 正确暴露了 Tool 定义。检查 Agent 启动日志,看 MCP Tool 是否加载成功。
Q:在中国大陆访问 MCP Server 困难 A:MCP Server 部署在内网的话,需要确保 Agent 所在网络能访问 Server。可以考虑把 MCP Server 暴露到公网并加 TLS。
下一步
MCP 搞定了,接下来看 OpenAPI Tool——通过 OpenAPI spec 动态生成 Tool,适合那些有 REST API 文档但没有 MCP 接口的服务。
← Function Tool 性能优化 | OpenAPI Tool →
想跟着学更多 Go ADK 实战?关注「全栈之巅-梦兽编程」公众号,每周更新 Go / AI 编程实战干货。
