HubSpot CRM MCP Server
Provides tools for interacting with HubSpot CRM, enabling search, creation, and updates of contacts, deals, and support tickets, plus a cross-object account summary tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@HubSpot CRM MCP ServerGive me an account summary for contact 12345"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
HubSpot CRM MCP Server
An MCP server that connects Claude directly to a HubSpot CRM — search, create, and update contacts, deals, and support tickets, plus a cross-object account summary tool that stitches all three together into one brief. Built as a demonstration of the kind of integration work a client/solutions engineer actually ships: wiring a real customer's business system up to an AI assistant, with the auth, error handling, and test coverage a production integration needs — not a toy demo.
Why this exists
Enterprise customers who want to use Claude against their own tools need someone to build the connector. This repo is that connector for HubSpot: a small, focused MCP server exposing the CRM objects a sales/support team actually works with, so Claude can answer "what deals are in the proposal stage" or "summarize this account" against real data instead of a copy-pasted CRM export.
Related MCP server: HubSpot MCP Server
Tools
Tool | What it does |
| Free-text search across name, email, company |
| Fetch one contact's full profile by ID |
| Create a new contact |
| Search deals, optionally filtered by pipeline stage |
| Fetch one deal, including its associated contacts |
| Create a deal, optionally associated with a contact |
| Move a deal to a new pipeline stage |
| Search support tickets, optionally filtered by priority |
| Create a support ticket, optionally associated with a contact |
| The cross-object tool — one contact's profile + every deal + every ticket associated with them, in a single readable brief |
get_account_summary is the one tool here that isn't a thin CRUD wrapper — it's the concrete reason to put an MCP server in front of a CRM instead of just using the CRM's own UI: assembling that view by hand normally means opening three separate tabs.
Setup
1. Install and build
npm install
npm run build2. Get a HubSpot access token
You don't need a paid HubSpot account — a free developer test account comes preloaded with realistic sample CRM data, which is what this was built and tested against.
In your HubSpot account: Settings → Integrations → Private Apps → Create a private app
Under Scopes, grant:
crm.objects.contacts.read/.writecrm.objects.deals.read/.writecrm.objects.tickets.read/.write
Copy the generated access token
3. Configure the token
cp .env.example .env
# paste your token into .env4. Point an MCP client at it
For Claude Desktop or Claude Code, add to your MCP config:
{
"mcpServers": {
"hubspot-crm": {
"command": "node",
"args": ["/absolute/path/to/hubspot-crm-mcp-server/dist/index.js"],
"env": { "HUBSPOT_ACCESS_TOKEN": "your-token-here" }
}
}
}Then ask Claude things like: "Search HubSpot for contacts at Acme" or "Give me an account summary for contact 12345".
5. Or test it standalone with the MCP Inspector (no Claude client needed):
npm run inspectorThis opens a browser UI to call each tool directly and inspect the raw responses — the fastest way to verify the server works end-to-end against your own HubSpot data before wiring up a client.
Testing
npm testThe full suite (26 tests) runs against a mocked fetch — no live HubSpot token required, so CI can run on every push without secrets. Tests cover the HTTP client (auth headers, request shaping, error handling, 404-as-empty-list semantics for associations) and every tool's business logic (formatting, filtering, the multi-call get_account_summary fan-out, and graceful handling when an association write fails).
Architecture
src/
hubspotClient.ts Thin wrapper over HubSpot's REST API v3/v4 (plain fetch,
no HubSpot SDK dependency) — list/get/search/create/
update/associate, with an injectable fetch impl for tests
format.ts Shared response-formatting helpers
tools/
contacts.ts Tool logic + MCP registration, contacts
deals.ts Tool logic + MCP registration, deals
tickets.ts Tool logic + MCP registration, tickets
accountSummary.ts Cross-object account brief
index.ts Server entrypoint (stdio transport)
test/
hubspotClient.test.ts Unit tests for the HTTP client
tools.test.ts Unit tests for each tool's business logic
mocks/hubspotMock.ts Mocked-fetch test helpersEach tool's business logic is a standalone exported function (searchContacts, createDeal, etc.) that registerXTools() wires into the MCP server — kept separate on purpose so the logic is directly unit-testable without spinning up an MCP transport.
Tech stack
TypeScript, the official @modelcontextprotocol/sdk, Zod for input validation/schema, Vitest for testing. No HubSpot SDK, no framework — plain fetch against documented REST endpoints, kept deliberately small and readable.
Limitations
create_ticketassumes the default HubSpot ticket pipeline (hs_pipeline: "0", first stage"1") — correct for a fresh portal, but a customized pipeline would need its own IDs looked up first.Associations use HubSpot's v4 "default association" endpoint, which covers the common case (link a deal/ticket to a contact) but not custom association types.
No rate-limit backoff yet — HubSpot's API returns 429s under heavy use, which this surfaces as a normal
HubSpotApiErrorrather than retrying.
Not affiliated with or endorsed by HubSpot. Built as a portfolio project demonstrating MCP server / API integration engineering.
Available Tools
10 toolscreate_contactB
Create a new HubSpot contact. Email is required by HubSpot for deduplication; other fields are optional but recommended for a usable CRM record.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| phone | No | ||
| company | No | ||
| jobTitle | No | ||
| lastName | No | ||
| firstName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose a key behavioral fact: email is required for deduplication, implying the system uses email to identify duplicates. However, it does not state what happens on duplicate email (e.g., update vs. error), whether the operation is idempotent, or any rate limits or authentication requirements. The disclosure is useful but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core purpose. The first sentence states what the tool does, and the second adds the most critical constraint (email required) and a helpful recommendation. Every word earns its place, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters, no output schema, and no annotations, the description is far from complete. It does not mention what the response will contain (e.g., the created contact object), error handling (e.g., duplicate email rejection), or any side effects. An agent calling this tool would lack information about return values and failure modes, making it inadequate for a create operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage (0%) for its 6 parameters, so the description must compensate. It only explains email's purpose (required for deduplication) and notes other fields are optional. It provides no additional meaning for phone, company, jobTitle, lastName, or firstName – their formats, typical values, or relationships are left undefined. This is insufficient for a 6-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and the resource 'a new HubSpot contact', distinguishing it from sibling tools like search_contacts (search) and get_contact (retrieve). The purpose is unambiguous and the resource is specific, so an agent can easily identify this tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention that this is for new contacts while search_contacts is for finding existing ones, nor does it specify any prerequisites or exclusion conditions. The usage context is entirely implicit from the name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dealC
Create a new HubSpot deal, optionally associated with an existing contact. Amount is in the portal's default currency.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| dealName | Yes | ||
| pipeline | No | ||
| contactId | No | If provided, associates the new deal with this contact. | |
| dealStage | No | Internal dealstage value; omit to use the pipeline default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It discloses that the operation creates a deal, may associate a contact, and that amount uses the portal default currency, but it omits permissions, side effects, reversibility, or response behavior. For a mutation tool with zero annotation support, this is a significant transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The primary purpose is front-loaded, and the second sentence provides a useful caveat about currency. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no annotations and no output schema, the description leaves important gaps: pipeline values and defaults are unexplained, dealName semantics are absent, and no information is given about return values or behavior when contactId is invalid. The agent would need to open the schema (which itself lacks pipeline/amount descriptions) to invoke this reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to 'amount' by clarifying it is in the portal's default currency and to 'contactId' by noting the association is optional. With only 40% schema description coverage, it partially compensates, but 'pipeline' and 'dealName' remain semantically unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a new HubSpot deal.' This clearly communicates the tool's function and distinguishes it from siblings like update_deal_stage and create_ticket by naming the deal resource. However, it doesn't explicitly differentiate from a potential sibling such as a search or update deal tool, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions optional contact association but does not suggest searching for a contact first via search_contacts or using update_deal_stage to modify an existing deal. The usage context is only implied by the tool name and resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ticketB
Create a new HubSpot support ticket, optionally associated with an existing contact.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Ticket body / description of the issue. | |
| subject | Yes | ||
| priority | No | ||
| contactId | No | If provided, associates the ticket with this contact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden of behavioral disclosure. It reveals that creation is a write operation and that contact association is optional, but it does not mention permissions, idempotency, failure behavior, or return values. This is minimal disclosure for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and object with no filler. Every word adds meaning, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with four parameters, no output schema, and no annotations, the description is too thin: it omits return-format expectations, prerequisites, and any side-effect/error behavior. The schema covers half the parameters but the description does not round out the missing half or the operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%; subject and priority lack descriptions. The description adds 'existing contact' context for contactId but does not clarify subject, content, or priority semantics, so it only partially compensates for the schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Create' with the resource 'HubSpot support ticket' and notes the optional contact association, which clearly identifies the tool's function. It differentiates from search_contacts/search_tickets by naming the create action, though it does not explicitly contrast with sibling create tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the action and the optional existing-contact association, which implies when to use it, but it does not explicitly say when not to use it or name alternatives such as create_contact/create_deal for other objects. Usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_summaryA
Build a single account brief for a contact: their profile, every deal associated with them (with stage and amount), and every support ticket associated with them (with priority). Use this instead of chaining get_contact + search_deals + search_tickets when you want the full picture in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | HubSpot contact ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does communicate the aggregate nature of the output and the scope ('every deal', 'every support ticket'), which is useful. However, it does not explicitly state that it is read-only, does not modify data, or how errors/empty results are handled, leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core value proposition and output contents are front-loaded, and the guidance about alternatives is concise and actionable. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by summarizing the expected return contents: profile, deals with stage/amount, and tickets with priority. For a one-parameter aggregation tool, this is largely sufficient, though it omits edge-case behavior such as missing contacts or pagination limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with contactId already documented as 'HubSpot contact ID.' The description adds no additional semantic detail about the parameter beyond that. Since the schema handles the parameter documentation fully, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Build') and a clear resource ('a single account brief for a contact'), and enumerates exactly what it includes: profile, associated deals with stage and amount, and associated tickets with priority. It also differentiates itself from the sibling tools by naming the alternative chained calls, so an agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool 'instead of chaining get_contact + search_deals + search_tickets when you want the full picture in one call.' This gives a concrete replacement scenario and names the alternative tools, leaving no ambiguity about when it should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactA
Fetch a single HubSpot contact by ID, including their core properties. Pair with get_account_summary for a fuller picture (deals + tickets included).
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | HubSpot contact ID (from search_contacts). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses that this is a read operation ('Fetch'), that output is limited to core properties, and indirectly that deals/tickets are excluded by pointing to get_account_summary. It does not mention error behavior or authorization, but for a single-ID lookup this is reasonable transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences, with the core action front-loaded and the companion-tool guidance in the second sentence. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description conveys what the tool does, what data it returns (core properties), and how to get a fuller picture. It omits exact response fields and error cases, but those are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter description already explains what contactId is and where it comes from. The tool description adds no extra semantic detail beyond 'by ID,' so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and resource ('a single HubSpot contact by ID') and scopes the result to 'core properties.' This clearly distinguishes it from search_contacts (search vs. fetch) and create_contact (read vs. write).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear contextual guidance by recommending pairing with get_account_summary when deals/tickets are needed, implying get_contact alone returns only contact data. It does not explicitly name when-not-to-use or alternatives beyond that complementary tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dealA
Fetch a single HubSpot deal by ID, including stage, amount, close date, and the contacts associated with it.
| Name | Required | Description | Default |
|---|---|---|---|
| dealId | Yes | HubSpot deal ID (from search_deals). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral disclosure burden. It reasonably describes a read operation and lists the fields/associations returned, but it is silent on error behavior, not-found cases, and authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence, front-loaded with verb, resource, and identifier, followed by a compact list of included fields. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description names the key returned attributes: stage, amount, close date, and contacts. It omits error behavior and a full field list, but the simplicity of the tool makes the description nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single parameter dealId is described as 'HubSpot deal ID (from search_deals)'. The tool description only restates 'by ID', adding no new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch'), a specific resource ('a single HubSpot deal'), the key identifier ('by ID'), and the returned fields. This clearly distinguishes it from search_deals (search vs single fetch) and get_contact (deal vs contact).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when you already have a deal ID and need detail, and the schema notes the ID comes from search_deals. However, it does not explicitly state when to prefer this over search_deals or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsA
Search HubSpot contacts by name, email, or company. Returns up to limit matches with their core properties. Use this before get_contact when you don't already have an ID.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Free-text search — matches against name, email, company, and phone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses the return behavior ('Returns up to limit matches with their core properties') but does not clarify match semantics (fuzzy vs exact), sorting, empty-result behavior, or any access/permission requirements. This is adequate but leaves meaningful gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the primary purpose first and usage guidance second. Every sentence adds distinct value and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity two-parameter tool, the description covers search scope and return count, but 'core properties' is vague and no output schema exists to fill that gap. It also does not specify match behavior or mention the search_deals/search_tickets alternatives, though the contact-specific focus partially compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the description must compensate. It adds meaning to the limit parameter by explaining that it caps the number of returned matches, and it reiterates the query's field scope (though omitting phone, which the schema mentions). This is a useful addition over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search'), a concrete resource ('HubSpot contacts'), and explicit search criteria ('by name, email, or company'). It further clarifies the tool's role relative to get_contact by saying to use it when an ID is not already available.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs the agent to use this tool before get_contact when no ID is available, which is a clear when-to-use rule. This also implicitly defines when not to use it (when an ID is known) and names the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_dealsB
Search HubSpot deals by name, optionally filtered to a specific pipeline stage. Useful for questions like 'what deals are in the proposal stage'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Free-text match against the deal name. | |
| dealStage | No | Exact HubSpot dealstage internal value to filter on, if known. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure. It does not mention whether this is a read-only operation, any required authentication, rate limits, pagination behavior, or what the response format looks like. It only states the search scope and filter, leaving the agent without critical context about the operation's side effects and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with an example, which is concise and front-loads the primary function. It wastes no words, but it could be more structured by separating the primary purpose from the usage example for clarity, though it remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with only 3 parameters and no output schema, the description covers the core search capability and filter. However, the lack of behavioral context (e.g., read-only nature, response format, pagination) makes it incomplete for an agent that needs to understand side effects and result handling, especially given no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents two of three parameters (query and dealStage) with descriptions, giving 67% coverage. The description adds some contextual value by clarifying that the search is by name and that dealStage is a filter, but it doesn't explain the 'limit' parameter's semantics beyond its default and range, so it doesn't fully compensate for the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Search'), a specific resource ('HubSpot deals'), and a specific search dimension ('by name'). It also names an optional filter (pipeline stage), which helps distinguish it from other search tools like search_contacts and search_tickets, though it doesn't explicitly name these siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete example of when to use this tool ('what deals are in the proposal stage'), which helps the agent infer appropriate usage contexts. However, it does not explicitly state when NOT to use it or mention alternatives like get_deal for retrieving a specific deal by ID, so some guidance is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ticketsA
Search HubSpot support tickets by subject text, optionally filtered by priority. Useful for 'what high-priority tickets are open' style questions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Free-text match against the ticket subject. | |
| priority | No | Filter to tickets at this exact priority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses the core behavior (search by subject text, optional priority filtering), but does not mention read-only status, pagination/limit behavior, ordering, or exact-match semantics. Search implies a read operation, so this is not a safety hazard, but the description leaves return behavior unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler. The core behavior is stated first and the example usage in the second sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with three optional parameters, the description supplies enough information for an agent to issue a valid query with optional priority filtering. The lack of an output schema leaves return details implicit, but the purpose and input behavior are sufficiently covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the parameter descriptions already cover query and priority semantics. The tool description mostly restates this by saying 'by subject text' and 'optionally filtered by priority'; it adds no detail beyond the schema and does not clarify the limit parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a clear resource ('HubSpot support tickets'), and the matching/filter fields ('by subject text, optionally filtered by priority'). It distinguishes this tool from sibling ticket/contact and deal/search tools because it names the resource type explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives concrete context: it is framed for natural-language questions like 'what high-priority tickets are open'. It does not name alternatives or exclusions, so it misses the 'when not to use' bar but still gives useful usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_deal_stageA
Move a deal to a new pipeline stage — the most common day-to-day CRM write action (e.g. advancing a deal from 'proposal' to 'closed won').
| Name | Required | Description | Default |
|---|---|---|---|
| dealId | Yes | ||
| dealStage | Yes | Internal HubSpot dealstage value to move the deal to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly indicates this is a mutating/write operation ('write action', 'move a deal'), but it does not disclose side effects, reversibility, authorization requirements, or what happens on invalid stage values. The description states the core behavior but leaves significant behavioral context unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one efficient sentence with a concrete example and a clear operating scope. No filler words, no redundant paraphrasing of the tool name, and the action is front-loaded. Every part of the sentence contributes to the tool's understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is the only source of operational context beyond the schema. It is a mutation tool, but it does not explain how to validate/obtain the internal stage id, whether the stage update is idempotent, or what the success or failure response looks like. For an agent to invoke this blindly, the description is too thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents dealStage with a helpful 'Internal HubSpot dealstage value' but dealId has no description at all (50% coverage overall). The description offers no explicit meaning for either parameter—the example hints that dealStage is a target stage string, but does not clarify the format of dealId or how dealStage values should be obtained. Given the low schema coverage, the description should compensate more but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Move a deal to a new pipeline stage') and includes a concrete example that makes the tool's purpose unmistakable. It clearly distinguishes itself from sibling tools like search_deals, get_deal, and create_deal, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description frames this as 'the most common day-to-day CRM write action,' which implies the tool is the go-to for updating deal stages during normal workflow. However, it provides no explicit guidance on when not to use it, no mention of sibling alternatives like create_deal for new deals, and no prerequisites such as looking up the deal id first. Usage context is present but under-specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
create_contact - First observed
create_deal - First observed
create_ticket - First observed
get_account_summary - First observed
get_contact - First observed
get_deal - First observed
search_contacts - First observed
search_deals - First observed
search_tickets - First observed
update_deal_stage
TDQS
Scored across 10 tools
Each tool maps to a distinct resource/action: search vs get vs create for contacts/deals/tickets, plus a dedicated deal stage updater and an account summary aggregator. Even get_contact and get_account_summary are clearly differentiated by the summary's broader scope.
All tool names follow a consistent verb_noun snake_case pattern: search_*, get_*, create_*, plus update_deal_stage and get_account_summary. No mixed conventions or vague verbs.
10 tools is well-scoped for a HubSpot CRM server covering contacts, deals, and tickets. Each tool covers a meaningful operation without redundancy.
The surface covers search/get/create for contacts and deals, search/create for tickets, and deal stage updates, but lacks update/delete operations for contacts and tickets and a get_ticket by ID. These are notable gaps for a CRM lifecycle, though common workflows are still possible.
Maintenance
Related MCP Connectors
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Your professional network in Claude — search contacts, log notes, and send warm intros.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
xmagnet — AI-powered B2B CRM for Claude. 35 tools that turn natural-language prompts into real CRM actions: prospect, enrich, score leads, manage deals, scan buying intent, run email campaigns and sequences, build forms and landing pages, refine ICP, and analyze performance — all directly inside Claude. 🚀 ONE-CLICK INSTALL: https://api.xmagnet.ai/claude The install page guides Claude users through 3 steps in under a minute: open Claude Connectors, paste the connector name, paste the server URL, sign in. A reviewer workspace is auto-provisioned on first sign-in with sample contacts, deals, campaigns, and ICP suggestions, so every tool works end-to-end with zero setup. No 2FA. No paid plan required. Free tier exposes all 35 tools. What you can do: • Prospecting — search_contacts, search_companies, search_investors, find_contacts_at_companies, enrich_contact, validate_email, find_competitors, company_intelligence • Pipeline — get_deals_pipeline, scan_deal_intent, get_ghost_pipeline, create_deal • Campaigns & sequences — create_campaign, generate_campaign_content, get_campaign_stats, get_bounce_stats, get_unsub_stats, create_sequence_draft, list_sequences • Top of funnel — suggest_icp, get_icp, create_form, list_forms, create_landing_page, list_landing_pages, show_suggestions • Operations — analyze_contacts, get_contact_details, update_contact, save_contacts_to_crm, export_contacts, get_dashboard_stats, get_credit_balance Example prompts to try: • "Find C-suite contacts at fintech companies that raised Series A in the last 6 months." • "Scan my open deals for buying intent and prioritize follow-ups." • "Generate a re-engagement campaign for contacts who opened my last newsletter but didn't reply." • "Show me my deals pipeline by stage with weighted value and win rate." • "Generate a landing page for my Q2 webinar with a registration form." Built for founders, SDRs, RevOps, and growth teams who want their CRM to take action — not just store records. Install: https://api.xmagnet.ai/claude · Site: https://xmagnet.ai · Privacy: https://xmagnet.ai/privacy-policy · Terms: https://xmagnet.ai/terms-of-service · Support: ashish.sinha@xmagnet.ai
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables AI models to interact with HubSpot CRM data and operations through a standardized interface, supporting contact and company management.16128MIT
- AlicenseBqualityDmaintenanceEnables Claude to interact with HubSpot CRM for sales analysis and insights, providing tools for managing contacts, deals, companies, and retrieving sales analytics data.1719 npm10MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with HubSpot CRM for managing contacts, companies, deals, and sending emails through natural language commands.263 npmMIT
- AlicenseAqualityBmaintenanceExposes HubSpot CRM data and actions as tools for AI agents, enabling contact lookup, company search, contact creation, and activity logging via natural language.4263 npmMIT