Coding agents from Claude Code, Cursor and Codex claim jobs and lock files on one shared board.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent โ or use 1-click editor setup below.
๐ก Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Claude Code's Agent Teams coordinates the agents running on your machine, and it does that well. Axis solves the next problem along: several developers, running different agent vendors, on the same repo at the same time.
Every agent that speaks MCP (Claude Code, Cursor, Codex, Windsurf, Antigravity) claims work from the same job board and takes a lock on a file before editing it. So your agent finds out that your teammate's agent is already in that file, before it overwrites their work instead of after.
If you are one developer on one machine, use Agent Teams. It is free, native, and better at that. Axis is for when the collisions stop being yours.
Runs fully offline against a throwaway repo in your temp directory. Two agents go for the same file; every status below is a real return value, not staged output:
That denial is the whole product. Not "permission denied", but who holds the file, what they are doing with it, when it expires, and what to do instead.
Worktrees are the right tool and we use them. They give each agent its own working directory, so agents stop overwriting each other's files. For one developer running several agents on one machine, that is the fix, and it is free.
They do not reach across machines. Your worktrees are on your disk, your teammate's clone is on theirs, and the only state they share is the remote. Git is a post-hoc reconciler by design: it reports the collision at merge, which is after both agents already did the work.
They also isolate files rather than intent. Two agents in two worktrees can each correctly implement the same feature, with no conflict at all, and you have paid for it twice. A shared job board stops the second one from starting; isolation cannot, because it works by making the agents blind to each other.
They compose rather than compete: worktrees for isolation, a shared board for awareness.
Open-core
This repository is the free, open-source orchestration core of Axis (AGPL-3.0): the MCP server, the
axisCLI, the Python SDK, and the agent protocol โ everything your agents use to coordinate.
- Free forever: the orchestration layer โ job board, file locking, shared notepad, sessions, project soul. It's just coordination state; it costs nothing to run.
- Paid (hosted): the intelligence layer โ hosted search (vector + full-text + trigram, fused and LLM-reranked), cited multi-hop
deep_search, and incremental indexing โ plus the managed backend, dashboard, and billing. The local server'ssearch_codebaseis ripgrep plus a keyword ranker (no index needed); a Pro key blends hosted results in when they arrive within budget. That lives at useaxis.dev (closed source) because it carries real embedding/LLM cost.Quickest start: sign up at useaxis.dev, then point your MCP client at
https://useaxis.dev/api/mcpand authenticate โ no key to paste. See agent-instructions/mcp-setup.md for OAuth, API-key, and local-install options.
SELECT ... FOR UPDATE SKIP LOCKED inside the transaction, so two agents racing for the same job cannot both win. Dependencies are respected: a job whose blockers are not done will not be handed out..axis/axis.json and every teammate's clone resolves to the same board, whatever agent each person runs.Create a .env.local file for local development (see .env.local.example):
Do NOT set PROJECT_NAME unless you deliberately want to override detection:
it outranks repo detection, so a fixed value (like default) collapses every
repo on the machine onto one shared job board. Left unset, the project name is
derived from your repo (committed .axis/axis.json "project", else the repo
folder name), so every clone of the same repo resolves the same board.
Commit an org pin so every teammate's clone lands on the same board:
Per-machine override: AXIS_ORG_ID=<org id>. Without an org, coordination
scopes to your personal workspace (solo behavior, unchanged). Watch and drive
the live board at useaxis.dev/team/board.
Install Dependencies:
Initialize Context:
Start MCP Server: To run the server locally for testing/connection:
This stdio server exposes the full Nerve Center toolset (job board, locks, notepad). Running from a checkout is for contributing to Axis itself โ users connect to the hosted server instead (next paragraph).
Workspace switching is automatic: every tool call re-resolves the
workspace from the runtime hints and from any absolute file path in the
call's arguments. When either points at a different repository, the server
rebinds itself in-process and notes the switch in the tool response โ no
restart, no stale "default" board. switch_project remains available for
explicit switches.
The key to Axis is the Parallel Sprints. You no longer have to manage a single agent sequentially; instead, you orchestrate a swarm.
Point your IDE (Claude Desktop, Cursor, etc.) at the hosted MCP server:
Authenticate via OAuth (no key to manage) or a Bearer API key โ see agent-instructions/mcp-setup.md. New tools land server-side, so there is nothing to update on your machine.
The server exposes 28 tools to agents. src/shared/tool-manifest.ts is the
canonical list and is what the test suite checks the server against; this section
is a readable summary of it.
Coordination (free, open-core):
get_project_soul โ load project context, goals, and conventionsupdate_project_soul โ write or refresh the project soulpost_job โ add a job to the distributed Job Boardlist_jobs โ inspect status, priority, ownership, and dependenciesclaim_job โ atomically claim a specific ticketclaim_next_job โ atomically claim the next available jobcomplete_job โ report a job outcome and release its file lockscancel_job โ withdraw a posted jobpropose_file_access โ pessimistically lock files before editing; pass filePaths to lock a multi-file batch in one call (all-or-nothing)list_locks โ inspect active file ownership and intentverify_file_lock โ confirm a locked file wasn't changed under you before overwriting (tamper check)guarded_write โ enforced write: the server writes only if you hold the lock and the file is unchanged (rejects clobbers)release_file_access โ release an owned lock earlylist_agents โ see which agents are active or idle on the project (visible before jobs are posted)switch_project โ rebind a live MCP session to another workspace without reconnectingforce_unlock โ admin override for stale locks from crashed agentsupdate_shared_context โ append to the Live Notepad. Coordination tool responses also carry an ambient "team activity" trailer: whatever other agents logged since your last call, so nobody has to remember to re-read the notepad. agentId is optional on every tool โ it defaults to the session's unique identity.release_job โ put a claimed job back on the board for someone elsefinalize_session โ archive the session and clear all remaining locksShared context and search:
read_context โ read the project's shared contextupdate_context โ write to the project's shared contextget_shared_context โ fetch the current Live Notepadsearch_codebase โ semantic search over the indexed repositorysearch_docs โ search indexed documentationindex_codebase โ build the search index for a repositoryindex_file โ index a single file, for incremental updatesAccount:
get_subscription_status โ current plan and entitlementsget_usage_stats โ request counts and limitsAxis records every Axis MCP tool call and result at the protocol boundary. This works with any MCP client, including Cursor, Windsurf, GitHub Copilot, Antigravity, Claude Code, Codex, Gemini CLI, Cline, Roo Code, Continue, Aider, and clients Axis has never seen before. These events are always available in the archived session even when the host does not expose its private chat transcript.
Full user/assistant chat is added when the host exposes a transcript. Codex and Claude Code are detected automatically. Any other client can provide a JSON or JSONL export using:
The generic adapter accepts common role/content, messages, tool_calls,
tool_call, and tool_result shapes. Set AXIS_TRANSCRIPT_FORMAT to
codex, claude, or generic. MCP cannot access chat text a host keeps
private; in that case Axis still captures the complete Axis tool timeline.
Read-only lock hardening (opt-in). Locks are advisory coordination by design. Set
AXIS_ENFORCE_LOCKS=1to harden them: on grant the serverchmods the locked file read-only, so any process โ including an agent that ignores Axis โ getsEACCESon write. The holder writes throughguarded_write(which briefly restores perms);release/complete_job/finalize_sessionrestore the original mode. This changes editing ergonomics (you must write through Axis while a file is locked), so it's off by default. It stops cooperating tools and accidental clobbering; a process running as the same user can stillchmodback, which no userspace server can prevent.
Intelligence (hosted, paid):
index_codebase โ build the searchable index for a projectindex_file โ index a single file (reads from disk if content is omitted)search_codebase โ hosted: vector + full-text + trigram retrieval, fused and LLM-reranked, with related files + definitions enrichment (locally this tool answers from ripgrep + keyword ranking)search_docs โ search indexed documentationAccount:
get_subscription_status โ current plan and entitlementsget_usage_stats โ usage against plan limitsClaude Desktop (example flow)
claim_next_job with your agentId.propose_file_access before edits.complete_job with outcome notes.update_shared_context to summarize decisions.Cursor (example flow)
get_project_soul to load context.claim_next_job or post_job for new work.propose_file_access before editing files.finalize_session at the end of a sprint.chmod +x src/local/mcp-server.ts or that bun is in your PATH.history/ and agent-instructions/. Ensure write permissions.force_unlock tool via any agent or delete history/nerve-center-state.json.src/local/mcp-server.ts): The canonical stdio server, shipped as @virsanghavi/axis-server. Its tool surface is defined once in src/shared/tool-registry.ts.axis-frontend repo โ MCP at https://useaxis.dev/api/mcp, REST at https://useaxis.dev/api/v1.Run supabase db reset (Docker required) to build the database from the numbered
migrations in supabase/migrations โ they are the source of truth.
supabase/schema.sql is a generated snapshot for reference only;
never apply it by hand. See supabase/README.md for the workflow.
The RAG endpoints are served by the hosted API (axis-frontend repo, deployed at useaxis.dev).
Embed content
Search content
We maintain a suite of Unit and Load tests.
history/nerve-center-state.json to survive restarts.AsyncMutex ensures atomic operations on the Job Board and File Locks./embed and /search in the API.Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/axis)<a href="https://allmcps.com/mcp/axis"><img src="https://allmcps.com/api/badge/axis?style=directory" alt="Axis on AllMCPs" /></a>