Skip to content
🔗 分享本题
查看我的学习进度 →

企业级 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 能当跨语言总线:

  1. 协议语言无关:MCP 基于 JSON-RPC,Go/Python/任何语言都能实现,不绑定技术栈;
  2. 工具自动发现:Client 通过 list_tools 拿到工具的 name、description、JSON Schema 参数定义,Agent 不用看文档就能知道怎么调;
  3. 参数强约束:输入输出都有 Schema,参数校验在协议层完成,非法调用直接拒绝;
  4. 权限可控: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 团队不用碰业务库,业务团队不用碰模型代码,两边通过协议解耦。"