最近在折腾MCP服务器,想用Claude直接管理本地项目文件夹。照着文档搭了个filesystem服务器,结果发现只能读文件列表和内容,一尝试创建或修改文件就报权限错误。查了半天,好像跟MCP的“能力声明”和“资源定义”有关,但文档里没写清楚怎么给写权限。有没有大佬遇到过?是需要在服务器配置里手动声明“write”操作,还是Claude默认只开了只读沙盒?求指点,卡了好几天了……
MCP服务器连Claude后,为啥只能读文件不能写?
全部回复
共 151 条大概率是服务端工具没声明写权限,filesystem的write/create得在工具定义里显式标出来,光靠资源定义不够。
我之前也卡这,后来在server代码里给工具加了write权限声明,Claude那边才放行。
这问题我上周刚踩过,不是Claude那边默认只读,是MCP server的tool定义里没把write方法加进permissions。你检查一下filesystem server的代码,手动在工具列表里声明create/write操作,然后重启服务,Claude这边就能识别了。另外注意资源URI的权限范围,如果只配了read-only的pattern,写操作肯定会被拦。
我前几天刚踩完这个坑,大概率是MCP的tool定义里没写write权限导致的。你可以去server端配置文件里找找有没有类似"permissions"的字段,把write加进去,或者直接用官方那个@modelcontextprotocol/server-filesystem包,它默认是带写操作的。另外Claude这边确实会检查capabilities,如果server声明里没暴露write,它就不会调那个方法,但报错应该会更明确,你确认下是不是把error吞了。要是还不行,试试在client初始化时显式传allowedTools参数,把write相关函数名列进去。
我之前也卡在这块儿,八成不是Claude默认沙盒的问题,是MCP协议里工具(tool)和资源(resource)权限分开算的。filesystem服务器默认只暴露了读取类的工具,写操作要自己在server代码里显式注册,或者用官方那个带write后缀的版本。你检查一下连接时候的capabilities列表,里面要同时有filesystem.write和filesystem.read才算齐。另外如果用的是托管版Claude,有些平台会在网关层强制只读,那就得换个自定义端点绕过去。
这问题我上周也踩过坑,其实不是Claude默认只读,是MCP的filesystem服务器实现里把写操作默认关掉了,得在启动参数里显式加--allowed-write-root或者配置里声明permissions。你试试在服务器注册时把capabilities里的write设为true,然后客户端那边还得确认没有强制走只读模式。我之前就是这么解决的,文档确实写得含糊,得翻源码才看到。
这题我刚好上周踩完坑,你提到的“能力声明”确实是关键。MCP协议里服务器必须在manifest里明确列出支持的operations,比如read、write、edit,但很多第三方filesystem实现默认只暴露read权限,得在初始化配置里手动加“capabilities”字段或者调对应的SDK方法注册写操作。另外Claude Desktop的客户端设置里也有个沙盒开关,默认可能把文件系统挂载成只读,你检查下config文件里有没有“readOnly”这类参数,有的话改成false。我当时是把服务器代码里处理createFile的handler单独加了日志,发现请求根本没到业务层,直接就被客户端拦截了,所以大概率不是MCP层的问题,而是客户端安全策略。你可以试着用其他MCP客户端(比如VS Code插件)连同一个服务器,如果那边能写,那问题就锁定在Claude的沙盒配置上,别光看官方文档,去GitHub issue里搜“write permission”有惊喜。
这个问题我上周刚踩过同样的坑,最后翻MCP的Python SDK源码才搞明白。关键其实不在MCP协议本身,而在你启动服务器时暴露的工具列表——filesystem服务器默认只注册了read相关的工具,write操作需要你显式在服务器代码里用tool注解加进去,光改配置文件没用。另外Claude这边确实有沙盒限制,但它是根据服务器声明的权限来决定是否展示写按钮的,你工具没声明,它自然就当只读处理。我当时是把官方filesystem服务器的代码fork下来,在里面加了write_file和edit_file两个函数,再重新build镜像,问题就解决了。还有个坑是路径校验,官方实现里write操作要求目标路径必须在allowedDirectories白名单内,你如果传了绝对路径但没匹配上,也会报权限错误。建议你直接看服务器返回的JSON-RPC错误码,如果带-32601就是方法不存在,说明工具没注册成功,如果带-32000才是权限问题。
这个我上周刚踩完坑,大概率是没在server配置里把capabilities的write开关打开,filesystem的读写权限是分开声明的。另外Claude这边也会做二次校验,如果工具描述里没明确标write,它可能就默认按只读处理了。建议你直接在资源定义里加个mutable: true试试,或者换个思路用MCP的filesystem自定义命令绕过内置限制,反正文档那部分确实写得含糊。
大概率是filesystem server默认只声明了只读能力,得去MCP配置里手动加write权限,别信Claude那边会自动开。
之前我也卡这,后来发现要在服务器代码里显式允许写操作,光靠客户端设置没用。
试下在server配置里显式声明write权限,我之前也卡这,加完就好了。
我之前也踩过这个坑,filesystem服务器默认给的确实是只读权限,得在启动配置里手动加上写操作的白名单目录。你去看下服务器启动参数那块,有个allowedDirectories之类的配置项,把你要写入的路径加进去才行。Claude那边倒不是故意锁死,主要是MCP服务器自己声明了哪些能力才会暴露给模型。建议你先用命令行直接测一下服务器的写接口通不通,能排除是配置问题还是客户端限制。