ai-coord-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ai-coord-mcpcreate a task to refactor the authentication module"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ai-coord-mcp
A shared coordination layer between multiple AI coding assistants — not an orchestrator.
This MCP server never launches, manages, or talks to any AI process. It only exposes a task queue, a per-task message thread, and progress reporting, all persisted as human-readable JSON on disk. Claude Code and OpenCode (or any other MCP-capable client) are launched manually, in separate terminals, and both point their MCP config at this server. Claude typically plays coordinator (creates/reviews tasks); OpenCode plays implementer (claims/updates/completes them) — but the server has no opinion about that, it just stores state.
Claude Code (Sonnet) OpenCode (DeepSeek/Qwen/etc.)
│ │
│ create_task, list_tasks, │ claim_task, update_progress,
│ approve_task, request_revision │ complete_task, post_message
▼ ▼
ai-coord-mcp (this server)
│
▼
.ai/coordination/*.json (on disk)Design
Transport: stdio. Each client spawns its own copy of this server as a subprocess. "The same server" means the same storage directory (
COORDINATION_DIR), not one process. Every tool call re-reads the relevant JSON file from disk before mutating it; writes go through temp-file-then-rename (writeJsonAtomic) so a reader never sees a half-written file; a cross-process mutex (withLock,src/storage/lock.ts) built onmkdirguards concurrent writers, with stale-lock reclaim after 10s and an ownership token per holder.IDs: sequential
task-0001,task-0002, … assigned under a short-lived lock. Validated against/^task-\d{4,}$/before being joined into any filesystem path.Optimistic concurrency: every task carries a
versioncounter. Passexpected_versionto any mutating tool to get aConflictErrorinstead of a silent overwrite.Not implemented: binary attachments (the
filesfield is path references only, not stored content), archiving (thearchive/directory exists but nothing writes to it), typedbranch/commitfields (use themetadataconvention below instead), structured Definition-of-Done /verify_command(useexpected_outputinstead), task relationships /parent_id/blocks(usetagsto group instead), MCP Resources /resources/subscribe(usewait_for_taskinstead).
Status model:
pending --claim_task--> claimed --update_progress--> in_progress
^ | |
| | both claimed and in_progress can complete_task--> completed
| | |
| └──────────────────────cancel_task─────────────────┐ approve_task│request_revision
| | | |
└───────────────reopen_task (from cancelled/completed/approved)◄────────────┘ ▼ ▼
approved revision_requested
(loops back through
update_progress →
in_progress again)update_progress auto-advances claimed or revision_requested to in_progress on its
first call in that cycle — there's no separate "start_task" tool.
Related MCP server: MCP Agent Mail
Storage layout
.ai/coordination/
tasks/task-0001.json one file per task (includes its own audit history[])
messages/task-0001.json array of {id, taskId, author, timestamp, content}
progress/task-0001.json latest snapshot + full history of updates
archive/ reserved, unused
.locks/ transient lock directories, safe to delete if emptyEverything is plain JSON — cat .ai/coordination/tasks/task-0001.json works fine while
the server is running.
Setup
cd ai-coord-mcp
pnpm install
pnpm run buildBoth Claude Code and OpenCode need to point at the same COORDINATION_DIR (an absolute
path) so they share state regardless of which directory each was launched from.
Claude Code — add to .mcp.json (project) or via claude mcp add:
{
"mcpServers": {
"ai-coord": {
"command": "node",
"args": ["/absolute/path/to/ai-coord-mcp/dist/index.js"],
"env": {
"COORDINATION_DIR": "/absolute/path/to/shared/.ai/coordination"
}
}
}
}OpenCode — add the equivalent entry to its MCP config (opencode.json /
~/.config/opencode/config.json, depending on your OpenCode version):
{
"mcp": {
"ai-coord": {
"type": "local",
"command": ["node", "/absolute/path/to/ai-coord-mcp/dist/index.js"],
"environment": {
"COORDINATION_DIR": "/absolute/path/to/shared/.ai/coordination"
}
}
}
}If COORDINATION_DIR is unset, the server defaults to <cwd>/.ai/coordination — only
safe if you know both clients will be launched from the same working directory.
Getting started
Build the server and wire up
COORDINATION_DIRfor both clients (Setup above).Launch Claude Code and OpenCode in separate terminals, both in the shared repo.
In Claude Code, create a task:
Create a task: title "Sort inventory list", description "Implement stable sort by SKU for the inventory panel, keep the existing filter hooks working", expected_output "inventory.ts updated, existing tests still pass, new test for empty list". → calls
create_task, returnstask-0001(statuspending).In OpenCode:
Check ai-coord for any pending tasks. → calls
claim_next_task, works the task, callsupdate_progressa few times, thencomplete_task.Back in Claude Code:
Review task-0001 and approve or request revision. → reviews the diff, calls
approve_taskorrequest_revision(the latter posts feedback to the thread; OpenCode reads it viaget_messagesand repeats fromupdate_progress).
Tools
Tool | Purpose |
| Create a task (status |
| List task summaries (no |
| Fetch one task by id, full record including |
| Substring search over title/description/tags, same summary shape as |
|
|
| Atomically claim the first eligible pending task (optionally by |
| Block (polling, lock-free) until a task's status changes or |
|
|
|
|
|
|
| any open status → |
|
|
| Append to a task's conversation thread |
| Read a task's thread, optionally only messages |
| Report |
| Latest progress snapshot + history |
All mutating tools accept an optional expected_version — pass the task's current
version to get a ConflictError instead of clobbering a concurrent change.
Every status-changing tool above (claim_task through reopen_task) returns the same
summary shape as list_tasks — no history[] — so an implementer with a small context
window (a local model, say) isn't handed the whole growing transition/note log back on
every call. Same for update_progress: it returns the current snapshot, not the growing
history[]. get_task/get_progress remain the only tools that return full history.
Workflow conventions
Waiting for work: use
wait_for_taskover pollingget_task/list_tasks— one call instead of N, blocks server-side without holding a lock, returnstimed_out: trueas a normal result.Picking up work: use
claim_next_taskoverlist_tasks({status:"pending"})+claim_task— same two steps, atomic, retries automatically if another claimer wins the race.Git state: no typed
branch/commitfield. Convention:create_task'smetadatacarries{ baseCommit, branch }; both agents read/write those same keys.expected_outputplus this README is the Definition-of-Done contract.Implementer loop:
claim_next_task(orclaim_taskon a specific id) → work → a fewupdate_progresscalls →complete_task. If revision is requested,get_messagesfor the feedback, then repeat fromupdate_progress.Coordinator loop:
create_task→wait_for_task(or check back later) → oncompleted, review the diff atworking_directory→approve_taskorrequest_revision.
Tests
pnpm testRuns node:test (via tsx) over every src/**/*.test.ts file: the storage layer
(atomic writes, cross-process lock semantics including the stale-lock/ownership-token
edge case, id generation, message/progress persistence) and the full tool surface
(state-machine transitions, TASK_ID schema rejecting malformed/traversal ids, version
conflicts) driven through the real registerXxx() functions against a fresh temp
COORDINATION_DIR per test file.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityAmaintenanceA coordination layer for coding agents that provides memorable identities, inbox/outbox messaging, searchable message history, and file lease management to prevent conflicts. Uses Git for human-auditable artifacts and SQLite for fast queries, enabling multiple agents to collaborate across projects without stepping on each other.2,079MIT
- Alicense-qualityDmaintenanceA coordination layer for coding agents that provides identities, message threading, and searchable history. It features file reservation leases to prevent agents from overwriting each other's work in multi-agent environments.1MIT
- Alicense-qualityDmaintenanceA lightweight coordination layer for multiple AI agents working on the same codebase, providing check-in and check-out tools via STDIO or Streamable HTTP.581Apache 2.0
- AlicenseAqualityAmaintenanceLocal-first shared memory and coordination layer for AI coding agents, with repository evidence, reservations, handoffs, code graph context, and dashboard review backed by PostgreSQL/pgvector.303Apache 2.0
Related MCP Connectors
Durable agent-to-agent handoffs and shared scratchpad for multi-agent workflows.
The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.
One shared brain for your AI coding agents: team memory, agent Q&A, tasks, and file claims.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/quochuy/ai-coord-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server