
Get WhatsApp conversation analytics (volume and cost per category/direction/type) for a time range. start and end are Unix timestamps in seconds; start must be within the past 365 days. Granularity: HALF_HOUR, DAILY, or MONTHLY.
Get WhatsApp pricing analytics (cost and volume per pricing category and type) for a time range. Granularity: HALF_HOUR, DAILY, or MONTHLY.
List WhatsApp users blocked from messaging the credential's phone number. Cursor-paginated.
Block one or more WhatsApp users from messaging the credential's phone number. Pass user phone numbers in E.164 without '+'.
Unblock one or more previously-blocked WhatsApp users on the credential's phone number.
Get the WhatsApp business profile for the credential's phone number. Returns about, address, description, email, websites, vertical, and profilepictureurl.
Update the WhatsApp business profile (about, address, description, email, websites, vertical). Only provided fields are updated. Profile picture requires a handle from Meta's Resumable Upload API.
Upload a media file (image/video/audio/document/sticker, up to 100MB) to WhatsApp. Returns a mediaid usable in sendmedia_message. Media persists for 30 days before being auto-deleted.
Get a signed download URL and metadata for a WhatsApp media ID. The URL is valid for ~5 minutes and must be fetched with the same access token.
Delete a WhatsApp media object by ID. Deletion is permanent.
Send a plain-text WhatsApp message. The recipient must have messaged the business in the last 24 hours, or you must use sendtemplatemessage instead. Returns the accepted message ID.
Send a WhatsApp media message (image, video, audio, document, or sticker). Provide either mediaid (from uploadmedia) or a public HTTPS link. Caption supported for image/video/document; filename supported for document.
Send a location pin as a WhatsApp message. Requires latitude and longitude; name and address are optional.
Send one or more vCard-style contacts as a WhatsApp message. Each contact must have a 'name' object; phones/emails/addresses/org/urls are optional. Follows WhatsApp's contacts message schema.
Send an approved WhatsApp template message. Use listmessagetemplates to find valid names and languages. Components follow WhatsApp's template parameters schema.
Send a WhatsApp interactive message (reply buttons, list picker, CTA URL button, flow, catalog, product). Pass the full interactive payload including 'type' and type-specific action/body/header/footer.
React to an incoming WhatsApp message with a single emoji. Pass an empty emoji string to remove an existing reaction.
Mark an incoming WhatsApp message as read. Optionally also send a typing indicator so the recipient sees that the business is composing a reply.
List all WhatsApp phone numbers on the WhatsApp Business Account. Cursor-paginated — pass page_info.cursor as 'after' for the next page.
Get details of a WhatsApp phone number. Defaults to the credential's configured phone number ID. Returns displayphonenumber, verifiedname, qualityrating, status, throughput, and messaging tier.
List message templates on the WhatsApp Business Account. Use nameorcontent to search by substring; name is exact-match. Filter by name, language, status, or category. Cursor-paginated.
Get a single WhatsApp message template by ID. Use listmessagetemplates to find template IDs.
Create a WhatsApp message template (AUTHENTICATION, MARKETING, or UTILITY). Template goes through WhatsApp review before it can be used. Name must be lowercase letters/numbers/underscores; components follow WhatsApp's template schema.
Edit an existing WhatsApp message template. Edit rules vary by template status and field. Approved templates may be restricted to body/footer edits.
Delete a WhatsApp message template. Without hsmid, deletes every language variant of the named template. Pass hsmid to delete only one language. Deletion is permanent.
Validate WhatsApp credentials by reading the WhatsApp Business Account. Returns success status and a human-readable message.
Get WhatsApp Business Account details: name, currency, timezone, status, template namespace, verification status, country, and ownership type.
List apps subscribed to webhooks on the WhatsApp Business Account. Useful for confirming which Meta apps receive incoming message notifications.

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