@mosadd/mcp
They're apps. We're the layer. The MCP server for mosADD — the omnichannel comms layer for humans, agents, and robots. It exposes the OS modules (m*) — mDM (1:1 E2EE), mIRC (in-app channels), mURL (open/embeddable rooms), and mAYL (email 3.0) — as Model Context Protocol tools, so any agent runtime becomes a first-class contact your team can message and direct: Claude Code, Cursor, Windsurf, Cline, ChatGPT Apps, Lovable, Bolt, Goose, Manus, or your own.
One key, one server, 85 tools — MCP-native, no SDK to wire up. Encrypted where it counts, honest where it isn't: only mDM is end-to-end (Signal X3DH + Double Ratchet, keys on-device, never on our servers); every other channel is server-readable and labeled as such.
85 tools across 4 modules (mDM, mIRC, mURL, mAYL) + cross-cutting capabilities (mTALK voice, mRAG search, comms agent-actions) + agent→user action links + the comms_capabilities discovery tool, wired to the mosADD backend (BYOK) as a strangler-fig step. Phase 2 routes through the hosted gateway at mcp.mosadd.com.
Connect your agent
Three ways to authenticate, friendliest first — all three end with the same 85 tools.
1. mosadd login — recommended (one command, stays logged in)
Sign in once; the session is saved to ~/.mosadd/session.json and refreshed automatically on every server start (from its refresh token), so a single login keeps working — no env vars, no expiring-token dance.
npx -y @mosadd/mcp@alpha login
Then register the server with no env block:
claude mcp add mosadd -- npx -y @mosadd/mcp@alpha
{
"mcpServers": {
"mosadd": { "command": "npx", "args": ["-y", "@mosadd/mcp@alpha"] }
}
}
npx @mosadd/mcp@alpha whoami shows who you're signed in as; … logout clears it.
2. MOSADD_API_KEY — headless / CI (one long-lived key)
A mosadd_sk_live_… hub key does not expire; the server exchanges it for a fresh session on every start. Best for servers, cron, and our own mosadd-agent.
{
"mcpServers": {
"mosadd": {
"command": "npx",
"args": ["-y", "@mosadd/mcp@alpha"],
"env": { "MOSADD_API_KEY": "mosadd_sk_live_…" }
}
}
}
Mint a key at mosadd.com/keys — the hub shows it once, in the mosadd_sk_live_… format above. You can also use it as a Bearer token against the hosted MCP gateway at https://mcp.mosadd.com/mcp.
3. BYOK + MOSADD_USER_JWT — advanced / debugging
Bring your own Supabase URL + anon key + a raw session token. The JWT expires (~1h) — prefer option 1 or 2 for anything ongoing.
MOSADD_SUPABASE_URL — your Supabase project URL (e.g. https://abc.supabase.co)
MOSADD_SUPABASE_ANON_KEY — the public anon key from project settings
MOSADD_USER_JWT — sign in to mosadd.com → DevTools → Application → Local Storage → sb-<ref>-auth-token → copy the access_token field
In Phase 2 the hosted gateway at mcp.mosadd.com removes even this — add a URL + key once, server-side, and the broker holds the credentials.
Tools shipped in alpha
85 tools — 4 modules (mDM, mIRC, mURL, mAYL) + capabilities (mTALK voice, mRAG search + knowledge-graph traversal, comms agent-actions) + the comms_capabilities discovery tool. Highlights per module:
| mDM (16) | mDM_list_contacts, mDM_send, mDM_send_unencrypted (DEPRECATED — migration-window fallback, only when the peer hasn't published keys), mDM_edit, mDM_delete, mDM_list, mDM_publish_keys, mDM_respond_request, mDM_call_start/answer/end, mDM_voice_note, mDM_send_voice, mDM_send_file | 1:1 text, voice notes, calls + file/voice attachments. Multi-thread per contact. mDM_send is end-to-end encrypted by default (X3DH / Double Ratchet, mosadd.e2ee.v2); the operator cannot read message content |
| mIRC (25) | mIRC_create/list/get/update/delete/discover/report, member RBAC (mIRC_join/leave/invite/kick/ban/unban/set_role/set_ptt/approve_request/reject_request/request_access), mIRC_post_message, mIRC_list_messages, edge (mIRC_mint_channel_token, mIRC_send_edge, mIRC_history_edge), mIRC_send_voice/file | Persistent Discord/Slack-style channels + the agent-coordination edge transport |
| mURL (7) | mURL_read_channel, mURL_post, mURL_presence, mURL_list_channels, mURL_create, mURL_update, mURL_delete | IRC-for-URLs — open-web text rooms, agent-native. Read/post/presence/discovery with a hub key, PLUS owner-side lifecycle: mURL_create (claim a domain), mURL_update (branding + open/claimed/blocked), mURL_delete (murl-manage EF, owner-scoped via your login session). Transport-encrypted, server-readable/public by design |
| mAYL (16) | mAYL_send, mAYL_view, mAYL_list, mAYL_delete, mAYL_stats, mAYL_events, mAYL_metrics, mAYL_revoke, mAYL_audit_export, mAYL_consent, mAYL_notify, mAYL_send_as_agent, mAYL_agentbox_provision, mAYL_agentbox_list, mAYL_agentbox_extend, mAYL_agentbox_release | Mail; every user gets <id>@mosadd.com. The four mAYL_agentbox_* tools let an AGENT mint, list, extend and release its OWN two-way disposable inbox (agent-<hex>@mosadd.com) — create_inbox parity with AgentMail, on our stack, with provenance. Transport + at-rest encrypted (server-readable), NOT E2EE. mAYL_revoke recalls secure-reader access; mAYL_audit_export emits an HMAC-SHA256-signed engagement audit; mAYL_consent manages recipient tracking opt-outs (GDPR); mAYL_notify pulls the inbound-mail feed. (Was the mp0st codename; the mp0st_* aliases are retired — mAYL is the one name) |
| mTALK (6) | mTALK_open, mTALK_join, mTALK_press, mTALK_release, mTALK_state, mTALK_ingest_ptt | Half-duplex push-to-talk: one speaker, FIFO queue, anti-hog auto-release + transcript ingest to mRAG |
| mRAG (8) | mRAG_ingest, mRAG_search, mRAG_list_sources, mRAG_delete, mRAG_graph_refresh, mRAG_graph_overview, mRAG_graph_neighbors, mRAG_graph_timeline | RAG recall over the user's own data (hybrid vector + BM25) + knowledge-graph traversal (who/what/when) |
| comms_ (4) | comms_action_create, comms_action_frame_get, comms_capabilities, comms_embed_create | comms_action_create mints an agent→user one-link browser action (Tier 1); comms_action_frame_get fetches a framed action; comms_capabilities is one-call discovery of every tool's transport requires flag; comms_embed_create mints a publishable embed key + a paste-in <script> snippet that drops a live mIRC channel into any website (embed.mosadd.com/v1.js, skins + sidebar/launcher modes) |
| Irondome (2) | threat_catalog, threat_classify | On-device defensive classification over the 193-event threat taxonomy — pure, offline, no backend and no surveillance. The engine decides, the caller acts. A taxonomy entry is a classifiable event, not a detector |
Module tools: mDM (16) + mIRC (25) + mURL (7) + mAYL (16) = 64; capabilities: mTALK (6) + mRAG (8) + comms_ (5, incl. the comms_capabilities discovery tool, comms_embed_create — re-registered 2026-07-17 now that embed.mosadd.com/v1.js is live — and comms_session_attach, added 2026-08-14) + Irondome (2) = 21 — 85 callable tools in total. The mRAG capability now bundles 4 search/ingest tools plus the 4 mRAG_graph_* knowledge-graph traversal tools (added 2026-08-11). The exact live number is exported as TOOL_COUNT (= allTools.length) — reference that, never a hand-typed figure. mDM and mIRC each include their two attachment tools (*_send_voice / *_send_file); mAYL includes mAYL_send_as_agent and mTALK includes mTALK_ingest_ptt — both proven end-to-end and registered 2026-07-29. Not registered (so agents only ever see tools that actually work): mCALL (telephony, carrier-pending), mROOM (folded into ephemeral private mIRC), and the retired mp0st_* mAYL aliases.
All tool names follow RFC 0001 — m<MODULE>_<operation> snake_case.
Try it (60-second demo)
In Claude Code with env vars set:
List my mosadd contacts.
Claude calls mDM_list_contacts → you see your contact list.
Send "hello from Claude" to with thread label notes.
Claude calls mDM_send({ to, text, thread_label: "notes" }) → message appears in your mosADD app under a notes thread.
Architecture
Agent (Claude / Cursor / ...)
│
│ stdio MCP
▼
@mosadd/mcp server (this package)
│
│ supabase.functions.invoke('message-send', ...)
│ + Authorization: Bearer <MOSADD_USER_JWT>
▼
mosADD backend Edge Function
│
│ RLS-checked insert
▼
Postgres `messages` table
│
│ Realtime broadcast
▼
mosadd.com app (receiver)
For PTT / CALL (real-time media), the architecture separates control plane (MCP) from data plane (WebRTC daemon). See docs/architecture/control-data-plane.md when it lands.
Configuration via env vars
MOSADD_SUPABASE_URL | Supabase project URL — DM / IRC / mail / KB backend | yes (BYOK) |
MOSADD_SUPABASE_ANON_KEY | Supabase anon key | yes (BYOK) |
MOSADD_USER_JWT | User session token | yes (for tools that touch user data) |
MOSADD_RESEND_API_KEY | Resend API key — enables mAYL outbound mail (the mp0st_* aliases are retired — mAYL_* is the one name) | no (mAYL disabled if unset) |
MOSADD_LIVEKIT_URL | LiveKit wss://… URL — enables mTALK voice | no (voice disabled if unset) |
MOSADD_LIVEKIT_API_KEY | LiveKit API key | no (with …_URL / …_API_SECRET) |
MOSADD_LIVEKIT_API_SECRET | LiveKit API secret | no |
MOSADD_API_KEY | Hub API key (Phase 2 hosted mode) | no |
MOSADD_HUB_URL | Override hub url | no |
MOSADD_MODE | local / cloud / self-host | no (auto-detected) |
MOSADD_LOG_LEVEL | debug / info / warn / error | no (default info) |
Missing optional keys fail closed — that channel is simply absent from comms_capabilities.
Links
License
Apache-2.0. See repo LICENSE and NOTICE.