A powerful Model Context Protocol (MCP) server implementation for seamless HubSpot CRM integration, enabling AI assistants to interact with your HubSpot data
8 tools with explicit schemas and descriptions visible in src/index.ts. All tools follow verb_noun naming convention (get_, create_, update_). Tool descriptions are present and adequate (10-200 chars), though most lack depth about use cases and prerequisites. Input schemas are well-formed JSON Schema with property types and descriptions. However, output schemas are completely undocumented, the rubric requires tools to document what they return. Parameters lack enums where appropriate (e.g., 'days' and 'limit' have defaults but no min/max constraints stated). No tool annotations (readOnlyHint, destructiveHint) despite clear READ vs WRITE risk patterns. Error handling exists at server level but tool-level recovery guidance is absent.
Create a new company in HubSpot
Create a new contact in HubSpot
Get most recently active companies from HubSpot
Get most recently active contacts from HubSpot
Get activity history for a specific company
Get recent engagement activities across all contacts and companies
Output schemas completely undocumented. Tools return results but there is no specification of what fields, types, or structure the LLM will receive. This violates the 'Document the output schema' critical check and forces LLMs to reason about unpredictable responses.
Numeric parameters lack min/max constraints. 'days' (default 7) and 'limit' (defaults 10, 50) have no stated bounds. LLMs could pass unbounded values (e.g., days=10000, limit=999999) that break API calls or cause timeouts.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Update an existing company in HubSpot (ignores if company does not exist)
Update an existing contact in HubSpot (ignores if contact does not exist)
No tool annotations. Tools with WRITE risk (create, update) should declare destructiveHint=true or idempotentHint=true. Tools with READ risk should declare readOnlyHint=true. Omitting annotations prevents clients from routing calls appropriately or warning agents about side effects.
Descriptions lack WHEN and WHY context. 'Create a new contact in HubSpot' is accurate but does not explain when to use this vs create_company, prerequisites, or what happens on duplicates. LLMs cannot infer tool selection logic from bare action descriptions.
No error recovery guidance. If contact creation fails due to duplicate email or invalid properties, the tool handler catches errors but provides no LLM-actionable message. Errors should state: what failed, why, and what to try next.
Properties parameters accept additionalProperties: true without guidance. LLMs have no schema to know which HubSpot properties are valid (firstname, lastname, phone, etc.). Free-form object params invite hallucinated property names and invalid API calls.
No pagination info in list tools. get_recent_engagements and get_active_* accept 'limit' but no 'offset' or 'next_cursor'. Responses may exceed context window, and there is no way for LLMs to fetch the next batch.