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
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. 格式化结果
}
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}}¶m={{.args.arg1}}"
method: GET
responseTemplate:
body: |
# 为AI消费格式化的结果
功能实现
系统使用模板引擎处理请求和响应转换:
- 请求模板:使用参数构建HTTP请求
- 响应模板:将HTTP响应转换为适合AI消费的格式
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
总结与对比
-
Golang Filter:
- 优点:深度集成Envoy,性能最佳
- 缺点:需要与Envoy一起编译,更新不够灵活
- 适用场景:高性能要求的生产环境
-
WASM Go:
- 优点:可移植性好,动态加载,独立更新
- 缺点:相比原生Golang Filter有一定性能损失
- 适用场景:大多数常规使用场景,平衡了性能和灵活性
-
REST to MCP:
- 优点:无需编码,快速集成现有API
- 缺点:功能相对有限,不适合复杂逻辑
- 适用场景:快速原型开发,集成现有REST服务
-
服务注册集成:
- 优点:自动发现和更新,无需手动配置
- 缺点:依赖服务注册中心,配置较复杂
- 适用场景:微服务架构,服务频繁变更的环境