
List calendars in a location. locationid is required: use searchlocations to find it. Returns calendar IDs for getcalendar, listcalendarevents, and createappointment.
Fetch one calendar by ID. Use list_calendars to find calendar IDs.
List calendar events (appointments) in a location. locationid, starttime, and endtime (an epoch-ms window) are all required; use searchlocations for locationid. The API also needs at least one of calendarid (from listcalendars), userid, or groupid. Returns event IDs for getappointment.
Fetch one appointment (calendar event) by ID. Use listcalendarevents to find event IDs.
Book an appointment on a calendar. calendarId, locationId, contactId, and startTime are required. Use listcalendars for calendarId, searchlocations for locationId, and list_contacts for contactId. Returns the new appointment ID.
Permanently delete an appointment (calendar event) by ID. This cannot be undone. Use listcalendarevents or get_appointment to find event IDs.
List contacts in a location with free-text search and limit paging. locationid is required: use searchlocations to find it. Use the query param to search by name, email, or company. Returns contact IDs for the get/update/delete, task, note, and opportunity tools.
Fetch one contact by ID. Use list_contacts to find contact IDs.
Create a contact in a location. locationid is required: use searchlocations to find it. Returns the new contact ID for use with the task, note, opportunity, and appointment tools.
Update a contact's fields. Only the fields you pass are changed. Use list_contacts to find contact IDs.
Permanently delete a contact by ID. This cannot be undone. Use list_contacts to find contact IDs.
Search HighLevel locations (sub-accounts) with offset paging. Use this to discover location IDs required by listcontacts, listpipelines, searchopportunities, listcalendars, createcontact, createopportunity, and create_appointment. Filter by email; page with limit and skip.
Fetch one HighLevel location (sub-account) by ID. Use search_locations to find location IDs.
List all notes on a contact. Use listcontacts to find contact IDs. Returns note IDs for get/update/deletecontact_note.
Create a note on a contact. body is required. Use list_contacts to find contact IDs. Returns the new note ID.
Fetch one note on a contact by ID. Use listcontactnotes to find note IDs and list_contacts for contact IDs.
Update a note on a contact. body is required. Use listcontactnotes to find note IDs and list_contacts for contact IDs.
Permanently delete a note on a contact. Use listcontactnotes to find note IDs and list_contacts for contact IDs.
List opportunity pipelines and their stages in a location. locationid is required: use searchlocations to find it. Call this first to get pipelineId and pipelineStageId values for createopportunity, updateopportunity, and search_opportunities.
Search opportunities in a location with server-side filters. locationid is required: use searchlocations to find it. Filter by pipelineid and pipelinestageid (from listpipelines), contactid (from listcontacts), status, assigned_to, or free-text q. Returns opportunity IDs.
Fetch one opportunity by ID. Use search_opportunities to find opportunity IDs.
Create an opportunity. pipelineId, locationId, name, status, and contactId are required. Call listpipelines first to get a valid pipelineId (and pipelineStageId); use searchlocations for locationId and list_contacts for contactId. status is one of open/won/lost/abandoned. Returns the new opportunity ID.
Update an opportunity's fields. Only the fields you pass are changed. Use searchopportunities to find opportunity IDs and listpipelines for pipelineId/pipelineStageId values. status is one of open/won/lost/abandoned.
Permanently delete an opportunity by ID. This cannot be undone. Use search_opportunities to find opportunity IDs.
List all tasks on a contact. Use listcontacts to find contact IDs. Returns task IDs for get/update/deletecontact_task.
Create a task on a contact. title, dueDate, and completed are all required (pass completed=false for a new open task). Use list_contacts to find contact IDs. Returns the new task ID.
Fetch one task on a contact by ID. Use listcontacttasks to find task IDs and list_contacts to find contact IDs.
Update a task on a contact. Only the fields you pass are changed. Use listcontacttasks to find task IDs and list_contacts for contact IDs.
Permanently delete a task on a contact. Use listcontacttasks to find task IDs and list_contacts for contact IDs.
Validate GoHighLevel credentials by making a minimal authenticated call to the locations search endpoint.

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