Solon v3.1.2

solon-ai-mcp [预览]

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

1、描述

solon-ai 的扩展插件,提供 mcp 协议支持(包括客户端和服务端)。学习参考 《教程 / Solon AI 开发》

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

引用插件并通过配置服务端“启用”后,组件的 ToolMapping 方法,会自动发布为 mcp 工具服务

solon.ai.mcp.server:  # 对应的实体为 McpServerProperties(使用最新的 Solon Idea Plugin 会自动提示)
  enabled: true             # 默认为 false
  sseEndpoint: "/mcp/sse"   # 默认为 /mcp/sse
@Component
public class McpServerTool {
    //
    // 建议开启编译参数:-parameters (否则,要再配置参数的 name)
    //
    @ToolMapping(description = "查询天气预报")
    public String getWeather(@ToolParam(description = "城市位置") String location) {
        return "晴,14度";
    }
}

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

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

客户端可以使用原生的 modelcontextprotocol 接口,也可以使用 McpClientToolProvider (更简单些)

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

    String rst = mcpClient.callToolAsText("getWeather", Map.of("location", "杭州"));
}
  • 绑定给模型使用(结合配置与注入)
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 McpClientToolProvider clientWrapper(@Inject("${solon.ai.mcp.client.demo}") McpClientToolProvider client) {
        return client;
    }

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