mcp - 常见问题
问题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);
}
}