Higress 如何实现MCP服务器

1,027 阅读3分钟

Higress提供了四种不同的方式来实现MCP(Model Context Protocol)服务器,每种方式都有其特点和适用场景。下面我将详细介绍这四种实现方式的架构设计、功能实现和代码调用。

1. Golang Filter实现

Golang Filter方式通过Envoy的原生Golang HTTP过滤器机制实现MCP服务器,提供了与Envoy的深度集成。

架构设计

MCPServer struct {  
    mu sync.RWMutex         // 用于保护共享资源的互斥锁  
    name string             // 服务器名称  
    version string          // 服务器版本  
    resources map[string]resourceEntry  // 资源映射  
    tools map[string]ServerTool         // 工具映射  
    // 其他字段...  
}

server.go:63-81

功能实现

MCPServer处理各种功能,包括工具注册和方法调用:

// 向服务器添加工具  
func (s *MCPServer) AddTool(tool mcp.Tool, handler ToolHandlerFunc) {  
    s.AddTools(ServerTool{Tool: tool, Handler: handler})  
}

server.go:487-489

1a01f496d3349e5f15104b4ff2bf7257.png

2. WASM Go实现

WASM Go实现允许创建轻量级、可移植的MCP服务器,可以动态加载到Higress中。

架构设计

单个MCP服务器的初始化:

func init() {  
    mcp.LoadMCPServer(mcp.AddMCPServer("quark-search",  
        tools.LoadTools(mcp.NewMCPServer())))  
    mcp.InitMCPServer()  
}

功能实现

多个MCP服务器可以组合到一个WASM二进制文件中:

func init() {  
    mcp.LoadMCPServer(mcp.AddMCPServer("quark-search",  
        quark.LoadTools(mcp.NewMCPServer())))  
    mcp.LoadMCPServer(mcp.AddMCPServer("amap-tools",  
        amap.LoadTools(mcp.NewMCPServer())))  
    mcp.InitMCPServer()  
}

工具实现为满足Tool接口的结构体:

func (t WebSearch) Call(ctx server.HttpContext, s server.Server) error {  
    // 实现代码...  
    // 1. 获取服务器配置  
    // 2. 构建API请求  
    // 3. 处理响应  
    // 4. 格式化结果  
}

77a7e6bed35f711140d5b69454f600c6.png

3. REST to MCP实现

REST to MCP允许通过声明式配置将现有REST API转换为MCP工具,无需编写代码。

架构设计

通过YAML配置定义工具:

server:  
  name: rest-api-server  
  config:  
    apiKey: your-api-key-here  
tools:  
- name: tool-name  
  description: "工具的详细描述"  
  args:  
  - name: arg1  
    description: "参数1的描述"  
    required: true  
  requestTemplate:  
    url: "https://api.example.com/endpoint?key={{.config.apiKey}}&param={{.args.arg1}}"  
    method: GET  
  responseTemplate:  
    body: |   
      # 为AI消费格式化的结果

功能实现

系统使用模板引擎处理请求和响应转换:

  1. 请求模板:使用参数构建HTTP请求
  2. 响应模板:将HTTP响应转换为适合AI消费的格式

b28476b2ba2024ec077529b01f128978.png

4. 服务注册集成

服务注册集成允许Higress从服务注册中心(如Nacos)自动发现和注册MCP工具。

架构设计

type NacosMcpRegsitry struct {  
    serviceMatcher           map[string]string            // 服务匹配规则  
    configClient             config_client.IConfigClient  // Nacos配置客户端  
    namingClient             naming_client.INamingClient  // Nacos命名客户端  
    toolsDescription         map[string]*registry.ToolDescription  // 工具描述  
    toolsRpcContext          map[string]*registry.RpcContext       // RPC上下文  
    toolChangeEventListeners []registry.ToolChangeEventListener    // 变更监听器  
    currentServiceSet        map[string]bool              // 当前服务集合  
}

nacos.go:17-25

功能实现

注册表发现服务并动态注册为MCP工具:

func (n *NacosMcpRegsitry) refreshToolsListForService(group string, service string) bool {  
    // 从Nacos获取服务信息并转换为MCP工具  
    return n.refreshToolsListForServiceWithContent(group, service, nil, nil)  
}

nacos.go:268-270

4b37a4c512a419a601a300e41ce2263f.png

总结与对比

  1. Golang Filter:

    • 优点:深度集成Envoy,性能最佳
    • 缺点:需要与Envoy一起编译,更新不够灵活
    • 适用场景:高性能要求的生产环境
  2. WASM Go:

    • 优点:可移植性好,动态加载,独立更新
    • 缺点:相比原生Golang Filter有一定性能损失
    • 适用场景:大多数常规使用场景,平衡了性能和灵活性
  3. REST to MCP:

    • 优点:无需编码,快速集成现有API
    • 缺点:功能相对有限,不适合复杂逻辑
    • 适用场景:快速原型开发,集成现有REST服务
  4. 服务注册集成:

    • 优点:自动发现和更新,无需手动配置
    • 缺点:依赖服务注册中心,配置较复杂
    • 适用场景:微服务架构,服务频繁变更的环境