Open-source MCP (Model Context Protocol) server for the SharpSpring API, now branded Constant Contact Lead Gen & CRM. Lets AI agents and Claude read/write Leads and call any standard SharpSpring API method.
SharpSpring MCP has solid naming conventions (verb_noun pattern) and comprehensive descriptions for most tools. All 7 tools have descriptions (194-char baseline met). Input schemas are present and use Zod validation with type constraints. However, output schemas are undocumented, responses are JSON-stringified without field-level documentation. Error handling is minimal (no recovery guidance, no categorization). The generic sharpspring_call tool is a catch-all that bypasses structured validation, reducing composability. Pagination is supported but not consistently documented across all tools.
Call any documented SharpSpring API v1 method directly by name (e.g. getAccounts, createOpportunities, getActiveLists, addListMembers, createNotes, getTasks, getDealStages). Use this for any standard SharpSpring object or action not covered by a dedicated tool. Consult the official SharpSpring API method reference for exact method names and parameter shapes.
Create up to 500 leads in one call. Each lead must at minimum include emailAddress. Call sharpspring_get_fields first to discover valid custom field systemNames for this account.
Delete leads by ID.
Discover lead, account, opportunity, and campaign fields available in this SharpSpring account, including custom fields. Each result's `systemName` is the key to use when creating/updating that field's object type; `relationship` tells you which object type (lead, account, opportunity, campaign) the field belongs to. Always call this before creating/updating custom fields, since custom field systemNames differ per SharpSpring account.
Retrieve a single lead by its numeric ID.
Output schemas are undocumented. All tools return JSON-stringified text without field-level documentation. LLMs cannot plan downstream tool calls or extract structured data reliably.
sharpspring_call is a generic catch-all that accepts any method name and untyped params. This bypasses validation and forces LLMs to know SharpSpring API internals. Violates single-responsibility principle.
Error handling is minimal. No recovery guidance, no error categorization (retryable vs fatal), no actionable error messages. SharpSpringError is thrown but not caught/transformed for LLM consumption.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Retrieve leads matching a WHERE clause, or all leads if the clause is empty. Returns at most 500 results per call; use offset to page through more.
Update up to 500 existing leads in one call. Each lead object must include an `id`. Set strict=true to use updateLeadsV2, which returns an error instead of silently no-op'ing when the id doesn't match an existing lead.
Destructive operations (sharpspring_delete_leads) lack confirmation or dry-run support. No guard against accidental bulk deletion.
Parameter descriptions lack format/constraint details. E.g., 'limit' says '1-500' but no guidance on default or typical values. 'where' object structure is documented but not validated at tool boundary.