Solon v3.2.0

mcp - 服务端点构建与工具变更

</> markdown

支持 mcp 多端点,是 solon-ai-mcp server 的重要特色。其中 McpServerEndpointProvider(Mcp 服务端点提供者),是提供 Mcp Server 端点服务的实体。对应的配置属性实体为 McpServerProperties

配置属性 McpServerProperties:

属性默认值说明
nameSolon-Ai-Mcp-Server服务名称
version1.0.0服务端版本号
sseEndpoint/mcp/ssesse 端点(路径)
heartbeatInterval30s服务器SSE心跳间隔(空表示不启用)

为什么要支持多端点?

  • 当有很多工具时,可以按业务分组。
  • 比如,可以提供教育类的 mcp 服务,也可以提供金融类的 mcp 服务。

服务端开发时会涉及三个注解:

注解说明
@McpServerEndpoint标记当前类为一个 mcp 服务端点
@ToolMapping标记这个方法是一个工具映射。其中 description 属性是给大模型用的提示词,大模型会根据自己的理解调用这个工具,所以这个描述很重要。
@ToolParam标记调用时需要传什么参数。其中 description 属性是给大模型用的提示词

1、使用注解构建服务端点

既是端点,也是工具集。这跟 mvc 开发差不多,非常简单。框架会把 @McpServerEndpoint 类自动转换为 McpServerEndpointProvider 并注册到容器(后续可以修改工具集)。

@McpServerEndpoint(name="mcp-case1", sseEndpoint = "/case1/sse") 
public class McpServerTool {
    @ToolMapping(description = "查询天气预报")
    public String getWeather(@ToolParam(description = "城市位置") String location) {
        return "晴,14度";
    }
}

如果工具集是固定的,这个方案是最方便的。

2、使用代码构建服务端点

这个方案更自由,可以动态构建工具集。也可以在其它框架环境集成(spring、jfinal、vert.x 等...)

public class McpServerTool {
    @ToolMapping(description = "查询天气预报")
    public String getWeather(@ToolParam(description = "城市位置") String location) {
        return "晴,14度";
    }
}

@Configuration
public class McpServerConfig {
    @Bean("mcp-case2")
    public McpServerEndpointProvider serverEndpoint() {
        McpServerEndpointProvider serverEndpoint = McpServerEndpointProvider.builder()
                .name("mcp-case2")
                .sseEndpoint("/case2/sse")
                .build();

        serverEndpoint.addTool(new MethodToolProvider(new McpServerTool()));

        return serverEndpoint;
    }
}

其实还可以通过配置构建,但不如现有的两种方便。

3、服务端点的工具变更(添加或移除)

使用 web 控制器(或者定时任务,或者消息事件),动态添加工具和移除工具。如果是同名更新,需要先移除旧的,再添加新的。

@Controller
public class ToolController {
    @Inject("mcp-case1")
    McpServerEndpointProvider serverEndpointProvider;
    
    @Mapping("/tool/add")
    public void add(){
        serverEndpointProvider.addTool(new FunctionToolDesc("hello").doHandle(map->{
            return "hello world!";
        }));
        
        //添加后通知给客户端
        serverEndpointProvider.notifyToolsListChanged();
    }

    @Mapping("/tool/remove")
    public void remove(){
        serverEndpointProvider.removeTool("hello");
        //移除后通知给客户端
        serverEndpointProvider.notifyToolsListChanged();
    }
}

4、McpServerEndpointProvider 接口参考

接口说明备注
getName()获取端点名字
getSseEndpoint()获取服务内的 SSE 端点
getTransport()获取传输提供者主要内部使用
addTool(functionTool)添加工具
addTool(toolProvider)添加工具
removeTool(toolName)移除工具
removeTool(toolProvider)移除工具
notifyToolsListChanged()通知工具变化
McpServerEndpointProvider.builder()实例化构建器