Connect your AI Agents to Zoom Phone in minutes

Merge lets you securely connect your agents to Zoom Phone and thousands of tools instantly

Available tools

list_call_logs

List the account's call logs (legacy format), each with caller/callee, direction, duration, result, and a recordingid when recorded. Supports server-side filtering by date range, timestamp type, type, site, path, and charged-only. Use getcalllog for one log's detail, or listcall_history for the newer format.

list_user_call_logs

List one user's call logs, each with caller/callee, direction, duration, result, forwarding, and recording/voicemail flags. Supports server-side filtering by date range, type (all/missed), timestamp type, and phone number. Use listusers to find the userid. Use listcalllogs for the whole account.

get_call_log

Get full details of one call log (legacy format), including the per-leg logdetails path and recording/voicemail flags. Use listcalllogs or listusercalllogs to find the calllogid.

list_call_history

List the account's call history (newer format), each record with caller/callee, direction, duration, result, and times. Supports rich server-side filtering: date range, keyword, timestamp type, recording status, voicemail-only, department, and cost center. Use getcallhistory for one record's full routing path.

get_call_history

Get full details of one call-history record (newer format), including the callpath legs and callelements segments. Use listcallhistory to find the callhistoryuuid.

list_external_contacts

List external contacts (non-Zoom people reachable by call or SMS), each with name, email, phone numbers, and externalcontactid. Use getexternalcontact for one contact's detail, or createexternalcontact to add one.

get_external_contact

Get full details of one external contact: name, email, description, phone numbers, and extension. Use listexternalcontacts to find the externalcontactid.

create_external_contact

Add an external contact (a non-Zoom person reachable by call or SMS). Only the name is required; email, description, phone numbers, extension, and routing can be set. Returns the new externalcontactid for use with get/update/deleteexternalcontact.

update_external_contact

Update an external contact's name, email, description, phone numbers, extension, or routing. Use listexternalcontacts to find the externalcontactid. Only the fields you set are modified.

delete_external_contact

Delete an external contact. Use listexternalcontacts to find the externalcontactid. This cannot be undone.

list_sites

List Zoom Phone sites (locations that group users and numbers), each with its id, name, site code, and country. Supports a server-side sitename filter. The site id is used as the siteid filter on listusers, listphonenumbers, listrecordings, and more.

get_site

Get full details of one Zoom Phone site: name, site code, country, and main auto receptionist. Use listsites to find the siteid.

get_account_settings

Get the account's Zoom Phone feature settings (recording, voicemail, SMS, outbound SMS, call handling, and more). Pass settingtypes to return only specific groups. Use getphone_settings for the smaller BYOC/country/multi-site set instead.

get_phone_settings

Get account-level Zoom Phone settings: bring-your-own-carrier (BYOC), country, multi-site enablement, and the billing account. Use getaccountsettings for the full per-feature settings object.

list_call_queues

List call queues (ring groups that route inbound calls to members), each with its id, name, extension, assigned phone numbers, status, and site. Supports server-side filtering by site, department, and cost center. Use getcallqueue for one queue's members and policy.

get_call_queue

Get full details of one call queue: members (users and common areas), assigned phone numbers, policy, timezone, and languages. Use listcallqueues to find the callqueueid.

list_phone_numbers

List phone numbers on the account, each with its id, E.164 number, type, status, capabilities, and current assignee. Supports server-side filtering by assignment (assigned/unassigned/byoc/all), extension type, number type, site, and a specific number. Use type='unassigned' to find numbers free to assign to a user.

get_phone_number

Get full details of one phone number: its E.164 number, type, status, capabilities, assignee, site, carrier, and emergency address. Use listphonenumbers to find the number id first.

update_phone_number

Update a phone number's display name, capabilities, emergency-address status, or SIP group. Use listphonenumbers to find the number id. Only the fields you set are modified.

list_recordings

List the account's call recordings, each with caller/callee, duration, a downloadurl for the audio, and a transcriptdownloadurl when available. Supports server-side filtering by date range, owner type, recording type, site, date field, and group. Use listuser_recordings to scope to one user.

list_user_recordings

List one user's call recordings, each with caller/callee, duration, and download URLs for audio and transcript. Supports server-side filtering by date range. Use listusers to find the userid. Use list_recordings for the whole account.

get_call_log_recordings

Get the recording for a specific call by its call log ID, with caller/callee, duration, and the audio downloadurl. Use listcalllogs to find the callid (the calllogid / recording-bearing log).

update_recording

Enable or disable auto-delete for a call recording. Use listrecordings to find the recordingid. This changes the recording's retention behavior; it does not delete the recording (use delete_recording for that).

delete_recording

Permanently delete a call recording. Use listrecordings to find the recordingid. This cannot be undone.

list_sms_campaigns

List the account's 10DLC SMS campaigns (US A2P messaging registrations) with their status and brand. Each campaign's id is needed by getsmscampaign and assigncampaignphone_numbers. Campaigns govern which numbers may send SMS at scale.

get_sms_campaign

Get full details of one 10DLC SMS campaign: status, brand, use case, sample messages, and the phone numbers assigned to it. Use listsmscampaigns to find the campaign id first.

assign_campaign_phone_numbers

Assign one or more Zoom Phone numbers to a 10DLC SMS campaign, with the Letter-of-Authorization details the registration requires. Use listsmscampaigns to find the campaign id and listphonenumbers to find the numbers. Use unassigncampaignphone_number to remove one.

unassign_campaign_phone_number

Remove a phone number from a 10DLC SMS campaign. Use getsmscampaign to see the assigned number IDs and listsmscampaigns to find the campaign id. The number stays on the account; only its campaign assignment is removed.

get_campaign_number_opt_status

List the opt-in/opt-out status of consumer numbers against Zoom Phone numbers for a 10DLC SMS campaign. Call before sending to a consumer to confirm they have not opted out. Use listsmscampaigns to find the campaign id. Use updatecampaignnumberoptstatus to change a status.

update_campaign_number_opt_status

Set a consumer number's opt-in or opt-out status for a 10DLC SMS campaign (honor STOP/START requests). Use getcampaignnumberoptstatus to read the current status and listsmscampaigns to find the campaign id.

get_user_campaign_opt_status

List a user's consumer-number opt-in/opt-out statuses across SMS campaigns. Use listusers to find the userid. Returns the opt status for each consumer/Zoom-number pair, including the opt-in message when present.

get_consent_opt_status

List the opt-in/opt-out status of consumer numbers under an SMS consent record. Use when managing consent outside a specific campaign. Returns the opt status for each consumer/Zoom-number pair.

list_account_sms_sessions

List SMS/MMS conversation sessions across the account, newest activity first. Supports server-side filtering by date range, session owner type, phone number, and which timestamp to filter on. Each session carries its sessionid (pass to getsmssession or sendsms) and participants. Use listusersms_sessions to scope to one user instead.

list_user_sms_sessions

List SMS/MMS conversation sessions owned by a specific phone user, newest activity first. Supports server-side filtering by date range, session type, phone number, and timestamp type. Use listusers to find the userid first. Use listaccountsms_sessions for all account sessions.

get_sms_session

Get the message history of one SMS/MMS session (conversation), newest or oldest first. Returns each message with its text, links, delivery status, direction, sender/recipients, and MMS attachment metadata (type, name, size, download URL). Supports date-range, delivery-status, and sort params. Use listaccountsmssessions to find the sessionid. Use getsmsmessage for a single message by ID.

get_sms_message

Get a single SMS/MMS message by its ID within a session. Returns the text, links, direction, delivery status, sender/recipients, and full MMS attachment metadata (type, name, size, download URL). Use getsmssession to find message IDs in a conversation.

read_sms_attachment_text

Extract readable text from a PDF, DOCX, spreadsheet, or text attachment on an SMS/MMS message. Pass the session, message, and attachment IDs from the message metadata. For image-only or unsupported files, use downloadsmsattachment to get the original.

download_sms_attachment

Download an SMS/MMS attachment through the file service. To READ a PDF/DOCX/text attachment, use readsmsattachment_text. Provide the session, message, and attachment IDs from the message metadata.

sync_sms_session

Sync (full, incremental, or backward) the messages of one SMS session, returning a synctoken to fetch only changes on the next call. Use for keeping a local copy of a conversation in step with Zoom. Use getsmssession for ordinary paginated reads. Use listaccountsmssessions to find the session_id.

sync_user_sms_sessions

Sync (full, incremental, or backward) a user's SMS sessions in descending order, returning a synctoken to fetch only changes next time. Each session includes its latest message and unread count. Use listusers to find the userid. Use listusersmssessions for ordinary paginated reads.

send_sms

Send an SMS or MMS from a Zoom Phone number to one or more recipients. Text may include links (max 500 chars); for MMS, prefer a filereference staged through POST /api/v1/files/ so file bytes stay out of the agent's context. Small files may be provided as base64; each attachment is limited to 2 MB. Pass sessionid to continue a conversation or omit it to start a new one. Find the sender's number with listphonenumbers or getuser, and existing sessions with listaccountsmssessions. Needs an SMS send scope on the Zoom app.

list_users

List Zoom Phone users, each with their id, extension, assigned phone numbers, and site. Supports server-side filtering by site, status, calling type, department, cost center, and a keyword search over name/email/extension. The user id and assigned numbers feed sendsms, listusersmssessions, and get_user.

get_user

Get a Zoom Phone user's full profile: assigned phone numbers, extension, site, calling plans, and the per-feature policy object. Accepts a user ID or email. Use listusers to find user IDs. The returned phone numbers are valid SMS senders for sendsms.

get_user_settings

Get a user's phone profile settings: outbound caller IDs, devices, delegation, business hours, and more. Accepts a user ID or email. Use listusers to find user IDs. Use getuser for the profile and policy object instead.

get_user_call_handling

Get a user's call-handling settings: business, closed, and holiday hours plus the call-forwarding rules that apply in each. Accepts a user ID or email. Use list_users to find user IDs.

update_user

Update a Zoom Phone user's profile: extension number, emergency address, site, applied template, or the per-feature policy object. Accepts a user ID or email. Use listusers to find user IDs, listsites for site IDs, and get_user to read the current policy before changing it. Only the fields you set are modified.

assign_user_phone_numbers

Assign one or more phone numbers to a Zoom Phone user, so the user can call and text from them. Accepts a user ID or email. Use listphonenumbers with type='unassigned' to find available numbers and listusers to find the user. Use unassignuserphonenumber to remove one.

unassign_user_phone_number

Remove a phone number from a Zoom Phone user. The number returns to the account's unassigned pool. Accepts a user ID or email. Use getuser to see the user's assigned number IDs and listusers to find the user.

validate_credential

Validate Zoom Phone credentials by listing phone users. Returns success status and a message.

list_voicemails

List the account's voicemails, each with caller/callee, duration, read status, and an audio downloadurl. Supports server-side filtering by read status, site, owner type, voicemail type (normal/spam), date range, and trashed. Use listuser_voicemails to scope to one user.

list_user_voicemails

List one user's voicemails, each with caller/callee, duration, read status, and an audio downloadurl. Supports server-side filtering by read status, date range, and trash. Use listusers to find the userid. Use listvoicemails for the whole account.

get_voicemail

Get full details of one voicemail: caller/callee, duration, read status, audio downloadurl, and the transcription when available. Use listvoicemails or listuservoicemails to find the voicemail_id.

update_voicemail

Mark a voicemail as read or unread. Use listvoicemails or listuservoicemails to find the voicemailid.

delete_voicemail

Permanently delete a voicemail. Use listvoicemails or listuservoicemails to find the voicemailid. This cannot be undone.

View all tools by creating a free accountSee more tools

How to set up Merge Agent Handler

In an mcp.json file, add the configuration below, and restart Cursor.

Learn more in the official documentation ↗

1{
2  "mcpServers": {
3    "agent-handler": {
4      "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5      "headers": {
6        "Authorization": "Bearer yMt*****"
7      }
8    }
9  }
10}
11
Copy Code

Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.

Make sure Claude is using the Node v20+.

Learn more in the official documentation ↗

1{
2  "mcpServers": {
3    "agent-handler": {
4      "command": "npx",
5      "args": [
6        "-y",
7        "mcp-remote@latest",
8        "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9        "--header",
10        "Authorization: Bearer ${AUTH_TOKEN}"
11      ],
12      "env": {
13        "AUTH_TOKEN": "yMt*****"
14      }
15    }
16  }
17}
Copy Code
Copied!

Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.

Learn more in the official documentation ↗

1{
2    "mcpServers": {
3      "agent-handler": {
4        "command": "npx",
5        "args": [
6          "-y",
7          "mcp-remote@latest",
8          "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9          "--header",
10          "Authorization: Bearer ${AUTH_TOKEN}"
11        ],
12        "env": {
13          "AUTH_TOKEN": "<ah-production-access-key>"
14        }
15      }
16    }
17  }
Copy Code

In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".

You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.

Learn more in the official documentation ↗

1{
2  "inputs": [
3    {
4      "type": "promptString",
5      "id": "agent-handler-auth",
6      "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7      "password": true
8    }
9  ],
10  "servers": {
11    "agent-handler": {
12      "type": "stdio",
13      "command": "npx",
14      "args": [
15        "-y",
16        "mcp-remote@latest",
17        "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18        "--header",
19        "Authorization: Bearer ${input:agent-handler-auth}"
20      ]
21    }
22  }
23}
Copy Code

FAQs on using Merge's Zoom Phone  MCP server

FAQs on using Merge's Zoom Phone  MCP server

Explore other MCP servers built and managed by Merge

pagerduty
PagerDuty
paypal
PayPal
peec
Peec AI
pendo
Pendo
pipedrive
Pipedrive
plaid
Plaid
plaud
Plaud
podium
Podium
posthog
PostHog
pubmed
PubMed
pylon
Pylon
quartr
Quartr
quickbooks_online
QuickBooks Online
ramp
Ramp
readme
ReadMe
render
Render
reo
Reo.dev
ringcentral
RingCentral
rootly
Rootly
sabre
Sabre
salesforce
Salesforce
salesforce_data_360
Salesforce Data 360
salesforce_marketing_cloud
Salesforce Marketing Cloud
sanity
Sanity

Ready to try it out?

Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now