HubSpot MCP Server
HubSpot MCP Server
A Model Context Protocol (MCP) server that exposes HubSpot CRM data and actions as tools for AI agents (Claude, Cursor, and any other MCP-compatible client) — so an agent can look up a contact, search companies, upsert a lead, and log a call or note, all through typed, validated tool calls instead of hand-rolled API glue.
Battle-tested against a live HubSpot account: contact lookup/upsert, company search, and note logging all verified end-to-end (see Tools for sample I/O).
If you find this useful, a star helps other people building MCP integrations find it.
Architecture
src/
hubspotClient.ts HubSpot REST API wrapper (auth, requests, 429 retry, typed responses)
index.ts MCP server: tool definitions + stdio transport wiringTransport:
StdioServerTransport— the server communicates with its MCP client over stdin/stdout, so it's launched as a subprocess (no network port to manage).Auth: A HubSpot Private App access token is read from the
HUBSPOT_ACCESS_TOKENenvironment variable at startup. The token is never hardcoded or logged.Error handling: All HubSpot API calls go through
HubSpotClient, which:Converts network/HTTP failures into a typed
HubSpotApiErrorwith a client-safe message.Retries
429 Too Many Requestsresponses (respecting theRetry-Afterheader, with exponential backoff as a fallback) up to 2 times before surfacing the error.Never throws out of a tool handler —
index.tscatches every error and returns an MCPisError: truetool result instead of crashing the server.
Tool schemas: Each tool's input is defined with
zod, giving strict runtime validation and auto-generated JSON Schema for the MCP client.
Setup
cd hubspot-mcp-server
npm install
cp .env.example .env # then fill in HUBSPOT_ACCESS_TOKEN
npm run buildGenerate a HubSpot Private App access token: HubSpot → Settings → Integrations → Private Apps → Create a private app. Grant at minimum:
crm.objects.contacts.read/crm.objects.contacts.writecrm.objects.companies.readcrm.objects.notes.write(or the relevant engagements scope for the activity types you plan to log)
Running standalone
HUBSPOT_ACCESS_TOKEN=pat-xxxxx npm startFor local development without a build step:
HUBSPOT_ACCESS_TOKEN=pat-xxxxx npm run devConfiguring Claude Desktop
Add this server to your claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"hubspot": {
"command": "node",
"args": ["/absolute/path/to/hubspot-mcp-server/dist/index.js"],
"env": {
"HUBSPOT_ACCESS_TOKEN": "pat-xxxxx"
}
}
}
}Restart Claude Desktop after saving. The four HubSpot tools will appear in the tool picker.
Tools
hubspot_get_contact
Look up a contact by email.
{ "email": "jane.doe@example.com" }Returns first name, last name, lifecycle stage, and associated company name (if any).
hubspot_search_companies
Search companies by name or domain.
{ "query": "acme" }Returns matching company names and domains.
hubspot_create_contact
Create a contact, or update it if the email already exists.
{
"email": "jane.doe@example.com",
"firstName": "Jane",
"lastName": "Doe",
"company": "Acme Corp"
}hubspot_log_activity
Log an engagement on a contact's timeline.
{
"contactId": "12345",
"activityType": "NOTE",
"body": "Discussed renewal timeline on the call."
}activityType is one of NOTE, EMAIL, or CALL.
Notes
Rate limits: HubSpot returns
429when the account's rate limit is exceeded. The client retries automatically; if retries are exhausted, the tool returns a clear error message rather than crashing.All tool errors (invalid input, HubSpot API errors, network failures) are returned as MCP tool errors (
isError: true) so the calling agent can react instead of the server process dying.
License
MIT — see LICENSE.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/djmoore-projects/hubspot-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server