Skip to main content
Glama
Dialpad MCP server

Dialpad MCP server

Dialpad MCP server

An MCP server for the Dialpad API v2. It lets Claude look up Dialpad users, offices, departments, call centers, call history, transcripts, contacts, phone numbers and analytics exports. It can also make the few changes Cititec's automations already make: contact sync, notification messages, and pausing a call event subscription.

It uses the same framework as Cititec's other MCP servers: TypeScript, @modelcontextprotocol/sdk, a stdio transport and a fail-closed HTTP transport, vitest tests, tsup and a Docker image.

Tools

Reads send GET to a fixed path. IDs are checked and URL-encoded, and no tool accepts a free-form path. List tools return one page with a next_cursor. Each item is trimmed to its main fields (full: true returns every field), and every response is capped at 60,000 characters.

Sensitive tools return personal information (call logs, transcripts, contacts, exports) or internal URLs. Make them available to administrators only.

Tool

Dialpad API

Sensitive

dialpad_get_company

GET /company

dialpad_list_users

GET /users (email, number, name prefix, state, admin)

dialpad_get_user

GET /users/{id}

dialpad_list_offices / dialpad_get_office

GET /offices, /offices/{id}

dialpad_list_departments / dialpad_get_department

GET /departments, /departments/{id}

dialpad_list_callcenters / dialpad_get_callcenter

GET /callcenters, /callcenters/{id}

dialpad_get_callcenter_status

GET /callcenters/{id}/status (live queue status)

dialpad_list_calls

GET /call (start time range, target)

yes

dialpad_get_call

GET /call/{id} (Dialpad allows 10 a minute)

yes

dialpad_get_call_transcript

GET /transcripts/{call_id}

yes

dialpad_list_contacts / dialpad_get_contact

GET /contacts, /contacts/{id}

yes

dialpad_list_numbers / dialpad_get_number

GET /numbers, /numbers/{number} (company admin key)

dialpad_create_stats_export

POST /stats: starts a report job and changes no Dialpad data

yes

dialpad_get_stats_export

GET /stats/{id}: status and download link

yes

dialpad_list_call_subscriptions / dialpad_get_call_subscription

GET /subscriptions/call, /subscriptions/call/{id}

dialpad_list_webhooks

GET /webhooks: the signing secret is never returned

yes

Write tools

Only the changes Cititec's N8N workflows already make are included. Each one is a single request, so on the MCP host the proposal an administrator approves is exactly what is sent.

Tool

Dialpad API

Used by (N8N)

dialpad_create_contact

POST /contacts

Autotask contact sync

dialpad_update_contact

PATCH /contacts/{id}

Autotask contact sync

dialpad_delete_contact

DELETE /contacts/{id} (destructive)

Autotask webhook handler

dialpad_send_sms

POST /sms to a channel or up to 10 numbers

workflow alerts to a Dialpad channel; texts from the call-to-ticket workflow

dialpad_update_call_subscription

PATCH /subscriptions/call/{id} (enabled, call_states only)

call-to-ticket workflow

Not included: calls, call control, users, offices, number assignment, routing and the rest of Dialpad's admin API.

Where the endpoint details come from

Paths, methods, parameters, call states and response fields were checked against Dialpad's OpenAPI spec, dialpad_api_spec.json in dialpad/dialpad-python-sdk (MIT). A few filters appear only on the newer reference at developers.dialpad.com, not in that spec: first_name/last_name for users, name_search for offices, name for contacts and area_code for numbers. Dialpad publishes no official MCP server or TypeScript SDK.

Related MCP server: RBPaaS MCP Server

Authentication

Dialpad uses an API key sent as Authorization: Bearer <key>. Create it in Dialpad under Admin Settings > My Company > Authentication > API keys. The number tools need a company admin key. Dialpad has no read-only keys, so read-only access depends on which tools are exposed, not on the key.

Transport

Where the key comes from

stdio (default)

DIALPAD_API_KEY

HTTP, AUTH_MODE=env

DIALPAD_API_KEY

HTTP, AUTH_MODE=gateway (the image default)

X-Dialpad-Api-Key header on every request; no fallback to the environment

The HTTP transport refuses to start without a real CONDUIT_S2S_SECRET and checks the X-Gateway-S2S header on every /mcp request. MCP_ALLOW_INSECURE_DEV=1 is for local development only: it skips the check and listens on 127.0.0.1. See .env.example.

Rate limits

Dialpad allows 20 requests per second per company, and 1200 per minute on most endpoints. Some limits are lower: call details 10 a minute, contact create 100 a minute, SMS 100 a minute (800 on Tier 1), stats exports about 200 an hour. A 429 is reported as a rate-limit error, not as a bad key.

Running on the Cititec MCP host

The host starts the image over stdio with the service's env file. The host adds the cititec_change_status tool itself and turns write_tools into proposals; this image does neither. Suggested control.json lists:

  • read_tools: every tool in the first table. Admin-gate the sensitive ones by giving them only to users who need call and contact data.

  • write_tools: the five write tools, with a key in the -rw.env file. Leave them out if Claude should only read.

Development

npm ci
npm run lint    # type check
npm run build
npm test

Local run over stdio: DIALPAD_API_KEY=... node dist/index.js.

On Cititec workstations ThreatLocker must allow esbuild.exe (used by tsup and vitest) before build and test run.

License

Apache-2.0. The HTTP transport, gateway check, logger and build setup come from WYRE Technology's unifi-mcp. See NOTICE.

Available Tools

27 tools
dialpad_create_contactB

Create a company-shared Dialpad contact (or a local contact for one user with owner_id). Same fields the N8N Autotask contact sync sends. Proposal: an administrator must approve it before it runs.

Inputs: last_name (required), first_name (required), urls, emails, +5 more.

dialpad_create_stats_exportA
Read-only

Start a Dialpad analytics export (calls, texts, voicemails, recordings, on-duty, CSAT, dispositions) as raw records or summary stats, then poll dialpad_get_stats_export with the returned request_id for the download link. Starts a report job only; changes no Dialpad data. Dialpad allows about 200 per hour. Contains personal information - admin-gated.

Inputs: stat_type (required), export_type (required), group_by, is_today, +6 more.

dialpad_delete_contactA
DestructiveIdempotent

Delete a Dialpad contact (the N8N sync does this when the Autotask contact is deactivated). Cannot be undone. Proposal: an administrator must approve it before it runs.

Inputs: id (required).

dialpad_get_callA
Read-onlyIdempotent

Get one call in detail: timings, routing, recording details, CSAT score and AI transcription text if any. Dialpad allows 10 of these per minute. Contains personal information - admin-gated.

Inputs: id (required).

dialpad_get_callcenterA
Read-onlyIdempotent

Get one call center by ID, including its routing, hours and alert settings.

Inputs: id (required).

dialpad_get_callcenter_statusA
Read-onlyIdempotent

Get live status for one call center: availability, operators on duty, calls waiting and longest wait time.

Inputs: id (required).

dialpad_get_call_subscriptionB
Read-onlyIdempotent

Get one call event subscription by ID.

Inputs: id (required).

dialpad_get_call_transcriptA
Read-onlyIdempotent

Get the Dialpad AI transcript of a call: each line with time, speaker name, type (transcript or moment) and text. Returns up to max_lines lines (default 400). Contains personal information - admin-gated.

Inputs: call_id (required), max_lines.

dialpad_get_companyA
Read-onlyIdempotent

Get the Dialpad company: name, domain, country, account type, office count and AI settings.

Inputs: no named parameters.

dialpad_get_contactA
Read-onlyIdempotent

Get one shared or local contact by ID. Contains personal information - admin-gated.

Inputs: id (required).

dialpad_get_departmentA
Read-onlyIdempotent

Get one department by ID, including its routing and hours settings.

Inputs: id (required).

dialpad_get_numberA
Read-onlyIdempotent

Get one phone number: type, status and assignment. Needs a company admin API key.

Inputs: number (required).

dialpad_get_officeA
Read-onlyIdempotent

Get one Dialpad office by ID, including its settings and numbers.

Inputs: id (required).

dialpad_get_stats_exportA
Read-onlyIdempotent

Check a stats export started with dialpad_create_stats_export: status (processing, complete, failed) and, when complete, a download URL for the CSV. Contains personal information - admin-gated.

Inputs: id (required).

dialpad_get_userA
Read-onlyIdempotent

Get one Dialpad user by ID ('me' for the API key's own user, with a user-level key).

Inputs: id (required).

dialpad_list_callcentersA
Read-onlyIdempotent

List call centers (queues) across the company, optionally for one office.

Inputs: full, cursor, office_id, name_search.

dialpad_list_callsA
Read-onlyIdempotent

List finished calls, newest first: times, direction, duration, internal and external number, contact and target. Filter by start time range and by target (user, office, department, call center...). Returns one page; use next_cursor for more. Contains personal information - admin-gated.

Inputs: full, cursor, target_id, target_type, +2 more.

dialpad_list_call_subscriptionsA
Read-onlyIdempotent

List call event subscriptions (which call states are sent to which webhook, and whether each is enabled). Used by the N8N call-to-ticket workflow.

Inputs: cursor, target_id, target_type.

dialpad_list_contactsA
Read-onlyIdempotent

List company-shared Dialpad contacts (and local contacts with include_local), with name, company, phones and emails. Filter by name. Returns one page; use next_cursor for more. Contains personal information - admin-gated.

Inputs: full, name, cursor, owner_id, +1 more.

dialpad_list_departmentsA
Read-onlyIdempotent

List departments (ring groups) across the company, optionally for one office.

Inputs: full, cursor, office_id, name_search.

dialpad_list_numbersA
Read-onlyIdempotent

List phone numbers in the company with type, status, and what each is assigned to (user, office, department, call center). Needs a company admin API key.

Inputs: full, cursor, status, area_code.

dialpad_list_officesA
Read-onlyIdempotent

List Dialpad offices (sites) with ID, name, state and main numbers.

Inputs: full, cursor, active_only, name_search.

dialpad_list_usersA
Read-onlyIdempotent

List Dialpad users (staff) with name, email, phone numbers, extension, office and state. Filter by email, by phone number, or by first/last name prefix. Defaults to active users.

Inputs: full, email, state, cursor, +4 more.

dialpad_list_webhooksA
Read-onlyIdempotent

List webhook endpoints registered with Dialpad (ID and URL). The signing secret is never returned. Endpoint URLs are internal - admin-gated.

Inputs: cursor.

dialpad_send_smsA

Send a text message, either to a Dialpad channel (channel_hashtag, as the N8N alerts do) or to up to 10 phone numbers. The sender is from_number, user_id or a sender group. Proposal: an administrator must approve it before it is sent.

Inputs: text (required), user_id, to_numbers, from_number, +4 more.

dialpad_update_call_subscriptionA

Turn a call event subscription on or off, or change which call states it sends (the N8N call-to-ticket workflow pauses and resumes its subscription this way). Does not change where events are sent. Proposal: an administrator must approve it before it runs.

Inputs: id (required), enabled, call_states.

dialpad_update_contactB

Update a Dialpad contact. Only the fields given are changed; phones, emails and urls replace the whole list. Proposal: an administrator must approve it before it runs.

Inputs: id (required), urls, emails, phones, +5 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 27 tools

    Disambiguation4/5

    Most tools map cleanly to one resource+action (get_call vs get_call_transcript vs list_calls, create_stats_export vs get_stats_export pairs are obvious). The only soft overlaps are call_subscriptions versus webhooks and get_callcenter vs get_callcenter_status, but the descriptions draw clear lines between them. An agent should rarely misselect here.

    Naming Consistency5/5

    Every tool uses the dialpad_ prefix plus a consistent verb_noun snake_case pattern (get_/list_/create_/update_/delete_/send_). Singular vs plural on get vs list matches the resource cardinality and stays predictable throughout.

    Tool Count3/5

    27 tools is heavy, though the domain (users, offices, departments, call centers, calls, contacts, analytics exports, subscriptions, webhooks, SMS) is genuinely broad so nearly every tool maps to a distinct resource. Still, the surface is large enough that it exceeds a comfortable working set and could be consolidated (e.g. subscriptions/webhooks, callcenter status).

    Completeness4/5

    Read coverage across the platform is thorough and contacts get full CRUD plus SMS send and subscription toggling, so core workflows are supported. Gaps remain: no message/text history listing despite SMS sending, no webhook create/delete, no number assignment/management, and no write operations for users/offices/departments/call centers.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers