One coordination board for a team's coding agents. Claude Code, Cursor, Codex and Windsurf share a job board and take a lock on a file before editing it, so agents run by different people do not overwrite each other.
Axis MCP Server provides 29 tools with mostly complete descriptions and schemas, but has significant consistency issues. 24/29 tools (83%) have descriptions exceeding 20 characters and input schemas with type definitions. However, parameter descriptions vary widely in quality, some parameters lack descriptions entirely, and error handling guidance is sparse. The tool definitions show strong architectural thinking around multi-agent coordination (file locks, job boards) but fall short of production-grade clarity in several key areas. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present, reducing LLM safety awareness.
**CANCEL A JOB**: Remove a job from the board if it is no longer needed or is blocked. - Returns the cancelled job. - Use sparingly — cancelling jobs is a signal that work is truly unnecessary.
**CLAIM A SPECIFIC JOB BY ID**: Claim a particular job if you know its ID. - Use this when a job is already assigned to you, or when you explicitly choose a job from the board. - Returns the claimed job (with its `id` and `completionKey` for use in `complete_job`).
**CLAIM THE NEXT UNASSIGNED JOB**: Pop the highest-priority unclaimed job from the board and claim it. - Returns the claimed job or null if the board is empty. - Use this when you have capacity and want load-balanced pickup. - Alternatively, use `claim_job` with a specific job ID if you prefer direct assignment.
**COMPLETE A CLAIMED JOB**: Report that a job is finished. This releases all locks held for that job. - Requires the job ID and its `completionKey` (returned by `claim_job` or `claim_next_job`). - `outcome` is a 1-line summary of what you did (e.g., 'Refactored auth middleware to use JWT'). - **Completing a job is mandatory** — do not accumulate incomplete jobs. This is your signal to release locks.
**ADVANCED CODE INTELLIGENCE** (Hosted tier only): Multi-step agentic search that understands *why* code is structured the way it is. - Returns semantic + behavioral connections, not just text matches. - Slower than `search_codebase` but much more powerful for 'how is X done' and cross-module reasoning. - Available only in the hosted server (paid feature); local servers use `search_codebase` as the fallback.
No tool annotations present: missing readOnlyHint, destructiveHint, and idempotentHint across all 29 tools. LLMs cannot distinguish safe read operations from destructive writes at parse time, risking misuse of destructive tools like force_unlock, guarded_write, and complete_job.
List tools (list_locks, list_jobs, list_agents, get_shared_context) lack output schema documentation. Schema field shows only input; output structure is undocumented. LLMs cannot predict what fields to extract from responses.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
**MANDATORY CLEANUP**: Call when the user's entire request is complete. - Releases all locks held by this session. - Archives the session context so future sessions can resume from it. - **Do not skip this.** Dangling locks block all other agents.
**LAST RESORT: FORCE-UNLOCK A FILE**: Break a stale lock held by a crashed agent. - **NEVER** use to skip coordination. Use only when a lock is >25 minutes old and the holding agent is clearly offline. - Requires you to provide a specific reason (`reason` parameter, e.g., 'Agent crashed 1 hour ago'). - This is a power tool — misuse will anger your teammates.
**READ THIS FIRST**: Load the project's core context — goals, architecture, conventions — so every agent understands the mission. - Returns the content of `.axis/instructions/context.md` and `.axis/instructions/conventions.md` in one call. - Call this as your **very first action** in every session. Non-negotiable. - If the soul files don't exist, the response includes guidance on creating them via `axis-init` or `update_project_soul`.
**READ THE SHARED NOTEPAD**: Fetch recent entries from the live notepad so you see what other agents did since your last read. - Returns the most recent N entries (typically last 10–50 lines). - Use this to stay aware of what teammates are doing without blocking them.
**BILLING CHECK**: Returns the user's subscription tier (Pro vs Free), Stripe customer ID, and current period end. - If no email is provided, returns the subscription status of the current API key owner. - Critical for gating features behind paywalls.
**API USAGE**: Returns token usage and request counts. - If no email is provided, returns usage for the current API key owner. - Useful for debugging rate limits or explaining quota usage to users.
**ATOMIC FILE WRITE WITH TAMPER CHECK**: Write to a file you hold a lock on, but verify it hasn't changed since the lock was granted. - Combines `verify_file_lock` + filesystem write into one atomic operation. - If the file has been tampered with, the write is rejected and you must re-lock before retrying. - Use this for critical writes (refactors, migrations) where partial/concurrent edits would be unsafe.
**INDEX THE REPO FOR SEARCH**: Walk the project, content-hash every file, and sync changed files into the searchable index so `search_codebase`/`deep_search` work and stay fresh. - Incremental: unchanged files are skipped (no re-embedding), deleted files are pruned. Safe and cheap to run often. - Run this once to set up search on a new project, and after large changes (e.g. a git pull) to refresh. Single-file edits are picked up by `index_file`. - Respects .gitignore and skips binaries/large files. Takes no arguments — it indexes the current project root.
**INDEX ONE FILE**: Add or refresh one file in the search index after you edit it. - Call this after creating or significantly changing a file so `search_codebase` picks up the new content. - Much faster than `index_codebase` for single-file updates; use it in the WORK loop.
**WHO'S ONLINE**: Return a roster of agents currently active or idle in this workspace. - Use this to coordinate before posting a job or proposing a contested lock. - Results include agent ID, last heartbeat, and status (active vs idle).
**LIST ALL JOBS**: Return every job on the board — posted, in-progress, completed. - Use this to synchronize with the board before deciding what to work on. - Results include job metadata: title, description, status, claimer, timestamps.
**INSPECT ACTIVE LOCKS**: Return current file locks, owners, intents, and timestamps. - Call before planning overlapping work or when a lock conflict needs coordination.
**POST WORK TO THE BOARD**: Create a tracked job so teammates and agents can see what you are doing and claim it or coordinate around it. - Jobs are lightweight — 50 chars title, 500 chars description max. They are coordination artifacts, not detailed specifications. - `title` and `description` are required. `priority` is optional ('high', 'medium', 'low'; default: 'medium'). - Jobs are stored durably in Postgres (if connected) or locally in `.axis-state.json`; once posted, they survive agent crashes and are visible to every agent in the team. - Use sparingly: post jobs for non-trivial work (2+ files, refactors, features). Skip for single-line typos or config tweaks.
**CRITICAL: REQUEST FILE LOCK** — call this before EVERY file edit, no exceptions. - Returns `GRANTED` if safe to proceed, `REQUIRES_ORCHESTRATION` if another agent holds the lock, or `REJECTED` if you tried to lock a directory. - **Lock individual files, not directories.** Directory locks block parallel work and are rejected. - Paths can be absolute or relative — they're normalized against the project root. - Required: `intent` (descriptive — 'Refactor auth to use JWT', NOT 'editing file') plus `filePath` or `filePaths`. `agentId` is optional (defaults to your session identity). - Editing several files? Pass `filePaths` to lock them in ONE call — all-or-nothing, so a partial batch never blocks others. - Locks expire after 30 minutes. Use `force_unlock` only as a last resort for crashed agents. - **Every lock MUST be released.** `complete_job` releases the locks for that job; `finalize_session` releases everything. Dangling locks block all other agents.
**READ THIS FIRST** to understand the project's architecture, coding conventions, and active state. - Returns the content of core context files like `context.md` (Project Goals), `conventions.md` (Style Guide), or `activity.md`. - Usage: Call with `filename='context.md'` effectively. - Note: If you need the *current* runtime state (active locks, jobs), use the distinct resource `mcp://context/current` instead.
**RELEASE YOUR LOCK**: Release one file lock as soon as you no longer need it. - Use this before a job is complete when another agent can safely continue on the file. - Only the owning agent can release the lock; use `force_unlock` only for a crashed agent.
**RELEASE A CLAIMED JOB**: Un-claim a job you hold so another agent can take it. - Use this when you cannot proceed (e.g., you are blocked by another agent) and want to let someone else pick it up. - The job remains on the board; another agent can claim it.
**CODE INTELLIGENCE SEARCH** — does what plain grep can't: returns ranked `file:line` hits PLUS `related` files that historically co-change with each hit, PLUS `definitions` of what the top result calls. - Use for 'where is X', 'how is Y done', anything before refactoring, and any time you need to know what code is structurally connected to a match (not just textually present). - Hybrid: semantic + full-text + trigram, reranked. Falls back to instant local search offline. - For pure literal-string lookups (a specific token or filename), grep is fine — this tool's edge is the related/definitions enrichment.
**DOCUMENTATION SEARCH**: Searches the official Axis documentation (if indexed). - Use this when you need info on *how* to use Axis features, not just codebase structure. - Falls back to local RAG search if the remote API is unavailable.
**REBIND THE LOCAL WORKSPACE**: Load a different project from `.axis/axis.json` so subsequent operations target the new project. - Use this when a single developer or agent is working across multiple repos and needs to switch context. - Not available on hosted servers (which resolve project per-request from call metadata). - Requires the project name as it appears in `.axis/axis.json`.
**APPEND OR OVERWRITE** any shared context file. - To update the project soul (context.md / conventions.md), prefer `update_project_soul` instead — it handles both files in one call. - Use this tool for other context files (e.g., `activity.md`) or when you need to append to a file. - For short-term updates (like 'I just fixed bug X'), use `update_shared_context` (Notepad) instead. - Supports `append: true` (default: false) to add to the end of a file.
**WRITE THE PROJECT SOUL**: Create or update `.axis/instructions/context.md` and `.axis/instructions/conventions.md` in one call. - Both files are optional; omit `context` or `conventions` to skip that file. - Use this tool when bootstrapping a new Axis setup or when the project goals/conventions change materially. - For day-to-day activity logs, use `update_context` with filename `activity.md` instead.
**WRITE TO THE SHARED NOTEPAD**: Append a line to the live notepad so teammates see what you just did, what you found, or what you need help with. - Short, frequent updates (one per significant decision or discovery). - For *persistent* records (goals, conventions), use `update_context` or `update_project_soul` instead. - Notepad is fast, always-on, and team-visible — use it for ambient awareness.
**TAMPER CHECK BEFORE WRITING**: Confirm a file you hold a lock on hasn't changed since the lock was granted. - Locks are advisory — another process can still edit the file. Call this right before overwriting to avoid clobbering concurrent changes. - Returns `OK` (unchanged), `CONFLICT` (modified/deleted — re
Error handling lacks actionable recovery guidance. Most tools provide no guidance on what to do when operations fail. E.g., verify_file_lock description cuts off mid-sentence ('returns `OK` (unchanged), `CONFLICT` (modified/deleted, re').
Parameter descriptions are inconsistent. Some optional parameters lack guidance on defaults or behavior when omitted. E.g., propose_file_access's 'agentId' says 'Optional, defaults to this session's unique identity' but never explains what the session identity is or how to specify one explicitly.
No pagination hints for list tools. list_jobs, list_agents, list_locks, get_shared_context do not indicate max result limits or pagination support. Large teams could exceed context window with unbounded list results.
Dependency ordering not documented. E.g., get_project_soul docs suggest calling it 'as your very first action' but no tool explicitly requires it as a prerequisite. LLMs may skip this critical context initialization step.
Inconsistent ID parameter naming. Some tools use filePath, others use jobId, agentId. search_codebase and search_docs use free-form 'query' strings. No enum constraints on priority values or status fields. LLMs lack guidance on valid formats.