Solon v3.3.0

mcp - 服务的接口方式(和代理效果)

</> markdown

服务端点除了常规的方法构建方式外,还支持接口实现的方式(或者混合)。比如把本地一个工具类(不修改任何代码),转为 Mcp 服务:

@McpServerEndpoint(sseEndpoint = "/mcp/sse") 
public class McpServerTool implements ToolProvider {
    private ToolProvider toolProvider = new MethodToolProvider(new DemoTools());
    
    @Override
    public Collection<FunctionTool> getTools() {
        return toolProvider.getTools();
    }
}

1、支持三种内容提供者接口

提供者接口描述备注
ToolProvider工具提供者可通过 MethodFunctionTool 快速构建
PromptProvider提示语提供者可通过 MethodPromptProvider 快速构建
ResourceProvider资源提供者可通过 MethodResourceProvider 快速构建

2、接口实现的代理效果

把一个 McpServer 通过 McpClientProvider(实现了上述三个接口) 连接后,再转为另一个 McpServer。

把 stdio 转为 sse 服务:

@McpServerEndpoint(sseEndpoint = "/mcp/sse") 
public class McpServerTool implements ToolProvider {
    private McpClientProvider stdioToolProvider = McpClientProvider.builder()
            .channel(McpChannel.STDIO) //表示使用 stdio
            .serverParameters(ServerParameters.builder("npx")
                    .args("-y", "@gitee/mcp-gitee@latest")
                    .addEnvVar("GITEE_API_BASE", "https://gitee.com/api/v5")
                    .addEnvVar("GITEE_ACCESS_TOKEN", "<your personal access token>")
                    .build())
            .build();

    @Override
    public Collection<FunctionTool> getTools() {
        return stdioToolProvider.getTools();
    }
}

把 sse 服务转为 stdio 服务:

@McpServerEndpoint(channel = McpChannel.STDIO)
public class McpSseToStdioServerDemo implements ToolProvider {
    McpClientProvider sseToolProvider = McpClientProvider.builder()
            .apiUrl("http://localhost:8081/sse")
            .build();

    @Override
    public Collection<FunctionTool> getTools() {
        return sseToolProvider.getTools();
    }
}