企业级 AI 应用最常见的问题之一:Agent 要调业务接口,但业务系统是 Go/Java,AI 编排是 Python,两边怎么接?MCP 的答案:Go 侧把业务能力封装成 MCP Server,Python 侧统一发现和调用——MCP 就是那条跨语言工具总线。
💡 答案要点
问题背景:
业务系统(Go) AI 编排(Python)
├─ 客户/案件/合同/任务等业务接口 ├─ 模型生态(OpenAI/本地模型)
├─ 数据与规则(MySQL) ├─ Skill / Agent 编排(LangGraph)
└─ 权限与审计 └─ 评测与运行时
问题:Python Agent 怎么安全、规范地调 Go 的业务能力?
❌ 直接连 MySQL → 权限失控、耦合、没有协议约束
❌ 手写 REST 客户端 → 每个接口一套文档/校验/错误处理,Agent 无法自动发现
✅ MCP Server(Go 侧封装)+ MCP Client(Python 侧)→ 标准协议、自动发现、权限可控为什么 MCP 能当跨语言总线:
- 协议语言无关:MCP 基于 JSON-RPC,Go/Python/任何语言都能实现,不绑定技术栈;
- 工具自动发现:Client 通过
list_tools拿到工具的 name、description、JSON Schema 参数定义,Agent 不用看文档就能知道怎么调; - 参数强约束:输入输出都有 Schema,参数校验在协议层完成,非法调用直接拒绝;
- 权限可控:Go 侧在工具入口做鉴权(谁可以调什么工具、什么数据范围),Python 侧拿到的是一组受限的工具,而不是整个数据库。
Go 侧封装示例(mcp-go 伪代码):
go
// 用 mcp-go 把业务能力封装成 MCP 工具
import (
"github.com/mark3labs/mcp-go/server"
"github.com/mark3labs/mcp-go/mcp"
)
// 1. 定义工具:名称、描述、参数 Schema
createCaseTool := mcp.NewTool("create_case",
mcp.WithDescription("创建案件,返回案件ID"),
mcp.WithString("client_id", mcp.Required(), mcp.Description("客户ID")),
mcp.WithString("case_type", mcp.Required(), mcp.Description("案件类型")),
)
// 2. 注册处理器:参数校验 → 权限检查 → 调业务 service → 返回结构化结果
srv := server.NewMCPServer("legal-tools", "1.0.0")
srv.AddTool(createCaseTool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
// 鉴权:从上下文拿 agent 身份,校验是否有 create_case 权限
// 幂等:req.Params.Arguments 里的 request_id 查重
caseID, err := biz.CreateCase(ctx, args)
if err != nil {
// 结构化错误返回:错误码 + 是否可重试,供 LLM 判断
return mcp.NewToolResultError(fmt.Sprintf("E_BIZ_%d:%s", err.Code, err.Msg)), nil
}
return mcp.NewToolResultJSON(map[string]string{"case_id": caseID}), nil
})Python 侧统一注册和调用(伪代码):
python
# Agent 启动时发现所有工具,注册进 LangGraph 的工具列表
from mcp import ClientSession, StdioServerParameters
async def register_go_tools():
# 连接 Go 侧 MCP Server(stdio 或 streamable http)
session = await ClientSession(...)
tools = await session.list_tools() # 自动发现:客户/案件/合同/任务等
for t in tools:
registry[t.name] = {"schema": t.inputSchema, "call": session.call_tool}
return registry完整链路(一次请求):
用户提问 → Python Agent 规划(LangGraph)
→ 决定调用 create_case 工具 → 经 Go 侧 MCP Server 鉴权
→ Go 业务 service 执行(MySQL 事务)→ 结构化结果回传
→ Agent 继续编排 / 组装回复 → 全程日志进审计面试话术:
"我的混合架构里,Go 负责稳定业务,Python 负责 AI 编排,MCP 是那条跨语言工具总线。Go 侧用 mcp-go 把客户、案件、合同、任务这些业务能力封装成 MCP Server,工具带 JSON Schema 参数约束和鉴权;Python 侧启动时 list_tools 自动发现,Agent 按 Schema 调用。相比手写 REST 客户端,MCP 的好处是协议标准化、工具可自动发现、参数强校验、权限在 Go 侧可控——AI 团队不用碰业务库,业务团队不用碰模型代码,两边通过协议解耦。"