mcp - 服务端点构建与工具变更
支持 mcp 多端点,是 solon-ai-mcp server 的重要特色。其中 McpServerEndpointProvider(Mcp 服务端点提供者),是提供 Mcp Server 端点服务的实体。对应的配置属性实体为 McpServerProperties
配置属性 McpServerProperties:
属性 | 默认值 | 说明 |
---|---|---|
name | Solon-Ai-Mcp-Server | 服务名称 |
version | 1.0.0 | 服务端版本号 |
sseEndpoint | /mcp/sse | sse 端点(路径) |
heartbeatInterval | 30s | 服务器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() | 实例化构建器 |