故障排查
Exec command 故障排查
排查命令执行与沙箱失败。
exec_command 会保留原始 stdout、stderr 和 exit_code,同时可能返回常见失败的结构化 diagnostics。
常见 code:
DEV_NULL_DENIED:Landlock 对/dev/null的 special-device rule 不正确。TMPDIR_NOT_WRITABLE:配置的临时目录不可写。HOME_NOT_WRITABLE:配置的 home 目录不可写。DNS_RESOLUTION_FAILED:resolver 配置或 network / DNS 失败。NETWORK_PERMISSION_REQUIRED:safe mode 阻止了看起来需要网络的命令。SHELL_EXPANSION_PERMISSION_REQUIRED:safe mode 阻止 shell expansion。INLINE_SCRIPT_PERMISSION_REQUIRED:safe mode 阻止 inline interpreter / shell code。LANDLOCK_READ_ROOT_BLOCKED:工具链需要读取的路径没有加入 read roots。SECRET_ENV_REJECTED:secret-looking 或 loader/startup 环境变量被拒绝。COMMAND_TIMED_OUT:命令超过timeout_ms。OUTPUT_TRUNCATED:stdout 或 stderr 超过 output limit。
常用显式探针:
dd if=/dev/null of=/dev/null bs=1 count=0
echo hi >/dev/null
printf ok > "$HOME/coding-tools-write-test"
printf ok > "$TMPDIR/coding-tools-write-test"
cat /etc/resolv.conf && getent hosts repo.maven.apache.org工具链版本不对(nvm、pyenv、rbenv、asdf)
典型现象:终端中 node --version 是 v24,但通过 exec_command 执行却变成系统 Node(例如 v18)。
原因通常是 version manager 只在 interactive shell rc(如 ~/.zshrc、~/.bashrc)中把 shim/bin 目录放到 PATH 前面。如果启动 MCP server 的 host 是 GUI 应用(desktop app、IDE),它往往只继承系统最小 PATH。而 exec_command 在默认 core policy 下继承 server process 的 PATH,因此解析到系统版本。
建议按以下顺序处理:
- 在 launcher 中解析 login-shell PATH。 如果你控制启动 server 的进程,在 startup 时向用户 login shell 获取一次
PATH,然后用它 spawn server。这样即使 host 从 GUI 启动,nvm 等版本管理器仍能工作。 - 显式传 PATH。 在 MCP host config 的
envblock 中传入,或使用工具链的绝对路径。 - 放宽环境继承。 如果命令还需要
NVM_DIR、GOPATH、JAVA_HOME等变量,使用--shell-env-inherit all/CODING_TOOLS_MCP_SHELL_ENV_INHERIT=all。Dangerous mode 以外仍会过滤敏感变量。
这种策略类似 Codex 的 shell_environment_policy.inherit = "all",但 Coding Tools MCP 默认仍保持更严格的 core policy。