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

### 1、描述

solon-ai 的扩展插件，提供 mcp 协议支持（stdio、sse、streamable）。支持完整的 MCP 能力开发。

* MCP-Server，服务端
* MCP-Client，客户端
* MCP-Proxy，代理（stdio 与 sse、streamable 相互代理转换）


### 2、学习与教程

此插件也可用于非 solon 生态（比如 springboot, jfinal, vert.x 等）。

<mark>具体开发学习，参考： [《教程 / Solon AI MCP 开发》](/article/learn-solon-ai-mcp)</mark>


### 3、服务端示例（发布工具服务）

```java
@McpServerEndpoint(channel= McpChannel.STREAMABLE, mcpEndpoint = "/mcp") 
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);
    }
}
```

### 4、客户端示例（使用工具服务）


* 直接调用

```java
public void case1(){
    McpClientProvider mcpClient = McpClientProvider.builder()
            .channel(McpChannel.STREAMABLE)
            .apiUrl("http://localhost:8080/mcp")
            .cacheSeconds(30)
            .build();

    String rst = mcpClient.callTool("getWeather", Map.of("location", "杭州")).getContent();
}
```

* 绑定给模型使用（结合配置与注入）

```yaml
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"
          channel: "streamable"
        gitee:
           apiUrl: "http://ai.gitee.demo/mcp/sse"
           channel: "sse"
```

```java
@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();
    }
}
```
