Solon v3.3.0

solon-ai-mcp [预览]

</> markdown
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-mcp</artifactId>
</dependency>

1、描述

(v3.2.0 后支持)solon-ai 的扩展插件,提供 mcp 协议支持。支持完整的 MCP 能力开发。

  • MCP-Server,服务端
  • MCP-Client,客户端
  • MCP-Proxy,代理(stdio 与 sse 相互代理转换)

学习参考 《教程 / Solon AI 开发》

2、服务端示例(发布工具服务)

@McpServerEndpoint(sseEndpoint = "/mcp/sse") 
public class McpServerTool {
    //
    // 建议开启编译参数:-parameters (否则,要再配置参数的 name)
    //
    @ToolMapping(description = "查询天气预报")
    public String getWeather(@Param(description = "城市位置") String location) {
        return "晴,14度";
    }
}

public class McpServerApp {
    public static void main(String[] args) {
        Solon.start(McpServerApp.class, args);
    }
}

3、客户端示例(使用工具服务)

  • 直接调用
public void case1(){
    McpClientProvider mcpClient = new McpClientProvider("http://localhost:8080/mcp/sse");

    String rst = mcpClient.callToolAsText("getWeather", Map.of("location", "杭州")).getContent();
}
  • 绑定给模型使用(结合配置与注入)
solon.ai:
  chat:
    demo:
      apiUrl: "http://127.0.0.1:11434/api/chat"
      provider: "ollama"
      model: "qwen2.5:1.5b"
  mcp:
    client:
        demo:
          apiUrl: "http://localhost:8080/mcp/sse"
        gitee:
           apiUrl: "http://ai.gitee.demo/mcp/sse"
@Configuration
public class McpClientConfig {
    @Bean
    public McpClientProvider clientWrapper(@Inject("${solon.ai.mcp.client.demo}") McpClientProvider client) {
        return client;
    }

    @Bean
    public ChatModel chatModel(@Inject("${solon.ai.chat.demo}") ChatConfig chatConfig, McpClientProvider toolProvider) {
        return ChatModel.of(chatConfig)
                .defaultToolsAdd(toolProvider.getTools()) //添加默认工具
                .build();
    }
    
    @Bean
    public void case2( McpClientProvider toolProvider, ChatModel chatModel) {
        ChatResponse resp = chatModel.prompt("杭州今天的天气怎么样?")
                .options(options -> {
                    //转为工具集合用于绑定 //如果有 defaultToolsAdd,这里就不需要了
                    //options.toolsAdd(toolProvider.getTools());
                    
                    //获取特定工具用于绑定
                    //options.toolsAdd(toolProvider.getTool("getWeather"));
                })
                .call();
    }
}