reticle_* tools, then add the SDK to your app so there is something for those tools to talk to. You need both, in that order.
Do only the first half and the tools appear but every call reports no session. Do only the second and your app connects to a daemon nobody is asking questions.
If you want the CLI without the script:
reticle setup mcp is exactly the registration half of the installer, and it prints any client it could not write for you.
Part 1. Register the MCP server
There is no config file that all agents share. Each harness has its own path and its own schema, so write only the one you actually use.Claude Code
Register once, globally, and every project has it:claude mcp list. reticle should be there.
If the claude CLI isn’t available, merge one key into mcpServers in ~/.claude.json. It is a large stateful file, so merge, never rewrite:
Cursor, VS Code, Windsurf
Same shape, different file and root key. Cursor and Windsurf usemcpServers; VS Code uses servers:
Codex CLI
TOML, in.codex/config.toml. This is the one init cannot write for you:
OpenCode
Note the flat command array and the requiredtype:
Part 2. Wire the SDK into your app
Vite
src/components/Login.tsx:81. And injects connect() so you can’t forget it.
Anything without the plugin
If you’re not on Vite or Next, callconnect() yourself, guarded so it never reaches production:
connect() is dev-only by design. Guard it with whatever your bundler gives you:
import.meta.env.DEV, process.env.NODE_ENV !== 'production', or a build flag. Reticle also
self-guards, but two locks on a door that leads to your users is a reasonable number.Tauri. and the step whose failure is silent
The frontend is identical to any web app. The CSP is not optional:invoke('load_todos') already reaches Reticle as ipc://load_todos.
Electron, and the rest of desktop
Main-process and renderer wiring, IPC observation, and what differs from the web install.
Part 3. Prove it
[Reticle] this page could not open a websocket to … naming the exact address it tried; set it explicitly with VITE_RETICLE_WS_URL=ws://localhost:4400/reticle or reticle.connect({ url }).
Still stuck? npx @reticlehq/server doctor checks Chromium, the daemon and the port in one command.
Instrument your app
Register stores, signals and testids so your verdicts get stronger than “the DOM changed”.
Quickstart
Drive your first flow and read a real verdict.