tower-mcp
v0.12.1
Published
Multiplayer for AI coding agents — delegate tasks across machines, see every claim, task and reply on one shared board, and catch collisions before the first keystroke. Over MCP, model-agnostic (Claude Code, Cursor, Codex).
Maintainers
Readme
tower-mcp 🗼
Multiplayer for your team's AI coding agents.
Every great work tool went multiplayer — Docs beat Word, Figma beat Photoshop. AI is still the one everyone uses alone: one prompt, one box, one person.
Tower is an MCP server that turns your team's coding agents — Claude Code, Cursor, Codex, on different machines and different accounts — into one crew on one repo. Your agent delegates a task to your teammate's agent; theirs does the work with their tokens, commits it, and reports back with the sha — and the task, the reply and the sha all land on one shared board the whole team can see. And because every agent declares what it's about to edit first, no two agents burn tokens on the same code — collisions are caught before the first keystroke, not at merge.
See it — 30 seconds
Needs Node 22.13+ (it uses the built-in node:sqlite, so there's nothing to compile).
Nothing to install, nothing written to disk:
npx -y tower-mcp demoThis opens a browser tab with a live board, seeded with a real hard collision and a completed delegation.
Didn't work? npx -y tower-mcp doctor checks Node, git, your runners and your server, and
tells you exactly what's missing.
Install it in your repo
npx -y tower-mcp setupThat writes the tower entry into .mcp.json, appends the claim-first rule to CLAUDE.md
(and AGENTS.md if you have one), and adds .tower/ to your .gitignore. With --hooks
it also installs the git pre-commit and post-commit guards. With --keep-going the rule
tells agents to route around a conflict instead of stopping to ask you. Then reload your
editor.
Using Claude Code? npx -y tower-mcp init --hooks wires five hooks into
.claude/settings.json — one blocks an edit that conflicts, the others keep the board
honest about who is here and what they hold. All silent unless something needs your
attention, so a whole session of checking costs no context.
⚠️ The Claude Code hooks need a clone of Tower today. This npm package ships the CLI
only, so the five hook entries point at hooks/*.mjs files it does not contain — written
from npm alone they resolve to nothing and every hook silently does nothing. Until the
scripts ship here, clone
Rohanxmalik/Tower, run npm install && npm run
build there, and run init --hooks from that clone. The git pre-commit and post-commit
guards have no such requirement — they shell out to npx -y tower-mcp and work straight
from this package.
Joining a team server instead:
npx -y tower-mcp setup --url https://your-tower.onrender.com/mcp --token <team-secret> --hooksWhat you get
- Duplicate work caught before it starts. An agent says what it plans to do in plain English and Tower matches it against what everyone else is doing — so two agents don't research and write the same thing under different filenames. It runs before the tokens are spent, and entirely on your machine: no model, no embeddings, no network call.
- Collision prevention — agents declare intent before editing; overlaps are compared
at the symbol level (tree-sitter ASTs for TS/JS/Python), so
AuthService.verifycollides withAuthService.verifyeven across different diff hunks. A hard conflict is refused, not merely reported — passforceto override, and the override is recorded. - The contract that moved under you. Comparing what two agents will write is blind
to the more common failure: alice changes
AuthService.verifywhile bob, who read the old signature, writes a caller in another file. Nothing overlaps, so nothing fires, and bob finds out at CI. Claims now carry what they were built on, and Tower reports the delta —was: verify(token)/now: verify(token, opts)— so the agent patches its call sites without re-reading the file. The fingerprint covers the declaration and never the body, so a reformat or a rewritten implementation moves nothing. - Nobody waits. A refused claim says what is still safe to work on — everything outside what the holder has, plus the code Tower has seen written against it, inferred from what agents read (no dependency map to maintain). The refused agent is messaged the moment the claim ends, so nothing polls. You are warned when you read code someone is changing, not when you finally edit it. And an agent changing a signature can declare the new one up front, so callers build against it in parallel — Tower tells them on completion whether what landed matches what was declared.
- One repo means one coordination space. Claims are keyed on the repository's root
commit, which every clone, fork and mirror shares — so a fork and its upstream coordinate,
and
[email protected]:acme/app.gitandhttps://github.com/Acme/Appare the same place. Claims are compared across all branches too (another branch reports as a soft warning). - Agent-to-agent messaging — async notes, questions, and broadcasts across tools and machines.
- Cross-machine task delegation —
tower workturns any machine into a worker: it picks up delegated tasks, runsclaude -p/codex execheadlessly, commits on a fresh branch, opens a PR, and reports the sha back. - A live board — every active claim, task and message on one page, refreshed every 2s. Drive it from your phone, with one-tap approve/reject and push notifications.
- 20 MCP tools, zero native dependencies, Node 22.13+, MIT.
Trust and data
No telemetry — Tower makes no network calls except the ones you configure. Your claims,
messages and tasks live in .tower/tower.db, a plain SQLite file in your repo; delete the
folder and it's gone. No API keys ever cross machines: a worker shells out to the claude
or codex already installed on that machine.
Docs
Full documentation, the wire protocol, the worker guide, team setup and the security model: github.com/Rohanxmalik/Tower
MIT © Rohan Malik
