最近跟着教程折腾MCP,写了个最简单的weather server,用Python的FastMCP起的服务,本地跑着没问题。结果一接到Claude Desktop里就报“Failed to fetch MCP config”,我检查了路径和命令,甚至把config里的command换成了绝对路径还是不行。更诡异的是,用官方的filesystem server就能连上,说明不是客户端的问题。是不是我漏了什么环境变量?还是说stdio模式对子进程的工作目录有要求?看日志也看不懂,有没有老哥给个排查思路,最好能推荐个断点或者日志级别的工具,救救孩子。
MCP服务器连自家API都连不上,这玩意到底咋调试?
全部回复
共 36 条你这情况我上周刚踩过一模一样的坑,最后发现是Python子进程的cwd没设对,MCP默认会在Claude的安装目录下启动server,你试试在config里加个cwd字段指向你server.py所在目录。另外调试别硬看日志,直接装个mcp的inspector命令行工具,能逐步看请求和响应,比瞎猜快多了。还有个坑是FastMCP的版本要>=1.0,旧版跟Claude的协议对不上,也会报这种错。
这问题我上周刚踩过一模一样的坑,最后发现是Claude Desktop自带的环境变量把PYTHONPATH给覆盖了,子进程根本找不到FastMCP的依赖。你可以试试在config里给command包一层bash -c,手动source一下虚拟环境再执行python,或者干脆把环境变量写死在command里,比如用env PYTHONPATH=/你的路径 python /绝对路径/server.py。另外stdio模式下工作目录确实有讲究,Claude Desktop启动子进程的cwd默认是它自己的安装目录,你server里如果有相对路径的读写操作肯定炸,最好在代码开头os.chdir到固定目录。调试工具的话别用断点,直接给FastMCP加个日志中间件,把stderr重定向到文件,用tail -f实时看,比在GUI里看什么log强多了。还有个坑是config里不要用~符号,Claude Desktop不展开它。
我之前也卡在这好久,后来发现多半是stdio模式下子进程的工作目录问题,Claude Desktop启动时给的cwd不是你以为的那个。你试试在config里显式加上cwd字段指向server目录,或者用env传个PYTHONPATH。另外别急着上断点,先给FastMCP加个--debug参数,把stderr重定向到文件看看具体报错,一般环境变量和路径问题日志里都有线索。官方server能连说明基础配置没毛病,八成就是你自定义server的启动方式跟客户端预期不一致。
我上周也踩过这坑,最后发现是FastMCP默认的transport参数跟Claude Desktop不匹配,你试试在初始化时显式指定transport="stdio",同时确认下子进程的cwd是不是指向了server文件所在目录,有时候工作目录不对也会导致握手失败。调试的话可以先在终端手动跑一下server,再用Claude的--debug模式看输出,比直接问日志高效多了,实在不行就用mcp-inspector这个工具,可视化看消息收发,排查这种问题神器。
试试在config里把command换成python -m uvicorn的启动方式,或者用npx tsx跑ts版,八成是环境变量PATH没继承。
建议在server代码里加个启动日志写到文件里,能看到实际报错比啥工具都强。
我之前也栽在过这里,多半是stdio模式下工作目录的问题,Claude Desktop启动子进程时用的cwd不是你项目的路径,所以相对路径和依赖加载全炸了。你可以试试在config里把command写成绝对路径,同时把args里带上--host和--port,但更省事的方法是用npx或者uvx跑,这样环境隔离干净些。另外调试的话,别光看客户端日志,直接在终端里手动跑一下server,加个--verbose或者--log-level DEBUG,看看有没有报错信息,FastMCP的日志其实挺详细的。实在不行就换transport模式,用HTTP方式起服务,然后在config里配URL,排查起来比stdio直观多了。
我之前也卡在这过,八成不是环境变量的问题,而是stdio模式下子进程的工作目录没对上。Claude Desktop启动MCP时cwd默认在它自己的安装目录,你可以在config里加个cwd字段指向你server的目录试试。
另外调试别光看客户端日志,直接在你server代码里加个try catch把stderr重定向到文件,或者用python -m pdb配合logging模块看执行流。官方filesystem能连说明它内部处理了路径,你这多半是相对路径引用或启动时依赖了当前目录的文件。
如果还不行,把启动命令改成bash -c "cd /你的路径 && python server.py"这种形式,绕开工作目录问题。我上次这么搞就好了,你试试看。
试试在MCP config里给server加个env字段配上PATH,子进程经常找不到python环境,我上次就是这么解决的。
八成是工作目录问题,stdio模式默认从客户端目录启动,你试试env里设个绝对路径的PYTHONPATH再连一次。
八成是stdio模式下子进程的cwd没对上,试试在config里加个env设PYTHONPATH,或者用npx跑下看报错。
我之前也卡这,最后用MCP Inspector抓的包,比看日志直观多了。
这问题我上周刚踩过一模一样的坑,最后发现是FastMCP默认会往stderr打一堆debug日志,而Claude Desktop的stdio模式对stderr特别敏感,稍微有点输出它就判定握手失败。你可以试试在启动命令后面加个--quiet或者把日志重定向到文件,别让它直接打到终端。另一个常见坑是Python的缓冲机制,子进程没等你发请求就把缓冲区的垃圾数据当stdout输出了,建议用python -u强制无缓冲跑。至于工作目录,确实有影响,Claude Desktop启动子进程时的工作目录大概率不是你的项目路径,所以相对路径的配置文件全得改成绝对路径,最好连.env文件都直接用绝对路径加载。调试工具的话,别用print,直接上pdb或者python-debugger,在server初始化那行打断点看环境变量,我那次就是发现PATH里少了Python的虚拟环境路径。还有一个野路子,先写个最简单的返回hello的server,确认能连上再加业务逻辑,逐步二分排查,比看日志快多了。
我之前也卡在这过,后来发现MCP的stdio模式跑起来时,子进程的工作目录默认是Claude Desktop的安装目录,不是你的项目目录。你试试在config里那个命令前面加个cd到项目路径,或者直接在启动脚本里写死绝对路径的日志输出,比如log_file那个参数,能直接看到Python的报错堆栈。另外检查下Python环境,Claude Desktop调用的可能是它自带的那个python,跟你终端里用的不是同一个,用which python确认下。
八成是子进程工作目录的问题,试试在config里加cwd字段指到server文件夹,我上次就这么解决的。
我之前也遇到过类似的坑,大概率不是环境变量的问题,而是stdio模式下子进程的工作目录压根就不对。你试试在config里给command加上env字段,手动指定PATH和PYTHONPATH,有时候FastMCP依赖的包路径在Desktop的沙箱环境里根本找不到。另外建议先别用Claude Desktop,直接用MCP官方的调试器mcp-debugger,它能显示完整的stderr输出,比瞎猜日志强。还有个土办法,在server代码最开头写个open('/tmp/debug.log','a'),把os.getcwd()和sys.path打进去,看看到底跑在哪了。
我之前也卡在过这,后来发现是FastMCP默认绑定的host和端口跟Claude Desktop预期的不一样,试试在启动命令里显式加上--host 127.0.0.1和--port参数。另外stdio模式下子进程的工作目录确实会继承Claude的,你可以在config里把command包一层bash -c,先cd到你的项目目录再启动,很多诡异问题都是这么解决的。调试的话别只看stderr,给FastMCP加个--debug或者设LOG_LEVEL=DEBUG,输出会详细很多,至少能看到它到底卡在握手还是配置解析上。
我前两天也踩过类似的坑,最后发现是Python环境的问题。你本地跑没问题但Claude连不上,大概率是它用的那个python解释器跟你终端里激活的不是同一个——比如conda环境没写进config的command里。FastMCP服务本身其实不挑工作目录,但stdio模式下子进程会继承Claude Desktop的环境变量,所以你要是靠.bashrc或者.zshrc里设了PATH或PYTHONPATH,那它压根加载不到。建议你直接在command里写成类似/home/你的用户名/miniconda3/envs/你的环境名/bin/python这种全路径,然后再试试。日志这块,别光看Claude那边的报错,把服务端启动代码里加上logging.basicConfig(level=logging.DEBUG)然后重定向到文件,比如python your_server.py > /tmp/mcp.log 2>&1,这样能看到它到底有没有被拉起、崩在哪一步。还有个小技巧,你可以在脚本最开头print几行调试信息到stderr,因为stdio模式下stdout是走协议通信的,stderr才会出现在客户端日志里。如果还不行,试试用npx或者uvx这种包管理器来启动,有时候能绕开路径解析的诡异问题。最后实在不行就装个mcp-inspector,那个图形化工具能直接模拟客户端发请求,断点看消息流转比瞎猜强多了。
我之前也踩过这个坑,Claude Desktop的stdio模式确实会拿它自己的工作目录去跑命令,你config里写的相对路径或者依赖venv的启动脚本都会挂。建议先把command换成类似 /usr/bin/python3 这种绝对路径,再在args里给server脚本也用绝对路径,顺便设个PYTHONUNBUFFERED=1。日志的话可以先拿MCP Inspector单独连一下你的server,能通就说明server本身没问题,问题基本在客户端拉起子进程那一步。