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.
This server cannot be installed
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