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 ClientADK Go 连接 MCP Server 的客户端
ResourceMCP Server 提供的数据资源
ToolMCP Server 暴露的可调用工具
PromptMCP 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 实现分散在代码里
MCPTool 定义在 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 编程实战干货。