A Model Context Protocol server for Hubspot CRM integration
15 tools with complete schemas and descriptions, but quality is uneven. Tool names follow verb_noun convention (get_, create_, find_) which is good. Descriptions are present but often generic (avg ~80 chars, below the 194-char baseline). Parameters lack depth: no enums for constrained values (e.g., dealstage should be an enum), no format constraints (closedate is 'string' not 'date-time'), no min/max bounds on numeric params (limit, days). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance. Duplicate-checking logic mentioned in create_contact/create_company descriptions but not formalized. Missing: idempotency hints, permission scopes, rate-limit guidance.
Create a new company in HubSpot. Checks for duplicates before creation based on company name.
Create a new contact in HubSpot. Checks for duplicates before creation based on first name, last name, and company (if provided).
Create a new deal in HubSpot.
Find a company by its domain.
Find a company by its name.
Find a contact by their email address.
No output schemas documented. LLMs cannot predict response structure, forcing them to guess what fields are returned and breaking tool chaining (e.g., create_contact returns contact_id but this is not documented).
Constrained parameters lack enums. dealstage is a free-form string (should be enum: appointmentscheduled, qualifiedtobuy, etc.). pipeline is a string ID with no guidance. LLMs hallucinate invalid values.
Numeric parameters lack bounds. limit defaults to 10 but no min/max specified. days has no range. LLMs may pass absurd values (limit=999999, days=36500) causing API errors or timeouts.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
Find a contact by their name and optionally company.
Retrieve detailed information about a specific company by ID.
Get activity history for a specific company.
Retrieve detailed information about a specific contact by ID.
Retrieve detailed information about a specific deal by ID.
Get most recently active companies from HubSpot.
Get most recently active contacts from HubSpot.
Get most recently active deals from HubSpot.
Get recent engagement activities across all contacts and companies.
Descriptions are generic and under 100 chars on average. 'Get most recently active contacts' lacks context on when to use vs find_contact_by_name. No dependency hints (e.g., 'Call this to discover available contacts before creating associations').
No error handling guidance. If create_contact fails due to duplicate, the response should suggest 'Try find_contact_by_email() to check for existing contact.' Currently no recovery path documented.