# Visual Intent Layer Point at what you see and say what should change. The agent changes exactly that, and you verify by hand. It reviews a browser-rendered artifact — a saved or generated HTML document, or a local web app running on this machine; a mobile build, a native window, a design file and a PDF are outside it by decision rather than omission. ## Install Requires Node 20+. No Rust toolchain, no hosted account. The product is a standard local MCP server. You register it with your own agent's MCP mechanism — there is no install command of ours to run, and nothing of yours that we write. | Harness | What to run | | ----------- | -------------------------------------------------------------------------------------------------------- | | Claude Code | `claude mcp add visual-intent-layer -- npx -y --package visual-intent-layer@latest visual-intent-mcp` | | Codex | `codex mcp add visual-intent-layer -- npx -y --package visual-intent-layer@latest visual-intent-mcp` | | opencode | `opencode mcp add visual-intent-layer`, then give it `npx` and the arguments above when it asks | | pi | the entry below, with `pi-mcp-adapter` installed, or the adapter's `/mcp setup` panel | | any other | any host that can launch a local stdio server: command `npx`, arguments `-y --package visual-intent-layer@latest visual-intent-mcp` | Registry-aware clients can also find the server as `io.github.willa-code/visual-intent-layer` in the official MCP Registry, which lists where to get it rather than hosting it. **Install it on the machine where you look at the screen.** The Review Surface launches a browser on the machine running the server and binds a loopback port there. A server in a container, on a remote host, or inside a cloud agent has nothing to show you. Registering takes effect when your agent next starts, so restart it. ### The pi entry pi itself ships no MCP; `pi-mcp-adapter` provides it. Add this to the project's `.mcp.json` — merge it into `mcpServers` if the file already has one, rather than replacing the file: ```json { "mcpServers": { "visual-intent-layer": { "command": "npx", "args": ["-y", "--package", "visual-intent-layer@latest", "visual-intent-mcp"] } } } ``` A project `.mcp.json` applies to that project only. `.pi/mcp.json` is the Pi-only project override, and `~/.config/mcp/mcp.json` applies to every project. Install the package globally (`npm install -g visual-intent-layer`) and the entry's `command` becomes `visual-intent` with `args` `["mcp"]`. ### Update `@latest` is resolved when npx fetches the package, so there is nothing to update by hand — unless your Harness caches the resolved command and keeps serving it: `pi-mcp-adapter` caches for 24 hours, reading the cache from disk, so a restart does not renew it. Delete `~/.pi/agent/mcp-npx-cache.json` to force a fresh fetch. `npm view visual-intent-layer version` says what is current. To hold a version still, replace `@latest` with an exact version in the entry. A global install updates with `npm install -g visual-intent-layer@latest`. ### Uninstall Remove the entry you added, with the mechanism you added it: `codex mcp remove visual-intent-layer` in Codex, `claude mcp remove visual-intent-layer` in Claude Code, and by deleting the entry from your Harness's own MCP config everywhere else. A global install comes out with `npm uninstall -g visual-intent-layer`. Uninstalling deletes none of your reviews: Annotations, sessions and attachments stay in `~/.visual-intent-layer/data` until you remove that directory. `docs/guide.md` names the file for the Harnesses that keep one. ### If the tools do not appear Run the entry's command by hand first. It separates Node and npm from the Harness: ```sh npx -y --package visual-intent-layer@latest visual-intent-mcp ``` It prints `visual-intent review service on http://127.0.0.1:` to stderr and then holds the connection open for an agent; `Ctrl-C` ends it. If that works, your agent's own MCP panel is where the reason is: it names the server and reports why it failed to start. The product cannot tell you — it writes no configuration and reads none. The server runs without an agent too: ```sh npx -y --package visual-intent-layer@latest visual-intent open --html ./checkout.html ``` ## Documentation [`docs/guide.md`](docs/guide.md) is the product manual: the Review Surface, the Annotation model, target resolution, Check-In, the four MCP tools, environment and data, the envelope schema, develop and layout. `SECURITY.md` holds the threat model, supported versions and the disclosure process. `docs/adr/` records why the product behaves as it does, and `docs/pi-validation.md` is the live-pi checklist, awaiting a human run. ## License Apache-2.0. The complete local loop is permissively open.