
List Dialpad call centers. Filter by officeid or namesearch; set includealerts for alert config. Use cursor + limit for pagination. Use listoffices to find office_id.
Get a Dialpad call center by ID. Use list_callcenters to find call center IDs.
Create a Dialpad call center. name and officeid are required; use listoffices to find office_id. Returns the new call center including its id.
Update a Dialpad call center by ID. Only the fields you set are changed. Use list_callcenters to find call center IDs.
Delete a Dialpad call center by ID. Use list_callcenters to find call center IDs.
List Dialpad channels. Filter by state. Use cursor + limit for pagination.
Get a Dialpad channel by ID. Use list_channels to find channel IDs.
Create a Dialpad channel. name, description, and privacytype ('public' or 'private') are required. Returns the new channel including its id. Use addchannelmember to add members and deletechannel to remove the channel.
Delete a Dialpad channel by ID. Use list_channels to find channel IDs.
List members of a Dialpad channel. Use list_channels to find channel IDs. Use cursor + limit for pagination.
Add a user to a Dialpad channel. Use listchannels to find channel IDs and listusers to find user IDs. Inverse of removechannelmember.
Remove a user from a Dialpad channel. Use listchannelmembers to find member user IDs. Inverse of addchannelmember.
List SMS opt-out records for a Dialpad company. Use getcompany to find companyid. This endpoint requires a company admin API key. a2pcampaignid is only valid with optoutstate='opted_out'.
Get the Dialpad company associated with the current credential. Use this to discover the company ID needed by listsmsopt_outs.
List Dialpad contacts. Filter by name (first/last/display/company) or ownerid. Use cursor + limit for pagination; pass pageinfo.cursor back as cursor for the next page. Use listusers to find ownerid values.
Get a Dialpad contact by ID. Use list_contacts to find contact IDs.
Create a Dialpad contact. firstname and lastname are required. Returns the new contact including its id for use with getcontact/updatecontact/delete_contact.
Update a Dialpad contact by ID. Only the fields you set are changed. Use list_contacts to find contact IDs.
Delete a Dialpad contact by ID. Use list_contacts to find contact IDs.
List Dialpad departments. Filter by officeid or namesearch. Use cursor + limit for pagination. Use listoffices to find officeid values.
Get a Dialpad department by ID. Use list_departments to find department IDs.
Create a Dialpad department. name and officeid are required; use listoffices to find office_id. Returns the new department including its id.
Update a Dialpad department by ID. Only the fields you set are changed. Use list_departments to find department IDs.
Delete a Dialpad department by ID. Use list_departments to find department IDs.
List Dialpad phone numbers. Filter by area_code or status ('office', 'available', 'pending', 'suspended'). Use cursor + limit for pagination.
Get a Dialpad phone number by its E.164 string, e.g. '+14155550001'. Use list_numbers to find numbers. The number itself is the key, not a numeric ID.
Unassign/delete a Dialpad phone number by its E.164 string, e.g. '+14155550001'. Use list_numbers to find numbers.
List the call label names configured for the company. Returns a bare list of label strings with no pagination.
List Dialpad offices. Set active_only to return only active offices. Use cursor + limit for pagination. Offices are read-only; use this to find office IDs for creating users, departments, call centers, and rooms.
Get a Dialpad office by ID. Use list_offices to find office IDs.
List Dialpad rooms. Filter by officeid. Use cursor + limit for pagination. Use listoffices to find office_id values.
Get a Dialpad room by ID. Use list_rooms to find room IDs.
Create a Dialpad room. name and officeid are required; use listoffices to find office_id. Returns the new room including its id.
Update a Dialpad room by ID. Only the fields you set are changed. Use list_rooms to find room IDs.
Delete a Dialpad room by ID. Use list_rooms to find room IDs.
List Dialpad scheduled messages. Use cursor and limit to paginate; use user_id to filter by owner.
Get one Dialpad scheduled message by its string ID.
Schedule a real Dialpad SMS/MMS; sendat is ISO 8601, at least 10 minutes ahead. Links go in text; filereference is one image or video (max 500 KiB raw). Dialpad rejects documents; share them as links in text. Use exactly one recipient and text or file_reference. Texting phone numbers requires the company's 10DLC registration in Dialpad; if a send fails for missing registration, don't retry.
Update only the fields provided for a Dialpad scheduled message. sendat is ISO 8601 and must be at least 10 minutes from now. filereference replaces one image or video (max 500 KiB raw); Dialpad rejects documents, so share them as links in text.
Delete a Dialpad scheduled message by its string ID.
Send a Dialpad scheduled message immediately instead of waiting for its scheduled time.
Send a real SMS/MMS in Dialpad. Links go in text; filereference is one image or video (max 500 KiB raw). Dialpad rejects documents; share them as links in text. Use exactly one recipient and text or filereference. Texting phone numbers requires the company's 10DLC registration in Dialpad; if a send fails for missing registration, don't retry.
Start a batch text-history export (not real-time; real-time needs webhooks). Texts sent today may not appear yet. Exports take about 10s; Dialpad allows 200 per hour. Covers the whole company unless officeid or targettype/targetid is set. Then poll gettextexport with requestid until status is complete.
Read a batch text-history export (not real-time; real-time needs webhooks). Texts sent today may not appear yet. Exports take about 10s; Dialpad allows 200/hour. Covers the whole company unless officeid or targettype/targetid was set. Poll with requestid until complete. Each page re-downloads the export, so prefer a large limit. direction/message_id filters and paging run on our side.
List Dialpad users. Filter by firstname, lastname, state, email, companyadmin, number, or forwardingnumber. Use cursor + limit for pagination. For free-text search across name/email, use search_users instead.
Search Dialpad users by a free-text query matched against name and email. Use this when you have a search term; use list_users to browse or filter by a specific field. query is required.
Get a Dialpad user by ID. Use listusers or searchusers to find user IDs.
Create a Dialpad user. email and officeid are required; use listoffices to find officeid. Returns the new user including its id for use with getuser/updateuser/deleteuser.
Update a Dialpad user by ID. Only the fields you set are changed. Use listoffices to find officeid values. Use list_users to find user IDs.
Delete a Dialpad user by ID. Use list_users to find user IDs.
Validate Dialpad credentials by making a lightweight authenticated request. Returns success plus a message explaining any failure.

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