Skip to main content
Glama
Missive MCP
by kanjidoc

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_draft always 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 a contact_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.

Related MCP server: worksuite-mcp

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 — register at user scope, so the server is available in every project (don't add a project .mcp.json: it would hardcode one machine's absolute path into the repo and show up as a broken server plus an approval prompt for everyone else; this repo gitignores it for that reason):

claude mcp add-json missive '{"type":"stdio","command":"node","args":["/absolute/path/to/missive-mcp/dist/index.js"]}' --scope user

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_followup options 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.

Missive also runs an official hosted MCP server (https://mcp.missiveapp.com, OAuth, no token). It adds conversation search and calendars, but its contacts, labels, teams, and canned responses are read-only, and it has no tasks, posts, merge, or assign/close. This project was compared against it in September 2026 and kept — the full comparison and the conditions for revisiting are in ROADMAP.md §3.


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_conversations needs a mailbox filter — a boolean like inbox: true, or an id like shared_label / team_inbox. To filter by who's involved, add exactly one of email / domain / contact_organization.

  • Contacts need a contact_book; org-scoped writes need an organization (set the MISSIVE_DEFAULT_* vars to avoid repeating them).

  • missive_update_contacts replaces the whole infos/memberships array you send — fetch first, then send the full merged array.

  • Replying? Pass conversation or references to missive_create_draft and set subject to "Re: …". If you set MISSIVE_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

Available Tools

36 tools
missive_create_contactsA

Create one or more contacts. Body shape { contacts: [...] }. Each contact's contact_book falls back to MISSIVE_DEFAULT_CONTACT_BOOK. Supports names, starred, gender, infos[] (emails/phones/socials/addresses/custom), and memberships[] (organizations/groups).

Inputs: contacts (required).

missive_create_draftA

Creates a draft saved in Missive for manual review/sending — it does NOT send. Builds a draft email/SMS/WhatsApp/custom-channel message (in a new conversation, or appended to an existing one via conversation or references) that a human reviews and sends from the Missive app. The send-related parameters (send, send_at, auto_followup) are intentionally NOT available, so this tool can never transmit a message.

Inputs: body, team, close, account, +20 more.

missive_create_messageA

ADVANCED — custom channels only. Creates an INCOMING message record (a simulated inbound message) inside a Missive custom channel; it NEVER transmits anything externally and is NOT an email send. To actually send an email, use the Drafts endpoint with send (not exposed by this server). from_field is required; account (the custom-channel account ID) falls back to MISSIVE_DEFAULT_ACCOUNT.

Inputs: from_field (required), body, team, close, +21 more.

missive_create_postA
Destructive

Creates a post in a Missive conversation (POST /posts). A post is the recommended way for an automation to inject content and manage conversation state (close/reopen, move to inbox, assign users, add labels, set color) while leaving a visible trace. WARNING: the post is PERMANENT and VISIBLE to everyone with access to the conversation, creating it can send NOTIFICATIONS to those people, and it CANNOT be undone through this server (no delete tool is exposed). At least one of text, markdown, or attachments is required. If no conversation or matching references is given, a new conversation is created.

Inputs: team, text, close, reopen, +19 more.

missive_create_responsesA

Creates one or more responses (reusable canned reply / email templates). Body shape { responses: [...] }. Each response must be scoped to EITHER an organization (shared) OR a user (personal) — exactly one, never both; organization falls back to MISSIVE_DEFAULT_ORGANIZATION only when no user is given. Title is optional. Provide body, subject, default recipients, attachments, and external sync IDs as needed.

Inputs: responses (required).

missive_create_shared_labelsA

Creates one or more shared labels (folder-like, team-shared conversation tags). Each label requires a name and an organization (organization falls back to MISSIVE_DEFAULT_ORGANIZATION). Optionally set color, a parent label, and sharing options.

Inputs: shared_labels (required).

missive_create_taskA

Creates a task in Missive (standalone task, tasked conversation, or a subtask inside a conversation). Tasks created via the API appear in the Tasks view, not the Inbox. title is required; organization is required when using team, assignees, or add_users (defaults to MISSIVE_DEFAULT_ORGANIZATION); a subtask requires conversation or references.

Inputs: title (required), team, state, due_at, +9 more.

missive_create_teamsA

Creates one or more teams in an organization. The API token must belong to an admin or owner of the organization. Each team requires name and organization (organization falls back to MISSIVE_DEFAULT_ORGANIZATION). Body shape: { teams: [...] }.

Inputs: teams (required).

missive_get_contactA
Read-only

Fetch a single contact by its UUID. A deleted contact returns 404. Read-only.

Inputs: contact_id (required).

missive_get_conversationA
Read-only

Fetches a single conversation by ID (GET /conversations/:id). If the conversation was merged, the current (merged) conversation is returned and its id may differ from the one passed. Read-only. Conversations where you are only a guest return just id and last_activity_at.

Inputs: conversation_id (required).

missive_get_messageA
Read-only

Fetch one or more Missive messages (headers, body, attachments, and parent conversation) by message id. Pass one id for a single message or several ids to batch-fetch them in one call. Read-only.

Inputs: message_ids (required).

missive_get_responseA
Read-only

Fetches a single response (canned reply template) by its ID.

Inputs: response_id (required).

missive_get_taskA
Read-only

Gets a single task by ID, with full details including expanded assignee and team objects.

Inputs: task_id (required).

missive_helpA
Read-only

Returns embedded documentation about this Missive MCP server — overview, architecture, the full tool inventory, authentication, safety guarantees (it cannot send email or delete records), conventions, how to add tools, troubleshooting, and the installed version. Call this to understand the project or answer 'what version do I have?'.

Inputs: topic.

missive_list_contact_booksA
Read-only

Lists the contact books the API token owner can access (id, name, user, organization, sharing flags, description, and import status). Use this to find the contact_book id required when creating contacts. Read-only.

Inputs: limit, offset.

missive_list_contact_groupsA
Read-only

Lists the contact groups or organizations linked to a contact book (GET /contact_groups). Provide kind = 'group' (labels for unrelated contacts) or 'organization' (related contacts such as a business). contact_book is required (or set MISSIVE_DEFAULT_CONTACT_BOOK). Read-only.

Inputs: kind (required), limit, offset, contact_book.

missive_list_contactsA
Read-only

List contacts in a contact book. Requires contact_book (or MISSIVE_DEFAULT_CONTACT_BOOK). Supports search, order, limit (max 200), offset, modified_since, and include_deleted. Read-only.

Inputs: limit, order, offset, search, +3 more.

missive_list_conversation_commentsA
Read-only

Lists comments in a conversation (GET /conversations/:id/comments), newest first. Paginate with until = created_at of the oldest comment from the previous page. Read-only.

Inputs: conversation_id (required), limit, until.

missive_list_conversation_draftsA
Read-only

Lists draft messages in a conversation (GET /conversations/:id/drafts), newest first. Paginate with until = delivered_at of the oldest draft from the previous page. Read-only.

Inputs: conversation_id (required), limit, until.

missive_list_conversation_messagesA
Read-only

Lists messages in a conversation (GET /conversations/:id/messages), newest first; draft messages are excluded. Paginate with until = delivered_at of the oldest message from the previous page. Read-only.

Inputs: conversation_id (required), limit, until.

missive_list_conversation_postsA
Read-only

Lists posts in a conversation (GET /conversations/:id/posts), newest first. Paginate with until = created_at of the oldest post from the previous page. Read-only.

Inputs: conversation_id (required), limit, until.

missive_list_conversationsA
Read-only

Lists conversations visible to the API-token user (GET /conversations), newest activity first. REQUIRES at least one mailbox filter: a boolean (inbox, all, assigned, closed, snoozed, flagged, trashed, junked, drafts) or an ID filter (shared_label, team_inbox, team_closed, team_all). organization is an optional filter (falls back to MISSIVE_DEFAULT_ORGANIZATION, omitted otherwise). email/domain/contact_organization are mutually exclusive. Paginate with until = last_activity_at of the oldest conversation from the previous page. Read-only. Conversations where you are only a guest return just id and last_activity_at.

Inputs: all, email, inbox, limit, +15 more.

missive_list_messagesA
Read-only

Fetch messages matching an email Message-ID (the RFC 5322 Message-ID header value). Normally returns a single message; non-compliant senders may produce up to the latest 10 matches. Read-only.

Inputs: email_message_id (required).

missive_list_organizationsA
Read-only

Lists the organizations the API token owner is part of (id, name). Use this to find the organization id used as a filter or default by other tools. Read-only.

Inputs: limit, offset.

missive_list_responsesA
Read-only

Lists responses (reusable canned reply / email templates) for the authenticated user. organization is an optional filter; pagination via limit/offset.

Inputs: limit, offset, organization.

missive_list_shared_labelsA
Read-only

Lists shared labels (the folder-like, team-shared conversation tags) in the organizations you can access. organization is an optional filter; pagination via limit/offset.

Inputs: limit, offset, organization.

missive_list_tasksA
Read-only

Lists tasks you can access, ordered by last activity (most recent first). organization is an optional filter. Filter by state, type, team, assignee, parent conversation, or due-date range. Paginate with until (cursor on last_activity_at) — there is no offset.

Inputs: team, type, limit, state, +6 more.

missive_list_teamsA
Read-only

Lists teams in the organizations the API token owner belongs to and has access to (id, name, organization, members, observers, behaviors). organization is an optional filter; when omitted (and no default is set) teams from all accessible organizations are returned. Read-only.

Inputs: limit, offset, organization.

missive_list_usersA
Read-only

Lists users across the organizations the API token owner belongs to (id, name, email, avatar_url, and me for the token owner). organization is an optional filter; when omitted (and no default is set) users from all accessible organizations are returned. Read-only.

Inputs: limit, offset, organization.

missive_merge_conversationsA
Destructive

Merges one conversation INTO another (POST /conversations/:source/merge). The source_conversation_id is merged into target_conversation_id: the source conversation is replaced and all its messages, comments, and entries move to the target. IRREVERSIBLE — it CANNOT be un-merged through this server. Missive may swap the two conversations, so the returned conversation id may differ from either input. Optionally pass subject to rename the merged conversation.

Inputs: source_conversation_id (required), target_conversation_id (required), subject.

missive_update_contactsA
DestructiveIdempotent

Update one or more contacts by UUID (PATCH /contacts/:id1,:id2,...). Each object in contacts[] must include its id; only the attributes you supply are changed. WARNING: passing infos or memberships REPLACES the whole array — omitted items are deleted, so read-merge before writing. Idempotent.

Inputs: contacts (required).

missive_update_conversationsA
Idempotent

Updates conversation state WITHOUT creating a post or sending anything (PATCH /conversations/:ids) — close/reopen, move to inbox/team, assign/unassign, add/remove shared labels, recolor, or rename. Pass ids (the conversation IDs to update) and conversations with exactly one object per id, each carrying its matching id. organization is required on any item that uses add_users, add_assignees, remove_assignees, or add_shared_labels. Idempotent. Missive's API has no archive action — close is the closest, and add_to_inbox un-archives.

Inputs: ids (required), conversations (required).

missive_update_responsesA
DestructiveIdempotent

Updates one or more existing responses (canned reply templates). Provide one object per response, each with its id; only the attributes you include (title, body, subject, recipients, shared_labels, attachments, external IDs) are changed. Passing attachments replaces the whole set — omitted attachments are removed. Responses created by external integrations (e.g. WhatsApp templates) cannot be updated.

Inputs: responses (required).

missive_update_shared_labelsA
Idempotent

Updates one or more existing shared labels. Provide one object per label, each with its id; only the attributes you include (name, color, parent, sharing options, visibility) are changed.

Inputs: shared_labels (required).

missive_update_taskA
Idempotent

Updates a single task's attributes (title, description, state, assignees, team, due date). Only the fields you include are changed.

Inputs: task_id (required), team, state, title, +3 more.

missive_update_teamsA
Idempotent

Updates one or more existing teams. The API token must belong to an admin or owner of the organization. Pass ids (comma-joined into the URL path) and a teams array with one object per id, each carrying its own matching id plus only the attributes to change. Body shape: { teams: [...] }.

Inputs: ids (required), teams (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 36 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action, with clear naming and descriptions that prevent confusion even among similar functions like creating drafts vs. messages.

    Naming Consistency5/5

    All tools follow a consistent 'missive_verb_noun' pattern in lowercase snake_case, with verbs like create, get, list, update, merge, and help used uniformly.

    Tool Count4/5

    36 tools is high but justified by the breadth of Missive's domain (contacts, conversations, tasks, labels, teams, etc.); however, it exceeds the typical 3-15 range for well-scoped servers.

    Completeness2/5

    The server systematically lacks delete tools for all entities, leaving a significant lifecycle gap. While intentional for safety, it limits agents' ability to fully manage resources.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Connects AI assistants to Google Workspace (Gmail, Drive, Docs, Sheets, Slides, Calendar, Tasks, Forms, Chat, Contacts) through your own OAuth app, providing around 120 tools for managing email, files, calendar, and more.
      100
      MIT
    • A
      license
      C
      quality
      B
      maintenance
      Connects LLMs and AI agents to enterprise Microsoft 365 environments, enabling administration across Exchange Online, Microsoft Graph, Entra ID, compliance, security, mailbox operations, and mail-flow diagnostics through 34 tools.
      34
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to search, retrieve, and send email across multiple ordinary IMAP, POP3, and SMTP mailboxes, with per-account permissions and safe sending checks.
      Apache 2.0