Troubleshooting

August 12, 2026 ยท View on GitHub

Protocol Version Errors

Send MCP-Protocol-Version on every HTTP request. A 2026-07-28 client sends MCP-Protocol-Version: 2026-07-28, repeating the version in its params._meta; a header that disagrees with the body, or is missing from such a request, returns 400 with -32020. A handshake client sends the version it negotiated at initialization, normally MCP-Protocol-Version: 2025-11-25, or 2025-06-18 for compatibility. A header naming a version this server does not know returns 400 with -32600 and lists the ones it does; a request with no header at all is read as 2025-11-25.

Asking to handshake with a version this server does not speak is no longer an error: initialize answers with the newest version it does speak. If a client seems to be on an older protocol than expected, read the protocolVersion in the InitializeResult rather than assuming the one that was requested.

SANDBOX_UNAVAILABLE

If exec_command returns a warning about Linux Landlock being unavailable, the command still ran under server-side policy checks, but without kernel filesystem confinement. This is expected on Windows, macOS, and Linux hosts without Landlock support. Put the server inside an external sandbox before running untrusted commands or untrusted project code.

If an older client or server reports SANDBOX_UNAVAILABLE as an error, upgrade to the current behavior or run on a Landlock-capable Linux kernel.

Command Hangs Or Times Out

If the result returns status: "running", poll with write_stdin using empty chars, or terminate with kill_command. Command deadlines still apply when the client stops polling.

Permission Elicitation Is Unsupported

If request_permissions returns ELICITATION_UNSUPPORTED, the MCP client cannot show approval prompts. For dependency downloads and local development, prefer --permission-mode trusted; it allows network-looking commands, shell expansion, and inline scripts while keeping secret filtering and destructive-command checks. For isolated containers or VMs, use --permission-mode dangerous to disable exec_command permission gates.

Missing Toolchain Environment

exec_command defaults to a core shell environment. If tools such as MSVC, CUDA, oneAPI, or Nix depend on variables from the parent terminal, start the server with:

CODING_TOOLS_MCP_SHELL_ENV_INHERIT=all coding-tools-mcp --workspace /path/to/repo

This still filters secret-looking and loader/startup variables unless --permission-mode dangerous is also enabled.

Exec Diagnostics

exec_command may include diagnostics with codes such as DEV_NULL_DENIED, DNS_RESOLUTION_FAILED, NETWORK_PERMISSION_REQUIRED, TMPDIR_NOT_WRITABLE, HOME_NOT_WRITABLE, COMMAND_TIMED_OUT, and OUTPUT_TRUNCATED. See troubleshooting-exec.md.

Trace Tool Calls

For local debugging:

CODING_TOOLS_MCP_TRACE=1 coding-tools-mcp --workspace /path/to/repo

Trace events are JSON lines on stderr. Arguments are redacted for secret-looking keys and values; stdout remains reserved for stdio JSON-RPC frames.

SWE-bench

If Docker or the swebench package is missing, the default scaffold should report PREFLIGHT_ONLY; an explicit evaluation attempt should report BLOCKED, not pass. See swe-bench.md.