Solon v3.6.2

mcp - 常见问题

</> markdown

问题1:

mcp-server 采用 http sse 传递的端点,步及 http 的长链接。集群时,“所有经过”的网关都要采用:ip_hash 负载均衡策略。

问题2:

mcp sse 使用 nginx 代理时,要添加:proxy_http_version 1.1;

问题3:

mcp stdio server,不要开启控制台日志。不然协议会串流

问题4:

有些 mcp server 能连,有些不能连?有可能与 okhttp 有关,可尝试切换 HttpUtils 的实现层。

public class DemoApp {
    public static void main(String [] args) {
        HttpConfiguration.setFactory(JdkHttpUtilsFactory.getInstance());
        
        //在程序启动前,切换 httputils 的实现层
        Solon.start(DemoApp.class, args);
    }
}

提示:目前已知 mcp.api-inference.modelscope.net (魔搭社区)的 sse mcp server 必需切换(用 okhttp 适配接收时,会少半条数据)。

问题5:

有些服务端可能不会有心跳,或者心跳间隔很大。会造成 sse 长连出现读超时问题。此时,可以把读超时设为 0 秒。目前已知 "mcp.context7.com" 就有这个情况。处理示例:

public class Context7Test {
    @Test
    public void case1() throws Exception {
        McpClientProvider clientProvider = McpClientProvider.builder()
                .channel(McpChannel.STREAMABLE)
                .httpTimeout(HttpTimeout.of(30, 30, 0)) //0 为 socket 读超时
                .apiUrl("https://mcp.context7.com/mcp")
                .header("CONTEXT7_API_KEY", "xxx")
                .build();

        Collection<FunctionTool> tools = clientProvider.getTools();

        System.out.println("------------------------------------------------");
        System.out.println(tools);

        assert tools != null;
        assert tools.size() > 1;

        Thread.sleep(1000 * 60 * 5);
    }
}