npm package: @pinnacle-rcs/mcp
Description: Pinnacle MCP Server — AI-powered RCS, SMS, and MMS messaging tools for Claude, Cursor, and Windsurf
Latest version: 0.1.1

# Pinnacle MCP Server

Connect AI assistants to the [Pinnacle](https://pinnacle.sh) messaging API using the [Model Context Protocol](https://modelcontextprotocol.io). Send SMS, MMS, and RCS messages, manage contacts and conversations, and more — all through natural language.

**Supported clients:** Claude Desktop, Claude Code, Cursor, Windsurf, and any MCP-compatible AI tool.

## Quick Start

### Remote (recommended)

No install needed. Add to your MCP client config:

**Cursor** (`.cursor/mcp.json`):
```json
{
  "mcpServers": {
    "pinnacle": {
      "url": "https://mcp.pinnacle.sh/mcp",
      "headers": {
        "PINNACLE-API-KEY": "your-api-key"
      }
    }
  }
}
```

**Claude Code:**
```bash
claude mcp add pinnacle --transport http https://mcp.pinnacle.sh/mcp \
  -H "PINNACLE-API-KEY: your-api-key"
```

### Local (npx)

```bash
PINNACLE_API_KEY=your-api-key npx @pinnacle-rcs/mcp
```

Or add to your MCP client config:
```json
{
  "mcpServers": {
    "pinnacle": {
      "command": "npx",
      "args": ["@pinnacle-rcs/mcp"],
      "env": {
        "PINNACLE_API_KEY": "your-api-key"
      }
    }
  }
}
```

## Available Tools

### Messaging
| Tool | Description |
|------|-------------|
| `send_sms` | Send an SMS message |
| `send_mms` | Send an MMS with text and/or media |
| `send_rcs` | Send a rich RCS message with cards, buttons, and quick replies |
| `get_message` | Get message details by ID |
| `send_typing_indicator` | Show typing indicator from an RCS agent |
| `cancel_scheduled_message` | Cancel a scheduled message before it sends |
| `react_to_message` | Add or remove an emoji reaction on a message |
| `validate_sms` | Validate SMS and get segment/cost estimate |
| `validate_mms` | Validate MMS and get segment/cost estimate |
| `validate_rcs` | Validate RCS and get cost estimate |

### Conversations
| Tool | Description |
|------|-------------|
| `list_conversations` | List conversations with filtering |
| `get_conversation` | Get a conversation by ID or phone numbers |
| `list_conversation_messages` | Get messages in a conversation |
| `update_conversation` | Update conversation notes |

### Contacts
| Tool | Description |
|------|-------------|
| `get_contact` | Look up a contact |
| `create_contact` | Create a new contact |
| `update_contact` | Update a contact |

### Audiences
| Tool | Description |
|------|-------------|
| `get_audience` | Get an audience by ID |
| `create_audience` | Create an audience with optional contacts |
| `update_audience` | Update an audience's name or description |
| `delete_audience` | Delete an audience |
| `add_audience_contacts` | Add contacts to an audience |
| `remove_audience_contacts` | Remove contacts from an audience |

### Bulk Messaging
| Tool | Description |
|------|-------------|
| `blast_sms` | SMS blast to an audience |
| `blast_mms` | MMS blast to an audience |
| `blast_rcs` | RCS blast to an audience |

### Phone Numbers
| Tool | Description |
|------|-------------|
| `search_phone_numbers` | Search available numbers to purchase |
| `get_phone_number_details` | Get carrier, location, and contact info |
| `buy_phone_numbers` | Purchase phone numbers |
| `attach_webhook_to_phone` | Attach a webhook to a phone number |
| `detach_webhook_from_phone` | Detach a webhook from a phone number |
| `attach_campaign_to_phones` | Attach a campaign to phone numbers |
| `detach_campaign_from_phones` | Detach a campaign from phone numbers |

### RCS
| Tool | Description |
|------|-------------|
| `get_rcs_capabilities` | Check RCS support for phone numbers |
| `whitelist_rcs_number` | Whitelist a number for RCS testing |
| `generate_rcs_link` | Generate a deep link to open an RCS conversation |

### Brands
| Tool | Description |
|------|-------------|
| `autofill_brand` | Auto-fill brand info using AI |
| `upsert_brand` | Create or update a brand |
| `get_brand` | Get brand details by ID |
| `submit_brand` | Submit brand for carrier review |
| `validate_brand` | Validate brand before submission |
| `vet_brand` | Request external vetting for a brand |

### Campaigns
| Tool | Description |
|------|-------------|
| `autofill_dlc_campaign` | Auto-fill 10DLC campaign using AI |
| `get_dlc_campaign` | Get 10DLC campaign details |
| `submit_dlc_campaign` | Submit 10DLC campaign for review |
| `upsert_dlc_campaign` | Create or update a 10DLC campaign |
| `validate_dlc_campaign` | Validate 10DLC campaign |
| `autofill_toll_free_campaign` | Auto-fill toll-free campaign using AI |
| `get_toll_free_campaign` | Get toll-free campaign details |
| `submit_toll_free_campaign` | Submit toll-free campaign for review |
| `upsert_toll_free_campaign` | Create or update a toll-free campaign |
| `validate_toll_free_campaign` | Validate toll-free campaign |
| `autofill_rcs_campaign` | Auto-fill RCS campaign using AI |
| `get_rcs_campaign` | Get RCS campaign details |
| `submit_rcs_campaign` | Submit RCS campaign for review |
| `upsert_rcs_campaign` | Create or update an RCS campaign |
| `validate_rcs_campaign` | Validate RCS campaign |

### Status
| Tool | Description |
|------|-------------|
| `get_brand_status` | Brand registration status |
| `get_dlc_campaign_status` | 10DLC campaign status |
| `get_toll_free_campaign_status` | Toll-free campaign status |
| `get_rcs_campaign_status` | RCS campaign status |
| `get_phone_number_status` | Phone number status |

### Utility
| Tool | Description |
|------|-------------|
| `create_shortened_url` | Create a tracked pncl.to short URL |
| `get_shortened_url` | Get URL details and click analytics |
| `update_shortened_url` | Update a shortened URL's destination or expiration |
| `upload_file` | Generate presigned upload/download URLs |
| `refresh_file_urls` | Refresh expired presigned file URLs |
| `get_contact_card` | Get a contact card (vCard) by ID |
| `upsert_contact_card` | Create or update a contact card |

### Webhooks
| Tool | Description |
|------|-------------|
| `get_webhooks` | Get webhooks attached to phone numbers or URLs |

### Documentation
| Tool | Description |
|------|-------------|
| `search_pinnacle_docs` | Search Pinnacle docs, guides, and API references |

## Remote vs Local

| | Remote (`mcp.pinnacle.sh`) | Local (`npx @pinnacle-rcs/mcp`) |
|---|---|---|
| **Setup** | No install — just add the URL | Requires Node.js and npx |
| **Transport** | Streamable HTTP | stdio |
| **Docs search** | AI-powered answers with code examples and citations | Keyword search over the docs index |
| **Updates** | Always latest | Depends on npm version |

The `search_pinnacle_docs` tool behaves differently depending on how the server is running. The hosted server returns full, contextual AI-powered answers with code examples and citations. The local package fetches the docs index and returns the most relevant pages ranked by keyword match.

## Authentication

Uses the same `PINNACLE-API-KEY` from your [Pinnacle Dashboard](https://app.pinnacle.sh/dashboard/development/api-keys). No OAuth required.

- **Remote:** pass as `PINNACLE-API-KEY` header
- **Local:** set `PINNACLE_API_KEY` environment variable

## Development

```bash
npm install
npm run typecheck    # type check
npm run build        # bundle with tsup
npm run dev          # run stdio server locally
npm run dev:http     # run HTTP server locally
```

## Documentation

- [Getting Started Guide](https://docs.pinnacle.sh/guides/mcp)
- [API Reference](https://docs.pinnacle.sh/api-reference)
- [Pinnacle Dashboard](https://app.pinnacle.sh)

## License

MIT