ACDP
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., "@ACDPlock src/main.js for editing"
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.
MCP working video
https://drive.google.com/drive/folders/17vlptaYTBIrzcn-OJqejMzYxloS3vuNl?usp=drive_link
Related MCP server: agent-comm
Presentation video, how it works
https://github.com/user-attachments/assets/70b13320-ca29-4215-bd8e-067562017126
ACDP — Agent Coordination Protocol for Development
ACDP is an open protocol that lets multiple AI agents (and humans) work on the same codebase simultaneously without conflicts. It provides real-time file locking, commit approval, and agent awareness through a lightweight WebSocket server — independent of any version control system or file storage backend.
The Problem
When multiple AI agents work on the same project ("vibecoding"), things break fast:
Conflicts everywhere — Two agents edit the same file, one overwrites the other
No awareness — Agent A doesn't know Agent B is modifying a shared dependency
No coordination — There's no way to say "I'm working on this, don't touch it"
Slow feedback — File-based coordination requires save+sync cycles just to check lock status
Lost work — Without locks, agents silently overwrite each other's changes
Traditional version control was designed for incremental human collaboration. There is no standard for real-time coordination between parallel autonomous agents — regardless of where the code is stored.
How ACDP Solves It
ACDP is a standalone coordination layer. It doesn't depend on Git, GitHub, or any specific file storage — it works with any project, anywhere.
The core idea: One machine runs a WebSocket server that holds the coordination state (locks, connected agents, pending approvals) in memory. Every agent connects to this server via an MCP (Model Context Protocol) interface and coordinates in real-time. The protocol only manages who can modify what and when — how you store or version your code is entirely up to you.
Agent wants to edit app.js
│
▼
check_locks() ──→ "app.js is free"
│
▼
lock_files(["app.js"]) ──→ All agents notified: "app.js locked by Agent A"
│
▼
Agent works locally (only on locked files)
│
▼
request_commit(["app.js"]) ──→ Auto-approved (agent holds the lock)
│
▼
Agent commits changes (Git, save, deploy — whatever your workflow is)
│
▼
notify_sync(["app.js"]) ──→ All agents notified: "sync, app.js changed"
Lock auto-releasedKey properties:
Real-time — Locks and notifications are instant via WebSocket, not dependent on sync cycles
Agent-aware — Every agent sees who's connected and what they're working on
Approval built-in — Configurable auto-approve or manual approval for critical paths
Storage-agnostic — Works with Git, local filesystems, cloud storage, or any other backend
Architecture
Why WebSocket + MCP?
We evaluated three approaches:
Approach | Pros | Cons |
File-based (coordination files in repo) | No extra infrastructure | Slow (save+sync per lock), polling required, conflicts on coordination files |
HTTP API | Simple REST calls | No real-time updates, agents must poll |
WebSocket + MCP | Real-time, instant notifications, zero config for agents | Requires one machine to host the server |
We chose WebSocket + MCP because coordination must be real-time. When Agent A locks a file, Agent B needs to know now, not after the next sync. And because the coordination layer is a standalone WebSocket server, it works regardless of how the project stores its files.
MCP (Model Context Protocol) is the standard interface for AI agents to use external tools. By wrapping the WebSocket client in an MCP server, any AI agent that supports MCP (Claude, GPT, Gemini, etc.) gets coordination tools automatically.
System Design
Owner Machine (or any machine)
┌───────────────────────────────┐
│ acdp-socket-server │
│ WebSocket on ws://:3100 │
│ │
│ ┌─────────────────────┐ │
│ │ State (in memory) │ │
│ │ - Active locks │ │
│ │ - Connected agents │ │
│ │ - Pending commits │ │
│ └─────────────────────┘ │
│ │
│ Approval Engine │
│ Audit Log (JSONL) │
└───────────┬───────────────────┘
│ WebSocket
┌─────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│Machine A│ │Machine B│ │Machine C│
│ │ │ │ │ │
│ Claude │ │ GPT │ │ Human + │
│ + MCP │ │ + MCP │ │ Claude │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└───────────┼───────────┘
│
▼
Project Files
(Git, local, cloud, etc.)Three components, one npm package:
Component | Role |
| WebSocket server — holds locks, agents, and approvals in memory. Runs on one machine. |
| Client library — connects to the server, handles reconnection with exponential backoff. |
| MCP server — wraps the client into tools that AI agents can call. Runs on every agent's machine. |
Why In-Memory State?
The coordination state (locks, connected agents) lives only in memory. If the server dies, all locks die with it. This is intentional:
Clean restart — No stale locks from crashed agents
Simplicity — No database, no persistence layer, no migration scripts
Speed — Everything is a memory read/write, no I/O
Correctness — A lock from a dead server is meaningless anyway
The only things persisted are config.json (server infrastructure: port, token, timeouts), acdp/governance.json (policy: owner, sub-owner, approval rules), and an optional append-only JSONL audit log for debugging.
Installation
Requirements: Node.js >= 18
Option A: Global (recommended — works in every project)
Important: Do NOT use
claude mcp addCLI commands — there are known bugs with flag parsing that causeunknown optionerrors. Edit the config file directly instead.
Mac / Linux — edit ~/.claude.json and add the acdp entry inside mcpServers:
{
"mcpServers": {
"acdp": {
"command": "npx",
"args": ["-y", "-p", "acdp-mcp-server", "acdp-mcp"],
"env": {
"ACDP_AGENT_ID": "claude-agent"
}
}
}
}If the file already has other keys, just add the
"acdp": { ... }block inside the existing"mcpServers"object.
Windows — first install the package globally:
npm install -g acdp-mcp-serverThen edit the config file. The location depends on your Claude Code version — check which one exists on your machine:
Option 1: ~/.claude/.claude.json (wrapped format, same as Mac):
{
"mcpServers": {
"acdp": {
"command": "node",
"args": ["C:\\Users\\YOUR_USER\\AppData\\Roaming\\npm\\node_modules\\acdp-mcp-server\\bin\\acdp-mcp.js"],
"env": {
"ACDP_AGENT_ID": "claude-agent"
}
}
}
}Option 2: ~/.claude/mcp/acdp.json (flat format, no mcpServers wrapper):
{
"command": "node",
"args": ["C:\\Users\\YOUR_USER\\AppData\\Roaming\\npm\\node_modules\\acdp-mcp-server\\bin\\acdp-mcp.js"],
"env": {
"ACDP_AGENT_ID": "claude-agent"
}
}Replace YOUR_USER with your Windows username. To find the exact path, run: where acdp-mcp or npm root -g.
Note: On Windows, use
nodedirectly instead ofnpxorcmd /c— they don't propagate stdio correctly to the MCP process. If you're unsure which config location to use, check if~/.claude/.claude.jsonalready exists — if it does, add your MCP there. Otherwise, create~/.claude/mcp/acdp.json.
After editing, restart Claude Code. ACDP tools will be available in every project.
Option B: Per-project
Create .mcp.json in the project root:
Mac / Linux:
{
"mcpServers": {
"acdp": {
"command": "npx",
"args": ["-y", "-p", "acdp-mcp-server", "acdp-mcp"],
"env": {
"ACDP_AGENT_ID": "claude-agent"
}
}
}
}Windows (install globally first with npm install -g acdp-mcp-server):
{
"mcpServers": {
"acdp": {
"command": "node",
"args": ["C:\\Users\\YOUR_USER\\AppData\\Roaming\\npm\\node_modules\\acdp-mcp-server\\bin\\acdp-mcp.js"],
"env": {
"ACDP_AGENT_ID": "claude-agent"
}
}
}
}Commit it to your project — every collaborator gets ACDP automatically. Restart Claude Code to load the MCP.
What Happens on First Run
When the MCP server starts, it:
Checks if a socket server is already running on port 3100
If not, auto-generates
config.jsonwith a random secure token and your machine as ownerStarts the socket server as a detached background process
Connects and registers the agent
Zero configuration required. No manual server setup, no token sharing for local use.
Usage
Available Tools
Once installed, your AI agent has these tools:
Tool | Description |
| List all active file locks — who locked what, when it expires |
| Lock files before modifying them. Fails if already locked by another agent |
| Release your locks when done or when you change plans |
| Request permission to commit. Auto-approved if you hold the lock |
| After committing: notify all agents to sync, auto-releases your locks |
| See who's connected — agent IDs, machines, roles |
| Switch to a remote server (asks for IP + token) |
| Check which server you're currently connected to |
Single Developer Workflow
You (with Claude) working on a project:
1. Start Claude Code → MCP auto-starts the socket server
2. Claude calls check_locks → all clear
3. Claude calls lock_files(["src/api.js"]) → locked
4. Claude edits src/api.js
5. Claude calls request_commit → approved (holds the lock)
6. Claude commits the changes
7. Claude calls notify_sync → lock releasedEven solo, ACDP is useful: it gives your agent a structured workflow and prevents accidental concurrent edits across multiple Claude sessions.
Multi-Agent Workflow (Same Machine)
Terminal 1: Claude with ACDP_AGENT_ID=agent-frontend
Terminal 2: Claude with ACDP_AGENT_ID=agent-backend
Agent Frontend:
lock_files(["src/components/Header.jsx"]) → locked
(works on Header)
Agent Backend:
lock_files(["src/api/routes.js"]) → locked
lock_files(["src/components/Header.jsx"]) → FAILS (locked by agent-frontend)
(works on routes instead)
Agent Frontend:
notify_sync(["src/components/Header.jsx"]) → lock released, backend notified
Agent Backend:
(receives notification: Header.jsx changed, sync)
lock_files(["src/components/Header.jsx"]) → now succeedsLive Dashboard
ACDP ships with a built-in real-time dashboard served on the same port as the WebSocket server. Open it in any browser to watch agents, locks, and commits as they happen.

Open the dashboard
With the server running (auto-started by the MCP server or npm run start:server):
http://localhost:3100/dashboardYou'll be prompted for the server token — the same one in acdp-socket-server/config.json. The token is saved in sessionStorage so you only enter it once per browser session.
What you see
Agent Network — force-directed graph of connected agents. Owners glow magenta, agents glow cyan, and agents currently holding locks pulse amber.
Activity Stream — live terminal-style event log. Every lock, release, commit, connection, and disconnection streams in color-coded in real time.
Active Locks — countdown cards for every active lock with a visual TTL bar, holder ID, machine, and optional reason.
Pending Commits — inbox-style view of commits awaiting owner approval.
HUD — uptime, project name, owner, live agent/lock/pending counts, and connection status.
Endpoints
Path | Purpose |
| Serves the dashboard HTML |
| JSON snapshot (agents, locks, commits, metrics, uptime) |
| Liveness check — uptime, connected dashboard clients |
| Live state feed: |
Remote access
To watch a remote server's dashboard, tunnel the port (or put a TLS reverse proxy in front of it) and open https://your-domain/dashboard on your machine. The WebSocket upgrades to wss:// automatically when the page is served over HTTPS.
Working with Co-Workers (Multi-Machine Setup)
This is where ACDP shines. Multiple developers, each running their own AI agents, coordinating in real-time.
Step 1: Owner Starts the Server
The first developer's machine becomes the owner. This happens automatically on first MCP run, but for a team setup you'll want to configure it explicitly:
# On the owner's machine, in the project directory:
npx -y acdp-mcp-server # This auto-generates config.jsonCheck the generated acdp-socket-server/config.json (infrastructure only):
{
"port": 3100,
"token": "a1b2c3d4e5f6...",
"manual_approval_paths": [],
"default_ttl_minutes": 15,
"pending_commit_timeout_minutes": 10
}The owner is defined in acdp/governance.json (policy), not in config.json:
{
"project": {
"name": "my-project",
"owner": "maxi-macbook",
"sub_owner": null
}
}If
acdp/governance.jsondoesn't exist, the owner defaults to the machine's hostname.
Share two things with your co-workers:
Your machine's IP address on the local network (e.g.,
192.168.1.10)The
tokenfromconfig.json
Step 2: Co-Workers Connect
Each co-worker edits their Claude Code config file (do NOT use claude mcp add — it has known bugs), pointing to the owner's machine:
Mac / Linux — add to ~/.claude.json:
{
"mcpServers": {
"acdp": {
"command": "npx",
"args": ["-y", "-p", "acdp-mcp-server", "acdp-mcp"],
"env": {
"ACDP_AGENT_ID": "juan-agent",
"ACDP_SOCKET_URL": "ws://192.168.1.10:3100",
"ACDP_TOKEN": "a1b2c3d4e5f6..."
}
}
}
}Windows — add to ~/.claude/.claude.json or ~/.claude/mcp/acdp.json (see Installation for details on which file to use):
{
"command": "node",
"args": ["C:\\Users\\YOUR_USER\\AppData\\Roaming\\npm\\node_modules\\acdp-mcp-server\\bin\\acdp-mcp.js"],
"env": {
"ACDP_AGENT_ID": "juan-agent",
"ACDP_SOCKET_URL": "ws://192.168.1.10:3100",
"ACDP_TOKEN": "a1b2c3d4e5f6..."
}
}Or, if they already have the MCP running locally, their agent can use connect_remote at any time:
Agent: connect_remote(url: "ws://192.168.1.10:3100", token: "a1b2c3d4e5f6...")
→ "Connected to remote server. All tools now operate against that server."Step 3: Everyone Works
Maxi's machine (owner): Juan's machine:
Claude locks src/auth.js Claude locks src/dashboard.js
Claude works on auth Claude works on dashboard
Claude commits & notifies → Juan's Claude: "auth.js changed, sync"
Juan's Claude syncs, continues working
Claude commits & notifies
Maxi's Claude: "dashboard.js changed, sync"Configuration Options
Sub-Owner (Failover)
If the owner's machine goes down, a sub-owner can take over. Set it in acdp/governance.json:
{
"project": {
"name": "my-project",
"owner": "maxi-macbook",
"sub_owner": "juan-desktop"
}
}The sub-owner starts the server on their machine. Agents reconnect automatically (built-in exponential backoff).
Manual Approval for Critical Paths
Some files are too important for auto-approve:
{
"manual_approval_paths": [
"src/core/**",
"config/**",
"*.config.js"
]
}When an agent calls request_commit for these files, the request goes to PENDING. The owner or sub-owner must approve it manually via the socket.
Agent Identity
Each agent should have a unique ACDP_AGENT_ID. Good patterns:
ACDP_AGENT_ID=maxi-claude # Developer name + tool
ACDP_AGENT_ID=frontend-agent # Role-based
ACDP_AGENT_ID=claude-pr-review # Task-basedCommit Approval Flow
Agent calls request_commit(files, summary)
│
▼
Does agent hold locks for ALL files?
│
No → REJECTED ("You don't hold locks for: file.js")
│
Yes
│
▼
Do any files match manual_approval_paths?
│
No → AUTO-APPROVED (agent can commit immediately)
│
Yes → PENDING (owner/sub-owner must approve)
│
├──→ Owner approves → APPROVED
├──→ Owner rejects → REJECTED (with reason)
└──→ Timeout (10 min default) → AUTO-REJECTEDProtocol Files
ACDP also includes protocol files that live in your repository (under acdp/). These are documentation and governance, not runtime state:
File | Purpose |
| The full coordination rules — agents read this to understand how to behave |
| Module map, ownership, restricted areas |
| Authority rules: who can override locks, approve agents, modify the protocol |
| Registered agent identities |
| Current agent roster with status |
| Human-readable project state snapshot |
| Prompt to give an AI agent to initialize ACDP in a new project |
| Prompt to give an AI agent to join an existing ACDP project |
Quick Start Prompts
Initialize a New Project
Copy the prompt from acdp/prompts/init-project.md and paste it to your AI agent. It will:
Configure the MCP connection
Register as the first agent
Define the project architecture
Set governance rules
Start working
Add an Agent to an Existing Project
Copy the prompt from acdp/prompts/join-project.md. The agent will:
Configure the MCP connection
Read the protocol and current state
Register itself
Check locks and start contributing
Security
Token-based auth — Every connection requires a shared token. Without it, the server rejects the connection.
Role-based permissions — Only the owner and sub-owner can approve/reject commits for manual approval paths.
No external exposure by default — The server listens on
0.0.0.0:3100, intended for local network use. For internet exposure, use a reverse proxy with TLS.Locks are agent-scoped — You can only release your own locks. The owner can override any lock.
Philosophy
Simplicity over complexity — One npm package, one command, zero config
Coordination over control — ACDP coordinates, it doesn't dictate
Real-time over polling — WebSocket, not commit-and-check
Ephemeral over persistent — Locks die with the server, no stale state
Storage-agnostic — The coordination layer is independent of how you store or version your code
Project Status
Version: 0.5.3
ACDP is in active development. See CHANGELOG.md for release notes.
npm: acdp-mcp-server
Contributing
Contributions are welcome. The goal is to iterate the protocol based on real-world multi-agent usage.
See CONTRIBUTING.md for guidelines.
Author
Gabriel Urrutia — @gabogabucho
License
Available Tools
9 toolscheck_locksA
List all active file locks. Shows which files are locked, by whom, and when they expire.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. The verb 'List' clearly implies a non-destructive read operation, and the description details the output content (which files, by whom, when they expire). This is sufficient for a 0-parameter read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant information. The first sentence conveys the primary action, and the second provides complementary details. All words are purposeful and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 0-parameter list tool with no output schema, the description adequately covers what the tool does and what it returns (fields: files, lock holder, expiration). It lacks any mention of prerequisites or edge cases, but given the low complexity, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is effectively 100% (empty properties). According to the rubric, 0 parameters warrants a baseline of 4. The description adds no parameter semantics, but none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('List') and resource ('all active file locks'). It also specifies what information is shown (locked files, by whom, expiration), which distinguishes it from siblings like lock_files and release_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (when you want to see file locks) but does not explicitly mention alternatives or exclusions. No reference to sibling tools like lock_files or release_files, so the when-to-use guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_statusA
Check which coordination server you are currently connected to.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly indicates a read-only status check, but it does not disclose behavior when not connected, potential errors, or return format specifics. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence conveys the entire purpose with no wasted words. It is highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple no-parameter status tool, the description sufficiently covers the core behavior. However, the lack of an output schema means the return value is not specified, leaving a minor gap for an agent needing to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, making schema coverage trivially 100%. The description need not describe parameters, and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Check' and identifies the resource ('coordination server you are currently connected to'), making its purpose clear and distinguishing it from the sibling tool 'connect_remote' which establishes a connection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives. The purpose implies it is for checking current connection status, but it does not state exclusions or mention related tools like 'connect_remote'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_remoteA
Connect to a remote ACDP coordination server on another machine. Use this when you need to coordinate with agents running on a different computer. You will need the server IP/hostname and the secret token (found in acdp-socket-server/config.json on the remote machine). ASK THE USER for these values if you do not have them.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | WebSocket URL of the remote server (e.g., ws://192.168.1.10:3100) | |
| token | Yes | Secret token for authentication (from the remote server config) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds useful behavioral guidance by pointing to the token's location and instructing the agent to ask the user for missing values, but it does not describe post-connection behavior, failure handling, or whether the connection persists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences each serve a purpose: stating the action, providing usage context, and instructing the agent on obtaining required values. No wasted or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter connect tool, the description covers purpose, usage context, parameter sourcing, and user interaction. Missing details about connection lifecycle or failure modes are acceptable given the simplicity, but there is some room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes both parameters (100% coverage), but the description adds extra meaning by detailing where the token is found (acdp-socket-server/config.json) and reinforcing the user-instruction aspect, which goes beyond the basic schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Connect') and the resource ('remote ACDP coordination server'), and differentiates from siblings like start_local and connection_status by specifying cross-machine coordination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this when you need to coordinate with agents running on a different computer,' providing clear context for when to use it. It does not explicitly name alternative tools or exclusions, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agentsA
List all agents registered on the coordination server and their connection status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses the main behavior (listing agents and their status) but does not add context such as read-only nature, potential network dependencies, or response format. The word 'List' implies a read operation, but there is no explicit mention of safety or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the action and the key information returned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and lack of output schema, the description sufficiently explains what the tool returns: all agents and their connection status. It does not explicitly describe the data structure, but for a list operation this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema coverage is 100%, so the baseline is 4. The description adds no parameter details because none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (List) and the resource (all agents registered on the coordination server), plus the additional detail of connection status. This distinguishes it from siblings like connection_status, which likely focuses on current server connection rather than all agents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when you need an overview of agents and their status), but it does not provide explicit guidance on alternatives or exclusions. It does not mention that connection_status might be used for a single connection check, so usage context is inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lock_filesA
Lock files before modifying them. Other agents will see these files as unavailable. Fails if any file is already locked by another agent.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Array of file paths to lock | |
| reason | No | Why you need these files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that other agents see files as unavailable and that the operation fails if any file is already locked. This provides meaningful behavioral context, though it omits details like lock duration or release mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the action and result. Every word earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward locking tool, the description covers the core purpose, effect on other agents, and failure mode. It doesn't need to explain return values (no output schema), and the sibling tools imply the broader workflow. Slight gaps like lock persistence are acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes both parameters (files and reason) with 100% coverage, so the description doesn't need to add parameter details. It does implicitly tie the 'files' parameter to the locking behavior, but adds no extra semantic enrichment beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool locks files before modification, with a specific verb and resource. It also distinguishes itself by noting the effect on other agents and the failure condition when files are already locked, setting it apart from siblings like release_files and check_locks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use the tool ('before modifying them'), providing clear context. It doesn't explicitly contrast with alternatives like check_locks or release_files, but the usage timing is clear, so only a slight gap in exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notify_syncA
After committing changes, notify all other agents that these files have been updated. They will know to sync. This also auto-releases your locks on these files.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Array of file paths that were changed | |
| message | No | Description of what changed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the broadcast effect (all other agents notified), the synchronization trigger, and a critical side effect (auto-releasing locks). It does not mention failure modes or prerequisites beyond committing, but the key behaviors are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, 37 words, with the primary action stated first and the side effect in the second. Every sentence earns its place with no filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema and no annotations, the description covers the core behavior (notification) and a key side effect (lock release). It lacks explicit discussion of the optional 'message' parameter, but the schema covers that, and the prerequisite is mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds no additional details about the 'files' or 'message' parameters. It only refers to 'these files' implicitly, so it relies entirely on the schema for parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool notifies other agents about updated files after committing and distinguishes it from siblings by noting it also auto-releases locks. The verb 'notify' and resource 'other agents' make the purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear temporal context ('After committing changes') and explains the effect on other agents. However, it does not explicitly name alternatives like release_files or state when not to use this tool, so it lacks explicit exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_filesA
Release your locks on files. Use this when you no longer need exclusive access.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Array of file paths to release |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the operation releases the caller's own locks ("your locks") and is tied to the concept of exclusive access, but it does not mention error behavior, idempotency, or side effects. This is minimal but present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler, front-loading the core action and following with a usage condition. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one fully-described parameter, no output schema, and no annotations, the description adequately covers purpose and usage. It does not address return values or failure modes, but given the simplicity and lack of complex behavior, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the only parameter (files) as "Array of file paths to release", and the description's phrase "your locks on files" aligns with this. The description adds no additional meaning beyond the schema, so it earns the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action with a specific verb ('release') and resource ('your locks on files'), which directly distinguishes it from sibling tools like lock_files and check_locks. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when you no longer need exclusive access" provides a clear condition for when to invoke the tool. It implies the alternative (lock_files) is for when exclusive access is still needed, though it does not explicitly name alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_commitA
Request permission to commit changes to files. Auto-approved if you hold the lock and the files are not in a manual-approval path. Otherwise waits for owner approval.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Array of file paths you are committing | |
| summary | No | Short description of changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the approval workflow (auto vs manual) and the dependency on holding a lock, which is valuable. It does not mention failure modes or response format, but core behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the main purpose front-loaded and the second sentence elaborating approval conditions. No wasted words or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with only 2 parameters and no output schema. The description covers the core approval workflow but does not explain what happens after approval or rejection, nor any timeouts or response format. This is adequate for a basic request tool but leaves some ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage of both parameters with descriptions for 'files' and 'summary'. The description adds no additional parameter semantics beyond what the schema already states, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Request permission to commit changes to files.' This is a specific verb+resource pairing that is distinct from sibling tools like lock_files and release_files, which deal with locking and releasing rather than committing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when the tool is used by explaining the auto-approval condition (holding the lock and non-manual path) versus waiting for owner approval. However, it does not explicitly mention alternative tools for different workflows, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_localA
Start a local ACDP coordination server on this machine. You become the owner. Other agents can connect to your server using your IP and the generated token. Use this when YOU are hosting the coordination.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses key behaviors: becoming the owner and generating a token that others use to connect via IP. However, it omits lifecycle details such as whether the server runs in the background, how to stop it, or what the output (e.g., token and IP) looks like. This is moderately transparent but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary action ('Start a local ACDP coordination server'). Every sentence adds value: what it does, who becomes owner, how others connect, and when to use it. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description explains the core behavior but does not clarify how the IP/token are returned (via output, logs, etc.) or whether the process blocks. This leaves post-invocation expectations vague, which is a significant gap for a state-changing server-start tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, and the description adds no parameter-specific details, which is appropriate. With no parameters to document, the baseline of 4 is warranted. The description does not need to compensate for missing schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Start a local ACDP coordination server.' It clearly differentiates from siblings like connect_remote by stating 'You become the owner' and that other agents connect to you. This is not a tautology and uniquely identifies the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides a usage condition: 'Use this when YOU are hosting the coordination.' This is clear context, though it does not explicitly name the alternative (e.g., connect_remote) or include a when-not-to-use clause. The condition is sufficient to guide the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v0.7.0- First observed
check_locks - First observed
connect_remote - First observed
connection_status - First observed
list_agents - First observed
lock_files - First observed
notify_sync - First observed
release_files - First observed
request_commit - First observed
start_local
TDQS
Each tool targets a distinct action: locking, unlocking, checking locks, requesting commits, notifying sync, listing agents, starting/connecting to servers, and checking connection status. No two tools have overlapping purposes.
Most tools follow a verb_noun pattern (e.g., lock_files, release_files, list_agents, request_commit). Minor deviations like connection_status (noun_noun) and start_local/connect_remote (verb_adjective) break the pattern slightly, but the naming remains readable and predictable.
With 9 tools, the set is well-scoped for a coordination server. Each tool serves a clear purpose without redundancy, fitting comfortably within the ideal 3-15 range.
The tool set covers the core workflow: file locking (lock_files, release_files, check_locks), commit request and notification (request_commit, notify_sync), and agent/connection management (list_agents, start_local, connect_remote, connection_status). Minor gaps exist, such as no explicit approve_commit or disconnect tool, but these are likely handled outside the tool surface.
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 Connectors
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA Redis-backed MCP server that enables multiple AI agents to communicate, coordinate, and collaborate while working on parallel development tasks, preventing conflicts in shared codebases.20MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables AI coding agents to communicate, share state, and coordinate work in real time via MCP tools or REST API.1595MIT
- AlicenseNot gradedqualityDmaintenanceA local MCP server that provides shared, real-time context across multiple AI agents via WebSocket and MCP resource notifications, enabling collaborative workspaces, memory, tasks, and messaging.151MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for coordinating multiple AI agents across developers and vendors with a shared job board, per-file locking, and live project context.5AGPL 3.0
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/gabogabucho/ACDP-PCAD'
If you have feedback or need assistance with the MCP directory API, please join our Discord server