MCP server providing tools to manage HubSpot contacts and deals via the HubSpot CRM API
Server has 5 tools with basic schemas and descriptions, but significant gaps prevent production use. All tools have input schemas with type definitions and required fields, which is positive. However, parameter descriptions are minimal or missing entirely (e.g., 'email' in create_contact has no description text, only type). Tool descriptions are present but generic (10-50 chars), below the 50-200 char baseline for LLM optimization. No output schemas documented. Error handling returns raw exception strings rather than actionable recovery guidance. No parameter constraints (enums, ranges, patterns) despite many parameters accepting only specific values (e.g., dealstage should be an enum). Missing idempotency guidance for write operations.
Create a new contact in HubSpot
Create a new deal
Get full contact details by ID
Search contacts by query term
Update a contact's properties
Parameter descriptions missing or trivial. 'email' in create_contact has no description; 'properties' in update_contact lacks guidance on valid keys; 'dealstage' and 'pipeline' in create_deal have no constraints or examples.
No output schemas documented. Callers cannot predict response structure (e.g., does search_contacts return contact_id or id? Does create_deal return deal_id?). LLMs must guess field names for downstream tool calls.
Error handling returns raw exception strings ('HubSpot API 400: ...') without recovery guidance. LLM cannot determine if error is retryable, user-fixable, or fatal.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | <=2025-11-25 | v2 |
Tool descriptions too short (10-50 chars). 'Create a new contact in HubSpot' lacks context on when to use vs search_contacts, what fields are required, or what the response contains. Below 50-200 char baseline for LLM optimization.
No enum constraints on categorical parameters. 'dealstage' accepts free-form strings; should declare valid stages (e.g., 'negotiation', 'proposal', 'closed_won'). LLMs will hallucinate invalid values.