warp-mcp
# warp-mcp
MCP server for the [Ringer WARP platform](https://warp.ringer.tel) — SIP trunking, phone numbers, porting, messaging/10DLC, billing, and CDR analytics.
Gives AI agents (Claude, Cursor, Copilot, Codex, ChatGPT) full access to the WARP Customer API: 135 tools covering trunk provisioning, number search and ordering, port-in lifecycle, 10DLC brand/campaign registration, SMS sending, invoices, and call-detail analytics.
## Quick Start
```bash
# Recommended: global install — the setup wizard runs automatically
npm install -g warp-mcp
# Or run the wizard explicitly / without installing
npx -y warp-mcp setup
```
The wizard validates your API key, stores it in `~/.warp-mcp/config.json`, and registers the server with every MCP client it detects (Claude Code, Claude Desktop, Cursor, Codex, GitHub Copilot, ChatGPT Desktop).
You need a WARP API key (`rk_...`) — mint one in the [WARP portal](https://app.warp.ringer.tel) under **Settings → API Keys**.
## One-command installs
**Claude Code**
```bash
claude mcp add -s user warp -e WARP_API_TOKEN=rk_your_key -- npx -y warp-mcp
```
**Cursor** — [click to install](cursor://anysphere.cursor-deeplink/mcp/install?name=warp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIndhcnAtbWNwIl0sImVudiI6eyJXQVJQX0FQSV9UT0tFTiI6IllPVVJfV0FSUF9BUElfS0VZIn19) (then replace `YOUR_WARP_API_KEY`)
**Manual (any MCP client)**
```json
{
"mcpServers": {
"warp": {
"command": "npx",
"args": ["-y", "warp-mcp"],
"env": { "WARP_API_TOKEN": "rk_your_key" }
}
}
}
```
See [INSTALL.md](INSTALL.md) for per-client walkthroughs, troubleshooting, and uninstall steps.
## Hosted endpoint
No local install needed — connect straight to `https://mcp.warp.ringer.tel/` (Streamable HTTP).
**Desktop connectors (claude.ai, ChatGPT):** add a custom connector with that URL and
sign in with your WARP account when prompted — the hosted endpoint authenticates via
OAuth 2.1 and grants your customer-scoped permissions (excluding admin surfaces, Buzz,
and API-key management — those stay in the portal).
**Developer / CLI clients:** authenticate with a bearer `rk_` key instead:
```bash
claude mcp add --transport http warp https://mcp.warp.ringer.tel/ \
--header "Authorization: Bearer $WARP_API_KEY"
```
```json
{
"mcpServers": {
"warp": {
"type": "http",
"url": "https://mcp.warp.ringer.tel/",
"headers": { "Authorization": "Bearer rk_your_key_here" }
}
}
}
```
Keys are minted in the [WARP portal](https://app.warp.ringer.tel) under **Settings → API Keys**.
## Tools
| Prefix | Group | Tools | What it does |
|---|---|---:|---|
| `trunk_` | SIP Trunks | 24 | Trunk CRUD, SIP credentials, endpoints, IP ACLs, registrations |
| `port_` | Porting | 33 | Port-in requests end to end: draft → validate → submit → activate, documents, TIN compliance |
| `msg_` | Messaging | 33 | Send SMS, message history, 10DLC brands/campaigns, number enrollment, TCR reference data |
| `num_` | Numbers | 15 | Search, order, release DIDs; per-TN voice/SMS config; port-out PINs |
| `team_` | Team | 9 | Members and RBAC roles |
| `bill_` | Billing | 5 | Balance, ledger, invoices (JSON + HTML) |
| `cdr_` | Analytics | 5 | Call detail records, statistics, trends, CSV export |
| `acct_` / `net_` / `key_` | Account | 10 | Capacity, utilization, scopes, WARP network IPs, API-key audit |
| `warp_status` | Diagnostics | 1 | Config + connectivity check |
The server also ships a `warp-guide` prompt (and server instructions) with deep WARP domain knowledge — workflows, concepts, and common mistakes.
## Environment variables
| Variable | Default | Purpose |
|---|---|---|
| `WARP_API_TOKEN` | — | API key (`rk_...`). Overrides `~/.warp-mcp/config.json` |
| `WARP_API_BASE_URL` | `https://api.warp.ringer.tel` | API base URL override |
| `WARP_REQUEST_TIMEOUT_MS` | `30000` | Per-request timeout |
Token resolution order: env var → `~/.warp-mcp/config.json` → unauthenticated (tools return guidance to run setup).
## Development
```bash
npm ci --ignore-scripts
npm run build # tsc → dist/
npm test # vitest (in-memory MCP transport)
npm run dev # tsx src/index.ts
```
Releases are published from CI: `npm version patch|minor|major`, push with `--follow-tags`, create a GitHub release — the workflow publishes to npm (OIDC trusted publishing with provenance) and to the [MCP Registry](https://registry.modelcontextprotocol.io) (`io.github.ringer/warp`). Do not run `npm publish` locally after the initial release.
## License
MIT © [Ringer](https://ringer.tel)
TDQS
Scored across 135 tools
Tools are grouped by domain prefixes (acct_, net_, key_, bill_, msg_, num_, port_, trunk_, team_, cdr_) and nearly every tool has a distinct resource+action purpose. A few near-duplicates exist (acct_get_balance vs bill_get_balance, key_get_audit vs key_get_audit_all, msg_list vs msg_get_stats), but their descriptions explicitly disambiguate them, so an agent should rarely misselect.
All 135 tools follow a consistent snake_case domain_prefix_verb_noun pattern (e.g. trunk_list_endpoints, msg_create_campaign, port_get_progress). The naming is highly predictable across the entire tool surface, with no mixed conventions or vague verbs.
135 tools is far beyond the range that can be considered well-scoped for an LLM agent's tool set. Even though the server covers many domains, this extreme count creates a large selection surface, memory burden, and prompt overhead that outweighs the depth of coverage.
The tool surface is remarkably comprehensive: accounts, networking, API keys, billing, SMS/10DLC messaging, number inventory, port-in lifecycle, trunk management, team/roles, and CDR analytics all have robust CRUD/lifecycle coverage. The port-in workflow in particular has no obvious dead ends—create through activate, including documents, validation, auto-fix, resubmission, and cancellation.