Skip to main content
Glama
grncdr

Missive MCP Server

by grncdr
README.md
# Missive MCP Server

An MCP (Model Context Protocol) server that interfaces with the [Missive API](https://missiveapp.com/docs/developers/rest-api/endpoints), enabling Claude to manage email conversations, contacts, and team collaboration.

## Prerequisites

- Node.js 18+
- Missive account with **Productive plan** (required for API access)
- Missive API token

## Installation

```bash
npm install
npm run build
```

## Modes

The server runs in two modes: **stdio** for local single-user use, and **remote** for hosted multi-user deployments.

### Stdio Mode (Local)

Set the `MISSIVE_API_TOKEN` environment variable:

```bash
export MISSIVE_API_TOKEN="your_api_token_here"
npm start
```

To get your API token: open Missive, go to Settings > API, click "Create a new token".

Add to your Claude Desktop configuration (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "missive": {
      "command": "/path/to/node",
      "args": ["/path/to/missive-mcp/dist/index.js"],
      "env": {
        "MISSIVE_API_TOKEN": "your_api_token_here"
      }
    }
  }
}
```

**Important:** Use the full path to `node` (run `which node` to find it). Claude Desktop has a restricted PATH and may not find node otherwise.

### Remote Mode (Hosted)

Runs an HTTP server with OAuth. Each user provides their own Missive PAT through a browser-based authorization flow.

```bash
export ENCRYPTION_KEY="$(openssl rand -hex 32)"
export BASE_URL="https://missive-mcp.example.com"
npm run remote
```

| Variable | Required | Description |
|---|---|---|
| `ENCRYPTION_KEY` | Yes | 32-byte hex string for AES-256-GCM PAT encryption |
| `BASE_URL` | Yes | Public URL of the server |
| `PORT` | No | HTTP port (default 3000) |
| `DATA_DIR` | No | Directory for storage files (default `./data`) |

Point MCP clients at `{BASE_URL}/mcp`. The server handles OAuth automatically:

1. Client discovers endpoints via `/.well-known/oauth-authorization-server`
2. Client registers dynamically via `/register`
3. User is redirected to a form to paste their Missive API token
4. Server validates the token, encrypts and stores it, issues OAuth tokens
5. Client uses bearer tokens to call `/mcp`

PATs are encrypted at rest with AES-256-GCM. OAuth tokens expire after 1 hour (refresh tokens last 30 days).

## Tools

### Reference Data

| Tool | Description |
|------|-------------|
| `list_organizations` | List organizations you belong to |
| `list_teams` | List teams (for assignments) |
| `list_users` | List users (for assignments) |
| `list_contact_books` | List contact books (required before creating contacts) |
| `list_shared_labels` | List labels (for filtering and tagging) |

### Conversations

| Tool | Description |
|------|-------------|
| `list_conversations` | List conversations with filters (inbox, assigned, closed, team, label, email, domain) |
| `get_conversation` | Get a single conversation by ID |

### Messages

| Tool | Description |
|------|-------------|
| `get_conversation_timeline` | Get all messages, posts, and comments as a unified chronological timeline |
| `get_message` | Get full message content (with body truncation options) |

### Drafts

| Tool | Description |
|------|-------------|
| `list_drafts` | List drafts in a conversation |
| `create_draft` | Create a draft (not sent) |
| `send_message` | Send a message immediately (rate limited) |
| `delete_draft` | Delete an unsent draft |

### Contacts

| Tool | Description |
|------|-------------|
| `list_contacts` | List contacts in a book (with search) |
| `get_contact` | Get a single contact |
| `create_contact` | Create a new contact |
| `update_contact` | Update an existing contact |

### Management

| Tool | Description |
|------|-------------|
| `create_post` | Add a post to a conversation; close, label, assign, or move to team |

## Examples

### Read inbox
```
Use list_conversations with inbox=true to see recent conversations.
```

### Reply to an email
```
1. Use list_conversations to find the conversation
2. Use get_conversation_timeline to see the full thread (messages + team activity)
3. Use send_message with the conversation ID to reply
```

### Search for emails from a domain
```
Use list_conversations with domain="example.com"
```

### Assign a conversation
```
1. Use list_users to find the user ID
2. Use list_organizations to get the org ID
3. Use create_post with add_assignees=[user_id]
```

## Rate Limits

- `send_message`: 10 per minute, 100 per hour (client-enforced)
- Missive API rate limits are undocumented; the client handles 429 responses

## Security

- API tokens are validated on startup (stdio) or on authorization (remote)
- Tokens are never logged or included in error messages
- In remote mode, PATs are encrypted at rest with AES-256-GCM
- Email body content is never logged
- Input validation on all tool parameters

## License

MIT

TDQS

A4/5.0

Scored across 19 tools

Disambiguation5/5

Each tool has a clearly distinct purpose, targeting different resources (contacts, drafts, posts, messages, conversations, etc.) with specific actions. The only potential overlap between create_draft and draft_reply is clearly differentiated by descriptions.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_contact, list_conversations, send_message). The pattern is uniform and predictable across all 19 tools.

Tool Count5/5

With 19 tools covering contacts, conversations, messages, drafts, posts, and organizational entities, the count is well-scoped for a comprehensive email collaboration platform. Each tool serves a distinct function without unnecessary redundancy.

Completeness4/5

Core workflows (messaging, drafting, replying, managing contacts) are well-covered, but some CRUD operations are missing, e.g., delete_contact, update_draft, and administrative operations for organizations, labels, teams, and users. These are minor gaps that agents can typically work around.

Maintenance

ActivityInactive
ResponsivenessNo issues