Missive MCP
Connects AI assistants to your Missive team inbox with 36 tools for managing contacts, conversations, drafts, tasks, and more, while ensuring safety by preventing external sends and deletions.
README
<p align="center"> <img src="assets/missive-icon.png" width="72" height="72" alt="Missive MCP" /> </p>
Missive MCP
An MCP server that connects AI assistants — Claude Desktop and Claude Code — to your Missive team inbox. It gives the assistant 36 tools for contacts, conversations, messages, drafts, posts, shared labels, teams, tasks, and canned responses.
Safe by design. This server can read your inbox, organize it, post internal team comments, and merge conversations — but it cannot send an email or text to anyone outside your team, and it cannot delete anything.
missive_create_draftalways saves a draft in Missive for a person to review and send; there is no "send" tool and no send parameter.
New here? Follow the friendly step-by-step in SETUP.md — it assumes no prior experience. The rest of this page is the quick reference.
Why it feels turnkey
- The assistant gets usage instructions at connect time. The server ships MCP
instructions(the same channel Claude Desktop uses for built-in tools), so the assistant already knows the rules — which list calls need a mailbox filter, that contacts need acontact_book, that drafts never send, and so on. - Every tool is documented at the call site, grounded in the Missive API docs.
- It documents itself. Ask it to call
missive_help(topics:usage,tools,safety,authentication, …) any time.
Requirements
- Node.js 18+
- A Missive personal access token. In Missive: Preferences → API → Create a new token. (Requires an organization on the Missive Productive plan.)
Install
git clone https://github.com/kanjidoc/missive-mcp.git
cd missive-mcp
npm install
cp .env.example .env # paste your MISSIVE_API_TOKEN
npm run setup # validates the token, lists your resource IDs
npm run build
npm run setup confirms the token works and prints your organizations, contact
books, teams, and users — handy for filling the optional defaults below — then
prints a ready-to-paste launcher config.
Configure your client
The launcher config carries only the start command — never your token (the
token lives only in .env). Replace the path with your absolute checkout path.
Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"missive": {
"command": "node",
"args": ["/absolute/path/to/missive-mcp/dist/index.js"]
}
}
}
Claude Code:
claude mcp add-json missive '{"type":"stdio","command":"node","args":["/absolute/path/to/missive-mcp/dist/index.js"]}'
Restart the client, and the missive tools appear.
Configuration (.env)
Only the token is required; the rest are optional defaults so you don't repeat IDs.
Find IDs in Missive → Settings → API → Resource IDs, or run npm run setup.
| Variable | Required | Purpose |
|---|---|---|
MISSIVE_API_TOKEN |
yes | Your missive_pat-… personal access token. |
MISSIVE_DEFAULT_ORGANIZATION |
no | Default org; org-scoped tools use it when you omit organization. |
MISSIVE_DEFAULT_CONTACT_BOOK |
no | Default contact book; contact tools use it when you omit contact_book. |
MISSIVE_DEFAULT_TEAM |
no | Default team for drafts/tasks/posts/messages that omit team. |
MISSIVE_DEFAULT_FROM_ADDRESS |
no | Default "from" address for drafts (must be one of your Missive aliases). |
MISSIVE_DEFAULT_FROM_NAME |
no | Display name paired with the default from address. |
MISSIVE_DEFAULT_ACCOUNT |
no | Default custom-channel account for missive_create_message. |
Private roster (optional)
Drop a missive-roster.json next to .env to teach the assistant who your people
and teams are, so "assign this to Anj" or "route it to TwoFabianos" resolves to the
right Missive IDs with no missive_list_* call. The names and IDs are injected
into the server instructions the client reads at connect time. Copy the shape from
missive-roster.example.json:
{
"users": [{ "name": "Ada Lovelace", "id": "00000000-…-000000000001" }],
"teams": [{ "name": "Engineering", "id": "00000000-…-0000000000a1" }]
}
Each entry is a bare name + id (from Settings → API → Resource IDs, or
npm run setup). The file is gitignored — it holds real names and IDs, so it
never gets committed. It's entirely optional: with no file, nothing changes. A
missing, empty, or malformed file is ignored (logged to stderr), never fatal.
What's not included (and why)
The Missive API can do a few things this server deliberately leaves out. In plain terms:
- Sending emails or texts to people outside your team. The assistant can write
a draft and save it in Missive, but you press send. This is the main safety
guardrail — an AI can't fire off a real email on your behalf. (Technically: the
drafts endpoint's
send/send_at/auto_followupoptions are not exposed.) - Deleting things. There is no tool to delete a contact, draft, post, canned response, or label. The only irreversible action offered is merging two conversations, and it's clearly marked as such.
- Analytics reports. Missive can generate inbox/team analytics; those are slow, report-style requests that don't fit a back-and-forth assistant, so they're out.
- Webhooks (real-time event subscriptions). Missive can notify an external app when something happens — that's infrastructure plumbing to set up once, not something an assistant does mid-conversation.
- A few niche send-time options that only matter when actually sending: scheduled send, automated follow-up sequences, and WhatsApp message templates.
Everything else in the Missive REST API — reading and organizing conversations, contacts, tasks, labels, teams, drafts, and internal posts — is available. Any of the above is a small, self-contained addition if you want it later.
Tools (36)
Read-only tools are marked (ro); safely-repeatable updates (idem); irreversible
ones (!). See docs/TOOLS.md for the full parameter reference, and
call missive_help with topic: "usage" for recipes.
Contacts
| Tool | Does |
|---|---|
missive_list_contacts (ro) |
List contacts in a contact book (search, order, pagination). |
missive_get_contact (ro) |
Fetch one contact by UUID. |
missive_create_contacts |
Create one or more contacts (infos, memberships). |
missive_update_contacts (idem) |
Update contacts by UUID. ⚠️ infos/memberships replace the whole array. |
Contact books & groups
| Tool | Does |
|---|---|
missive_list_contact_books (ro) |
List accessible contact books (find the contact_book id). |
missive_list_contact_groups (ro) |
List groups/organizations in a contact book (kind = group/organization). |
Conversations
| Tool | Does |
|---|---|
missive_list_conversations (ro) |
List conversations — needs a mailbox filter (inbox/all/assigned/… or a label/team id). |
missive_get_conversation (ro) |
Fetch one conversation by id. |
missive_update_conversations (idem) |
Close/reopen, move, assign, label, recolor, or rename — without posting. |
missive_merge_conversations (!) |
Merge one conversation into another. Irreversible. |
missive_list_conversation_messages (ro) |
List a conversation's messages. |
missive_list_conversation_comments (ro) |
List a conversation's comments. |
missive_list_conversation_drafts (ro) |
List a conversation's drafts. |
missive_list_conversation_posts (ro) |
List a conversation's posts. |
Messages
| Tool | Does |
|---|---|
missive_get_message (ro) |
Fetch one or many messages by id (batch with several ids). |
missive_list_messages (ro) |
Find messages by RFC Message-ID. |
missive_create_message |
Advanced — inject an incoming custom-channel message (never sends externally). |
Drafts & posts
| Tool | Does |
|---|---|
missive_create_draft |
Save a draft (email/SMS/etc.) with optional attachments for manual review — does not send. |
missive_create_post |
Post an internal comment/note into a conversation (visible to your team). ⚠️ Permanent, notifies the team. |
Shared labels
| Tool | Does |
|---|---|
missive_list_shared_labels (ro) |
List shared labels (team-shared conversation tags). |
missive_create_shared_labels |
Create shared labels. |
missive_update_shared_labels (idem) |
Update shared labels. |
Teams, users & organizations
| Tool | Does |
|---|---|
missive_list_teams (ro) |
List teams. |
missive_create_teams |
Create teams (org admin/owner only). |
missive_update_teams (idem) |
Update teams (org admin/owner only). |
missive_list_users (ro) |
List users across your organizations. |
missive_list_organizations (ro) |
List your organizations (find the organization id). |
Responses (canned replies)
| Tool | Does |
|---|---|
missive_list_responses (ro) |
List canned reply / template responses. |
missive_get_response (ro) |
Fetch one response by id. |
missive_create_responses |
Create responses — scoped to an organization xor a user. |
missive_update_responses (idem) |
Update responses. |
Tasks
| Tool | Does |
|---|---|
missive_list_tasks (ro) |
List tasks (filter by state/team/assignee/due; until cursor). |
missive_get_task (ro) |
Fetch one task by id. |
missive_create_task |
Create a task, tasked conversation, or subtask. |
missive_update_task (idem) |
Update a task's fields. |
Help
| Tool | Does |
|---|---|
missive_help (ro) |
Self-documentation: overview, usage, tools, safety, authentication, and more. |
How the assistant calls it
A few rules the server teaches the model (and worth knowing yourself):
missive_list_conversationsneeds a mailbox filter — a boolean likeinbox: true, or an id likeshared_label/team_inbox. To filter by who's involved, add exactly one ofemail/domain/contact_organization.- Contacts need a
contact_book; org-scoped writes need anorganization(set theMISSIVE_DEFAULT_*vars to avoid repeating them). missive_update_contactsreplaces the wholeinfos/membershipsarray you send — fetch first, then send the full merged array.- Replying? Pass
conversationorreferencestomissive_create_draftand setsubjectto"Re: …". If you setMISSIVE_DEFAULT_FROM_ADDRESS, the draft uses it automatically; otherwise the assistant takes the from-address from the thread.
Example recipes (the assistant chains these for you):
- Triage:
missive_list_conversations(inbox: true)→missive_update_conversations(close: true, …) - Internal note:
missive_create_post(markdown: "…")— posts to the team; no email is sent. - Draft a reply:
missive_get_conversation+missive_list_conversation_messages→missive_create_draft(conversation, to_fields, subject: "Re: …", body) - Merge duplicates:
missive_merge_conversations(source_conversation_id, target_conversation_id) - Tasks:
missive_list_tasks(state: "todo")/missive_create_task/missive_update_task
Rate limits
Missive allows 5 concurrent requests, 300/minute, and 900/15 minutes. The client
caps concurrency and automatically retries HTTP 429 honoring Retry-After. For
bulk reads, prefer the batch endpoints (e.g. missive_get_message with several ids).
Development
npm run dev # run with ts-node (no build)
npm run build # compile to dist/
npm run lint # eslint
npm test # vitest
npm run format # prettier
See CONTRIBUTING.md to add a tool, CLAUDE.md for
the architecture and conventions, and SECURITY.md for credential
handling. The design rationale lives in docs/superpowers/specs/.
License
MIT © kanjidoc
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。