折腾两天了,真的有点破防。我照着文档用Python写了个很简单的MCP服务器,就暴露了一个get_weather工具,用stdio模式。在终端里直接python server.py能正常启动,用mcp-inspector测试工具调用也一切正常。但是一放到Claude Desktop的配置文件里(claude_desktop_config.json),客户端就报错,说“Failed to connect to MCP server”,日志里也看不到具体原因,只显示连接被拒绝。我确认过路径是绝对路径,Python环境也是对的(用的是系统默认的python3,没走conda)。有没有大佬遇到过类似情况?是不是stdio模式下Claude Desktop对启动命令的参数解析有什么坑?还是说需要额外设置环境变量?求一个比较系统的排查思路,感谢!
MCP服务器本地跑起来了,但Claude Desktop死活连不上,求排查思路?
全部回复
共 105 条试试在配置里把command写成python3的绝对路径,Claude Desktop有时不认环境变量。
这个坑我踩过,十有八九是Claude Desktop启动MCP时用的shell环境和你终端不一样,PATH里根本找不到python3。你试试在配置文件里把command直接写成python3的绝对路径,比如/usr/bin/python3或者/Library/Frameworks那种。另外stdio模式下服务器千万别往stdout打任何日志,一打印协议就崩了,日志全走stderr。还连不上的话把command换成/bin/bash -c "..."包一层,能看到真实报错。
Claude Desktop 在 macOS 上启动的进程环境变量跟你终端里不一样,PATH 经常丢,所以配置文件里写 python3 它可能根本找不到。建议把 command 换成 python3 的绝对路径试试,比如 /usr/bin/python3 或者 which python3 查出来的那个。我之前也卡在这儿,日志里啥都不显示,换绝对路径立马就好了。另外可以顺手看看 ~/Library/Logs/Claude 下的 mcp.log,比界面报错详细得多。
这个报错八成是Claude Desktop启动子进程时的环境变量跟你终端里不一样,PATH里可能根本找不到python3。建议在配置里command直接写python3的绝对路径,比如/usr/bin/python3或者/opt/homebrew/bin/python3,别指望它继承你的shell环境。还有个坑是有些版本对stdio服务器的stderr日志很敏感,你的server往stderr打东西可能直接被判定成启动失败。可以先把日志重定向到文件,看看进程到底有没有被拉起来。
这个坑我踩过,大概率是Claude Desktop启动MCP server时用的环境和你终端里不一样。它读的是config里command指定的可执行文件,你要是只写了python3,它可能找不到或者用了另一个版本,最好写python3的绝对路径。另外stdio模式下server千万别往stdout打日志,任何print都会污染协议导致握手失败,日志一律走stderr。你可以先看下~/Library/Logs/Claude里的mcp.log,通常能看到真正的报错。