npm package: @sendly/mcp
Description: Sendly MCP Server — Full SMS platform for AI agents. Messaging, contacts, campaigns, templates, webhooks, OTP verification, and more.
Author: Sendly
Latest version: 2.0.1

# @sendly/mcp

Full SMS platform for AI agents — 82 tools for messaging, contacts, campaigns, templates, webhooks, OTP verification, conversations, labels, drafts, and more via [Model Context Protocol](https://modelcontextprotocol.io).

## Quick Setup

### Claude Code

```bash
claude mcp add --env SENDLY_API_KEY=sk_test_v1_your_key sendly -- npx -y @sendly/mcp
```

### Claude Desktop

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "sendly": {
      "command": "npx",
      "args": ["-y", "@sendly/mcp"],
      "env": {
        "SENDLY_API_KEY": "sk_test_v1_your_key"
      }
    }
  }
}
```

### Cursor / VS Code Copilot / Windsurf

Add to your MCP config (`.cursor/mcp.json`, `.vscode/mcp.json`, or `~/.codeium/windsurf/mcp_config.json`):

```json
{
  "mcpServers": {
    "sendly": {
      "command": "npx",
      "args": ["-y", "@sendly/mcp"],
      "env": {
        "SENDLY_API_KEY": "sk_test_v1_your_key"
      }
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp set sendly '{"command":"npx","args":["-y","@sendly/mcp"],"env":{"SENDLY_API_KEY":"sk_test_v1_your_key"}}'
```

Then ask your agent: *"Send a test SMS to +15005550000 saying Hello from my agent"*

## All 82 Tools

### Messaging (6)

| Tool | Description |
|------|-------------|
| `send_sms` | Send an SMS/MMS to a phone number |
| `list_messages` | List messages with full-text search (`q` param) |
| `get_message` | Get message details and delivery status |
| `schedule_sms` | Schedule for future delivery (5 min – 5 days) |
| `cancel_scheduled_message` | Cancel scheduled message, credits refunded |
| `list_scheduled_messages` | List pending scheduled messages |

### Batch Messaging (4)

| Tool | Description |
|------|-------------|
| `send_batch` | Send to multiple recipients in one call (up to 1,000) |
| `preview_batch` | Preview credit cost before sending |
| `get_batch` | Get batch status with per-message results |
| `list_batches` | List all batches |

### Conversations (9)

| Tool | Description |
|------|-------------|
| `list_conversations` | List threads by recent activity |
| `get_conversation` | Get conversation with optional message history |
| `get_conversation_context` | LLM-ready formatted context with AI annotations |
| `reply_to_conversation` | Reply in a conversation (auto-sets recipient) |
| `update_conversation` | Update metadata or tags |
| `close_conversation` | Close (auto-reopens on new inbound) |
| `reopen_conversation` | Reopen a closed conversation |
| `mark_conversation_read` | Reset unread count to zero |
| `get_suggested_replies` | AI-generated replies in 3 tones |

### Contacts (6)

| Tool | Description |
|------|-------------|
| `create_contact` | Create with phone, name, email, metadata |
| `list_contacts` | List with search and pagination |
| `get_contact` | Get contact with list memberships |
| `update_contact` | Update name, email, or metadata |
| `delete_contact` | Delete (removes from all lists) |
| `import_contacts` | Bulk import up to 10,000 contacts |

### Contact Lists (7)

| Tool | Description |
|------|-------------|
| `create_contact_list` | Create a list for campaigns |
| `list_contact_lists` | List all lists with counts |
| `get_contact_list` | Get list with members |
| `update_contact_list` | Update name or description |
| `delete_contact_list` | Delete list (contacts preserved) |
| `add_list_contacts` | Add contacts to a list |
| `remove_list_contact` | Remove a contact from a list |

### Campaigns (10)

| Tool | Description |
|------|-------------|
| `create_campaign` | Create with `{{variable}}` personalization |
| `list_campaigns` | List with status filter |
| `get_campaign` | Get with delivery stats |
| `update_campaign` | Update draft or scheduled campaign |
| `delete_campaign` | Delete draft or cancelled campaign |
| `preview_campaign` | Preview recipient count and credit cost |
| `send_campaign` | Send immediately |
| `schedule_campaign` | Schedule for future delivery |
| `cancel_campaign` | Cancel scheduled campaign, credits refunded |
| `clone_campaign` | Clone as new draft |

### Templates (8)

| Tool | Description |
|------|-------------|
| `create_template` | Create with `{{variable}}` placeholders |
| `list_templates` | List custom and preset templates |
| `get_template` | Get template with variable definitions |
| `update_template` | Update name or text |
| `delete_template` | Delete custom template |
| `publish_template` | Publish for use with Verify API |
| `preview_template` | Preview with sample variable values |
| `list_template_presets` | List system OTP/2FA presets |

### Labels (4)

| Tool | Description |
|------|-------------|
| `create_label` | Create with name and color |
| `list_labels` | List all workspace labels |
| `add_conversation_label` | Add labels to a conversation |
| `remove_conversation_label` | Remove a label from a conversation |

### Auto-Label Rules (4)

| Tool | Description |
|------|-------------|
| `list_rules` | List auto-label rules |
| `create_rule` | Create rule (intent/sentiment → label) |
| `update_rule` | Update conditions, actions, or enabled state |
| `delete_rule` | Delete rule |

### Drafts (4)

| Tool | Description |
|------|-------------|
| `create_draft` | Create draft for human review |
| `list_drafts` | List drafts by conversation or status |
| `approve_draft` | Approve and send as real SMS |
| `reject_draft` | Reject with reason |

### Webhooks (9)

| Tool | Description |
|------|-------------|
| `create_webhook` | Create endpoint (returns signing secret) |
| `list_webhooks` | List all webhooks |
| `get_webhook` | Get webhook with delivery stats |
| `update_webhook` | Update URL, events, or active state |
| `delete_webhook` | Delete webhook |
| `test_webhook` | Send test event to verify endpoint |
| `list_webhook_deliveries` | Delivery history with statuses |
| `rotate_webhook_secret` | Rotate signing secret |
| `list_webhook_event_types` | List available event types |

### OTP / Verify (7)

| Tool | Description |
|------|-------------|
| `send_otp` | Send verification code via SMS |
| `check_otp` | Verify the code user entered |
| `get_verification_status` | Check verification state |
| `resend_otp` | Resend if original not received |
| `list_verifications` | List recent verifications |
| `create_verify_session` | Hosted verification UI (zero frontend code) |
| `validate_verify_session` | Validate token from hosted session |

### Credits (2)

| Tool | Description |
|------|-------------|
| `get_credits` | Current balance and reserved credits |
| `list_credit_transactions` | Transaction history |

### Account (1)

| Tool | Description |
|------|-------------|
| `get_account` | Credit balance, verification status, rate limits |

### Enterprise (1)

| Tool | Description |
|------|-------------|
| `generate_business_page` | Generate hosted business page for verification *(enterprise only)* |

## Authentication

Set `SENDLY_API_KEY` as an environment variable:

- **Test keys** (`sk_test_v1_...`) — sandbox mode, no real SMS, OTP codes in response
- **Live keys** (`sk_live_v1_...`) — real SMS delivery, requires verified phone number

Get your key at [sendly.live](https://sendly.live) → Settings → API Keys.

## Sandbox Testing

With test keys, use magic numbers:

| Number | Behavior |
|--------|----------|
| +15005550000 | Always succeeds |
| +15005550001 | Invalid number |
| +15005550006 | Carrier rejected |

## Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `SENDLY_API_KEY` | Yes | Your Sendly API key |
| `SENDLY_BASE_URL` | No | API base (default: `https://sendly.live`) |

## Links

- [MCP Tools Reference](https://sendly.live/docs/ai/mcp-tools) — all 82 tools with schemas
- [Agent Skills](https://sendly.live/skills) — SKILL.md files for 8 platforms
- [API Reference](https://sendly.live/docs/api)
- [Sendly Dashboard](https://sendly.live/dashboard)

## License

MIT