A Model Context Protocol server for HubSpot that creates, retrieves, updates, and deletes summary notes. Tools include: create_shared_summary, get_summaries, update_shared_summary, delete_shared_summary.
Server has 4 tools with complete input schemas and descriptions, but quality is inconsistent. Tool names follow verb_noun convention (create_, get_, update_, delete_) which is good. However, descriptions are verbose and procedural rather than outcome-focused. Parameters lack type constraints (enums, ranges, patterns). Output schemas are completely undocumented, LLMs cannot plan downstream calls. Error handling is minimal. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. The server exposes SHARED_CONTACT_ID as a hardcoded environment variable, which is a security anti-pattern.
Step 1: Accept a title, summary, and author. Step 2: Combine these into a note body. Step 3: Create a new HubSpot Note engagement associated with a dedicated contact.
Delete a summary note from HubSpot. Either provide an explicit Engagement ID (id) or use optional filters (date, dayOfWeek, limit, timeRange) to select a candidate note (e.g., 'delete my last summary').
Retrieve summary notes from HubSpot with flexible filters. Optional filters: • date: (YYYY-MM-DD) to filter by a specific date. • dayOfWeek: e.g., 'Monday' to filter by day of the week. • limit: Number of most recent summaries to return. • timeRange: { start: 'HH:MM', end: 'HH:MM' } to filter by time of day.
Step 1: Provide an explicit Engagement ID OR a search query (query) to locate the note. Step 2: Retrieve the current note content. Step 3: Merge existing values with any provided updates (title, summary, author). Step 4: Update the note while preserving unchanged fields.
No output schemas documented. LLMs cannot infer what fields are returned, breaking tool chaining and forcing discovery calls.
Descriptions are procedural (Step 1, Step 2, Step 3) rather than outcome-focused. Should state WHAT the tool does, WHEN to use it, and what it returns in 50-200 chars.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). delete_shared_summary and update_shared_summary are marked DESTRUCTIVE/REVERSIBLE but lack annotations to guide agent behavior.
Parameters lack type constraints. 'dayOfWeek' accepts free-form strings (should be enum: Monday-Sunday). 'limit' has no min/max bounds. 'date' has no format validation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
update_shared_summary and delete_shared_summary accept optional 'id' OR filter parameters, but no validation ensures at least one is provided. LLMs may call with no parameters.