For agents, on top of README.md, which they read first.
launch.shmust never build, wait, or enternix develop. Its whole job is to answer inside the client's 30 s startup timeout on an emptybuck-out. Anything slow goes ininstall.sh.- Nothing but JSON-RPC on
launch.sh's stdout. Diagnostics go to stderr; the one stdout line it may write itself is the error reply toinitialize. Same rule as the proxy's (../../apps/native/CLAUDE.md). run/bin/nativeis a copy, not a symlink intobuck-out, on purpose - see the comment ininstall.sh. Do not "simplify" it into a symlink.- Test a change with
tools/mcp/test.sh: scripted stdio, timed, in a bare environment (env -i PATH=/usr/bin:/bin, all a profile-less NixOS process gets), with and without a binary, against a scratch copy of the layout so the realrun/binis never moved. launch.shuses bash builtins only. In that bare environmentdirname,sedandjqdo not exist; adirnamethere made the repo root "" and the launcher looked for//run/bin/native(2026-09-21).- Keep both scripts shellcheck-clean:
nix develop -c shellcheck tools/mcp/*.sh.