The HubSpot MCP connector routes your AI agent's tool calls to HubSpot's own MCP server through Scalekit. Each user signs in to HubSpot once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 22 tools.
- Tools
- 22
- What they doRead · write · destructive
- 17 · 2 · 317 read2 write3 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the HubSpot MCP connection
In AgentKit > Connections, create a HubSpot MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for HubSpot, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.
Use your own OAuth app
Register your Scalekit environment with the HubSpot MCP connector so Scalekit handles the OAuth flow and token lifecycle for your users. HubSpot MCP uses a dedicated MCP Auth App — not a Legacy App or a standard Public App.
-
Copy the redirect URI from Scalekit
- In Scalekit dashboard, go to AgentKit > Connections > Create Connection.
- Search for HubSpot MCP and click Create.
- Copy the Redirect URI from the connection details panel. It looks like:
https://<YOUR_ENV>.scalekit.cloud/sso/v1/oauth/conn_<ID>/callback
-
Create an MCP auth app in HubSpot
- Log in to developers.hubspot.com and open your developer account.
- In the left sidebar, click MCP Auth Apps (marked Beta). Do not use Legacy Apps or Projects.

- Click Create MCP auth app (top right).
- Enter an App name, for example
Agent Auth, and complete any required fields. - Click Create.
-
Add the redirect URI and configure scopes
-
Inside your new MCP auth app, navigate to the Auth or OAuth settings section.
-
Under Redirect URLs, paste the Scalekit redirect URI you copied in step 1 and save.
-
Under Scopes, add the scopes your agent needs. Start with:
crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.companies.readcrm.objects.deals.readAdd additional scopes based on the tools your agent will use (for example,
contentscopes for landing pages and campaigns).
-
-
Copy your app credentials
- In your MCP auth app settings, find the App ID (visible in the app list as a number, for example
43664586). - Locate your Client ID and Client Secret under the OAuth settings.
- In your MCP auth app settings, find the App ID (visible in the app list as a number, for example
-
Add credentials in Scalekit
- In Scalekit dashboard, go to AgentKit > Connections and open the HubSpot MCP connection you created.
- Enter:
- Client ID — from your MCP auth app
- Client Secret — from your MCP auth app
- Permissions — the scope strings you configured in step 3 (for example,
crm.objects.contacts.read crm.objects.deals.read)
- Click Save.
-
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'hubspotmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize HubSpot MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'hubspotmcp_get_campaign_analytics',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "hubspotmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize HubSpot MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="hubspotmcp_get_campaign_analytics",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolhubspotmcp_discover_hubspot_schemaSearches HubSpot schema to discover available data types or look up known types directly.Read-onlyDiscover Hubspot Schema
Searches HubSpot schema to discover available data types or look up known types directly. Use SEARCH_OBJECT_TYPES when you don't know the exact type name, or GET_OBJECT_TYPES when you already know the type names (e.g. CONTACT, DEAL), or with an empty typeNameFilter list to retrieve all available types. Check readAccess/writeAccess before attempting operations on a type.
Inputs
querystringrequired- The schema query to run. Choose SEARCH_OBJECT_TYPES to discover types by natural language, or GET_OBJECT_TYPES to fetch known type names directly (or all types when typeNameFilter is empty).
hubspotmcp_get_campaign_analyticsRetrieve engagement analytics (sessions, new contacts, influenced contacts) for one or more HubSpot campaigns.Read-onlyGet Campaign Analytics
Retrieve engagement analytics (sessions, new contacts, influenced contacts) for one or more HubSpot campaigns.
Inputs
requestsarray- Required: List of analytics requests to process. Each entry is a full CampaignAnalyticsRequest. Maximum 20 requests per batch.
hubspotmcp_get_campaign_asset_metricsRetrieve performance metrics for assets (emails, landing pages, CTAs) associated with a campaign.Read-onlyGet Campaign Asset Metrics
Retrieve performance metrics for assets (emails, landing pages, CTAs) associated with a campaign.
Inputs
assetTypestringrequired- The asset type name, such as LANDING_PAGE, SITE_PAGE, BLOG_POST, or MEETING_EVENT. If invalid, the error will list valid types.
campaignCrmObjectIdintegerrequired- The numeric ID of the campaign to get asset metrics for. Must be greater than 0.
crmObjectIdsarray- Optional list of CRM object IDs to scope metrics to specific assets. When omitted or empty, metrics are returned for all assets of the given assetType associated with the campaign.
endDatestring- End of the date range in YYYY-MM-DD format.
startDatestring- Start of the date range in YYYY-MM-DD format.
hubspotmcp_get_campaign_attribution_reportsREQUIRED FIRST STEP: before your first call, invoke tool_guidance for "get_campaign_attribution_reports" and follow it.Read-onlyGet Campaign Attribution Reports
REQUIRED FIRST STEP: before your first call, invoke tool_guidance for "get_campaign_attribution_reports" and follow it. The dimension names, filter syntax, date-range semantics, grouping rules, and query patterns live in tool_guidance, not in this description; calling this tool without them produces wrong or failed queries. Attribution data tool: all metrics (revenue, deal amounts, deal counts, contact counts) are scoped to the closed-won deal attribution pipeline. Use for revenue, attributed deal, and attributed contact questions. For non-attribution contact queries (new contacts, influenced contacts, sessions), use read_campaign_data with GET_ANALYTICS. For deals at any stage, use read_campaign_data with operation=GET_ASSET_METRICS and assetType=DEAL, or search_crm_objects with a campaign association filter. For long-running queries, this returns a PROCESSING status with a taskId to poll for results.
Inputs
attributionModelstring- Revenue attribution model for the REVENUE metric. Defaults to LINEAR. See instructions for valid values.one of
LINEARFIRST_INTERACTIONLAST_INTERACTIONFULL_PATHU_SHAPEDW_SHAPEDTIME_DECAYJ_SHAPEDINVERSE_J_SHAPED campaignCrmObjectIdsarray- Campaign CRM object IDs to scope the query. Empty for cross-campaign analysis.
dimensionsarray- How to group data (AGGREGATION mode). Max 2 per query. Omit for ungrouped totals. Key mappings: 'channels' or 'content types' (emails, ads, landing pages) -> ASSET_TYPE; specific asset names -> ASSET_TITLE; 'influence types' or 'engagement types' -> INTERACTION_TYPE; traffic/referral source -> INTERACTION_SOURCE; deal names -> DEAL_NAME; deal IDs (for links) -> DEAL.
endDatestring- End of date range filter (YYYY-MM-DD). Must pair with startDate or both omitted.
filtersarray- Server-side filters on any dimension property. See instructions for examples.
hasReadToolInstructionsboolean- Set to true if you have already read the usage instructions for get_campaign_attribution_reports (via tool_guidance or a prior error response). If you have not read them yet, leave this unset or set it to false and you will receive an error response containing the full instructions. Not required when polling with taskId.
limitinteger- Max result rows returned by the server. Defaults to 100, maximum 500. When responseFormat=CONCISE, zero-value rows are filtered client-side after the server applies this limit, so fewer rows than requested may be returned.
metricsarray- Required: What to measure. REVENUE for attributed revenue (use for any non-deal breakdown like channel/source/asset), DEAL_AMOUNT for per-deal or total deal value (always grouped by deal), DEAL_COUNT for unique deals, CONTACT_COUNT for unique contacts, ATTRIBUTION_COUNT for touchpoint volume.
modestring- Report mode. Only AGGREGATION is currently supported.one of
AGGREGATIONSEARCH responseFormatstring- Controls response verbosity. CONCISE (default) omits zero-value metric entries and drops rows where all metrics are zero, reducing token usage. DETAILED returns all rows and fields including zero values.one of
CONCISEDETAILED sortByMetricstring- Sort results by this metric (DESC by default). Use to rank rows without post-processing, e.g. REVENUE returns highest-revenue rows first.
sortOrderstring- Sort direction for sortByMetric. ASC or DESC. Defaults to DESC.one of
ASCDESC startDatestring- Start of date range filter (YYYY-MM-DD). Must pair with endDate or both omitted. Filters by deal close date for REVENUE/DEAL_AMOUNT, deal create date for DEAL_COUNT, touchpoint timestamp for CONTACT_COUNT/ATTRIBUTION_COUNT.
taskIdstring- Poll for results of a previously submitted query. Pass the taskId from a PROCESSING response.
hubspotmcp_get_campaign_contacts_by_typeRetrieve paginated contact IDs for a campaign filtered by attribution type (NEW_CONTACTS, INFLUENCED_CONTACTS, or ALL_CONTACTS).Read-onlyGet Campaign Contacts By Type
Retrieve paginated contact IDs for a campaign filtered by attribution type (NEW_CONTACTS, INFLUENCED_CONTACTS, or ALL_CONTACTS).
Inputs
campaignCrmObjectIdintegerrequired- The numeric object ID of the campaign. Must be greater than 0.
contactTypestringrequired- The contact attribution type: NEW_CONTACTS_FIRST_TOUCH (first marketing interaction was this campaign), NEW_CONTACTS_LAST_TOUCH (last interaction before conversion), or INFLUENCED_CONTACTS (any engagement within the date range).one of
NEW_CONTACTS_FIRST_TOUCHNEW_CONTACTS_LAST_TOUCHINFLUENCED_CONTACTS endDatestring- End of the date range in YYYY-MM-DD format.
limitinteger- Maximum number of results to return per page.
offsetinteger- Pagination offset — number of records to skip before returning results.
startDatestring- Start of the date range in YYYY-MM-DD format.
hubspotmcp_get_content_analytics_reportRun a content analytics report across HubSpot landing pages, website pages, and blog posts for a given date range.Read-onlyGet Content Analytics Report
Run a content analytics report across HubSpot landing pages, website pages, and blog posts for a given date range.
Inputs
modestringrequired- Which report mode to run. TOTALS returns aggregated metrics per content; TIME_SERIES returns data points per period (requires contentIds and period); SUMMARY returns summarized points per period; PEOPLE returns the list of contacts or visitors who viewed the pages.one of
TOTALSTIME_SERIESSUMMARYPEOPLE contentIdsarray- Content IDs to filter results to. Numeric for pages and posts; composite string (e.g. hubdb-{tableId}-{rowId}) for HubDB rows. Leave empty to query all pages in the portal. Required for TIME_SERIES and PEOPLE modes.
endstring- End of the reporting period in YYYY-MM-DD format.
excludedIdsarray- Content IDs to exclude from the result set. Same format as contentIds (numeric or composite string).
includeMetadataboolean- TOTALS mode: include per-content metadata (title, URL, type) in the response.
limitinteger- Maximum number of results to return per page.
offsetinteger- Pagination offset — number of records to skip before returning results.
paginationCursorstring- Pagination cursor from the previous response to fetch the next page.
peopleTypestring- PEOPLE mode: whether to return CONTACTS (known people) or VISITORS (anonymous). Required for PEOPLE mode.one of
CONTACTSVISITORS periodstring- TIME_SERIES or SUMMARY mode: bucket size for the time series. Required for those modes.one of
DAILYWEEKLYMONTHLYQUARTERLYYEARLY scaleByPercentboolean- TOTALS mode: scale metric values by their percent contribution to the totals.
searchstring- Free-text search to filter content by title or URL.
sortDirectionstring- TOTALS mode: sort direction. Ignored in other modes.one of
ASCDESC sortMetricstring- TOTALS mode: metric to sort by (e.g. rawViews, submissions, contacts). Ignored in other modes.
startstring- Start of the reporting period in YYYY-MM-DD format.
hubspotmcp_get_crm_objectsFetch multiple CRM objects of the same type in a single request by their IDs.Read-onlyGet Crm Objects
Fetch multiple CRM objects of the same type in a single request by their IDs.
Inputs
objectTypestringrequired- The HubSpot CRM object type to operate on (e.g. contacts, companies, deals).
objectIdsarray- List of object IDs to fetch. Min: 1, Max: 100
propertiesarray- List of property names to include in results.
hubspotmcp_get_organization_detailsRetrieve organization-wide details including teams, job titles, seats, account settings, and timezone.Read-onlyGet Organization Details
Retrieve organization-wide details including teams, job titles, seats, account settings, and timezone.
Inputs
includearray- Optional list of data to include in the response. Available values: - TEAMS: Include the list of teams and their members - SEATS: Include the list of seat/role names available in the account - JOB_TITLES: Include the list of job titles assigned to users in the account - ACCOUNT_INFORMATION: Include account details such as timezone, currency, and account type If not specified or empty, all data will be returned. Specify only the values you need to reduce response size. Unrecognized values will result in an error.
hubspotmcp_get_propertiesFetch property definitions for a CRM object type, including data types and enumeration values.Read-onlyGet Properties
Fetch property definitions for a CRM object type, including data types and enumeration values.
Inputs
objectTypestringrequired- The HubSpot CRM object type to operate on (e.g. contacts, companies, deals).
propertyNamesarray- The set of property names to retrieve
hubspotmcp_get_user_detailsReturn details for the current user including team membership, CRM tool availability, and hub info.Read-onlyGet User Details
Return details for the current user including team membership, CRM tool availability, and hub info.
Inputs
includearray- Optional list of data sections to include in the user details response. Available values: - USER_INFORMATION: The current user's personal details (owner ID, name, email) - TOOL_INFORMATION: Tool and CRM object type availability, including separate read/write access per object type - TEAMS_AND_ROLES: The user's team memberships and role assignments If not specified or empty, USER_INFORMATION and TOOL_INFORMATION sections are returned. Specify only the sections you need to reduce response size. Unrecognized values will result in an error.
hubspotmcp_query_crm_dataQuery HubSpot CRM data using SQL with HubSpot-specific extensions.Read-onlyQuery Crm Data
Query HubSpot CRM data using SQL with HubSpot-specific extensions. Call get_properties first to discover valid property names.
Inputs
sqlstringrequired- SQL query to execute against HubSpot CRM data.
chatInsightsobject- Insights about the chat including user intent and satisfaction level.
verbosityLevelstring- Controls the amount of data returned in the response:
- LOW: Data only, no citation links
- MEDIUM/HIGH: Data with citation links for each record when availableone of
LOWMEDIUMHIGH
hubspotmcp_read_campaign_dataReads campaign data using one of three operations selected by the operation field.Read-onlyRead Campaign Data
Reads campaign data using one of three operations selected by the operation field. GET_ANALYTICS: engagement metrics (sessions, new contacts, influenced contacts) for one or more campaigns. GET_ASSET_METRICS: performance metrics for assets associated with a campaign, filtered by asset type. GET_CONTACTS: paginated contact IDs attributed to a campaign, filtered by attribution type (NEW_CONTACTS_FIRST_TOUCH, NEW_CONTACTS_LAST_TOUCH, INFLUENCED_CONTACTS).
Inputs
operationstringrequired- Required. The operation to perform: GET_ANALYTICS, GET_ASSET_METRICS, or GET_CONTACTS.one of
GET_ANALYTICSGET_ASSET_METRICSGET_CONTACTS analyticsRequestobject- Analytics request data. Required when operation is GET_ANALYTICS.
assetMetricsRequestobject- Asset metrics request data. Required when operation is GET_ASSET_METRICS.
contactsRequestobject- Contacts request data. Required when operation is GET_CONTACTS.
hubspotmcp_render_landing_page_uiDisplay the landing page card (preview image and open-in-editor link) in the chat UI.Read-onlyRender Landing Page Ui
Display the landing page card (preview image and open-in-editor link) in the chat UI.
Inputs
targetstringrequired- What to render. Use a "propose" target (pageName, pageDescription, goal) to show the proposal card for a page that does not exist yet, or a "result" target carrying a contentId to show the result card for an existing page.
hubspotmcp_search_crm_objectsSearch and retrieve CRM records from HubSpot using filters, sorting, and keyword queries.Read-onlySearch Crm Objects
Search and retrieve CRM records from HubSpot using filters, sorting, and keyword queries.
Inputs
objectTypestringrequired- The HubSpot CRM object type to operate on (e.g. contacts, companies, deals).
chatInsightsobject- Insights about the chat including user intent and satisfaction level. IMPORTANT: MUST be provided for all scenarios.
filterGroupsarray- * The filter groups that define the search criteria. * Filters that match ALL of several conditions (AND logic) should be put in the same filterGroup. * Filters that match AT LEAST ONE of several conditions (OR logic) should be put in a separate filterGroup.
limitinteger- Maximum number of results to return per page.
offsetinteger- Pagination offset — number of records to skip before returning results.
propertiesarray- List of property names to include in results.
querystring- Text to search for within the default searchable properties of the specified object type.
sortsarray- Optional sorting rules for results. Only one sort rule can be applied
hubspotmcp_search_ownersList and search for HubSpot owners who can be assigned to CRM records.Read-onlySearch Owners
List and search for HubSpot owners who can be assigned to CRM records.
Inputs
limitinteger- Maximum number of results to return per page.
offsetinteger- Pagination offset — number of records to skip before returning results.
ownerIdsarray- Optional list of owner IDs to lookup directly. When provided, search query is ignored
searchQuerystring- Optional search query to find owners by name or email. Returns all owners if not provided
hubspotmcp_search_propertiesFind the most relevant CRM property definitions using keyword-based search.Read-onlySearch Properties
Find the most relevant CRM property definitions using keyword-based search.
Inputs
objectTypestringrequired- The HubSpot CRM object type to operate on (e.g. contacts, companies, deals).
keywordsarray- Multiple search keywords (max 5) to find relevant properties using efficient keyword-based search. Supports searching for multiple related property concepts in a single request. Examples: - ["urgency"] - Single keyword search - ["assignee", "assigned_to", "owner"] - Multiple related keywords for assignment - ["name", "employees", "zip", "contact"] - Multiple unrelated keywords for different properties If both query and keywords are provided, keywords takes precedence. If empty and no query provided, returns all properties for the object type.
querystring- Text to search for within the default searchable properties of the specified object type.
hubspotmcp_tool_guidanceRetrieve usage instructions and guidance for one or more HubSpot MCP tools.Read-onlyTool Guidance
Retrieve usage instructions and guidance for one or more HubSpot MCP tools.
Inputs
toolNamesarrayrequired- List of tool names to get usage instructions for
hubspotmcp_manage_onboardingAssess a portal's CRM onboarding status and guide the user through the next onboarding step.WriteManage Onboarding
Assess a portal's CRM onboarding status and guide the user through the next onboarding step. Call this tool when get_user_details returns onboarded: false. Use action to control behavior: leave empty (the default) to just check status. SET_GOAL records the user's primary goal; requires goal to be set to one of organizeAndTrackContacts, automateMarketing, generateLeads, manageSalesPipeline, customerSupport, billsAndCollectPayment, buildWebsite, createMarketingContent, or stillExploring. Only one goal can be stored; setting a new goal replaces any previous one.
- Idempotent
Inputs
actionstring- Defaults to empty, which just checks onboarding status. Set to SET_GOAL to record the user's primary goal — requires goal to also be set.
goalstring- The user's primary goal, required when action=SET_GOAL. Map the user's free-text goal description to the single closest matching canonical value: organizeAndTrackContacts, automateMarketing, generateLeads, manageSalesPipeline, customerSupport, billsAndCollectPayment, buildWebsite, createMarketingContent, or stillExploring.
hubspotmcp_submit_feedbackSubmit user feedback about the HubSpot MCP connector to HubSpot.WriteSubmit Feedback
Submit user feedback about the HubSpot MCP connector to HubSpot.
Inputs
feedbackstringrequired- User's verbatim feedback about the HubSpot connector. CRITICAL RULES: - Use the user's EXACT words. NEVER paraphrase, summarize, or rewrite. - If the user said it in their language, keep it in their language. - If the user hasn't typed specific feedback yet, do NOT fill this in yourself — ask them first. - Avoid PII — use anonymized references.
explanationOfSatisfactionstring- Brief explanation of what went wrong from the agent's perspective. When errors occurred: Explain why the agent made a request that failed validation, including what the agent's reasoning was and why it failed. This helps with investigation and improvement. Example: 'Error: "A non-empty list of objects to create or update must be provided" - Agent attempted to batch update contacts but incorrectly passed an empty list because it filtered out all objects based on a misunderstanding of the user's criteria.'
feedbackTypestring- Category of the feedback being submitted. Used to triage and analyze feedback trends.
- PROBLEM: Something is broken or not working as expected (errors, incorrect results, bugs).
- FEATURE_REQUEST: A request for new functionality or capability, including enhancements to existing features that would require new behavior to be built.
- GENERAL_FEEDBACK: Opinions, observations, or suggestions about an existing tool or workflow — e.g., usability impressions, praise, workflow friction, or improvement ideas that don't rise to the level of a bug report or feature request.
- OTHER: Use only when the feedback genuinely does not fit any of the above categories.one of
PROBLEMFEATURE_REQUESTGENERAL_FEEDBACKOTHER goalstring- User's goal or what they were trying to accomplish and relevant conversation context. Avoid PII - use anonymized references. Important: Avoid adding extraneous information, especially from memory.
sourceInterfacestring- Where the feedback originated.
- MCP_UI: Submitted from the dedicated in-app feedback UI rendered by the MCP host (e.g. a feedback form/widget the user explicitly opened).
- NON_UI: Submitted from a regular chat conversation (no dedicated feedback UI).one of
MCP_UINON_UI triggeringToolNamestring- Name of the HubSpot tool related to this feedback. IMPORTANT: This tool ONLY collects feedback about HubSpot connector tools. Do NOT submit feedback about non-HubSpot tools (e.g. Slack, Microsoft 365, Notion, iMessage, Intercom, Bash, etc.).
hubspotmcp_manage_campaign_objectsCreates or updates HubSpot marketing campaigns and manages asset associations.DestructiveManage Campaign Objects
Creates or updates HubSpot marketing campaigns and manages asset associations. Use CRM tools to retrieve the campaign's campaignCrmObjectId before using CAMPAIGN_UPDATE or CAMPAIGN_ASSET operations. Always show proposed changes and get explicit user approval before creating or updating campaigns or modifying asset associations. operationType is required on every request: CAMPAIGN_CREATE (set createRequest), CAMPAIGN_UPDATE (set updateRequest), CAMPAIGN_ASSET (set assetRequest; call CAMPAIGN_ASSET_TYPES_LIST first), CAMPAIGN_ASSET_TYPES_LIST (no additional fields), CAMPAIGN_CLONE (set cloneRequest).
Inputs
operationTypestringrequired- Required. The operation to perform: CAMPAIGN_CREATE, CAMPAIGN_UPDATE, CAMPAIGN_ASSET, CAMPAIGN_ASSET_TYPES_LIST, or CAMPAIGN_CLONE.one of
CAMPAIGN_CREATECAMPAIGN_UPDATECAMPAIGN_ASSETCAMPAIGN_ASSET_TYPES_LISTCAMPAIGN_CLONE assetRequestobject- Asset association data. Required when operationType is CAMPAIGN_ASSET.
cloneRequestobject- Campaign clone data. Required when operationType is CAMPAIGN_CLONE.
createRequestobject- Campaign creation data. Required when operationType is CAMPAIGN_CREATE.
updateRequestobject- Campaign update data. Required when operationType is CAMPAIGN_UPDATE.
hubspotmcp_manage_crm_objectsCreate or update CRM objects with properties and associations.DestructiveManage Crm Objects
Create or update CRM objects with properties and associations. Use createRequest to create, updateRequest to update.
Inputs
confirmationStatusstring- User confirmation for write actions. Must be CONFIRMED or CONFIRMATION_NOT_REQUIRED.one of
CONFIRMEDCONFIRMATION_WAIVED_FOR_SESSION createRequestobject- Required when creating new CRM objects.
updateRequestobject- Required when updating existing CRM objects.
hubspotmcp_manage_landing_pageRead from or write to HubSpot landing pages.DestructiveManage Landing Page
Read from or write to HubSpot landing pages. Specify the action field to control the operation (LIST, GET, CREATE, UPDATE, DELETE, etc.).
Inputs
actionstringrequired- Action to perform. One per call. READ actions (no side effects): "MODULES": list every module on the page draft. Each entry includes the module's field values, its layout position (sectionId, rowIndex, parentCellName when it lives inside a nested column, and cellWidth/cellX on the 12-column grid), and ownership flags (overrideable, globalOwned, globalPartialPath, themePartialOwned). Positions are populated even on a freshly created template page, before any edit. Capture a module's position here BEFORE you REMOVE or MOVE it so you can restore or reposition it precisely. Check ownership before REMOVE/MOVE: true global partials (header/footer) and global widgets are refused, but modules inside theme dnd_partial sections are removable and movable. "MODULE_TYPES": list available module types for this page's theme (call before INSERT). "MODULE_DEF": full field schema for a module type (requires modulePath). The response also includes the curated guide in moduleGuide when one exists, so a separate MODULE_GUIDE call is usually unnecessary. "MODULE_STYLES": read the layout styles (padding, margin, background, visibility) for a module (requires moduleId). "MODULE_GUIDE": (rarely needed — MODULE_DEF already returns the same guide inline) curated markdown for the modulePath covering required fields, common traps, and a minimal INSERT body. Errors if no guide exists; check MODULE_TYPES.hasGuide first. "REVISIONS": list recent page revisions for undo. "TEMPLATES": list landing page templates available in the portal (contentId not required). "FORMS": list forms available in the portal for embedding via the @hubspot/form module (contentId not required). Returns guid, name, portalId, formType, isPublished, createdAt, updatedAt. "BRAND_KIT": fetch the portal's primary brand kit (colors, fonts, logos) when brand-consistent content would help — e.g. picking a CTA color, a hero font, or a logo to drop into a header (contentId not required). WRITE actions (mutate the same shared draft — issue them ONE AT A TIME, never in parallel): "CLONE": duplicate an existing page (requires contentId of the source page; optional pageName and slug for the clone). Returns a new contentId. "CREATE_FROM_TEMPLATE": create the page from a template (requires pageName and templatePath; optional slug). MUST be preceded by a proposal card (call render_landing_page_ui directly with a "propose" target — there is no separate write step to propose) and an explicit user confirmation IN CHAT — never the first step of creating a page, and choosing a template is NOT confirmation. Returns contentId. "SET_MODULE_FIELDS": verbatim field patch on one module (requires contentId, moduleId, fieldOverridesJson). "SET_MODULE_STYLES": set layout styles (padding, margin, background, visibility) on one module (requires contentId, moduleId, stylesJson). Merge semantics — only supplied fields are updated. Call action=MODULE_STYLES first to see current values. "SET_SECTION_STYLES": set the background, padding, margin, or full-width of the ENTIRE SECTION band a module sits in (requires contentId, moduleId, stylesJson; moduleId is any module inside the band, used as an anchor). This is the correct way to do "make this section's background <color>" — do NOT inject CSS via SET_METADATA headHtml for section backgrounds. Merge semantics. Page-scoped bands — including theme dnd_partial sections — CAN be styled; only true global sections (header/footer/global widgets) are refused. "INSERT": add a new module (requires contentId, modulePath; then EITHER anchorModuleId+anchorPosition for anchor-based placement, OR sectionId+rowStart+columnStart+columnsSpanned for grid-coord placement; optional fieldOverridesJson). "REMOVE": delete one module (requires contentId, moduleId). If it was the last module in its section band, the now-empty band — background and padding included — is collapsed too, so no empty "Drop modules here" ghost band is left behind. "REMOVE_SECTION": delete the ENTIRE section band a module sits in — the whole top-level row, every module in it, AND the band's own background/padding styles (requires contentId, moduleId; moduleId is any module inside the target band, used as an anchor). Page-scoped sections — including theme dnd_partial sections like a logo bar — CAN be removed; only true global sections are refused. "MOVE": reposition module (requires contentId, moduleId; optional sectionId, rowStart, columnStart). "SET_METADATA": update page metadata — pageName, htmlTitle, slug, metaDescription, featuredImageUrl, language, headHtml (requires contentId; all metadata fields optional). "PUBLISH": publish draft (requires contentId; confirm with the user first). "RESTORE_REVISION": roll back to revision (requires contentId, revisionId; confirm first).
anchorModuleIdstring- Anchor-based placement: moduleId of an existing module that the new INSERT should land relative to. When provided, omit rowStart / columnStart / columnsSpanned — the backend resolves the target row from the anchor and auto-redistributes column widths across siblings. Pair with anchorPosition.
anchorPositionstring- Anchor placement direction. Used with anchorModuleId on INSERT. Values: "BEFORE" (new module on a new row immediately above the anchor's row), "AFTER" (new row immediately below), "IN_ROW_WITH" (sibling cell appended to the right of all existing cells in the anchor's row — siblings give up width), "IN_ROW_BEFORE" (sibling cell positioned to the LEFT of the anchor within the same row), "IN_ROW_AFTER" (sibling cell positioned to the RIGHT of the anchor within the same row, regardless of any cells beyond the anchor), "START_OF_SECTION" (first row of anchor's section), "END_OF_SECTION" (last row of anchor's section), "STACK_ABOVE" (wrap the anchor in a column and place the new module ABOVE it as a stacked row), "STACK_BELOW" (same, stacked BELOW). STACK_* builds a "unified section" — both modules share ONE wrapper cell as separate rows (the shape the editor's drag-to-stack creates); use it instead of BEFORE/AFTER when the two modules should read as one visual group rather than independent section rows. STACK requires a module anchor inside a section (not a top-level section id).
availableForNewContentboolean- When action=TEMPLATES: filter to templates available for new page creation. Omit to return all templates.
columnsSpannedinteger- Width in columns on the 12-column grid. Required for INSERT when using legacy grid-coord placement. Full width=12, two halves=6 each, three thirds=4 each. Omit when using anchor-based placement (anchorModuleId + anchorPosition) — width is computed automatically by stealing from siblings.
columnStartinteger- 1-based column position on a 12-column grid. Required for INSERT (grid-coord placement). Optional for MOVE. columnStart=1 is leftmost.
contentIdinteger- Content ID of the landing page. Required for most actions. NOT required for CREATE_FROM_TEMPLATE (creates a new page), TEMPLATES, FORMS, BRAND_KIT, MODULE_DEF, and MODULE_GUIDE.
featuredImageUrlstring- Featured image URL for social sharing. Only used for SET_METADATA. Omit to leave unchanged.
fieldOverridesJsonstring- JSON object of verbatim field values (e.g. {"heading":"Close deals faster"}). Required for SET_MODULE_FIELDS. Optional for INSERT (sets initial field values on the new module).
folderNamestring- When action=TEMPLATES: filter by folder name (e.g. "my-theme/templates").
headHtmlstring- Raw HTML injected into <head> (e.g. "<style>body{background:#2563eb}</style>"). Only used for SET_METADATA. Omit to leave unchanged.
htmlTitlestring- HTML <title> tag for the page (~50–60 chars). Only used for SET_METADATA. Omit to leave unchanged.
hublSourcestring- Complete HubL template source. Required for CREATE_CUSTOM_TEMPLATE and UPDATE_CUSTOM_TEMPLATE. Must be a valid HubL document — real HubL expressions, not escaped HTML. {{ standard_header_includes }} and {{ standard_footer_includes }} are injected automatically before </head> and before </body> if absent.
languagestring- ISO-639-1 language code (e.g. "en", "de"). Used for SET_METADATA (omit to leave unchanged).
limitinteger- Maximum number of results to return per page.
metaDescriptionstring- Meta description for search snippets (~140–160 chars). Only used for SET_METADATA. Omit to leave unchanged.
moduleIdstring- Module ID to operate on. Required for SET_MODULE_FIELDS, SET_MODULE_STYLES, SET_SECTION_STYLES, REMOVE, REMOVE_SECTION, MOVE, and MODULE_STYLES. For REMOVE_SECTION and SET_SECTION_STYLES it is any module inside the target section band (an anchor). Find IDs via action=MODULES.
modulePathstring- Module type path (e.g. "@hubspot/rich_text"). Required for INSERT, MODULE_DEF, and MODULE_GUIDE. Use paths exactly as returned by action=MODULE_TYPES.
offsetinteger- Pagination offset — number of records to skip before returning results.
pageNamestring- Name for the landing page. Required for CREATE_FROM_TEMPLATE. Optional for CLONE (defaults to a copy of the source page name). Also used by SET_METADATA to update the internal listing name shown in the HubSpot content listing UI (not the HTML title).
querystring- Text to search for within the default searchable properties of the specified object type.
responseFormatstring- Verbosity of the response. "DETAILED" returns all fields and is the default when omitted. "SUMMARY" trims verbose fields to save tokens on large pages: when action=MODULES, drops module field values and returns only module IDs, modulePaths, and section info. For MODULE_TYPES, MODULE_DEF, and REVISIONS, SUMMARY currently returns the same payload as DETAILED.
revisionIdstring- Revision ID to restore. Required for RESTORE_REVISION. Find IDs via action=REVISIONS.
rowStartinteger- 1-based row position within the section. Required for INSERT (grid-coord placement). Optional for MOVE. Modules with the same rowStart and sectionId are placed side-by-side.
sectionIdstring- Layout section ID to place the module in. Required for INSERT (grid-coord placement). Optional for MOVE (omit to keep current section). Find section IDs via action=MODULES.
slugstring- URL slug (lowercase, hyphenated, no leading slash). Used for SET_METADATA (omit to leave unchanged), CREATE_FROM_TEMPLATE (omit to derive from pageName), or CLONE (omit to auto-generate).
stylesJsonstring- JSON object of structured layout styles to merge. Required for SET_MODULE_STYLES (onto a module) and SET_SECTION_STYLES (onto a section band). Uses merge semantics: only supplied fields are updated, existing styles are preserved. Shape: {"breakpoint_styles":{"default":{"padding":{"top":{"value":20,"units":"px"}},"margin":{"top":{"value":10,"units":"px"}}}}}. Supported breakpoints: "default" (desktop), "mobile". Supported spacing sides — padding: top, right, bottom, left; margin: top, bottom. Each side is a Size: {"value":<number>,"units":"px"|"em"|"rem"|..."}. Background color (mainly for SET_SECTION_STYLES) goes in the top-level backgroundColor field as r/g/b/a: {"backgroundColor":{"r":255,"g":238,"b":0,"a":1}} (r/g/b 0–255, a 0–1). Section-only fields (SET_SECTION_STYLES): "forceFullWidthSection":true OR "maxWidthSectionCentering":<px> (mutually exclusive). Use camelCase keys (e.g. backgroundColor, breakpointStyles, forceFullWidthSection) — they mirror what action=MODULE_STYLES returns. Also supports per-breakpoint "hidden":true/false to toggle visibility. Layout only — for TEXT color use the separate textColor field, not this.
templatePathstring- Template path to build the page on. Required for CREATE_FROM_TEMPLATE. Use action=TEMPLATES to discover available templates, then pass the templatePath exactly as returned.
textColorstring- For action=SET_MODULE_STYLES: set the text color of ALL text in a module (headings, paragraphs, list items) to this CSS color, e.g. "#cc0000", "red", or "rgb(204,0,0)". This is the reliable way to recolor module text — it writes a scoped, !important rule the renderer applies to the module's own elements, overriding the theme. Do NOT hand-roll headHtml CSS for text color, and do NOT use it to recolor a whole section (use the section's sectionStyleVariant for that). Supply with moduleId; may be combined with stylesJson.
themePathstring- When action=TEMPLATES: filter templates by theme path. Use for HubSpot themes ("@hubspot/elevate", "@hubspot/growth"), marketplace themes ("@marketplace/vendor/theme-name"), or custom themes ("my-custom-theme"). Omit to return templates across all themes.
No tools match.