warp-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@warp-mcp search for available phone numbers in area code 415"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
warp-mcp
MCP server for the Ringer WARP platform — 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
# Recommended: global install — the setup wizard runs automatically
npm install -g warp-mcp
# Or run the wizard explicitly / without installing
npx -y warp-mcp setupThe 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 under Settings → API Keys.
Related MCP server: bubblyphone-agents
One-command installs
Claude Code
claude mcp add -s user warp -e WARP_API_TOKEN=rk_your_key -- npx -y warp-mcpCursor — click to install (then replace YOUR_WARP_API_KEY)
Manual (any MCP client)
{
"mcpServers": {
"warp": {
"command": "npx",
"args": ["-y", "warp-mcp"],
"env": { "WARP_API_TOKEN": "rk_your_key" }
}
}
}See 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:
claude mcp add --transport http warp https://mcp.warp.ringer.tel/ \
--header "Authorization: Bearer $WARP_API_KEY"{
"mcpServers": {
"warp": {
"type": "http",
"url": "https://mcp.warp.ringer.tel/",
"headers": { "Authorization": "Bearer rk_your_key_here" }
}
}
}Keys are minted in the WARP portal under Settings → API Keys.
Tools
Prefix | Group | Tools | What it does |
| SIP Trunks | 24 | Trunk CRUD, SIP credentials, endpoints, IP ACLs, registrations |
| Porting | 33 | Port-in requests end to end: draft → validate → submit → activate, documents, TIN compliance |
| Messaging | 33 | Send SMS, message history, 10DLC brands/campaigns, number enrollment, TCR reference data |
| Numbers | 15 | Search, order, release DIDs; per-TN voice/SMS config; port-out PINs |
| Team | 9 | Members and RBAC roles |
| Billing | 5 | Balance, ledger, invoices (JSON + HTML) |
| Analytics | 5 | Call detail records, statistics, trends, CSV export |
| Account | 10 | Capacity, utilization, scopes, WARP network IPs, API-key audit |
| 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 |
| — | API key ( |
|
| API base URL override |
|
| Per-request timeout |
Token resolution order: env var → ~/.warp-mcp/config.json → unauthenticated (tools return guidance to run setup).
Development
npm ci --ignore-scripts
npm run build # tsc → dist/
npm test # vitest (in-memory MCP transport)
npm run dev # tsx src/index.tsReleases 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 (io.github.ringer/warp). Do not run npm publish locally after the initial release.
License
MIT © Ringer
Available Tools
135 toolsacct_get_balanceGet prepaid balanceARead-onlyIdempotent
Get your prepaid balance and currency. Use for a quick balance check; for the full billing snapshot (credit limit, available, suspension flag) use bill_get_balance. POSTPAID customers always see prepaid_balance=0.
Inputs: no named parameters.
acct_get_capacityGet account capacityARead-onlyIdempotent
Get your account's per-class × per-direction CPS (calls-per-second) and channel capacity ceilings. Use when planning traffic loads or diagnosing capacity-related call rejections.
Inputs: no named parameters.
acct_get_utilizationGet capacity utilizationARead-onlyIdempotent
Get your aggregate CPS/channel capacity and current concurrent usage across trunk groups. Use to check how close live traffic is to capacity ceilings. current_* fields are null when live counters cannot be read (counters_available=false).
Inputs: no named parameters.
acct_list_scopesList permission scope catalogARead-onlyIdempotent
List every permission scope in the WARP platform registry, grouped by category. Use when building or editing team roles or API keys to see what scopes exist. Requires the team:read scope.
Inputs: no named parameters.
bill_get_balanceGet billing balance snapshotARead-onlyIdempotent
Get your full billing balance snapshot: current balance, credit limit, available credit, suspension flag, and currency. Use for billing questions; for just the prepaid number use acct_get_balance.
Inputs: no named parameters.
bill_get_invoiceGet an invoiceARead-onlyIdempotent
Get one invoice in full: header, line items, tax lines, and payment applications. Use after finding the invoice id via bill_list_invoices. Returns 404 for invoices not owned by you.
Inputs: invoice_id (required).
bill_get_invoice_htmlRender invoice as HTMLARead-onlyIdempotent
Render one invoice as a branded HTML document (returned as text). Use when the user wants a presentable invoice document; for structured data use bill_get_invoice. A PDF variant exists at GET /v1/invoices/{id}/pdf but is binary — direct users to the portal for PDF downloads.
Inputs: invoice_id (required).
bill_list_invoicesList invoicesARead-onlyIdempotent
List your invoices, newest billing period first. Use to find an invoice id before fetching details with bill_get_invoice.
Inputs: no named parameters.
bill_list_ledgerList ledger transactionsARead-onlyIdempotent
List your billing ledger journal entries, most recent first. Use to trace payments, charges, and adjustments — e.g. 'why did my balance drop yesterday'.
Inputs: limit.
cdr_export_csvExport CDRs as CSVARead-onlyIdempotent
Start an asynchronous CSV export of call detail records for a date range and wait for the download link. The export runs server-side (capped at 500,000 rows; a capped file ends with a TRUNCATED marker line) and the tool returns a signed download URL valid 24h — it never returns CSV text, so hand the URL to the user rather than trying to read it. Use only when the user explicitly wants a file; for browsing or analysis use cdr_get_details / cdr_get_statistics. This tool polls for up to 45s; if the job is still running it returns its job_id — call the tool again with that job_id (filters are ignored then) to resume waiting on the same export instead of starting a new one. Errors: INVALID_DATE, NO_ACTIVE_CUSTOMER, NOT_FOUND (unknown or foreign job_id), CDR_EXPORT_FAILED, EXPORT_TIMEOUT, CDR_EXPORT_UNAVAILABLE.
Inputs: ani, dni, job_id, end_date, +4 more.
cdr_get_dashboard_statsGet dashboard statisticsARead-onlyIdempotent
Get the key dashboard metrics (counts, revenue, growth) scoped to your accessible customers. Use for a quick account health overview rather than detailed CDR analysis.
Inputs: no named parameters.
cdr_get_detailsList call detail recordsARead-onlyIdempotent
List call detail records (CDRs) for a date range with optional filters, newest first. Use to investigate specific calls, verify traffic, or debug call failures. Pagination is cursor-based: pass the previous response's next_cursor back as cursor to get the following page, and stop when has_more is false. There is no page number and no total count — an exact total over the CDR store is not affordable at platform volume. For aggregate metrics use cdr_get_statistics; for chart data use cdr_get_trends. Returns up to 50 records per page — pass next_cursor to continue; the WARP API itself accepts up to 1000 for direct callers. Errors: INVALID_DATE, INVALID_CURSOR (a bad cursor is a hard error, never a silent restart), CDR_QUERY_FAILED.
Inputs: ani, dni, limit, cursor, +5 more.
cdr_get_statisticsGet call statisticsARead-onlyIdempotent
Get aggregated CDR metrics (totals, durations, dispositions) for a date range. Use for summary questions like 'how many calls last week' or ASR/ACD analysis. For individual calls use cdr_get_details.
Inputs: end_date, start_date, tz_offset_minutes.
cdr_get_trendsGet call trend dataARead-onlyIdempotent
Get time-bucketed CDR aggregates for a date range, suitable for charts and spotting traffic patterns over time. Choose hour granularity for a single day, day for weeks, week for months.
Inputs: end_date, start_date, granularity, tz_offset_minutes.
key_getGet an API keyARead-onlyIdempotent
Get one API key's metadata and scopes by key UUID (never the secret). Use to inspect a specific key found via key_list. Requires the api_keys:read scope.
Inputs: key_id (required), customer_id (required).
key_get_auditGet API key audit trailARead-onlyIdempotent
Get the most recent 100 audit events (create/rotate/revoke/auth activity) for one API key. Use when investigating suspicious key usage or verifying rotation history. Requires the api_keys:read scope.
Inputs: key_id (required), customer_id (required).
key_get_audit_allGet customer-wide API key audit trailARead-onlyIdempotent
Get the most recent 100 audit events across ALL of your API keys. Use for a security review of key activity account-wide; for a single key's history use key_get_audit. Requires the api_keys:read scope.
Inputs: customer_id (required).
key_listList API keysARead-onlyIdempotent
List your API keys with their scopes and prefixes (secrets are never returned). Use to audit which keys exist and what they can do. Requires the api_keys:read scope.
Inputs: customer_id (required), include_revoked.
msg_assign_numbersAttach numbers to campaignA
Attach telephone numbers you own to one of your 10DLC campaigns. This is STEP 3 of the 10DLC flow (msg_create_brand → msg_create_campaign → assign numbers) and is required before msg_send will accept a number as from. Returns per-TN assigned/failed lists (failure reasons: not_found, not_owned, lookup_error, write_error); the response is NOT wrapped in the standard envelope. Errors: INVALID_PAYLOAD (400), NOT_FOUND (404, campaign not owned), TNIQ_ERROR (502).
Inputs: id (required), phone_numbers (required).
msg_create_brandCreate 10DLC brandA
Register a new 10DLC brand with TCR (The Campaign Registry) for your account. This is STEP 1 of the 10DLC flow: create brand → msg_create_campaign → msg_assign_numbers. Check msg_list_entity_types and msg_list_verticals for valid enum values first. Registration may incur TCR fees. Errors: INVALID_PAYLOAD/TNIQ_VALIDATION (400), TNIQ_ERROR (502, upstream TCR failure).
Inputs: ein, city, email, phone, +18 more.
msg_create_campaignCreate 10DLC campaignA
Register a new 10DLC campaign under one of your brands. This is STEP 2 of the 10DLC flow: msg_create_brand → create campaign → msg_assign_numbers. Check msg_get_use_case_requirements for the chosen use case first (sample counts, opt-in rules). Carrier review can take days; monitor with msg_get_mno_status. Registration incurs recurring TCR fees. Errors: INVALID_PAYLOAD/TNIQ_VALIDATION (400), TNIQ_ERROR (502).
Inputs: sample1, sample2, sample3, sample4, +23 more.
msg_delete_brandDelete 10DLC brandADestructive
Permanently delete one of your 10DLC brands from TCR and this account. Campaigns under the brand become unusable — only do this when decommissioning a brand. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required).
msg_elect_cnpElect connectivity partner (CNP)A
Elect a Connectivity Partner / DCA for one of your campaigns (required before carriers will pass traffic; see msg_list_dcas for available partners). The body is a free-form object passed through to the messaging backend. Check election/sharing progress with msg_get_sharing_status. Errors: INVALID_PAYLOAD (400), NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required), body.
msg_getGet a messageARead-onlyIdempotent
Get a single SMS/MMS message by its WARP message UUID, including delivery status. Use after msg_send or msg_list to check one message's details. Errors: INVALID_ID (400), NOT_FOUND (404).
Inputs: id (required).
msg_get_brandGet 10DLC brandARead-onlyIdempotent
Get one of your 10DLC brands by its messaging-backend UUID (snake_case TCR brand object, including identity status and trust score). For brands not registered in this account use msg_lookup_brand with the TCR brand ID instead. Errors: NOT_FOUND (404, includes cross-tenant access), TNIQ_ERROR (502).
Inputs: id (required).
msg_get_campaignGet 10DLC campaignARead-onlyIdempotent
Get one of your 10DLC campaigns by its messaging-backend UUID (snake_case TCR campaign object, including registration status). For campaigns not registered in this account use msg_lookup_campaign with the TCR campaign ID. Errors: NOT_FOUND (404, includes cross-tenant access), TNIQ_ERROR (502).
Inputs: id (required).
msg_get_mno_statusGet campaign MNO statusARead-onlyIdempotent
Get per-mobile-carrier (MNO) registration status for one of your campaigns — shows whether AT&T, T-Mobile, Verizon, etc. have approved it. Use after msg_create_campaign or msg_resubmit_campaign to track carrier approval. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required).
msg_get_sharing_statusGet campaign sharing statusARead-onlyIdempotent
Get the connectivity-partner (CNP) sharing status for one of your campaigns — whether the campaign has been shared with and accepted by the elected CNP/DCA. Use after msg_elect_cnp; if stuck, try msg_nudge_cnp. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required).
msg_get_statsGet message statisticsARead-onlyIdempotent
Get aggregate message counts for your account: overall totals (total, inbound, outbound, delivered, failed) plus a per-campaign breakdown. Use for a quick health check of messaging volume and delivery rates. Errors: NO_ACTIVE_CUSTOMER/UNAUTHORIZED (401).
Inputs: no named parameters.
msg_get_throughput_estimateGet throughput estimateARead-onlyIdempotent
Estimate messaging throughput (messages/sec, daily cap) and get a recommendation for a brand given its trust score and vetting status. Use after msg_get_brand (which includes the trust score) to understand sending capacity and whether external vetting would help. Errors: MISSING_PARAM/INVALID_PARAM (400).
Inputs: trust_score (required), vetted.
msg_get_use_case_requirementsGet use case requirementsARead-onlyIdempotent
Get the submission requirements for a specific 10DLC campaign use case: required sample-message count, opt-in rules, approval difficulty, and notes. Use before msg_create_campaign to build a compliant submission. Errors: MISSING_PARAM/INVALID_USE_CASE (400).
Inputs: use_case (required).
msg_link_brandLink existing TCR brandA
Link a brand that already exists at TCR (registered elsewhere) into this account, instead of creating a new one with msg_create_brand. Use msg_lookup_brand first to verify the TCR brand ID. Errors: INVALID_PAYLOAD (400), TNIQ_ERROR (502).
Inputs: tcr_brand_id (required).
msg_link_campaignLink existing TCR campaignA
Link a campaign that already exists at TCR (registered elsewhere) into this account, instead of creating a new one with msg_create_campaign. Use msg_lookup_campaign first to verify the TCR campaign ID. Errors: INVALID_PAYLOAD (400), TNIQ_ERROR (502).
Inputs: tcr_campaign_id (required).
msg_listList messagesARead-onlyIdempotent
List your SMS/MMS messages (inbound and outbound), most recent first, optionally filtered by direction or delivery status. Use to review message history or check recent delivery outcomes; for a single message use msg_get, for aggregate counts use msg_get_stats. Errors: NO_ACTIVE_CUSTOMER/UNAUTHORIZED (401).
Inputs: page, status, per_page, direction.
msg_list_brandsList 10DLC brandsARead-onlyIdempotent
List your registered 10DLC brands (snake_case TCR brand objects). A brand is step 1 of the 10DLC flow (create brand → create campaign → assign numbers); use this to find an existing brand before creating campaigns.
Inputs: page, per_page.
msg_list_campaign_numbersList campaign numbersARead-onlyIdempotent
List the telephone numbers attached to one of your 10DLC campaigns. Use to verify which numbers can send under a campaign; for account-wide messaging status of every DID use msg_list_numbers. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required), page, per_page.
msg_list_campaignsList 10DLC campaignsARead-onlyIdempotent
List your 10DLC campaigns (snake_case TCR campaign objects), optionally filtered by parent brand. A number must be attached to an approved campaign (msg_assign_numbers) before msg_send will accept it as a from number.
Inputs: page, brand_id, per_page.
msg_list_carriersList mobile carriers (MNOs)ARead-onlyIdempotent
List the mobile network operators (MNOs) relevant to 10DLC registration (AT&T, T-Mobile, Verizon, etc.). Reference data for interpreting msg_get_mno_status results.
Inputs: no named parameters.
msg_list_dcasList connectivity partners (DCAs/CNPs)ARead-onlyIdempotent
List the Direct Connect Aggregators / connectivity partners (CNPs) that WARP elects against (only the common ones, not the full upstream list). Use before msg_elect_cnp to pick a partner.
Inputs: no named parameters.
msg_list_entity_typesList brand entity typesARead-onlyIdempotent
List the valid 10DLC brand entity types (e.g. PRIVATE_PROFIT, NON_PROFIT). Reference data — check before msg_create_brand.
Inputs: no named parameters.
msg_list_numbersList messaging-enabled numbersARead-onlyIdempotent
List every active DID you own joined to its messaging association: attached campaign/brand, messaging status, MMS enablement, and whether a per-TN inbound webhook is configured (has_webhook). Use to check which numbers are ready to send with msg_send or still need msg_assign_numbers. Errors: NO_ACTIVE_CUSTOMER/UNAUTHORIZED (401).
Inputs: no named parameters.
msg_list_use_casesList campaign use casesARead-onlyIdempotent
List the valid 10DLC campaign use cases (e.g. MARKETING, 2FA). Reference data — check before msg_create_campaign, then fetch details with msg_get_use_case_requirements.
Inputs: no named parameters.
msg_list_verticalsList industry verticalsARead-onlyIdempotent
List the valid 10DLC brand industry verticals. Reference data — check before msg_create_brand or msg_update_brand.
Inputs: no named parameters.
msg_lookup_brandLook up TCR brandARead-onlyIdempotent
Read brand details directly from TCR by TCR brand ID, without requiring the brand to be registered in this account. Use before msg_link_brand to verify a brand exists. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: tcr_brand_id (required).
msg_lookup_campaignLook up TCR campaignARead-onlyIdempotent
Read campaign details directly from TCR by TCR campaign ID, without requiring the campaign to be registered in this account. Use before msg_link_campaign to verify a campaign exists. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: tcr_campaign_id (required).
msg_nudge_cnpNudge connectivity partnerA
Prompt the elected Connectivity Partner to re-review a campaign that is stuck in review. Use when msg_get_sharing_status shows a pending CNP review for too long. Returns 202 Accepted with no body. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required).
msg_remove_numbersDetach numbers from campaignADestructive
Detach telephone numbers from one of your 10DLC campaigns — those numbers can no longer send SMS until re-attached to an approved campaign. Returns per-TN removed/failed lists (failure reasons: not_found, not_owned, lookup_error, write_error); the response is NOT wrapped in the standard envelope. Errors: INVALID_PAYLOAD (400), NOT_FOUND (404, campaign not owned), TNIQ_ERROR (502).
Inputs: id (required), phone_numbers (required).
msg_resubmit_campaignResubmit 10DLC campaignAIdempotent
Resubmit a 10DLC campaign for carrier review, typically after fixing rejection reasons with msg_update_campaign. Check current per-carrier status with msg_get_mno_status first. Errors: NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required).
msg_sendSend an SMS messageA
SENDS A REAL SMS TEXT MESSAGE to a real phone number — the recipient's device will receive it immediately; there is no test/sandbox mode, so confirm the destination and body before calling. The from number must be assigned to your account AND enrolled in an approved 10DLC campaign (register via msg_create_brand → msg_create_campaign → msg_assign_numbers), otherwise the request is rejected. Errors: INVALID_PAYLOAD/MISSING_PARAM/INVALID_TO (400), NO_ACTIVE_CUSTOMER/UNAUTHORIZED (401), FROM_* rejections for unenrolled numbers.
Inputs: to (required), body (required), from (required), idempotency_key, +1 more.
msg_update_brandUpdate 10DLC brandAIdempotent
Full replace (PUT) of one of your 10DLC brands — supply the complete brand object, not just changed fields. Use to correct brand identity details, which may trigger TCR re-verification. Errors: INVALID_PAYLOAD (400), NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required), ein, city, email, +19 more.
msg_update_campaignUpdate 10DLC campaignAIdempotent
Update (PUT) one of your 10DLC campaigns — e.g. fix sample messages or opt-in flow after a carrier rejection, then resubmit with msg_resubmit_campaign. Errors: INVALID_PAYLOAD (400), NOT_FOUND (404), TNIQ_ERROR (502).
Inputs: id (required), sample1, sample2, sample3, +24 more.
net_get_ingress_ipsGet WARP SIP ingress serversARead-onlyIdempotent
Get the customer-facing WARP SIP edge servers (UDP/TCP/TLS hosts, IPs, ports) to point a trunk or PBX at. Use when configuring SIP endpoints or firewall rules toward WARP.
Inputs: no named parameters.
net_get_vendor_ipsGet WARP origination IPsARead-onlyIdempotent
Get the WARP egress/origination IPs you must allowlist in your firewall for symmetric SIP signaling. Use when inbound calls from WARP are being blocked or when setting up a new network edge.
Inputs: no named parameters.
num_bulk_orderBulk order (assign) numbersA
Procure and assign up to 200 telephone numbers in one idempotent batch. THIS COSTS MONEY — each number incurs purchase and recurring charges, so confirm the list with the user first. Requires a UUID idempotency key (reused as procurement_request_id); reuse the same key to safely retry. Per-TN failures do not abort the batch. Find candidates with num_search; for a single number use num_order; to route many held numbers to a trunk use num_bulk_route. Errors: INVALID_REQUEST, MISSING_IDEMPOTENCY_KEY, INVALID_IDEMPOTENCY_KEY, TRUNK_UNOWNED (whole-request 403 on default_trunk_id).
Inputs: tns (required), idempotency_key (required), note, tn_metadata, +2 more.
num_bulk_routeBulk route numbers to a trunkAIdempotent
Assign up to 200 HELD numbers you already own to a single voice trunk-group in one request (idempotent at the SQL level). Use after num_bulk_order to bring purchased numbers into service, or to re-home existing numbers. For per-number routing details use num_update_voice. Errors: INVALID_REQUEST, TRUNK_UNOWNED (whole-request 403).
Inputs: tns (required), trunk_id (required).
num_delete_sms_configClear SMS configurationADestructive
Remove the SMS usage row from a number you own, disabling SMS on it. To change SMS settings instead of removing them, use num_update_sms. Errors: TN_NOT_OWNED.
Inputs: tn (required).
num_delete_voice_configClear voice configurationADestructive
Remove the voice usage row from a number you own, DISABLING voice routing on it (inbound calls will stop routing). To change routing instead of removing it, use num_update_voice. Errors: TN_NOT_OWNED.
Inputs: tn (required).
num_getGet a numberARead-onlyIdempotent
Get one telephone number you own, including its voice and SMS usage configuration. Use after num_list to inspect a specific TN before updating it with num_update_voice, num_update_sms, or num_update_metadata.
Inputs: tn (required).
num_get_port_out_pinGet port-out PIN statusARead-onlyIdempotent
Check whether a port-out PIN is set on a number you own, and if verification attempts locked it out, when the lock expires (locked_until). The PIN itself is never returned. Set a PIN with num_set_port_out_pin; clear it with num_remove_port_out_pin. Errors: TN_NOT_OWNED.
Inputs: tn (required).
num_listList your numbersARead-onlyIdempotent
List the telephone numbers you own, with each number's voice/SMS configuration state. Use to browse or audit your DID/TFN inventory; filter by status, type, search text, or configuration flags. To find NEW purchasable numbers use num_search instead; to inspect one owned number use num_get.
Inputs: page, size, type, search, +3 more.
num_orderOrder (assign) a numberA
Procure a telephone number from upstream inventory and assign it to your account. THIS COSTS MONEY — ordering a number incurs purchase and recurring charges, so confirm the TN with the user first. Find candidates with num_search; after ordering, configure it with num_update_voice / num_update_sms. For up to 200 numbers at once use num_bulk_order. Errors: TN_ALREADY_ASSIGNED, TN_UNAVAILABLE, TNIQ_UPSTREAM_ERROR.
Inputs: tn (required), description, friendly_name.
num_releaseRelease a numberADestructive
Release a telephone number you own back to inventory. IRREVERSIBLE from your account's perspective — the number leaves your inventory and may be picked up by others, so confirm with the user first. Errors: TN_NOT_OWNED, POI_LOCKED (number is a POI fallback ANI), TNIQ_UPSTREAM_ERROR.
Inputs: tn (required), reason.
num_remove_port_out_pinClear port-out PINBDestructive
Clear the port-out PIN on a number you own (idempotent), removing PIN protection against port-outs. Requires step-up MFA. Returns 204 No Content on success. Check state with num_get_port_out_pin; set a new PIN with num_set_port_out_pin. Errors: TN_NOT_OWNED.
Inputs: tn (required).
num_searchSearch available numbersARead-onlyIdempotent
Search upstream inventory for PURCHASABLE telephone numbers by area code, rate center, locality, or digit pattern. Returns paginated candidates you do not yet own. Use this before ordering; then buy a candidate with num_order (or many with num_bulk_order). For numbers you already own use num_list.
Inputs: npa, nxx, city, page, +7 more.
num_set_port_out_pinSet port-out PINAIdempotent
Set the customer-chosen 4-10 digit port-out PIN on a number you own (hashed at rest; also resets the failed-attempt lock). Requires step-up MFA on the session. Check current state with num_get_port_out_pin; clear with num_remove_port_out_pin. Errors: INVALID_REQUEST, INVALID_PIN, TN_NOT_OWNED.
Inputs: tn (required), pin (required).
num_update_metadataUpdate number metadataAIdempotent
Update the friendly name and/or description on a number you own. Use to label numbers for humans; for routing/E911/CNAM use num_update_voice, for messaging use num_update_sms. Errors: INVALID_REQUEST, TN_NOT_OWNED.
Inputs: tn (required), description, friendly_name.
num_update_smsUpdate SMS configurationAIdempotent
Update the customer-owned SMS fields on a number you own: inbound webhook URL/secret, fallback URL, and MMS toggle. Requests containing tniq-owned fields are rejected. To remove SMS entirely use num_delete_sms_config. Errors: INVALID_REQUEST, TN_NOT_OWNED.
Inputs: tn (required), mms_enabled, inbound_webhook_url, fallback_inbound_url, +1 more.
num_update_voiceUpdate voice configurationAIdempotent
Set or update the voice routing, E911, and CNAM configuration on a number you own. Use after ordering a number (num_order) to bring it into voice service, or to change routing later. To disable voice entirely use num_delete_voice_config; to route many numbers to one trunk use num_bulk_route. Errors: INVALID_REQUEST, TN_NOT_OWNED.
Inputs: tn (required), trunk_id, cnam_enabled, e911_enabled, +5 more.
port_activateActivate ported numbersA
Activate numbers that have reached FOC (the final step of the port-in lifecycle). Gated on the project being activatable — check port_get_progress first. Requires step-up MFA. To have this happen automatically instead, use port_set_auto_activation. Errors: NOT_FOUND, CONFLICT (not activatable), TNIQ_ERROR.
Inputs: id (required).
port_add_noteAdd a port-in noteA
Add a note to the port request. visibility="internal" is operator-only (customers get FORBIDDEN); customers may only post "customer" notes. Read notes with port_list_notes. Errors: INVALID_PAYLOAD, FORBIDDEN, NOT_FOUND, INTERNAL_ERROR.
Inputs: id (required), body (required), visibility.
port_add_tnsAdd TNs to a port-in requestA
Normalise a free-form TN list and upload it to the draft port request's TNIQ project. Step 2 of the port-in lifecycle, after port_create_request and before port_set_group_details / port_validate_request. Errors: INVALID_PAYLOAD, VALIDATION_ERROR, NOT_FOUND, TNIQ_ERROR.
Inputs: id (required), tns (required).
port_auto_fixAuto-fix port-in errorsA
Apply TNIQ auto-fixes to the project, optionally scoped to one error group (from port_get_error_groups) or a TN subset. After fixing, run port_revalidate_tns or port_resubmit_request as appropriate. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required), tns, error_group_id.
port_cancel_requestCancel a port-in requestADestructive
Cancel a submitted port. Gated on the project being cancellable — a CONFLICT is returned otherwise. For unsubmitted drafts use port_delete_draft instead. Requires step-up MFA. Errors: NOT_FOUND, CONFLICT, TNIQ_ERROR.
Inputs: id (required).
port_create_requestCreate a port-in draftA
Create a draft port-in request (TNIQ project + WARP mirror row). This is step 1 of the port-in lifecycle: create draft → port_add_tns → port_set_group_details → port_validate_request → port_generate_loa → port_submit_request → track with port_get_progress → port_activate. Run port_preview first to check portability. Errors: NO_ACTIVE_CUSTOMER, INVALID_PAYLOAD, TNIQ_ERROR, INTERNAL_ERROR, GATEWAY_UNAVAILABLE.
Inputs: name, desired_due_date.
port_delete_documentDelete a port documentADestructive
Delete a document from the port project. Get document IDs from port_list_documents. Deleting a group's only current LOA will re-block port_submit_request for that group. Errors: NOT_FOUND, TNIQ_VALIDATION, TNIQ_ERROR.
Inputs: id (required), doc_id (required).
port_delete_draftDelete a port-in draftADestructive
Delete a pre-submission draft port request (TNIQ project + WARP mirror row). Only allowed in states with zero submitted TNs — after submission use port_cancel_request instead. Requires step-up MFA. Errors: NOT_FOUND, CONFLICT (already submitted), TNIQ_ERROR, INTERNAL_ERROR.
Inputs: id (required).
port_download_documentDownload a port documentARead-onlyIdempotent
Download one port document's raw bytes (Content-Type mirrors the stored document). Get document IDs from port_list_documents. Note: binary content (e.g. PDF) is returned inline and may not be readable as text. Errors (JSON): NOT_FOUND, TNIQ_VALIDATION, TNIQ_ERROR.
Inputs: id (required), doc_id (required).
port_execute_transferExecute an on-net transferA
Transfer on-net numbers between WARP tenants without an NPAC port. Each item authorizes with the current owner's port-out PIN; items succeed or fail INDEPENDENTLY within an HTTP 200 response — check per-TN results. Per-TN failure reasons: not_in_warp_inventory, already_yours, poi_locked, invalid_pin, pin_locked, lookup_failed, transfer_failed, invalid_tn. Preview eligibility first with port_preview_transfer. Requires step-up MFA. Errors: NO_ACTIVE_CUSTOMER, INVALID_PAYLOAD.
Inputs: items (required).
port_generate_loaGenerate a Letter of AuthorizationA
Render a WARP-branded LOA PDF for one off-net SPID group and upload it to the project, superseding prior LOAs for that group. Only valid BEFORE the port is submitted; every off-net group needs a current LOA before port_submit_request will succeed. Requires attestation=true plus all authorizing-party, losing-carrier, and signer fields. Requires step-up MFA. Alternatively upload an existing signed LOA with port_upload_document. Errors: INVALID_PAYLOAD (error.details.fields lists missing fields), INVALID_PARAM, CONFLICT (already submitted), TNIQ_ERROR, INTERNAL_ERROR, GATEWAY_UNAVAILABLE.
Inputs: id (required), spid (required), attestation (required), signer, +2 more.
port_get_error_groupsGet port-in error groupsARead-onlyIdempotent
Get the TNIQ validation/port error groups for the project. Use after port_validate_request or a rejected submission to see what's blocking the port, then resolve with port_auto_fix (pass an error_group_id) or port_set_group_details. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required).
port_get_historyGet port-in audit historyARead-onlyIdempotent
Get the audit timeline for the port request (tenant-scoped, newest-first). Use to see who did what and when — submissions, cancels, document uploads, state changes. Errors: NOT_FOUND, INTERNAL_ERROR.
Inputs: id (required).
port_get_progressGet port-in progressARead-onlyIdempotent
Get the live TNIQ progress snapshot for the port project. Use to track a submitted port (per-TN states, FOC readiness) and to check whether it is activatable before port_activate. For aggregate counts use port_get_statistics. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required).
port_get_requestGet a port-in requestARead-onlyIdempotent
Get one port-in request: the WARP mirror row, the live TNIQ project, and per-SPID grouped TN details. Also reconciles any ACTIVATED TNs into inventory (idempotent). Use this as the primary status view for a port; for the lighter progress snapshot use port_get_progress. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, CONFLICT.
Inputs: id (required).
port_get_statisticsGet port-in statisticsARead-onlyIdempotent
Get the live TNIQ statistics for the port project (also opportunistically refreshes the WARP snapshot). Use for aggregate TN state counts; for per-TN detail use port_get_progress. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required).
port_list_documentsList port documentsARead-onlyIdempotent
List the port project's documents (LOAs, bills, CSRs, etc.), optionally filtered by doc_type or TN. signer_ip is present only for operator callers. Use to verify LOA coverage before port_submit_request. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required), tn, doc_type.
port_list_notesList port-in notesARead-onlyIdempotent
List the port request's notes. Operators also see internal notes; customers see only customer-visibility notes. Add notes with port_add_note. Errors: NOT_FOUND, INTERNAL_ERROR.
Inputs: id (required).
port_list_requestsList port-in requestsARead-onlyIdempotent
List the active customer's port-in requests, most-recent first. Use to find an existing port request's UUID before calling port_get_request or any other per-request tool. Errors: NO_ACTIVE_CUSTOMER, INTERNAL_ERROR.
Inputs: no named parameters.
port_lookup_company_detailsLookup company details by name and addressARead-onlyIdempotent
Retrieve detailed company information from TinComply by company name and optional address. Used during the port-in flow for entity verification (e.g. before drafting an LOA). See also port_lookup_ein (by EIN) and port_verify_tin_name (TIN/name match). Errors: INVALID_REQUEST, COMPANY_NAME_REQUIRED, TINCOMPLY_ERROR, LOOKUP_FAILED.
Inputs: company_name (required), city, state, street, +1 more.
port_lookup_einLookup company by EINARead-onlyIdempotent
Retrieve company information from TinComply by EIN/Tax ID. Used during the port-in flow for entity verification. Validate the format first with port_validate_ein_format if unsure. Errors: EIN_REQUIRED, INVALID_EIN, TINCOMPLY_ERROR, LOOKUP_FAILED.
Inputs: ein (required).
port_previewPreview a port-inARead-onlyIdempotent
Run an instant Telique-backed portability preview for a free-form list of TNs, grouped by current losing-carrier SPID. No project is created — use this BEFORE port_create_request to see which carriers hold the numbers and whether they are portable. For numbers already on-net (WARP-to-WARP), use port_preview_transfer instead. Errors: NO_ACTIVE_CUSTOMER, INVALID_PAYLOAD, VALIDATION_ERROR, GATEWAY_UNAVAILABLE.
Inputs: tns (required).
port_preview_transferPreview an on-net transferARead-onlyIdempotent
For a free-form TN list, report which numbers are on-net (an active WARP assignment) and eligible for on-net transfer between WARP tenants (no NPAC port needed). The owning customer's BAN is masked. Per-TN ineligibility reasons: not_in_warp_inventory, already_yours, poi_locked, lookup_failed. Use before port_execute_transfer; for off-net numbers use port_preview instead. Errors: NO_ACTIVE_CUSTOMER, INVALID_PAYLOAD, VALIDATION_ERROR.
Inputs: tns (required).
port_resubmit_requestResubmit a port-in requestA
Resubmit a port that is in an error/rejection/exception state (e.g. after fixing issues with port_auto_fix or port_set_group_details). Only valid from those states — a CONFLICT is returned otherwise. Errors: NOT_FOUND, CONFLICT, TNIQ_ERROR.
Inputs: id (required).
port_revalidate_tnsRevalidate selected port-in TNsA
Send a REVALIDATE bulk action for selected (or all) TNs in the port request. Use after fixing individual TN errors when you don't need the full re-validation of port_validate_request. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required), tns.
port_set_auto_activationSet auto-activation policyAIdempotent
Update the port project's auto-activation mode so numbers activate without a manual port_activate call. Modes: DISABLED (manual only), ASAP (activate as soon as FOC is reached), SCHEDULED (activate at scheduled_at, which is required for that mode). Errors: INVALID_PAYLOAD, NOT_FOUND, TNIQ_ERROR.
Inputs: id (required), mode (required), scheduled_at.
port_set_group_detailsApply carrier-group detailsAIdempotent
Apply losing-carrier account details (account number, BTN, PIN, service address, names) to EVERY TN in one SPID group. Group membership is recomputed from live TNIQ details, not client-supplied. Get SPID groups from port_get_request; run before port_validate_request. Errors: INVALID_PAYLOAD, INVALID_PARAM, NOT_FOUND, TNIQ_ERROR.
Inputs: id (required), spid (required), btn, pin, +4 more.
port_submit_requestSubmit a port-in requestA
Submit the port to NPAC. Gated on (1) every off-net SPID group having a current LOA (generate one with port_generate_loa or upload with port_upload_document) and (2) the project being submittable (validate first with port_validate_request). Requires step-up MFA. On the LOA gate a 409 CONFLICT is returned whose error.details has reason="loa_required" and groups=[{spid, tn_count, reason: "missing"|"stale"}]; other 409s carry error.details.reason from the submit blocker. After submitting, track with port_get_progress and port_get_statistics. Errors: NOT_FOUND, CONFLICT, TNIQ_ERROR.
Inputs: id (required).
port_supplement_due_dateSupplement the due dateA
Change the desired due date of a submitted port (SUP_DDD), optionally for a subset of TNs. Only valid before activation — a CONFLICT is returned otherwise. Errors: INVALID_PAYLOAD, NOT_FOUND, CONFLICT, TNIQ_ERROR.
Inputs: id (required), new_ddd (required), tns.
port_upload_documentUpload a port documentA
Upload a supporting document (LOA, bill copy, CSR, or other; max 25MB) to the port's TNIQ project from a local file. Use for a customer-signed LOA or supporting evidence; to have WARP generate the LOA instead, use port_generate_loa. Errors: INVALID_PAYLOAD, NOT_FOUND, TNIQ_VALIDATION, TNIQ_ERROR.
Inputs: id (required), doc_type (required), file_path (required).
port_validate_ein_formatValidate EIN formatARead-onlyIdempotent
Check whether an EIN is well-formed (9 digits) WITHOUT calling the external TinComply API. Use as a cheap pre-check before port_lookup_ein or port_verify_tin_name. Errors: EIN_REQUIRED.
Inputs: ein (required).
port_validate_requestValidate a port-in requestA
Trigger a TNIQ-side re-validation of ALL TNs in the port request. Run after adding TNs (port_add_tns) and applying carrier details (port_set_group_details), then inspect failures via port_get_error_groups and fix them with port_auto_fix. To revalidate only a subset of TNs use port_revalidate_tns. Errors: NOT_FOUND, TNIQ_ERROR.
Inputs: id (required).
port_verify_tin_nameVerify TIN and company name matchARead-onlyIdempotent
Verify that a TIN matches the provided company name via IRS TIN-Name matching. Used during the port-in flow to confirm the authorizing entity before submission. See also port_lookup_ein and port_lookup_company_details. Errors: INVALID_REQUEST, INVALID_TIN, COMPANY_NAME_REQUIRED, TINCOMPLY_ERROR, VERIFICATION_FAILED.
Inputs: tin (required), company_name (required).
team_create_roleCreate a custom roleA
Create a customer-owned role with the given scope set. Scopes must exist in the platform registry (discover them with acct_list_scopes), be non-superadmin, and be held by the caller (no privilege escalation). To start from an existing role's scopes instead, use team_duplicate_role. Requires the team:write scope.
Inputs: name (required), scopes (required), customer_id (required), display_name (required), +1 more.
team_delete_roleDelete a custom roleADestructive
Permanently delete a customer-owned role. HIGH IMPACT and irreversible. Fails when the role is still assigned to any user (reassign members via team_update_member_role first) or when it is a system role. Requires the team:write scope.
Inputs: role_id (required), customer_id (required).
team_duplicate_roleDuplicate a roleA
Create a new customer-owned role copying the source role's scope set (the source may be a system role). Useful for customizing a system role: duplicate it, then adjust scopes with team_update_role. The caller must hold every copied scope. Requires the team:write scope.
Inputs: name (required), role_id (required), customer_id (required), display_name (required), +1 more.
team_get_roleGet a roleARead-onlyIdempotent
Get one role (system or customer-owned) with its full scope list. Use to inspect exactly what a role grants before assigning it (team_update_member_role) or editing it (team_update_role). Requires the team:read scope.
Inputs: role_id (required), customer_id (required).
team_list_membersList team membersARead-onlyIdempotent
List every user holding a role in this customer, alphabetical by email. Use to see who is on the team and which role each member holds, or to find a user UUID for team_update_member_role / team_remove_member. Requires the team:read scope.
Inputs: customer_id (required).
team_list_rolesList rolesARead-onlyIdempotent
List the system roles plus this customer's custom roles. Use to find a role UUID for team_update_member_role, team_get_role, team_update_role, team_duplicate_role, or team_delete_role. Requires the team:read scope.
Inputs: customer_id (required).
team_remove_memberRemove a team memberADestructive
Remove a user's membership (role assignment) from this customer. HIGH IMPACT: the user immediately loses access and all their sessions are invalidated. You cannot remove yourself. Find the user UUID via team_list_members first. To change a member's permissions instead of removing them, use team_update_member_role. Requires the team:write scope.
Inputs: user_id (required), customer_id (required).
team_update_member_roleSet a member's roleAIdempotent
Assign a role (system or customer-owned, never superadmin) to a member of this customer, replacing their current role. The caller must hold every scope the role grants (no privilege escalation). Find user UUIDs via team_list_members and role UUIDs via team_list_roles. Requires the team:write scope.
Inputs: role_id (required), user_id (required), customer_id (required).
team_update_roleUpdate a custom roleAIdempotent
Update the display name, description, and/or scope set of a customer-owned role. System roles are immutable. HIGH IMPACT when changing scopes: session invalidation fans out to every user holding the role. Only provided fields are changed. Use acct_list_scopes to discover valid scopes. Requires the team:write scope.
Inputs: role_id (required), customer_id (required), scopes, description, +1 more.
trunk_add_ip_aclAdd a trunk IP ACL entryA
Add an IP/netmask to an owned trunk's ACL and sync it to Kamailio, allowing that source IP to send calls. The trunk's auth_type should include IP_ACL (IP_ACL, EITHER, or BOTH — check with trunk_get). Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INVALID_PAYLOAD, INTERNAL_ERROR.
Inputs: ip (required), trunk_id (required), enabled, netmask, +1 more.
trunk_createCreate a trunkA
Create a new trunk group on your account. Enforces your account's allowed number-classes and per-direction capacity ceilings (check acct_get_capacity first). Note: a capacity of 0 means 'direction disabled' — calls in that direction are rejected with 503 + Retry-After. Errors: NO_ACTIVE_CUSTOMER, INVALID_PAYLOAD, VALIDATION_ERROR, INTERNAL_ERROR.
Inputs: name (required), auth_type (required), sip_config, description, +5 more.
trunk_create_credentialCreate a SIP credentialA
Create a SIP Digest credential on an owned trunk. The trunk's auth_type must be DIGEST, EITHER, or BOTH (check with trunk_get). The plaintext password is returned exactly once — save it immediately. Step-up MFA required. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, VALIDATION_ERROR, INVALID_PAYLOAD, CONFLICT, INTERNAL_ERROR.
Inputs: trunk_id (required), username (required).
trunk_create_endpointCreate a trunk endpointA
Add a dispatcher endpoint (SIP destination) to an owned trunk, either as structured host/port/transport or as a raw_uri. Returns HTTP 207 with a warning when the Kamailio sync is deferred. Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INVALID_PAYLOAD, VALIDATION_ERROR, INTERNAL_ERROR.
Inputs: trunk_id (required), host, port, weight, +5 more.
trunk_deleteDelete a trunkADestructive
Delete an owned trunk. Rejected with CONFLICT when the trunk has live calls (drain first — check trunk_get_throttle_state) or is referenced by CDRs (disable it via trunk_update instead). Run trunk_get_cascade_preview first to see what will be removed. Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, CONFLICT, INTERNAL_ERROR.
Inputs: trunk_id (required).
trunk_delete_credentialDelete a SIP credentialADestructive
Delete a SIP credential and cascade removal from Redis + Kamailio usrloc. Idempotent (returns 204 when already gone). Use trunk_list_credentials first to find the credential id. Step-up MFA required. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, NOT_FOUND, INTERNAL_ERROR.
Inputs: cred_id (required), trunk_id (required).
trunk_delete_endpointDelete a trunk endpointADestructive
Remove a dispatcher endpoint from an owned trunk and drop it from Kamailio. Use trunk_list_endpoints first to find the endpoint id. Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INTERNAL_ERROR.
Inputs: trunk_id (required), endpoint_id (required).
trunk_delete_ip_aclDelete a trunk IP ACL entryADestructive
Remove an IP ACL entry from an owned trunk; that source IP can no longer send calls via IP auth. Use trunk_list_ips first to find the ip_id. Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INTERNAL_ERROR.
Inputs: ip_id (required), trunk_id (required).
trunk_getGet a trunkARead-onlyIdempotent
Get one trunk group you own, including its IP ACL entries. Use trunk_list first to find the trunk id. Errors: UNAUTHORIZED, INVALID_ID, NOT_FOUND.
Inputs: trunk_id (required).
trunk_get_cascade_previewPreview trunk deletion cascadeARead-onlyIdempotent
Get per-trunk cascade-preview counts (src_ips, tns_routed_here, active_calls, cdr_count) for an owned trunk. Use before trunk_delete to see what would be affected; active_calls is read live from Redis. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INTERNAL_ERROR.
Inputs: trunk_id (required).
trunk_get_endpointGet a trunk endpointARead-onlyIdempotent
Get one dispatcher endpoint on an owned trunk. Use trunk_list_endpoints first to find the endpoint id. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INTERNAL_ERROR.
Inputs: trunk_id (required), endpoint_id (required).
trunk_get_throttle_stateGet trunk live throttle stateARead-onlyIdempotent
Get an owned trunk's configured capacity plus live CPS/channel counters. Use to check current load before draining, deleting, or resizing a trunk. On a Redis read failure the counters are null and counters_available=false (still HTTP 200). Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, NOT_FOUND.
Inputs: trunk_id (required).
trunk_listList my trunksARead-onlyIdempotent
List all of your trunk groups, each with its IP ACL entries. Use this first to find a trunk_id for the other trunk_* tools. Errors: UNAUTHORIZED, INTERNAL_ERROR.
Inputs: no named parameters.
trunk_list_credential_callsList a credential's active callsARead-onlyIdempotent
List active SIP dialogs for a credential's AOR. Note: the dialog-tracking store is not yet live, so this currently returns an empty array. Use trunk_list_credentials first to find the credential id. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, NOT_FOUND, INTERNAL_ERROR.
Inputs: cred_id (required), trunk_id (required).
trunk_list_credential_registrationsList a credential's live registrationsARead-onlyIdempotent
List the current Kamailio usrloc bindings (live SIP registrations) for a credential's AOR. Use to see which devices are registered, or to find a contact_id for trunk_revoke_registration. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, NOT_FOUND, GATEWAY_UNAVAILABLE.
Inputs: cred_id (required), trunk_id (required).
trunk_list_credentialsList SIP credentialsARead-onlyIdempotent
List SIP Digest credentials for an owned trunk (no HA1, no password), each enriched with live registration_count and active_call_count. Use trunk_list first to find the trunk id. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, INTERNAL_ERROR.
Inputs: trunk_id (required).
trunk_list_endpointsList trunk endpointsARead-onlyIdempotent
List the dispatcher endpoints (SIP destinations WARP delivers calls to) for an owned trunk. Use trunk_list first to find the trunk id. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INTERNAL_ERROR.
Inputs: trunk_id (required).
trunk_list_ipsList trunk IP ACL entriesARead-onlyIdempotent
List all IP ACL entries for an owned trunk. Use to audit which source IPs may send calls, or to find an ip_id for trunk_update_ip_acl / trunk_delete_ip_acl. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INTERNAL_ERROR.
Inputs: trunk_id (required).
trunk_revoke_registrationRevoke a single SIP registrationADestructive
Evict one SIP contact binding from Kamailio usrloc for a credential's AOR. Use trunk_list_credential_registrations first to find the contact_id. Step-up MFA required. Errors: INVALID_ID, MISSING_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, NOT_FOUND, GATEWAY_UNAVAILABLE.
Inputs: cred_id (required), trunk_id (required), contact_id (required).
trunk_rotate_credentialRotate a SIP credential's passwordADestructive
Generate a new password + HA1 for a SIP credential (username and realm unchanged). The old password stops working immediately and the new plaintext password is returned exactly once — save it immediately. Step-up MFA required. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, NOT_FOUND, INTERNAL_ERROR.
Inputs: cred_id (required), trunk_id (required).
trunk_updateUpdate a trunkAIdempotent
Update an owned trunk's settings (name, auth type, capacities, SIP config). The trunk being updated is excluded from the account capacity-sum check. POI assignment is silently ignored (admin-only). Step-up MFA required. Use trunk_list first to find the trunk id. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INVALID_PAYLOAD, VALIDATION_ERROR, INTERNAL_ERROR.
Inputs: trunk_id (required), name, auth_type, sip_config, +6 more.
trunk_update_credentialEnable or disable a SIP credentialAIdempotent
Toggle a SIP credential's enabled flag. Disabling drops the Redis HA1 + AOR and tears down active registrations (in-progress dialogs are NOT terminated); enabling restores them. Use trunk_list_credentials first to find the credential id. Step-up MFA required. Errors: INVALID_ID, NO_ACTIVE_CUSTOMER, TRUNK_UNOWNED, INVALID_PAYLOAD, NOT_FOUND, INTERNAL_ERROR.
Inputs: cred_id (required), trunk_id (required), enabled.
trunk_update_endpointUpdate a trunk endpointAIdempotent
Update a dispatcher endpoint on an owned trunk (structured host/port/transport fields or a raw_uri). Returns HTTP 207 with a warning when the Kamailio sync is deferred. Use trunk_list_endpoints first to find the endpoint id. Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INVALID_PAYLOAD, VALIDATION_ERROR, INTERNAL_ERROR.
Inputs: trunk_id (required), endpoint_id (required), host, port, +6 more.
trunk_update_ip_aclUpdate a trunk IP ACL entryAIdempotent
Update the description and/or enabled flag of an owned trunk's IP ACL entry. Use trunk_list_ips first to find the ip_id. Step-up MFA required. Errors: NO_ACTIVE_CUSTOMER, INVALID_ID, NOT_FOUND, INVALID_PAYLOAD, INTERNAL_ERROR.
Inputs: ip_id (required), trunk_id (required), enabled, description.
warp_statusWARP MCP statusARead-onlyIdempotent
Check warp-mcp configuration and API connectivity. Use this first when any other tool returns an auth error, or to confirm the server is set up correctly. Reports the server version, API base URL, whether an API key is configured, and whether the API accepts it.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
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.
Maintenance
Related MCP Connectors
ORDan's MCP server: calls, SMS and phone numbers for AI agents, under their owner's spend controls
Give AI agents real phone numbers, messages, and voice calls via MCP.
Phone, SMS and email for AI agents. One remote MCP endpoint, OAuth login, zero install.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for provisioning dedicated real-SIM US phone numbers, receiving inbound SMS, and extracting OTP codes. Built for AI agents automating phone verification workflows.12311 npm1MIT
- AlicenseAqualityDmaintenanceMCP server for BubblyPhone that lets AI assistants make real phone calls, manage AI voice agents, buy phone numbers in 30+ countries, and track billing. Supports 20 tools for full telephony control.209 npm1MIT

oitvoip-mcp-serverofficial
AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) server that provides AI agents with seamless access to the NetSapiens VoIP platform for user management, call analytics, and system administration.235MIT
@saperly/mcpofficial
AlicenseNot gradedqualityDmaintenanceMCP server for Saperly that enables AI agents to provision phone numbers, place calls, send SMS, and manage credentials via 36 tools backed by the Saperly API.56 npm3MIT