
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 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 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 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 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 (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 full details of one external contact: name, email, description, phone numbers, and extension. Use listexternalcontacts to find the externalcontactid.
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 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 an external contact. Use listexternalcontacts to find the externalcontactid. This cannot be undone.
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 full details of one Zoom Phone site: name, site code, country, and main auto receptionist. Use listsites to find the siteid.
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 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 (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 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 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 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 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 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 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 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).
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).
Permanently delete a call recording. Use listrecordings to find the recordingid. This cannot be undone.
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 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 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.
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.
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.
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.
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.
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 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 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 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 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.
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 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 (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 (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 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 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 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 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 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 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 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.
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 Zoom Phone credentials by listing phone users. Returns success status and a message.
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 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 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.
Mark a voicemail as read or unread. Use listvoicemails or listuservoicemails to find the voicemailid.
Permanently delete a voicemail. Use listvoicemails or listuservoicemails to find the voicemailid. This cannot be undone.

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}
11Open 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}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 }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}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now