skill
m-AI-l
Asynchronous messaging between Claude threads — built entirely in Markdown.
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/playtosor/m_AI_l itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 27, 2026m_AI_l
Asynchronous inter-agent messaging for AI coding agents. A pnpm monorepo with a
TypeScript core (@m_ai_l/core) and an MCP server (@m_ai_l/mcp) that lets any
MCP-capable harness read, send, cancel, and edit project mailbox messages.
Why
Agents working in parallel need a durable, conflict-safe channel to exchange briefs, decisions, and handover notes. m_AI_l stores messages as plain Markdown mailboxes — inspectable with any editor — and exposes the operations through MCP tools so agents never parse files manually.
Key properties:
- File-based mailboxes (
mailbox_HANDLE.md) with atomic writes and light locking - Roster-driven routing: a project's
roster.mdis the authority for messaging paths - Canonical project registry:
[COMMON_PATH]/projects_config.md - Read archives by default;
no_archiveorlimitto opt out / read less read_recent_archiverecovers messages when a client crashed after server-side archiving
Installation
Requirements: Node.js >= 18, pnpm >= 9.
pnpm install
pnpm -r build # compiles packages/core and packages/mcp
pnpm -r test # 361 tests / 46 suites
Consumers:
- As an npm package:
@m_ai_l/core(library) and@m_ai_l/mcp(server with bundleddist/server.bundle.jsand am-ai-l-mcpbin). - As an OpenCode plugin:
tools/mailbox.tsloads@m_ai_l/coreviaMAILBOX_LIBRARY_PATH(defaults topackages/core/dist/index.js).
Quickstart
Configure the project registry path, then point an MCP client at the server:
# Defaults: C:\dev\common (COMMON_PATH), C:\dev\m_AI_l_EXPORT (PROJECT_ROOT)
set COMMON_PATH=C:\dev\common
node packages/mcp/dist/server.js
Client configuration (local MCP server, stdio):
{
"mcp": {
"m_AI_l_MCP": {
"type": "local",
"command": ["node", "<repo>/Vibe/mcp_server/packages/mcp/dist/server.js"],
"environment": { "COMMON_PATH": "C:/dev/common" }
}
}
}
Read the inbox of a handle in a project:
mailbox({ action: "mail", project_handle: "MAILEXPORT", handle: "AGENT1" })
Concepts
| Concept | Rule |
|---|---|
| Message format | HANDLE // YYYYMMDD-HHMM // PRIORITY // SUBJECT // Body |
| Priority | H, M, or L |
| Sentinel | <!-- END --> marks the mailbox boundary; rewritten to (((END))) inside content |
| Source of truth | [COMMON_PATH]/projects_config.md lists projects, paths, rosters |
| Roster | <project>/roster.md maps handles to mailbox/outbox files; inactive entries reject sends |
| HUMAN | Global mailbox resolved next to projects_config.md under COMMON_PATH |
| Cross-project mailboxes | Roster entries may declare absolute paths in other projects |
| Locking | X.lock beside the target file; locks older than 10 minutes expire |
| Atomic writes | Temp file in tmp/, then rename — crash leaves old or new complete state |
| Outbox | Best-effort: delivery to the recipient inbox wins; a failed outbox trace never cancels a send |
| Tolerant reads | Imperfect timestamp or missing priority does not block reading; multi-line bodies stay one message |
API Core (@m_ai_l/core)
Main exports from dist/index.js:
| Function | Purpose |
|---|---|
readMail(project, handle, opts?) | Read (and by default archive) inbox messages; limit, noArchive options |
writeMail(project, sender, recipient, priority, subject, body, opts?) | Deliver a message + outbox trace |
editMail(project, sender, recipient, timestamp, subject, patch?) | Edit unread in place, else send CORRECTION: message |
cancelMail(project, sender, recipient, timestamp, subject) | Remove an unread message |
archiveMail(project, handle) | Archive a mailbox and reset to sentinel |
initMail(project, handle, role, mailbox?, status?) | Create messaging files + roster entry |
getProjects / getRoster / getOutbox | Registry, roster, outbox readers |
getMemberContext(project, handle) | Resolved paths + member context |
resolveHandleCandidates(target, current?, cwd?) | current project -> COMMON -> all active projects |
readRecentArchive(handle, limit?, current?, cwd?) | Recovery after crash-interrupted reads |
handoverSelf(project, handle, body, sender?) | Standardized self-handover note |
mailboxWithLib(lib, input) | Inbox entry used by the OpenCode plugin |
Business errors: ProjectNotFoundError, RosterEntryNotFoundError,
RosterEntryInactiveError, RosterEntryExistsError, MailboxNotFoundError,
FileOperationError, InvalidMessageFormatError.
API MCP (@m_ai_l/mcp)
The MCP server registers 13 tools. All are technically callable by any MCP client.
However, we recommend harnesses restrict autonomous agent access to the 5 message
lifecycle tools (read_mail, write_mail, edit_mail, cancel_mail, archive_mail).
The remaining 8 tools (get_projects, get_roster, resolve_handle_candidates,
get_member_context, init_mail, handover_self, read_recent_archive, get_outbox)
are intended for CLI or administrative setup, not for autonomous agent use.
| Tool | Input (required, optional...) | Purpose note |
|---|---|---|
read_mail | project_handle, handle, limit?, no_archive? | Read (and archive) inbox messages |
write_mail | project_handle, sender, recipient, priority, subject, body, sender_project_handle? | Deliver a message + outbox trace |
edit_mail | project_handle, sender, recipient, timestamp, subject, new_priority?, new_subject?, new_body? | Edit unread in place, else send CORRECTION: |
cancel_mail | project_handle, sender, recipient, timestamp, subject | Remove an unread message |
archive_mail | project_handle, handle | Maintenance: archives the entire mailbox and resets to sentinel (not a per-message action) |
read_recent_archive | handle, limit?, current_project_handle?, cwd? | Recovery after crash-interrupted reads |
get_projects | none | List all active projects |
get_roster | project_handle | List handles of a project |
get_member_context | project_handle, handle | Resolved paths + member context |
resolve_handle_candidates | target_handle, current_project_handle?, cwd? | current project -> COMMON -> all active projects |
init_mail | project_handle, handle, role, mailbox?, status? | Create messaging files + roster entry |
handover_self | project_handle, handle, body, sender? | Standardized self-handover note |
get_outbox | project_handle, handle | Read outbox (read-only, write path is frozen) |
write_mail with sender_project_handle different from project_handle signs
the sender as ORIGIN/HANDLE for cross-project delivery. Cancel and edit only
match unread messages in the recipient's active mailbox; multiple matches are a
conflict error.
Skills
skills/messaging/ ships instruction files (mailbox_read.md,
mailbox_write.md) for harnesses without MCP support, with a filesystem
fallback.
When MCP is available, prefer the tools — the skills cost more tokens per
message. See skills/README.md.
License
Apache-2.0