
Get all associations (emails, notes, calls, meetings, tasks) for a specific deal. Use this to find activities related to a deal, such as 'get all emails for the Acme Markets deal' or 'list notes associated with deal 12345'. Returns the IDs and metadata of associated objects which can then be fetched individually for full details.
Get all notes for a deal with full content and HubSpot UI URLs. Returns note details with clickable links to view in HubSpot. Use for 'show notes on Acme deal with links'.
Get all calls for a deal with full details and HubSpot UI URLs. Returns call info (duration, outcome, notes) with clickable links. Use for 'show calls on Acme deal with links'.
Get all meetings for a deal with full details and HubSpot UI URLs. Returns meeting info (title, attendees, time) with clickable links. Use for 'show meetings on Acme deal with links'.
Get all tasks for a deal with full details and HubSpot UI URLs. Returns task info (status, due date, assignee) with clickable links. Use for 'show tasks on Acme deal with links'.
Get all emails for a deal with full content and HubSpot UI URLs. Returns email info (subject, body, sender) with clickable links. Use for 'show emails on Acme deal with links'.
Get ALL activities (emails, notes, calls, meetings, tasks) for a deal with HubSpot UI URLs. Returns complete timeline with clickable links. Use for 'show everything on Acme deal with links'.
Get all associations (emails, notes, calls, meetings, tasks) for a specific company. Use this to find activities related to a company, such as 'get all emails for Acme Corp' or 'list notes associated with company 12345'. Returns the IDs and metadata of associated objects.
Get all notes for a company with full content and HubSpot UI URLs. Returns note details with clickable links to view in HubSpot. Use for 'show notes on Acme Corp with links'.
Get all calls for a company with full details and HubSpot UI URLs. Returns call info (duration, outcome, notes) with clickable links. Use for 'show calls on Acme Corp with links'.
Get all meetings for a company with full details and HubSpot UI URLs. Returns meeting info (title, attendees, time) with clickable links. Use for 'show meetings on Acme Corp with links'.
Get all tasks for a company with full details and HubSpot UI URLs. Returns task info (status, due date, assignee) with clickable links. Use for 'show tasks on Acme Corp with links'.
Get all emails for a company with full content and HubSpot UI URLs. Returns email info (subject, body, sender) with clickable links. Use for 'show emails on Acme Corp with links'.
Get ALL activities (emails, notes, calls, meetings, tasks) for a company with HubSpot UI URLs. Returns complete timeline with clickable links. Use for 'show everything on Acme Corp with links'.
Get all associations (emails, notes, calls, meetings, tasks) for a specific contact. Use this to find activities related to a contact, such as 'get all emails for John Doe' or 'list notes associated with contact 12345'. Returns the IDs and metadata of associated objects.
Get all notes for a contact with full content and HubSpot UI URLs. Returns note details with clickable links to view in HubSpot. Use for 'show notes on John Doe with links'.
Get all calls for a contact with full details and HubSpot UI URLs. Returns call info (duration, outcome, notes) with clickable links. Use for 'show calls on John Doe with links'.
Get all meetings for a contact with full details and HubSpot UI URLs. Returns meeting info (title, attendees, time) with clickable links. Use for 'show meetings on John Doe with links'.
Get all tasks for a contact with full details and HubSpot UI URLs. Returns task info (status, due date, assignee) with clickable links. Use for 'show tasks on John Doe with links'.
Get all emails for a contact with full content and HubSpot UI URLs. Returns email info (subject, body, sender) with clickable links. Use for 'show emails on John Doe with links'.
Get ALL activities (emails, notes, calls, meetings, tasks) for a contact with HubSpot UI URLs. Returns complete timeline with clickable links. Use for 'show everything on John Doe with links'.
Update many CRM records of one object type in a single call. Pass all records as inputs=[{"id":"123","properties":{...}}]; they are auto-batched in groups of 100, so use this instead of many single updates to avoid rate limits. Custom objects (e.g. contracts) must be addressed by their type id like '2-3465404', not the bare name (use listcustomobjects to find it).
Read many CRM records of one object type by ID in a single call. Pass all ids as inputs=[{"id":"123"}]; they are auto-batched in groups of 100. Custom objects must be addressed by their type id like '2-3465404', not the bare name (use listcustomobjects to find it).
Create many CRM records of one object type in a single call. Pass all records as inputs=[{"properties":{...}}]; they are auto-batched in groups of 100, so use this instead of many single creates to avoid rate limits. Custom objects must be addressed by their type id like '2-3465404', not the bare name (use listcustomobjects to find it).
Log a call engagement in HubSpot CRM. Associate with contacts, companies, deals, or tickets using format: associations=[{"id": "123", "type": "contact"}]. Returns engagement URL with parent context.
Get a call by ID. Optional: pass parentObjectType and parentObjectId (e.g., parentObjectType='contact', parentObjectId='123') to get URL with parent context.
Update a call's details. Optional: pass parentObjectType and parentObjectId to get URL with parent context.
Delete a call log from HubSpot
List call logs with pagination and filtering
Search calls by direction, status, duration, or date. Use for finding specific call logs.
Create a new company with name, domain, industry, and location details
Retrieve a company by its ID or unique property with specified properties, associations, and history
Update properties and information for an existing company
Delete a company from HubSpot (cannot be undone)
List companies with pagination and optional property filtering
Search companies with filters (name, domain, industry, location, size), sorting, and text query. Use filters array for property conditions with operators (EQ, CONTAINS_TOKEN, IN). Supports free text query search. Returns up to 100 companies per page with pagination.
Create a new contact with email, name, phone, company, and lifecycle stage
Get a contact by ID or email with properties and engagement history
Update properties and information for an existing contact
Delete a contact from HubSpot (cannot be undone)
List contacts with pagination and optional property filtering
Search contacts with filters (email, name, company, lifecyclestage), sorting, and text query. Use filters array for property conditions with operators (EQ, GT, IN, CONTAINS_TOKEN). Supports free text query search. Returns up to 100 contacts per page with pagination.
Create up to 100 contacts in a single batch request
Update up to 100 contacts in a single batch request
Get up to 100 contacts by IDs in a single batch request
Create a new sales deal with name, amount, pipeline stage, and owner
Get a deal by ID with pipeline stage and associated contacts/companies
Update properties and details for an existing deal
Delete a deal from HubSpot (cannot be undone)
List deals with pagination and filtering by pipeline, stage, or owner
Search deals with filters (amount, stage, closedate, owner), sorting, and text query. Use filters array for property conditions with operators (EQ, GT, IN, BETWEEN). Supports free text query search. Returns up to 100 deals per page with pagination.
Log an email engagement in HubSpot CRM. Record sent/received emails with subject, body, direction, status, attachments. Associate with contacts, companies, deals, or tickets using format: associations=[{"id": "123", "type": "contact"}]. Returns engagement URL.
Retrieve a specific email engagement by ID from HubSpot CRM. Returns complete email details including subject, body, sender/recipient information, direction, status, timestamps, and associated CRM records. Optional: pass parentObjectType and parentObjectId (e.g., parentObjectType='contact', parentObjectId='123') to get URL with parent context.
Update an existing email engagement's properties in HubSpot CRM. Modify email subject, body, status, direction, or other email properties. Optional: pass parentObjectType and parentObjectId to get URL with parent context.
Delete an email engagement from HubSpot CRM (moves to recycling bin). Use this to remove incorrect email logs, clean up test data, delete duplicate email entries, or remove emails that were logged in error. Deleted emails can be restored from the recycling bin.
List email engagements from HubSpot CRM with pagination and property filtering. Retrieve up to 100 emails per request with support for cursor-based pagination. Specify which email properties to return, include archived emails, and navigate through large result sets. Use this to browse email history, review recent communications, or export email data.
Search email engagements in HubSpot CRM using filters, text queries, and sorting. Find emails by subject keywords, sender/recipient, date ranges, email status, direction, or any email property. Supports complex filtering with AND/OR logic, full-text search, custom sorting, and pagination. Use this to locate specific emails, filter by criteria, or find emails matching patterns.
Log a meeting engagement in HubSpot CRM. Associate with contacts, companies, deals, or tickets using format: associations=[{"id": "123", "type": "contact"}]. Returns engagement URL with parent context.
Get a meeting by ID. Optional: pass parentObjectType and parentObjectId (e.g., parentObjectType='contact', parentObjectId='123') to get URL with parent context.
Update a meeting's details. Optional: pass parentObjectType and parentObjectId to get URL with parent context.
Delete a meeting from HubSpot
List meetings with pagination and filtering
Search meetings by title, date, outcome, or location. Use for finding specific meetings.
Create a note engagement in HubSpot CRM. Pass the note text as content (e.g. content='Met with customer'). Associate with contacts, companies, deals, or tickets using associations=[{"id": "123", "type": "contact"}]. Returns engagement URL with parent context.
Get a note by ID. Optional: pass parentObjectType and parentObjectId (e.g., parentObjectType='contact', parentObjectId='123') to get URL with parent context.
Update a note's content or properties. Pass the new note text as content (e.g. content='Revised summary'). Optional: pass parentObjectType and parentObjectId to get URL with parent context.
Delete a note from HubSpot
List notes with pagination and filtering
Search notes by content, filters, or associated objects. Use for finding specific notes by keywords or properties.
Retrieve a list of all owners (users) in the HubSpot account with their contact information, team assignments, and permissions. Used for assigning ownership of contacts, companies, deals, and tickets.
Retrieve detailed information about a specific owner (user) in HubSpot using their owner ID. Returns owner details including name, email, teams, and activity status for ownership assignment.
List all available deal properties including custom fields with their types, descriptions, valid values, and metadata. Essential for discovering what fields can be used in search filters, updates, and deal creation. Returns property names, data types, field types (text, number, date, dropdown, etc.), available options for dropdowns, and whether fields are required, read-only, or calculated.
List all available contact properties including custom fields with their types, descriptions, valid values, and metadata. Essential for discovering what fields can be used in search filters, updates, and contact creation. Returns property names, data types, field types (text, number, date, dropdown, etc.), available options for dropdowns, and whether fields are required, read-only, or calculated.
List all available company properties including custom fields with their types, descriptions, valid values, and metadata. Essential for discovering what fields can be used in search filters, updates, and company creation. Returns property names, data types, field types (text, number, date, dropdown, etc.), available options for dropdowns, and whether fields are required, read-only, or calculated.
List all custom objects in HubSpot with their required properties, searchable fields and schema info, plus the objecttypeid (e.g. '2-3465404') the batch* tools need. This is the only way to discover required fields in HubSpot. Full property and association definitions are omitted by default; set includeproperties or include_associations to true only if you need them.
Create a task engagement in HubSpot CRM. Associate with contacts, companies, deals, or tickets using format: associations=[{"id": "123", "type": "contact"}]. Returns engagement URL with parent context.
Get a task by ID. Optional: pass parentObjectType and parentObjectId (e.g., parentObjectType='contact', parentObjectId='123') to get URL with parent context.
Update a task's details or mark it complete. Optional: pass parentObjectType and parentObjectId to get URL with parent context.
Delete a task from HubSpot
List tasks with pagination and filtering
Search tasks by status, priority, due date, or assignee. Use for finding specific tasks.
Create a support ticket with subject (required), priority, category, and owner
Retrieve a ticket by its ID, optionally selecting which properties to return
Update properties and status for an existing ticket
Delete a ticket from HubSpot (cannot be undone)
List support tickets with filtering by status, priority, or owner
Search tickets by subject, status, priority, category, or date ranges
Validate HubSpot credentials. Verifies credentials during setup.

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}It can be used for endless AI assistants, agents, and third-party AI/automation apps.
The use cases naturally depend on the agent you've built, but here are a few common ones:
Here are just a few popular tools across data types:
Yes, you can apply custom security rules to HubSpot tool calls. Merge's security gateway and data loss prevention (DLP) applies to all connectors, including HubSpot.
Here are just a few examples:
You can configure these rules to block, redact, or log sensitive data, and they apply across all tool calls made to HubSpot through Agent Handler.
Here are some of the top reasons:
You can customize or expand the HubSpot connector using Connector Studio and Tool Packs. Here's how:
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now