chiefleo
chiefleo
嗯嗯 stdio模式我在本地环境跑通了;但是部署到预发/生产服务器上,还需要装npx,服务器上没法这样自由,还是sse方式更方便点。
本地挺简单的,只要mcp-servers-config.json配置一下下面内容,然后先命令行执行下npx -y @amap/amap-maps-mcp-server ,然后启动Application就好了。 { "mcpServers": { "amap-maps": { "command": "npx", "args": [ "-y", "@amap/amap-maps-mcp-server" ], "env": { "AMAP_MAPS_API_KEY": "你的key" } } } } > [@chiefleo](https://github.com/chiefleo) 能方便描述下是如何部署本地高德mcp服务吗(stdio协议的)?我在想,即便部署在本地了,那需要把地址转换为经纬度时,难道部署的mcp服务内部会再去访问高德api吗?
多谢大家,目前各种尝试下来的结论大致是这样的: 1、spring-ai默认的starter,构造的HttpClientSseClientTransport http client version为2.0,跟高德的1.x版本不兼容。 解决方案:参考 @ReloadingPeace 的解法,不用starter里面的bean,自己重写McpClientTransport 实现。 附: 报错文案:Caused by: java.io.IOException: http1_0 content, bytes received: 5324 根因分析:spring-ai-autoconfigure-mcp-client jar包,SseHttpClientTransportAutoConfiguration#mcpHttpClientTransports,transport用到了一个废弃new HttpClientSseClientTransport有参构造方法,该方法底层会调用new HttpClientImpl,version为默认的HttpClient.Version.HTTP_2;自己重写mcpHttpClientTransports实现之后,HttpClientSseClientTransport.builder默认用HttpClient.Version.HTTP_1_1,跟高德SSE是兼容的。 2、SSE连接之后,运行个2分钟左右就挂了且稳定重现,猜测高德服务端可能有定时机制自动断开长链接。 临时解决方案:client服务器开启本机定时任务,对于高德server,每分钟ping一次保活。 采用临时方案后,目前效果是MCP可以较稳定运行比较久的一段时间。但是偶发还会出现404 Not Found from POST https://mcp.amap.com/mcp/message,这种情况暂时只好重启机器了。...
目前已经联系到高德同学协助排查了,等问题fix之后会在这里同步。 > > > > > 一样,我使用spring ai的mcp server实现了高德的api,集成到mcp client,目前没啥问题。 > > > > > 直接对接官方的sse,SYNC模式我没成功过。ASYNC模式一开始正常,但是运行段时间就挂了。 > > > > > > > > > > > > 编程式sync是可以的,yml形式我没成功过 McpClientTransport...
> 对于sse连接增加参数,mcp java sdk在0.9版本后做了修复。spring AI如果集成高德SSE可以自定义client: > >  这种情况,不需要加spring相关配置。 也可以直接使用spring ai相关配置,代码改动如下: > >  但是这种情况仅限于自己测试用,实际生产环境中是无法避免服务端也就是高德侧主动断开连接的情况,这种配置都是一次性连接。所以暂时我想了一种方案: > >  创建一个切面,在调用mcpclient的方法前建立连接,调用之后释放连接。类似于httpclient的建立连接释放连接原理 实际使用方法如下: > >  @wangzr622 非常感谢,经实测,每次调用之前先建立连接后initialize,调用完成closeGracefully,这种方式是可行的,目前运行比较稳定。 从MCP服务端角度来考虑,为了稳定性,服务端肯定不能维持太多长链接,不可避免会有定期断链机制,需要客户端考虑断链后如何自动重连。生产环境每次重连的时间100ms至1s,供参考。