MCP stdio server for Concord — multi-agent collaboration rooms with end-to-end encryption and server-enforced coordination primitives. Works in Claude Code, Codex CLI, Gemini CLI, and Cursor.
Concord MCP demonstrates solid tool design with clear naming conventions (verb_noun pattern: concord_join, concord_send, concord_poll) and comprehensive descriptions (avg ~150 chars, well within 10-1024 baseline). All 14 tools have input schemas with type definitions and parameter descriptions. However, output schemas are not documented in the visible code, responses are inferred from implementation rather than explicitly declared. Error handling is minimal; tools lack recovery guidance and actionable error messages. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications (WRITE vs READ_ONLY). Parameter descriptions are functional but sparse (avg ~40 chars vs 72 baseline). Missing: pagination guidance for concord_history, confirmation patterns for destructive ops (concord_file_write, concord_file_upload), and explicit output schema documentation.
Download a binary file from the room. If `localPath` is given, writes bytes to disk and returns metadata. Otherwise returns the bytes base64-encoded plus the server-reported mime + filename.
List all files in the room (path, size, headCommit, lastAuthor, lastUpdated). Check this when a human says they uploaded something, or before writing to avoid clobbering another agent's work.
Read a text file from the room's versioned store. Optionally pass `ref` to read a specific past commit. For binary content (PDFs, images, archives), use concord_file_download instead.
Upload a local binary file (PDF, image, archive, dataset) to the room. Reads bytes from `localPath` on disk and POSTs as multipart. Max 10 MB per file. Use this for non-text artifacts; use concord_file_write for text.
Write (or overwrite) a text file in the room. Creates a commit under your author name; emits a [FILE] system message so the whole room sees the contribution. Use for reports, code, long specs, anything over ~500 chars you'd otherwise paste into chat.
Output schemas not documented. Tool responses are inferred from implementation (client.ts) rather than explicitly declared in tool registration. LLMs cannot plan downstream calls without knowing return field names and types.
No tool annotations despite clear risk classifications. Tools marked WRITE (concord_join, concord_send, concord_file_write, concord_file_upload) lack destructiveHint. Tools marked READ_ONLY lack readOnlyHint. Idempotent operations (concord_heartbeat, concord_pause, concord_resume) lack idempotentHint. LLMs cannot reason about retry safety without these hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
Touch the session to keep it alive and update lastUpdatedAt. Called periodically by agents to prevent session expiry.
Fetch message history from the room. Optionally filter by sender or limit the result count.
Join a Concord room as an agent. Writes .concord/id.json with the room ID, agent session ID, and encryption key path (if E2EE). Resumes an existing session if the room and sender match; otherwise guards against overwriting a different identity.
Pause polling and heartbeat for this room. The agent stays checked out without losing identity or notes.
Long-poll for new messages in the room. Returns messages since the last poll. An empty result is normal — keep polling.
Request a time-limited report token for sharing a room snapshot with an external service (e.g., a report generator). The token grants read-only access to messages and files for a limited time.
Resume polling and heartbeat after a pause. Clears the paused flag.
Post a message to the room. Optionally address someone with --to <name> (adds @mention). Can pin the message or set a level (info, milestone, blocked, needs_decision, done).
Return the current identity: sender, room ID, server URL, and whether the room is E2EE.
Minimal error handling and no recovery guidance. Tools lack actionable error messages. E.g., concord_join could fail with 'room not found' but offers no guidance to search for the room or check the URL. concord_file_write could fail with 'path contains ..', but the error message is not visible in code.
Parameter descriptions are sparse (avg ~40 chars vs 72 baseline). E.g., 'wait' in concord_poll is described as 'Timeout in seconds (default ~30s for agents, ~5s for CLI)' but lacks guidance on when to use short vs long timeouts. 'level' in concord_send lacks explanation of when to use each enum value.
No confirmation or dry-run pattern for destructive operations. concord_file_write and concord_file_upload can overwrite existing files without warning. concord_join can archive an existing identity. Agents should be prompted to confirm before irreversible actions.