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

```java
import org.noear.solon.ai.chat.tool.FunctionTool;
import org.noear.solon.ai.chat.tool.MethodToolProvider;
import org.noear.solon.ai.chat.tool.ToolProvider;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;

import java.util.Collection;

@McpServerEndpoint(channel = McpChannel.STREAMABLE_STATELESS, mcpEndpoint = "/mcp")
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 服务：

```java
import org.noear.solon.ai.chat.tool.FunctionTool;
import org.noear.solon.ai.chat.tool.ToolProvider;
import org.noear.solon.ai.mcp.McpChannel;
import org.noear.solon.ai.mcp.client.McpClientProvider;
import org.noear.solon.ai.mcp.client.McpServerParameters;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;

import java.util.Collection;

@McpServerEndpoint(channel = McpChannel.STREAMABLE_STATELESS, mcpEndpoint = "/mcp")
public class McpServerTool implements ToolProvider {
    private McpClientProvider stdioToolProvider = McpClientProvider.builder()
            .channel(McpChannel.STDIO) //表示使用 stdio
            .serverParameters(McpServerParameters.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 服务：

```java
import org.noear.solon.ai.chat.tool.FunctionTool;
import org.noear.solon.ai.chat.tool.ToolProvider;
import org.noear.solon.ai.mcp.McpChannel;
import org.noear.solon.ai.mcp.client.McpClientProvider;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;

import java.util.Collection;

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

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