HubSpot
Work with your HubSpot data to analyze patterns, create and update records, and manage your CRM operations. Read from and write to deals, contacts, companies, tickets, engagements, and other objects you have permission to access. Prepare reports, update deal stages, log calls and emails, create tasks, or review pipeline details before meetings. Use it for quick updates in chat or comprehensive CRM management, all grounded in your actual HubSpot data. Learn more: https://knowledge.hubspot.com/integrations/connect-your-hubspot-account-to-chatgpt
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- B2B Sales CRM Platforms
- Secondary Subcategories
- Content & SEOCRM Systems
- Brand
- HubSpot
- Access
- Account required
- First tracked
- 2026-07-07
- Tool count
- 18
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is visible.
ChatGPT Plugin Discoverability Score
ChatGPT organic discovery is not live yet
HubSpot is tracked in the ChatGPT Plugin registry. Public organic-discovery measurement is not live for ChatGPT yet, so there is no score to publish today.
Get notified when your score goes live
Enter your work email and we’ll notify you when ChatGPT Plugin organic discovery scoring launches.
No spam. Unsubscribe any time.
Competing in ChatGPT B2B Sales CRM Platforms
View CategoryHow the Discoverability Score works
Organic discovery scoring for HubSpot on ChatGPT is not live yet. The score will use measured agent conversations when it launches.
Organic discovery scoring is pending. Your Plugin score will appear on this scale when measurement goes live.
FoundDiagnostic
Whether Claude found your Plugin in connector search. It must be Found before it can reach the picker, but the score counts picker appearances—not search results.
PickedMain score
How often your Plugin appeared in the picker, or Claude invoked it directly, across contested conversations. This percentage is the Discoverability Score; the headline number is rounded.
PositionedDiagnostic
What position your Plugin appeared in when it was shown in the picker. This shows prominence, but it does not affect the score.
18 tools agents can invoke
<purpose> Retrieves guidance and usage instructions for a set of HubSpot tools. </purpose> <when_to_use> - If a tool's description isn't enough to commit to using it - To find if a tool's inputs or outputs have further semantic meaning - To learn understand if and how certain tools can work together </when_to_use>
tool_guidance
Searches HubSpot schema to discover available data types or look up known types directly. <capabilities> - Searches across all HubSpot data types available to the current user - Returns type names that can be used as input to other tools - Shows read/write access status for each type based on the current user's permissions </capabilities> <usage_guidance> - Use this tool FIRST when you need to identify which data types exist before querying data - Use SEARCH_OBJECT_TYPES when you don't know the exact type name - Use 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 </usage_guidance> <examples> <example> <user_input>How many support requests did we get last month?</user_input> <thoughts>The user is asking about support requests. I need to find the right data type to query.</thoughts> <tool_call>{"query": {"_queryType": "SEARCH_OBJECT_TYPES", "searchTerms": "support requests tickets"}}</tool_call> </example> <example> <user_input>Show me our fleet vehicle records</user_input> <thoughts>Fleet vehicles is likely a custom object. Let me discover it first.</thoughts> <tool_call>{"query": {"_queryType": "SEARCH_OBJECT_TYPES", "searchTerms": "fleet vehicles"}}</tool_call> </example> <example> <user_input>How many products do we have?</user_input> <thoughts>"products" is ambiguous — it may be HubSpot's standard Products object or a custom object like p12345_product_models, and semantic search tends to rank the standard one first, so I won't just take the top hit. I'll review all candidates and, if more than one plausibly matches, ask the user to clarify before querying.</thoughts> <tool_call>{"query": {"_queryType": "SEARCH_OBJECT_TYPES", "searchTerms": "products"}}</tool_call> </example> <example> <user_input>What fields are on contacts and deals?</user_input> <thoughts>The user already named the types. I can look them up directly.</thoughts> <tool_call>{"query": {"_queryType": "GET_OBJECT_TYPES", "typeNameFilter": ["CONTACT", "DEAL"]}}</tool_call> </example> <example> <user_input>What types of data does HubSpot have?</user_input> <thoughts>The user wants to see all available types. I'll use GET_OBJECT_TYPES and omit typeNameFilter to retrieve everything.</thoughts> <tool_call>{"query": {"_queryType": "GET_OBJECT_TYPES"}}</tool_call> </example> </examples>
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. CONTACT_COUNT = contacts whose interactions influenced closed-won deals; this is NOT a "new contacts generated" metric. For non-attribution contact queries (new contacts, influenced contacts, sessions), use read_campaign_data with GET_ANALYTICS. Scope note: this data covers closed-won / attributed deals only. For deals at any stage (open, opportunity, qualifiedtobuy, and so on), use read_campaign_data with operation=GET_ASSET_METRICS and assetType=DEAL (returns name, stage, amount, close date for all associated deals) 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.
Run a content analytics report across landing pages, website pages, and blog posts in the portal. Returns: TOTALS: ranked rows of contentId, contentTitle, and the requested metric value. TIME_SERIES: per-contentId series of {timestamp, value} points for the requested metric and period. SUMMARY: aggregated per-period points (one value per bucket) for the requested metric. PEOPLE: list of contacts/visitors (contactId or session identifier, plus available identity fields) who viewed the specified contentIds. Pick mode by intent: TOTALS to rank, TIME_SERIES to chart trends per page, SUMMARY for a single aggregated trend, PEOPLE for who-viewed lookups. TIME_SERIES/PEOPLE require contentIds. Examples: mode=TOTALS metric=VIEWS limit=10 -> top 10 pages by views. mode=TIME_SERIES contentIds=[123] metric=SUBMISSIONS period=LAST_30_DAYS -> daily submissions for page 123. Requires 'Read analytics related to pages, blogs and other content assets' permission and a Pro or Enterprise portal.
Fetches multiple CRM objects of the same object type in a single request. <returns> A list of CRM objects with their properties, identified by their unique IDs, containing: - id: Unique identifier for the CRM object - properties: Key-value pairs of property names and their values - createdAt: Timestamp when the object was created - updatedAt: Timestamp when the object was last updated - url: URL to view the object in HubSpot </returns> <usage_guidance> - Use the `search_crm_objects` tool to list a few objects first without a filter criteria - Then use the `get_crm_objects` tool to retrieve those objects by their IDs without any properties in the tool input to understand the data model - This will help you understand the structure of the objects and their properties </usage_guidance>
Lists organization-wide teams, job titles (roles), seats, and account information (eg timezone, currency). Use the include parameter to request only the data you need. <returns> - GUIDANCE (optional): Returned if additional context is required so provide a useful response Only fields listed in the include parameter are returned (or all fields if include is omitted): - TEAMS: Team objects with name, member's owner IDs, and metadata (org-wide, not personal — for the current user's team use get_user_details with include=[TEAMS_AND_ROLES]) - SEATS: Available seat type names in the organization (use these as filters with search_crm_objects on USER objectType to count how many users hold each seat) - JOB_TITLES: Job titles/roles present in the organization - ACCOUNT_INFORMATION: Account timezone, currency, account type, UI domain, account ID, portal name, and create date (epoch millis). Portal name and create date require the portal-context-metadata rollout </returns> <usage_guidance> - IMPORTANT: Check if user query contains first-person language ("my team", "my role", "my manager", "my direct reports") - If query uses "my", "I", or "me" referring to personal context → Use get_user_details instead - EXCEPTION: "my teams" or "which teams am I on" should use this tool since get_user_details only returns a single primaryTeam - If query is organization-wide ("our marketing team", "the sales team", "all managers", "my teams") → Use this tool - Use the include parameter to fetch only what you need and reduce response size - Include TEAMS when you need team membership or structure - Include SEATS when you need available seat types - Include JOB_TITLES when you need roles/job titles to filter users by role - Include ACCOUNT_INFORMATION when you need the account's timezone, currency, account type, UI domain, portal name, or create date - To find or count users by role or seat, use the returned job titles or seat types as filters with search_crm_objects on USER objectType - SEATS returns only seat type names, not user counts — you MUST follow up with search_crm_objects to get user counts per seat type - When the user references a team's data (e.g., 'our sales team's deals', 'marketing team pipeline'), use this tool first with include=[TEAMS] to resolve team membership to owner IDs, then pass those IDs as filters to search_crm_objects. - To find "my teams" (plural), call this tool with include=[TEAMS] and find teams with the user's ownerId -- [IMPORTANT]: DO NOT use member name for matching, only use ownerId - [IMPORTANT] If the `guidance` field is present, read it carefully before responding — it may contain a user-facing message (e.g., missing permissions requiring reauthorization) that must be relayed to the user, or an agent-internal hint (e.g., name disambiguation) that should influence how you process the results </usage_guidance> <examples> <example> <user_query>Who works in sales at my company?</user_query> <action>Use this tool with include=[TEAMS] to get teams, then filter for sales-related ones</action> </example> <example> <user_query>Show me deals for MY team?</user_query> <action>Do NOT use this tool, use get_user_details instead</action> </example> <example> <user_query>Search deals for all marketers</user_query> <action>Use this tool with include=[JOB_TITLES] to find marketing-related roles</action> </example> <example> <user_query>How many users have each seat type?</user_query> <action>Use this tool with include=[SEATS] to get seat type names, then use search_crm_objects on USER objectType filtering by each seat type to count users per seat</action> </example> <example> <user_query>Show me our sales team's deal pipeline</user_query> <action>Use this tool with include=[TEAMS] to get the sales team's member owner IDs, then use search_crm_objects to filter deals by those owner IDs.</action> </example> <example> <user_query>Which teams am I on?</user_query> <action>Use this tool with include=[TEAMS] to get all teams, then find teams that contain the member's ownerID (NOT MEMBER'S NAME)</action> </example> </examples>
Fetches property definitions including data types and enumeration values. <capabilities> - Particularly useful for discovering valid options in enumeration-type properties - To search for actual data, use search_crm_objects </capabilities> <returns> List of property definition objects containing: - name: Property identifier - label: Display label - description: Property description - type: Data type (string, enumeration, number, etc.) - options: For enumeration types, list of valid values with labels </returns> <usage_guidance> - Property details can be unexpectedly large. Consider fetching in batches - It's not advised to pass an objects full list of properties into this tool </usage_guidance>
Returns user, team and hub info; CRM/marketing object and tool availability. <usage_guidance> - This tool must be used before performing any operations with Hubspot tools to determine the identity of the user, and permissions they have on their Hubspot account - This tool only return information for the current user. Search for "users" objectType using the search_crm_objects tool to find other users/owners in the HubSpot account - This tool provides the availability of crm object types to the current user. Use these values in tools which expect crm object type parameters - This tool provides more accurate availability of the other tools provided by this MCP service. This is critical when tool returned in the response is not `AVAILABLE` - Every non `AVAILABLE` object type or tool requires some user interaction to resolve, noting that some issues cannot be resolved by just the user themselves - Each object type returns TWO separate availability statuses: `read` for view/search operations and `write` for create/update operations. Check the appropriate permission based on the operation you intend to perform - Use the "include" param to request only the sections you need; omitting it or passing an empty list returns USER_INFORMATION and TOOL_INFORMATION only — TEAMS_AND_ROLES must be explicitly requested - For account-level settings (timezone, currency, account type, UI domain), use get_organization_details with include=[ACCOUNT_INFORMATION] instead of this tool - TEAMS_AND_ROLES returns context specific to the current user only (their primary team, job title, direct reports); for org-wide team or role data, including "my TEAMS", use get_organization_details - IMPORTANT: directReports are not the same as team members. If directReports is empty and the user asked about direct reports: stop, inform the user that no direct reports are configured, and ask whether they want to proceed with team members instead — do not automatically substitute team members for direct reports </usage_guidance> <availability_guidance> <status name="AVAILABLE">It is free to use without issue</status> <status name="REQUIRES_REAUTHORIZATION">The user needs to perform a new authorization flow through HubSpot to unlock new access. This is possible through disconnecting and reconnecting the HubSpot connector through their settings</status> <status name="REQUIRES_PERMISSION_MODIFICATION">The user lacks the correct permission in their HubSpot account. If the only way to resolve a task is to use this tool or object, you should inform the user of their lacking permissions and let them decide if they want to ask their administrator for more privilege</status> <status name="REQUIRES_ACCOUNT_MODIFICATION">The whole HubSpot account lacks the correct permissions and would require an account upgrade. Again, inform the user about these tools or objects only if the presented task can only be solved using them</status> <status name="BLOCKED_FOR_PORTALS_WITH_SENSITIVE_DATA">The operation involves sensitive data, and no troubleshooting will unblock usage of the object or tool. If the only way to resolve a task is to use this tool or object, inform the user of the issue and ask them how they would like to proceed</status> <status name="NOT_AVAILABLE">There is no action the user can take to enable the object or tool. It is simply unavailable for use</status> </availability_guidance> <returns> - Always returned: user ID and Hub ID (accountId) - Only fields listed in the include parameter are returned (or all fields if include is omitted): - USER_INFORMATION: owner ID, name, and email for the current user - TOOL_INFORMATION: a mapping of CRM object types to separate `read` and `write` availability statuses; a mapping of other MCP tools to current availability - TEAMS_AND_ROLES: the current user's job title, assigned seats, primary team with member owner IDs, and direct report owner IDs (personal context only — use get_organization_details for org-wide team/role data) - If the `guidance` field is present, relay its message to the user — it may indicate unrecognized include values, missing permissions requiring reauthorization, or other issues - If present, the onboarded field indicates whether the portal has completed initial setup (true = onboarded, false = new portal that has not been set up yet) </returns> <examples> <example> <user_query>Compare workload across my direct reports</user_query> <action>Call with include=[TEAMS_AND_ROLES]. If directReports is empty, ask the user if they would like to compare workload across their primary team members instead. DO NOT use team members unless user confirms.</action> </example> </examples>
Creates or updates HubSpot marketing campaigns and manages asset associations. <prerequisites> Use CRM tools to retrieve the campaign's campaignCrmObjectId before using CAMPAIGN_UPDATE or CAMPAIGN_ASSET operations. </prerequisites> <mandatory_confirmation_process> Always show proposed changes in a table and get explicit user approval before creating or updating campaigns or modifying asset associations. This step is CRITICAL. <confirmation_rules> - **First confirmation only**: Add this line after the approval prompt: "Want to skip confirmations for this chat? Just ask." - **After 1 confirmation**: Stop offering the skip option, but keep confirming - **If user opts out**: Skip confirmations for remainder of session </confirmation_rules> <confirmation_format> Proposed Changes: | operationType | Field | Value | |-----------------|-------------|-------------------| | CAMPAIGN_CREATE | displayName | Q3 Brand Campaign | Approve? [✅ Yes / ❌ No] Want to skip confirmations for this chat? Just ask. </confirmation_format> </mandatory_confirmation_process> <operations> The `operationType` field is required on every request: - CAMPAIGN_CREATE: set `createRequest` with required `displayName`, optional `startDate`, `endDate`, `goal`, `audience`, `notes`, `customProperties`. - CAMPAIGN_UPDATE: set `updateRequest` with required `campaignCrmObjectId`, optional `displayName`, `startDate`, `endDate`, `goal`, `audience`, `notes`, `customProperties`. - CAMPAIGN_ASSET: set `assetRequest` with required `campaignCrmObjectId`, `assetOperations` (non-empty list of `{action, assetObjectType, crmObjectIds}`). Each entry has its own ADD|REMOVE action. Check `assetOperationFailures` in the response — if non-empty, those operations failed; succeeded ones are already applied. Call CAMPAIGN_ASSET_TYPES_LIST first. - CAMPAIGN_ASSET_TYPES_LIST: no additional fields required. </operations>
Creates or updates CRM objects with properties. Create object associations. <prerequisites> Use the get_user_details tool to identify the ownerId and check supported object types. </prerequisites> <mandatory_confirmation_process> Always show proposed changes in a table and get explicit user approval before creating or updating CRM objects. This step is CRITICAL for you to use this tool correctly. <confirmation_rules> - **First confirmation only**: Add this line after the approval prompt: "Want to skip confirmations for this chat? Just ask." - **After 1 confirmation**: Stop offering the skip option, but keep confirming - **If user opts out**: Skip confirmations for remainder of session </confirmation_rules> <confirmation_format> Proposed Changes: | Object Type | ID | Property | Current Value | New Value | |-------------|-----|----------|-----------------|--------------------| | Contact | 123 | email | old@example.com | new@example.com | Approve? [✅ Yes / ❌ No] Want to skip confirmations for this chat? Just ask. </confirmation_format> </mandatory_confirmation_process> <creating_associations> To create associations between CRM objects: - Use the createRequest attribute to create a new CRM object and associate it with an existing CRM object - Use the updateRequest attribute to associate two existing objects - ALWAYS ask user to confirm which specific objects should be associated before creating associations - Example workflow: create contact → get contact ID → find company ID → confirm with user → create an association </creating_associations> <guidance> - Limit upsert objects and associations to a MAXIMUM of 10 objects per request - Not all properties are editable. Use search_properties tool to list available properties or search_crm_objects to sample existing data before making changes </guidance>
Create, edit, style, publish, clone, and inspect HubSpot landing pages. One action per call. Read actions: MODULES, MODULE_TYPES, MODULE_DEF, MODULE_STYLES, MODULE_GUIDE, REVISIONS, TEMPLATES, FORMS, BRAND_KIT. Write actions: CREATE_FROM_TEMPLATE, SET_MODULE_FIELDS, SET_MODULE_STYLES, SET_SECTION_STYLES, INSERT, REMOVE, REMOVE_SECTION, MOVE, SET_METADATA, PUBLISH, CLONE, RESTORE_REVISION, "CREATE_CUSTOM_TEMPLATE", "UPDATE_CUSTOM_TEMPLATE". Read before you write: call action=MODULES to capture verbatim current values AND each module's layout position before any edit, action=MODULE_TYPES before INSERT, action=MODULE_DEF before writing unfamiliar fields, action=MODULE_STYLES before SET_MODULE_STYLES. Write actions mutate the same shared draft, so issue them ONE AT A TIME — never concurrently/in parallel. Wait for each response before the next, or parallel writes will clobber each other. Reads have no side effects and may be batched. Creating a page requires explicit user confirmation IN CHAT before CREATE_FROM_TEMPLATE — choosing a template is NOT confirmation. This tool never renders a card. After your LAST edit (or after create-then-populate or PUBLISH), call the render tool to show the finished page. Confirm with the user before PUBLISH or RESTORE_REVISION. Examples: action=MODULES contentId=123 -> modulesJson with module IDs and current field values. action=CREATE_FROM_TEMPLATE pageName="Spring Promo" templatePath="@hubspot/elevate/templates/lp-clickthrough.hubl.html" -> {status:"created", contentId:456, editorUrl}. action=SET_MODULE_FIELDS contentId=456 moduleId="hero_1" fieldOverridesJson={headline:"Hi"} -> verifiedFieldsJson. action=SET_SECTION_STYLES contentId=456 moduleId="hero_1" stylesJson={backgroundColor:{r:255,g:238,b:0,a:1}} -> verifiedStylesJson. Read actions require 'landingpages-read' or 'landingpages-write'. Write actions require 'landingpages-write'. The PUBLISH action additionally requires 'landingpages-publish'.
Queries HubSpot CRM data via SQL with HubSpot-specific extensions. IMPORTANT: You MUST call the Tool Guidance tool before your first query. It contains required guidance and examples. <select> IMPORTANT: Property names must exactly match HubSpot internal names. Always call search_properties to confirm names before querying. The record identifier property is hs_object_id. For financial values, prefer properties ending in _in_home_currency. <unsupported>SELECT DISTINCT, AS aliases, CASE WHEN, IF(), string functions (CONCAT, UPPER, etc.), COALESCE, associations.OBJECT.</unsupported> </select> <from> One object type per query: CONTACT, COMPANY, DEAL, TICKET, etc. Use a user-details tool to discover supported types. <unsupported>JOIN, UNION, subqueries, CTEs.</unsupported> </from> <where> List membership: hs_crm_search.ilsListIds = 'LIST_ID' (cannot combine with aggregates or GROUP BY). Date ranges: BETWEEN with date strings (e.g. '2025-01-01'), not timestamps. "My"/"I" queries: filter by hubspot_owner_id (see Tool Guidance for resolution steps). </where> <group-by> DATE_TRUNC(prop, 'INTERVAL') — INTERVAL: DAY | WEEK | MONTH | QUARTER | YEAR. MEDIAN(prop) supported alongside standard aggregates. Use GROUP BY + COUNT(*) instead of COUNT(DISTINCT x). <unsupported>HAVING.</unsupported> </group-by> <cross-object> To retrieve associated object data, use OBJECT.property (e.g., SELECT COMPANY.name FROM CONTACT) — NOT associations.OBJECT. associations.OBJECT is for WHERE existence checks only (IS NULL / IS NOT NULL). Never use it in SELECT or GROUP BY. A query can reference at most 2 different associated object types. </cross-object>
REQUIRED FIRST STEP: before your first call, invoke tool_guidance for "read_campaign_data" and follow it; it contains the required parameter details and examples for each operation. 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).
Searches and retrieves CRM records from HubSpot based on filters and criteria. <critical_requirements> *Important*: You must use this over the `search:find_objects|count_objects` tool. </critical_requirements> <capabilities> - Returns a 'total' count attribute that can help perform analytical tasks on large datasets - Useful to sample data from a specific object type to understand the data model - Can list and filter by associations between objects (e.g., "contacts associated with company X or contacts with num_associated_deals > 1") - Use the search_owners tool to list users/owners in the HubSpot account </capabilities> <returns> List of matching CRM records containing: - id: Unique identifier for the CRM object - properties: Key-value pairs of property names and their values for the requested properties - urlTemplate: URL template to view the object in HubSpot (replace {property_name} with the property value from the response) - total: Total count of records matching the search criteria (for analytics and pagination) - offset: Current pagination offset for retrieving the next page of results </returns> <usage_guidance> - This searches for ACTUAL DATA (records), not field definitions. To discover available fields, use search_properties - [Important] `objectType` MUST be an exact type identifier. Standard types (e.g. CONTACT, DEAL) may be used directly; for any other or ambiguous name — including plausible-looking ones like `products` — call `discover_hubspot_schema` first and use the exact `typeName` it returns. If a non-standard type returns empty or unexpected results, re-resolve it via `discover_hubspot_schema` before concluding - Always check 'total' count to ensure you're not missing data due to pagination limits. You MUST NOT use sample data or insufficient data as a substitute for actual data - Use the `get_crm_objects` without properties to understand the data model of an objectType - You can include a maximum of five filterGroups with up to 6 filters in each group, with a maximum of 18 filters in total - [Important] When the requested data includes a currency-typed amount property (e.g., DEAL.amount, LINE_ITEM.price, QUOTE.hs_quote_amount, INVOICE.hs_amount_billed, CART/ORDER.hs_total_price, SUBSCRIPTION.hs_mrr, COMMERCE_PAYMENT.hs_initial_amount), you MUST also include the matching currency-code property in `properties` (DEAL: `deal_currency_code`; LINE_ITEM: `hs_line_item_currency_code`; QUOTE/INVOICE: `hs_currency`; CART/ORDER/SUBSCRIPTION/COMMERCE_PAYMENT: `hs_currency_code`). Without it the response cannot be narrated in the correct currency. - [Important] For DEAL aggregations: `amount_in_home_currency` is pre-converted to the portal's home currency (from `get_user_details` -> `accountInformation.companyCurrency`); never pair it with `deal_currency_code`. NEVER sum raw `amount` across different `deal_currency_code` values. To aggregate: filter to a single currency, or use `amount_in_home_currency` and state the total is in the portal's home currency. - [Important] CRM Analysis can be a complex task. Work with the user to refine requirements and segment large datasets into manageable parts before performing analysis - [Important] You MUST include a clickable URL for every record returned, without exception. ALWAYS include UTM params in the URL - [Important] You should use `associatedWith` for searching objects by associations </usage_guidance> <filtering_capabilities> - Think of "filterGroups" as separate search conditions that you want to combine with OR logic (meaning ANY of them can match) - If you want to find things that match ALL of several conditions (AND logic), put those conditions together in the same filters list - If you want to find things that match AT LEAST ONE of several conditions (OR logic), put each condition in a separate filterGroup - You can include a maximum of five filterGroups with up to 6 filters in each group, with a maximum of 18 filters in total </filtering_capabilities>
Lists and searches for owners who can be assigned to CRM records. <capabilities> - Supports searching by name/email or batch lookup by owner IDs - HubSpot owner ids and user IDs are distinct, lookups only work when owner ids are provided specifically </capabilities> <returns> List of owner objects containing: - ownerId: The ID to use for hubspot_owner_id assignments - name: Display name of the owner - isActive: Whether the owner is currently active </returns> <examples> <example> <description>Search by name</description> <query>{"searchQuery": "John Smith"}</query> </example> <example> <description>Lookup specific IDs</description> <query>{"ownerIds": [12345, 67890]}</query> </example> <example> <description>Paginate results</description> <query>{"limit": 50, "offset": 50}</query> </example> </examples>
Finds the most relevant CRM property definitions using keyword-based search. <critical_requirements> *Important*: You must use this over the `fetch` tool to get HubSpot CRM Objects. </critical_requirements> <capabilities> - Lists all property definitions for specified object type when no search terms provided - To search for actual data, use search_crm_objects </capabilities> <returns> A filtered list of properties matching the search criteria containing: - name: Property identifier - label: Display label - description: Property description - matchScore: Relevance score for the property based on the search query (absent if no query is provided) </returns> <usage_guidance> - Use keywords field for multiple related property guesses in a SINGLE request (recommended for performance) - MAXIMUM OF 5 KEYWORDS ALLOWED PER REQUEST - exceeding this limit will return a validation error - Keywords should be property name guesses, not natural language phrases - Use query field for backward compatibility with single property guess - No search terms provided: Returns ALL properties for the object type (useful for discovery) </usage_guidance> <examples> <example> <user_input>total number of open tickets grouped by urgency</user_input> <thoughts>Customer is asking for total number of open tickets grouped by "urgency". I will look for the best matches on the "urgency" property for the "TICKET" object type.</thoughts> <query>{"objectType": "TICKET", "keywords": ["urgency"]}</query> </example> <example> <user_input>calls assigned to me</user_input> <thoughts>Customer is asking us to filter by calls assigned to them. I have a few guesses for what that property might be called: "assigned_to", "assignee", "owned_by", or "owner". Let me search for those on the "CALL" object type in one efficient request.</thoughts> <query>{"objectType": "CALL", "keywords": ["assignee", "assigned_to", "call_owner", "owned_by"]}</query> </example> <example> <user_input>list each company with its name, employees amount, zip code, and when we last touched base</user_input> <thoughts>Customer is asking us to list companies by a few attributes. I will guess keywords for each of those properties and search for them on the "COMPANY" object type in one request.</thoughts> <query>{"objectType": "COMPANY", "keywords": ["name", "employees", "zip_code", "last_contact"]}</query> </example> <example> <user_input>tickets for this year to identify top 10 most problems our customers face</user_input> <thoughts>Customer is asking us to analyze tickets. I will return all properties for the "TICKET" object type to help with discovery.</thoughts> <query>{"objectType": "TICKET"}</query> </example> </examples> <common_mistakes> - Do not exceed 5 keywords per request (will return validation error) - Keywords should be property name guesses, not natural language phrases </common_mistakes>
Opens an interactive feedback form for the user to submit feedback to HubSpot. <scope> This tool is EXCLUSIVELY for feedback about HubSpot connector tools (search_crm_objects, manage_crm_objects, get_properties, etc.). Do NOT use this tool for: - Issues with non-HubSpot tools (Slack, Microsoft 365, Notion, iMessage, Intercom, etc.) - General AI/LLM quality issues (wrong answers, hallucinations, formatting) - HubSpot product/UI issues unrelated to the connector If the user's issue is with a non-HubSpot tool, do NOT invoke this tool. Tell them this feedback channel is for HubSpot connector issues only. </scope> <routing> If submit_feedback is available in your toolset, call it directly — do NOT call this tool. A successful response from this tool does not mean the form rendered; clients without MCP UI support still return success. </routing> <when_to_invoke> <agent_detected_signals> - User provides explicit correction about HubSpot connector behavior - User states the HubSpot connector returned wrong data or errors - User expresses dissatisfaction with a HubSpot connector tool </agent_detected_signals> <user_initiated_signals> - Explicit feedback requests: "I want to give feedback", "Let me share feedback" - Indirect expressions to HubSpot: "HubSpot should know...", "Tell HubSpot..." - Any clear intent to communicate feedback to HubSpot </user_initiated_signals> </when_to_invoke> <agent_detected_flow> 1. Complete your response FIRST (provide the corrected answer) 2. At the END of your response, add a divider line (---) then on a NEW LINE, include ALL of these elements: a) Acknowledge what triggered this: "I noticed [you had to correct that / you expressed frustration]" b) Offer feedback collection: "Want to share feedback on the connector?" c) Make it optional: "Just ask anytime — I'll send it to HubSpot." 3. If user opts in: Call this tool to show the feedback form 4. If user declines or doesn't respond: Continue conversation normally. Never ask again this session. </agent_detected_flow> <user_initiated_flow> 1. Acknowledge immediately: "Happy to help with that — opening the feedback form now." 2. Call this tool to show the feedback form </user_initiated_flow> <critical_requirements> - NEVER suggest clicking Claude/ChatGPT thumbs up/down buttons sends feedback to HubSpot. Those buttons send feedback to Anthropic/OpenAI only. ONLY this tool sends feedback to HubSpot. </critical_requirements>
Collects and submits user feedback about the HubSpot connector to HubSpot. <scope> This tool is EXCLUSIVELY for feedback about HubSpot connector tools (search_crm_objects, manage_crm_objects, get_properties, etc.). Do NOT use this tool for: - Issues with non-HubSpot tools (Slack, Microsoft 365, Notion, iMessage, Intercom, etc.) - General AI/LLM quality issues (wrong answers, hallucinations, formatting) - HubSpot product/UI issues unrelated to the connector If the user's issue is with a non-HubSpot tool, tell them this feedback channel is for HubSpot connector issues only. </scope> <when_to_invoke> <agent_detected_signals> - User provides explicit correction about HubSpot connector behavior - User states the HubSpot connector returned wrong data or errors - User expresses dissatisfaction with a HubSpot connector tool </agent_detected_signals> <user_initiated_signals> - Explicit feedback requests: "I want to give feedback", "Let me share feedback" - Indirect expressions to HubSpot: "HubSpot should know...", "Tell HubSpot..." - Any clear intent to communicate feedback to HubSpot </user_initiated_signals> </when_to_invoke> <agent_detected_flow> 1. Complete your response FIRST (provide the corrected answer or handle the error). 2. At the END of your response, add a divider line (---) then on a NEW LINE: a) Note what went wrong: "I noticed an issue with the HubSpot connector." b) Ask if they want to report it: "Would you like to submit this as feedback to HubSpot?" c) Make it optional: "Just say yes — I'll walk you through it." 3. If user opts in: Ask them to describe the issue in their own words. WAIT for them to respond. 4. Show a preview: "Here's what I'll send to HubSpot: [their exact words]. Should I go ahead?" 5. WAIT for the user to confirm. Only call this tool once they say yes. 6. If user declines or doesn't respond: Continue conversation normally. Never ask again this session. </agent_detected_flow> <user_initiated_flow> 1. Acknowledge: "Happy to help with that. What would you like to share with HubSpot?" 2. If feedback is vague: "Can you be more specific about what went wrong? That helps HubSpot fix it." 3. WAIT for the user to provide clear, specific feedback in their own words. 4. Show a preview: "Here's what I'll send to HubSpot: [their exact words]. Should I go ahead?" 5. WAIT for the user to confirm. Only call this tool once they say yes. </user_initiated_flow> <critical_requirements> - NEVER call this tool unless the user has explicitly confirmed the feedback to be sent. - The feedback field MUST contain the user's own words. NEVER auto-generate or paraphrase feedback. - NEVER suggest clicking Claude/ChatGPT thumbs up/down buttons sends feedback to HubSpot. Those buttons send feedback to Anthropic/OpenAI only. ONLY this tool sends feedback to HubSpot. - NEVER submit feedback about non-HubSpot tools or connectors. </critical_requirements>
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are HubSpot alternatives on ChatGPT?
As of 2026-08-14, HubSpot competes with Allianz, Asbie, Attio, Breakcold, BROSH AI CRM, CarClever, Cirra AI, Clarify, Clearskies, Close, Coevera, decisionpoint.io, Guides, Haaretz, HighLevel, Hypha, Idea To Prototype Beta, item, Journaling with Medome, Levitate, LicitaLAB, Nash Agent, OnePageCRM, PortfolioIQ, Rallies, RealEstateIQ, RemindMeIQ, Rox, Salesflare, Streak, Talonic, Ticketek, Twenty, VoiceBit, WeightWise, YNAB: Get Good At Money, YouEx.ai, Zoho CRM in ChatGPT B2B Sales CRM Platforms, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.