折腾了一下午,还是没搞明白。我按照官方文档写了一个最简单的MCP服务器,就一个tool,返回当前时间。用Claude Desktop加了这个server,结果一直报“Failed to connect to MCP server”。日志里能看到进程起来了,但就是握手失败。我试了stdio和SSE两种传输方式,都不行。我的配置是照着文档抄的,路径也绝对没问题。有没有可能是Claude Desktop和MCP SDK版本不兼容?我用的SDK是0.6.0,Claude是最新版。网上搜了一圈,中文资料太少,英文帖子也看得云里雾里。有没有大佬指点一下,这种问题一般从哪个方向排查?还是说我思路就错了,MCP不应该这么用?
MCP服务器连自家API都连不上,是配置问题还是我理解错了?
全部回复
共 67 条先看Claude Desktop日志里具体报什么错,stdio模式下路径别用相对路径,试试绝对路径加node全路径。
先看下Claude Desktop的日志里具体报什么错,握手失败十有八九是stdio的启动命令或环境变量没配对。
我之前也踩过这个坑,折腾了整整一晚上才发现问题根本不在MCP本身。你提到进程起来了但握手失败,这其实是个很关键的信号——说明Claude Desktop确实把server拉起来了,只是两边在协议层没对上话。我当时的情况是SDK版本和Claude Desktop内置的MCP client协议版本不匹配,0.6.0那会儿正好有个breaking change,stdio的初始化握手字段改了,但Desktop那边还没跟上。你可以先试试把SDK降到0.5.x,或者干脆用官方examples仓库里那个time server的代码跑一遍,如果那个能通就说明是你代码里某个字段的问题。另外SSE连不上很正常,Desktop对SSE的支持一直不太稳定,很多人反馈要走localhost还得注意端口和CORS,优先用stdio排查。还有个小细节,日志里进程起来了不代表stdin/stdout没被污染,你如果在server代码里打了console.log,那直接就破坏协议了,这个坑我第一次也中了。建议你把server端的日志全部改成写文件,别走标准输出,然后再看握手阶段到底卡在哪一步。
学到了,感谢分享!
有没有更详细的教程推荐?
我之前也踩过这个坑,大概率是SDK版本和Claude Desktop内置的MCP客户端协议版本对不上。你可以先把server进程单独跑起来,手动发一条initialize的JSON-RPC请求看看能不能正常响应,这样能排除是传输层还是握手层的问题。另外stdio模式下注意日志千万别往stdout打,会污染协议流,这个坑我踩过好几次。SSE的话先确认端口和路径都对,Claude Desktop那边有时候对URL格式很挑剔。
我之前也卡在握手失败这步,后来发现是Claude Desktop的日志里其实有更具体的错误,得去开发者工具或者日志文件里翻,别只看界面提示。SDK 0.6.0和最新版Desktop确实有过协议版本对不上的坑,建议先把SDK升到最新试试。另外stdio方式下server进程启动后如果没往stdout写正确的JSON-RPC响应,也会握手失败,可以在server里加几行日志确认收到initialize请求没有。