A small, readable MCP server for GoHighLevel API v2. Six tools, dry-run writes, and the API gotchas documented.
Six tools with clear verb-noun naming and solid descriptions (avg 120 chars). All tools have input schemas with typed properties. Strengths: dry-run pattern for writes, explicit confirmation checks, good parameter descriptions (E.164 format, ISO 8601, IANA timezone). Weaknesses: no output schemas documented, missing descriptions on some parameters (list_calendars has empty properties), no error recovery guidance, no pagination support despite potential for large result sets.
Book an appointment. Verifies the requested time is a real free slot first, then writes. DRY RUN BY DEFAULT: pass confirm:true to actually book.
Create a contact. DRY RUN BY DEFAULT: returns the exact payload without sending. Pass confirm:true to actually write.
Fetch one contact by its GoHighLevel contact id.
Get real bookable slots for a calendar in a date range. Handles the epoch-milliseconds requirement for you.
List all calendars in the connected location, with their ids and slot durations.
Search contacts in the connected GoHighLevel location by name, email, or phone.
No output schemas documented. LLMs cannot predict response structure for downstream tool chaining. E.g., search_contacts returns contact objects but field names/types are undocumented.
list_calendars inputSchema has empty properties object, no parameters documented, even though the tool clearly accepts locationId internally. Violates self-documenting principle.
No error recovery guidance. Tools return raw API errors without actionable next steps. E.g., 'Contact not found' should suggest 'Try search_contacts() first.'
search_contacts lacks pagination. No limit enforcement or next_cursor documented. Large result sets could exhaust context window.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
get_contact parameter 'contactId' lacks format guidance. Should specify: 'GoHighLevel contact ID (alphanumeric string, e.g. abc123def456)' to prevent LLM confusion with email or name.