HubSpot MCP Extended
Provides comprehensive CRM automation with 106 tools including advanced workflows for invoices and line items, built directly from HubSpot's public OpenAPI specifications.
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 MCP Extended Create a new contact named Sarah Johnson with email sarah@example.com"
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.
Note: Coverage reporting will be available after setting up Codecov token and app integration.
HubSpot MCP Extended
Independent MCP server built directly from HubSpot's public OpenAPI specifications, providing comprehensive CRM automation with 106 tools including advanced workflows for invoices and line items.
Note: This is an independent, community-driven implementation and not affiliated with or endorsed by HubSpot. Built using HubSpot's official public OpenAPI specifications.
š Licensing
This software is source available with dual licensing:
Free for non-commercial use (personal, educational, research, open source projects)
Commercial license required for business/production use by for-profit organizations
See LICENSE for full terms and LICENSING.md for details on obtaining a commercial license.
Related MCP server: hubspot-mcp
š Recent Improvements (v1.4.0)
ā Dual Licensing Model: MIT for open source + Commercial license option for enterprise support
ā Claude Desktop Parameter Compatibility: Fixed parameter name mismatch causing "Unable to infer object type" errors
ā Line Items API Support: Added 11 new tools for complete invoice workflow functionality (95ā106 tools)
ā Smart Parameter Mapping: Automatic normalization of shortened parameter names (objtype/objectType, objid/objectId)
ā Fixed macOS Compatibility: Deployment script now works natively on macOS without requiring GNU coreutils
ā Docker Compose Integration: Optimized for persistent container with
docker execaccessā Enhanced Deployment Verification: Automatic validation of tool count and JSON response integrity
ā Cross-Platform Support: Works on macOS, Linux, and Windows with consistent behavior
š® Planned Enhancements
š Rate Limit Handling: Automatic throttling and exponential backoff for HubSpot API limits (planned for v1.5.0)
š Features
106 HubSpot Tools - Complete CRM functionality including contacts, companies, deals, tickets, quotes, invoices, and line items
Docker Support - Containerized deployment for consistent environments
Security First - Environment variable-based configuration, no hardcoded secrets, token redaction in logs
Production Ready - Comprehensive error handling, secure logging, and testing
TypeScript - Fully typed for reliability and developer experience
š Prerequisites
Essential (Required)
Node.js (v20 or higher)
npm (for dependency management)
HubSpot Private App or Connected App with appropriate scopes and access token
Claude Desktop or compatible MCP client
Optional (For Full Deployment)
Docker and Docker Compose (only needed for
./deploy.sh)macOS/Linux/Windows (deployment script optimized for macOS)
š” First time? You can skip Docker and use ./deploy-local.sh for quick testing!
š Updating to Latest Version
For Existing Users
If you already have HubSpot MCP Extended installed and want to update to the latest version:
Option 1: Git Update (Recommended)
# Navigate to your project directory
cd hubspot-mcp-extended
# Pull the latest changes
git pull origin main
# Rebuild the project
npm install
npm run build
# If using Docker, rebuild the image
docker compose down
docker compose up -d --buildOption 2: Fresh Installation
# Backup your .env file first
cp .env .env.backup
# Remove old installation
rm -rf hubspot-mcp-extended
# Fresh clone and setup
git clone https://github.com/calypsoCodex/hubspot-mcp-extended.git
cd hubspot-mcp-extended
cp .env.backup .env
./deploy-local.sh # or ./deploy.sh for DockerCurrent Version: v1.4.0
Latest improvements:
106 tools (added 11 Line Items API tools)
Enhanced parameter compatibility (objtype/objectType auto-mapping)
Fixed macOS deployment script (no longer requires GNU coreutils)
Improved Docker integration with persistent container
š Quick Start
1. Clone Repository
git clone https://github.com/calypsoCodex/hubspot-mcp-extended.git
cd hubspot-mcp-extended2. Configure Environment
# Copy environment template
cp .env.example .env
# Edit .env and add your HubSpot API token
# Make sure the variable name is exactly: HUBSPOT_ACCESS_TOKEN
vim .env # or use your preferred editor3. Deploy
Option A: Local Development (No Docker)
./deploy-local.shWhat this does:
Installs dependencies
Builds TypeScript
Validates deployment (checks for 106 tools)
No Docker required!
Option B: Docker Deployment (Production-Ready)
./deploy.shWhat this does:
Builds Docker image
Starts container with docker compose
Validates deployment automatically
Persistent container for quick
docker execaccess
4. Configure Claude Desktop
Update your Claude Desktop config at:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
For Local Deployment:
{
"mcpServers": {
"hubspot-mcp-extended": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/hubspot-mcp-extended/build/index.js"],
"env": {
"HUBSPOT_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
}
}
}
}For Docker Deployment:
{
"mcpServers": {
"hubspot-mcp-extended": {
"command": "docker",
"args": ["exec", "-i", "hubspot-mcp-extended", "node", "build/index.js", "--stdio"]
}
}
}Important: Restart Claude Desktop after configuration changes.
5. Verify Installation
Quick Validation Commands
# 1. Verify deployment (no API key needed)
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | node build/index.js --stdio | jq '.result.tools | length'
# Expected output: 106
# 2. Test tool execution (requires API key in .env)
echo '{"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "get_v3_obj", "arguments": {"objectType": "contacts", "limit": "1"}}}' | node build/index.js --stdio
# Expected: Contact data or authentication errorAfter Successful Deployment
You should see:
ā 106 tools available in Claude Desktop
ā Tools appear in Claude's MCP tools list
ā All HubSpot operations accessible through natural language
Docker-Specific Verification
# Verify the container is running (should show "Up" status)
docker compose ps
# Check logs (should show "106 tools")
docker compose logs
# Test the MCP server through Docker exec
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | docker exec -i hubspot-mcp-extended node build/index.js --stdioš” Usage Examples
Example 1: Search Contacts by Email
"Find all contacts with email domain @acme.com"Claude will:
Use
post-crm-v3-objects-objtype-search_searchtoolConstruct search with:
objectType: "contacts"(orobjtype: "contacts"- both work!)filterGroupswith email filter
Example 2: Create an Invoice with Line Items
"Create an invoice for Acme Corp with:
- Item 1: Consulting Services - $500
- Item 2: Software License - $1,200
Total: $1,700"Claude will:
Use
post-crm-v3-objects-invoices_invoicesto create invoiceUse
post-crm-v3-objects-line_items-batch-create_createto add line itemsAssociate line items with invoice
Example 3: Batch Update Deals
"Update all deals in stage 'negotiation' to set close_date to end of month"Claude will:
Search deals with
post-crm-v3-objects-objtype-search_searchBatch update with
post-crm-v3-objects-objtype-batch-update_update
Parameter Compatibility Note
Tools work with both parameter naming conventions:
ā Short names:
objtype,objid(from tool names)ā Full names:
objectType,objectId(from schemas)
The server automatically maps between them, so Claude can use either form.
š ļø Development
Project Structure
hubspot-mcp-extended/
āāā src/ # TypeScript source code
ā āāā index.ts # Main MCP server entry point
ā āāā tools/ # Tool implementations
ā āāā schemas/ # OpenAPI schemas
āāā scripts/ # Build and deployment scripts
āāā docs/ # Documentation
ā āāā specs/ # OpenAPI specification files
āāā build/ # Compiled JavaScript (generated)
āāā tests/ # Test filesBuilding from Source
# Install dependencies
npm install
# Build TypeScript
npm run build
# Run in development mode with auto-reload
npm run dev
# Verify tool count
node -e "const tools = require('./build/index.js'); console.log('Tools:', tools.hubspotTools?.length || 'Not available');"Testing
# Run unit tests
npm test
# Run integration tests
npm run test:integration
# Test tool listing (works without API key - shows 106 tools)
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | node build/index.js --stdio
# Test actual tool execution (requires valid API key in .env)
echo '{"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "get_v3_obj", "arguments": {"objectType": "contacts", "limit": "5"}}}' | node build/index.js --stdio
# Test Docker deployment
./scripts/verify-docker-project.sh
# Automated Docker setup validation (NEW!)
./scripts/validate-docker-setup.shEnvironment Variables
HUBSPOT_ACCESS_TOKEN(required): Your HubSpot API access tokenLOG_LEVEL(optional): Set logging verbosity (default: info)
š Tool Regeneration
This server's tools are automatically generated from HubSpot's official OpenAPI specifications. To regenerate tools when HubSpot updates their APIs:
Quick Regeneration
npm run regenerate:allManual Step-by-Step
# 1. Ensure HubSpot specs are at known-good version (CRITICAL)
./scripts/ensure-hubspot-version.sh
# 2. Generate tools
npm run regenerate:specs
npm run regenerate:tools
# 3. Test and verify
npm run test:tools
./deploy.sh --allow-non-main
# 4. Update documentation
npm run regenerate:manifestCurrent Status
Tools: 106 (includes Line Items API - updated 2025-01-13)
Source: HubSpot official OpenAPI specs
Compatibility: Claude Desktop (names < 64 chars, parameter normalization)
š¤ Contributing
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
š License
This project is licensed under the MIT License - see the LICENSE file for details.
š Support
Create an Issue for bug reports
Submit a Feature Request for enhancements
Check Documentation for detailed guides
Built with ā¤ļø for the AI and automation community
Available Tools
106 toolsdelete-crm-object-schemas-v3-schemas-objtype-associations-va_varD
Remove an association
Inputs: objectType (required), associationIdentifier (required).
delete-crm-object-schemas-v3-schemas-objtype_objtypeC
Delete a schema
Inputs: objectType (required), archived.
delete-crm-v3-objects-invoices-var_varD
Archive
Inputs: invoiceId (required).
delete-crm-v3-objects-line_items-var_varD
Archive
Inputs: lineItemId (required).
delete-crm-v3-objects-objtype-objid-associations-var-var-var_varC
Remove an association between two objects
Inputs: objectId (required), objectType (required), toObjectId (required), toObjectType (required), +1 more.
delete-crm-v3-objects-objtype-objid_objidD
Archive
Inputs: objectId (required), objectType (required).
delete-crm-v3-objects-quotes-var_varC
Archive
Inputs: quoteId (required).
delete-crm-v3-properties-objtype-groups-var_varB
Archive a property group
Inputs: groupName (required), objectType (required).
delete-crm-v3-properties-objtype-var_varC
Archive a property
Inputs: objectType (required), propertyName (required).
delete-crm-v4-associations-var-var-labels-var_varD
Delete
Inputs: toObjectType (required), fromObjectType (required), associationTypeId (required).
delete-crm-v4-objects-objtype-objid-associations-var-var_varD
Delete
Inputs: objectId (required), objectType (required), toObjectId (required), toObjectType (required).
delete-crm-v4-objects-objtype-objid_objidD
Archive
Inputs: objectId (required), objectType (required).
get-crm-object-schemas-v3-schemas-objtype_objtypeC
Get an existing schema
Inputs: objectType (required).
get-crm-object-schemas-v3-schemas_schemasC
Get all schemas
Inputs: archived.
get-crm-v3-associations-var-var-types_typesC
List association types
Inputs: toObjectType (required), fromObjectType (required).
get-crm-v3-object-library-enablement_enablementD
Read All
Inputs: no named parameters.
get-crm-v3-object-library-enablement-var_varD
Read
Inputs: objectTypeId (required).
get-crm-v3-objects-invoices_invoicesD
List
Inputs: after, limit, archived, properties, +2 more.
get-crm-v3-objects-invoices-var_varD
Read
Inputs: invoiceId (required), archived, idProperty, properties, +2 more.
get-crm-v3-objects-line_items_line_itemsD
List
Inputs: after, limit, archived, properties, +2 more.
get-crm-v3-objects-line_items-var_varD
Read
Inputs: lineItemId (required), archived, idProperty, properties, +2 more.
get-crm-v3-objects-objtype-objid-associations-var_varC
List associations of an object by type
Inputs: objectId (required), objectType (required), toObjectType (required).
get-crm-v3-objects-objtype-objid_objidD
Read
Inputs: objectId (required), objectType (required).
get-crm-v3-objects-objtype_objtypeD
List
Inputs: objectType (required).
get-crm-v3-objects-quotes_quotesD
List
Inputs: after, limit, archived, properties, +2 more.
get-crm-v3-objects-quotes-var_varC
Read
Inputs: quoteId (required), archived, idProperty, properties, +2 more.
get-crm-v3-properties-objtype-groups_groupsB
Read all property groups
Inputs: objectType (required).
get-crm-v3-properties-objtype-groups-var_varC
Read a property group
Inputs: groupName (required), objectType (required).
get-crm-v3-properties-objtype_objtypeC
Read all properties
Inputs: objectType (required), archived, properties.
get-crm-v3-properties-objtype-var_varC
Read a property
Inputs: objectType (required), propertyName (required), archived, properties.
get-crm-v4-associations-definitions-configurations-all_allC
Read All
Inputs: no named parameters.
get-crm-v4-associations-definitions-configurations-var-var_varD
Read
Inputs: toObjectType (required), fromObjectType (required).
get-crm-v4-associations-var-var-labels_labelsC
Read
Inputs: toObjectType (required), fromObjectType (required).
get-crm-v4-objects-objtype-objid-associations-var_varD
List
Inputs: objectId (required), objectType (required), toObjectType (required).
get-crm-v4-objects-objtype-objid_objidD
Read
Inputs: objectId (required), objectType (required).
get-crm-v4-objects-objtype_objtypeD
List
Inputs: objectType (required).
patch-crm-object-schemas-v3-schemas-objtype_objtypeD
Update a schema
Inputs: objectType (required), labels, restorable, description, +5 more.
patch-crm-v3-objects-invoices-var_varC
Update
Inputs: invoiceId (required), properties (required), idProperty.
patch-crm-v3-objects-line_items-var_varD
Update
Inputs: lineItemId (required), properties (required), idProperty.
patch-crm-v3-objects-objtype-objid_objidC
Update. REQUIRES body parameter with properties to update. Example: {body: {properties: {"firstname": "Updated Name", "email": "newemail@example.com"}}}
Inputs: objectId (required), objectType (required), properties (required).
patch-crm-v3-objects-quotes-var_varD
Update
Inputs: quoteId (required), properties (required), idProperty.
patch-crm-v3-properties-objtype-groups-var_varC
Update a property group
Inputs: groupName (required), objectType (required), label, displayOrder.
patch-crm-v3-properties-objtype-var_varD
Update a property
Inputs: objectType (required), propertyName (required), type, label, +8 more.
patch-crm-v4-objects-objtype-objid_objidB
Update. REQUIRES body parameter with properties to update. Example: {body: {properties: {"firstname": "Updated Name", "email": "newemail@example.com"}}}
Inputs: objectId (required), objectType (required), properties (required).
post-crm-object-schemas-v3-schemas-objtype-associat_associationsC
Create an association. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: objectType (required), toObjectTypeId (required), fromObjectTypeId (required), name.
post-crm-object-schemas-v3-schemas_schemasC
Create a new schema. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: name (required), labels (required), properties (required), associatedObjects (required), +5 more.
post-crm-objects-v4-objtype-batch-upsert_upsertB
Create or update a batch of objects by unique property values. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required), objectType (required).
post-crm-objects-v4-objtype-merge_mergeB
Merge two objects with same type. REQUIRES body parameter with merge details. Example: {body: {objectIdToMerge: "123", primaryObjectId: "456"}}
Inputs: objectType (required), objectIdToMerge (required), primaryObjectId (required).
post-crm-v3-associations-var-var-batch-archive_archiveC
Archive a batch of associations. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v3-associations-var-var-batch-create_createC
Create a batch of associations. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v3-associations-var-var-batch-read_readC
Read a batch of associations. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v3-objects-invoices-batch-archive_archiveA
Archive a batch of invoices by ID. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required).
post-crm-v3-objects-invoices-batch-create_createB
Create a batch of invoices. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required).
post-crm-v3-objects-invoices-batch-read_readA
Read a batch of invoices by internal ID, or unique property values. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), properties (required), propertiesWithHistory (required), archived, +1 more.
post-crm-v3-objects-invoices-batch-update_updateA
Update a batch of invoices by internal ID, or unique property values. REQUIRES body parameter with objects to update. Example: {body: {inputs: [{"id": "123", "properties": {"firstname": "John Updated"}}]}}
Inputs: inputs (required).
post-crm-v3-objects-invoices-batch-upsert_upsertA
Create or update a batch of invoices by unique property values. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required).
post-crm-v3-objects-invoices_invoicesD
Create. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: properties (required), associations.
post-crm-v3-objects-invoices-search_searchA
POST /crm/v3/objects/invoices/search. REQUIRES body parameter with search criteria. Example: {body: {filterGroups: [{filters: [{propertyName: "email", operator: "EQ", value: "john@example.com"}]}], properties: ["firstname", "lastname", "email"]}}
Inputs: after, limit, query, sorts, +2 more.
post-crm-v3-objects-line_items-batch-archive_archiveA
Archive a batch of line items by ID. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required).
post-crm-v3-objects-line_items-batch-create_createB
Create a batch of line items. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required).
post-crm-v3-objects-line_items-batch-read_readA
Read a batch of line items by internal ID, or unique property values. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), properties (required), propertiesWithHistory (required), archived, +1 more.
post-crm-v3-objects-line_items-batch-update_updateA
Update a batch of line items by internal ID, or unique property values. REQUIRES body parameter with objects to update. Example: {body: {inputs: [{"id": "123", "properties": {"firstname": "John Updated"}}]}}
Inputs: inputs (required).
post-crm-v3-objects-line_items-batch-upsert_upsertB
Create or update a batch of line items by unique property values. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required).
post-crm-v3-objects-line_items_line_itemsC
Create. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: properties (required), associations.
post-crm-v3-objects-line_items-search_searchB
POST /crm/v3/objects/line_items/search. REQUIRES body parameter with search criteria. Example: {body: {filterGroups: [{filters: [{propertyName: "email", operator: "EQ", value: "john@example.com"}]}], properties: ["firstname", "lastname", "email"]}}
Inputs: after, limit, query, sorts, +2 more.
post-crm-v3-objects-objtype-batch-archive_archiveA
Archive a batch of objects by ID. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required), objectType (required).
post-crm-v3-objects-objtype-batch-create_createC
Create a batch of objects. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required), objectType (required).
post-crm-v3-objects-objtype-batch-read_readA
Read a batch of objects by internal ID, or unique property values. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), objectType (required), properties (required), propertiesWithHistory (required), +1 more.
post-crm-v3-objects-objtype-batch-update_updateA
Update a batch of objects by internal ID, or unique property values. REQUIRES body parameter with objects to update. Example: {body: {inputs: [{"id": "123", "properties": {"firstname": "John Updated"}}]}}
Inputs: inputs (required), objectType (required).
post-crm-v3-objects-objtype-batch-upsert_upsertB
Create or update a batch of objects by unique property values. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required), objectType (required).
post-crm-v3-objects-objtype-gdpr-delete_gdpr-deleteC
GDPR DELETE. REQUIRES body parameter with object properties. Example for companies: {body: {properties: {"name": "Company Name", "domain": "example.com", "industry": "COMPUTER_SOFTWARE"}}}
Inputs: objectId (required), objectType (required), idProperty.
post-crm-v3-objects-objtype-merge_mergeC
Merge two objects with same type. REQUIRES body parameter with object properties. Example for companies: {body: {properties: {"name": "Company Name", "domain": "example.com", "industry": "COMPUTER_SOFTWARE"}}}
Inputs: objectType (required), objectIdToMerge (required), primaryObjectId (required).
post-crm-v3-objects-objtype_objtypeB
Create. REQUIRES body parameter with object properties. Example for companies: {body: {properties: {"name": "Company Name", "domain": "example.com", "industry": "COMPUTER_SOFTWARE"}}}
Inputs: objectType (required), properties (required), associations.
post-crm-v3-objects-objtype-search_searchB
POST /crm/v3/objects/{objectType}/search. REQUIRES body parameter with search criteria. Example: {body: {filterGroups: [{filters: [{propertyName: "email", operator: "EQ", value: "john@example.com"}]}], properties: ["firstname", "lastname", "email"]}}
Inputs: objectType (required), after, limit, query, +3 more.
post-crm-v3-objects-quotes-batch-archive_archiveA
Archive a batch of quotes by ID. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required).
post-crm-v3-objects-quotes-batch-create_createB
Create a batch of quotes. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required).
post-crm-v3-objects-quotes-batch-read_readA
Read a batch of quotes by internal ID, or unique property values. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), properties (required), propertiesWithHistory (required), archived, +1 more.
post-crm-v3-objects-quotes-batch-update_updateA
Update a batch of quotes by internal ID, or unique property values. REQUIRES body parameter with objects to update. Example: {body: {inputs: [{"id": "123", "properties": {"firstname": "John Updated"}}]}}
Inputs: inputs (required).
post-crm-v3-objects-quotes-batch-upsert_upsertA
Create or update a batch of quotes by unique property values. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required).
post-crm-v3-objects-quotes_quotesD
Create. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: properties (required), associations.
post-crm-v3-objects-quotes-search_searchC
POST /crm/v3/objects/quotes/search. REQUIRES body parameter with search criteria. Example: {body: {filterGroups: [{filters: [{propertyName: "email", operator: "EQ", value: "john@example.com"}]}], properties: ["firstname", "lastname", "email"]}}
Inputs: after, limit, query, sorts, +2 more.
post-crm-v3-properties-objtype-batch-archive_archiveC
Archive a batch of properties. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required), objectType (required).
post-crm-v3-properties-objtype-batch-create_createC
Create a batch of properties. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required), objectType (required).
post-crm-v3-properties-objtype-batch-read_readD
Read a batch of properties. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), archived (required), objectType (required).
post-crm-v3-properties-objtype-groups_groupsB
Create a property group. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: name (required), label (required), objectType (required), displayOrder.
post-crm-v3-properties-objtype_objtypeC
Create a property. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: name (required), type (required), label (required), fieldType (required), +11 more.
post-crm-v4-associations-definitions-configurations-var-va_purgeD
Delete. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-definitions-configurations-var-v_createD
Create. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-definitions-configurations-var-v_updateD
Update. REQUIRES body parameter with objects to update. Example: {body: {inputs: [{"id": "123", "properties": {"firstname": "John Updated"}}]}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-usage-high-usage-report-var_varD
Report. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: body (required), userId (required).
post-crm-v4-associations-var-var-batch-archive_archiveC
Delete. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-var-var-batch-associate-default_defaultC
Create Default Associations. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-var-var-batch-create_createD
Create. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-var-var-batch-labels-archive_archiveC
Delete Specific Labels. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-var-var-batch-read_readC
Read. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), toObjectType (required), fromObjectType (required).
post-crm-v4-associations-var-var-labels_labelsC
Create. REQUIRES body parameter with request data. Check the inputSchema for required body structure.
Inputs: name (required), label (required), toObjectType (required), fromObjectType (required), +1 more.
post-crm-v4-objects-objtype-batch-archive_archiveA
Archive a batch of objects by ID. REQUIRES body parameter with object IDs to archive. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}]}}
Inputs: inputs (required), objectType (required).
post-crm-v4-objects-objtype-batch-create_createB
Create a batch of objects. REQUIRES body parameter with objects to create. Example: {body: {inputs: [{"properties": {"firstname": "John", "lastname": "Doe", "email": "john@example.com"}}]}}
Inputs: inputs (required), objectType (required).
post-crm-v4-objects-objtype-batch-read_readA
Read a batch of objects by internal ID, or unique property values. REQUIRES body parameter with object IDs and properties to retrieve. Example: {body: {inputs: [{"id": "123"}, {"id": "456"}], properties: ["firstname", "lastname", "email"], propertiesWithHistory: []}}
Inputs: inputs (required), objectType (required), properties (required), propertiesWithHistory (required), +1 more.
post-crm-v4-objects-objtype-batch-update_updateB
Update a batch of objects by internal ID, or unique property values. REQUIRES body parameter with objects to update. Example: {body: {inputs: [{"id": "123", "properties": {"firstname": "John Updated"}}]}}
Inputs: inputs (required), objectType (required).
post-crm-v4-objects-objtype-gdpr-delete_gdpr-deleteB
GDPR DELETE. REQUIRES body parameter with object properties. Example for companies: {body: {properties: {"name": "Company Name", "domain": "example.com", "industry": "COMPUTER_SOFTWARE"}}}
Inputs: objectId (required), objectType (required), idProperty.
post-crm-v4-objects-objtype_objtypeC
Create. REQUIRES body parameter with object properties. Example for companies: {body: {properties: {"name": "Company Name", "domain": "example.com", "industry": "COMPUTER_SOFTWARE"}}}
Inputs: objectType (required), properties (required), associations.
put-crm-v3-objects-objtype-objid-associations-var-var-var_varC
Associate an object with another object
Inputs: body (required), objectId (required), objectType (required), toObjectId (required), +2 more.
put-crm-v4-associations-var-var-labels_labelsD
Update
Inputs: label (required), toObjectType (required), fromObjectType (required), associationTypeId (required), +1 more.
put-crm-v4-objects-objtype-objid-associations-var-var_varD
Create
Inputs: body (required), objectId (required), objectType (required), toObjectId (required), +1 more.
put-crm-v4-objects-var-var-associations-default-var-var_varD
Create Default
Inputs: body (required), toObjectId (required), fromObjectId (required), toObjectType (required), +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 106 tools
The tool names are raw API paths with placeholders like 'objtype' and 'var', and there are multiple v3/v4 versions of the same operations (e.g., get-crm-v3-objects-objtype-objid_objid vs get-crm-v4-objects-objtype-objid_objid). Generic objtype tools overlap with specific object type tools (quotes, invoices, line_items), and descriptions are often just 'Read' or 'Archive', making accurate selection nearly impossible.
All tools follow a uniform pattern of HTTP method + hyphenated path segments, which is consistent. However, the heavy use of vague placeholders like 'objtype' and 'var', and the mixing of generic and specific object types in the same pattern, reduces readability and predictability.
With 106 tools, the set is far beyond what an agent can effectively navigate. Many tools are near-duplicates, such as v3/v4 variants and generic vs specific object type versions of the same CRUD operations, so most do not earn their place.
The tool set comprehensively covers CRM object operations: CRUD, batch, search, upsert, associations, properties, schemas, and specific object types like quotes and invoices. The generic objtype tools allow any object type, so core workflows are supported, though the redundancy of v3/v4 and generic/specific tools makes the surface bloated.
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.
MCP server for the HubSpot Integrations Center HubDB: search and retrieve integration data.
HubSpot MCP server: 9 tools, every client portal on one connector. Writes preview first.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
Related MCP Servers
- AlicenseBqualityFmaintenanceMCP server for HubSpot CRM ā 33 tools covering contacts, companies, deals, pipelines, lists, marketing emails, forms, workflows, and properties.3014 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server for the HubSpot CRM API with tools for managing contacts, companies, deals, tickets, and CRM workflows. Generated with MCPForge. Sensitive operations can be protected with permissions, audit logs, and approval workflows.19 npmMIT
- AlicenseAqualityDmaintenanceA comprehensive MCP server providing Claude with enterprise-grade access to HubSpot CRM, including contacts, deals, quotes, workflows, and automation through 37 tools.3710 npmMIT
- FlicenseNot gradedqualityDmaintenanceCustom MCP server for HubSpot CRM providing ICP segmentation, scoring, duplicate detection, Data Quality Score, and lifecycle stage automation. Exposes 39 tools to enhance HubSpot's native capabilities.-