MCP Server for Systeme.io — manage contacts, tags, courses, and subscriptions through Claude
Strong foundation with 19 well-named tools using consistent verb_noun patterns (list_, get_, create_, update_, delete_, add_, remove_). All tools have descriptions (avg 140 chars, within 10-1024 baseline). Input schemas are comprehensive with Zod validation and type constraints. However, output schemas are not documented, responses are JSON-stringified without field-level documentation. Error handling returns generic error messages without recovery guidance. Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications. Parameter descriptions are solid but lack format/constraint details in some cases (e.g., 'locale' accepts 'en', 'fr', 'es', 'de', 'pt' but not formalized as enum).
Add a contact to a community.
Assign a tag to a contact. This can trigger automations in Systeme.io (e.g., adding to a campaign, enrolling in a course).
Cancel an active subscription for a contact.
Create a new contact in Systeme.io with an email address, optional locale, and custom fields. This can trigger automations (e.g., enrolling in a course or campaign).
Create a new tag in Systeme.io. Tags help organize and segment contacts for campaigns and automations.
Delete a contact from Systeme.io. Note: actual deletion may take several days for security reasons.
Output schemas not documented. Responses are JSON-stringified without field-level documentation. LLMs cannot plan downstream tool calls or extract specific fields without trial-and-error.
Error handling returns generic 'Error: <message>' without recovery guidance. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
Tool annotations missing. Destructive tools (delete_contact, delete_tag, cancel_subscription) lack destructiveHint. Read-only tools lack readOnlyHint. This prevents agents from reasoning about side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Delete a tag from Systeme.io. This removes the tag from all contacts.
Enroll a contact in an online course. You can grant full access, partial access (specific modules), or dripping content access.
Get full details of a specific contact by their ID, including email, locale, custom fields, tags, and registration info.
List all communities in your Systeme.io account.
List all custom contact fields defined in your Systeme.io account (e.g., first_name, country, phone_number, and any custom fields you created).
List contacts in your Systeme.io account. Filter by email, tags, bounced/unsubscribed status, or registration date. Returns paginated results.
List all online courses in your Systeme.io school. Filter by active status or search by name.
List all subscriptions for a contact, including status, plan, and payment details.
List all tags in your Systeme.io account. Tags are used to segment and organize your contacts.
Remove a contact from a community.
Remove a tag from a contact.
Update an existing contact's locale or custom fields. Uses merge-patch: only specified fields are changed.
Rename an existing tag.
Locale parameter accepts undocumented values ('en', 'fr', 'es', 'de', 'pt'). Should be formalized as enum constraint instead of free-form string.
Pagination cursors (startingAfter) lack documentation on how to obtain initial cursor or detect end-of-results. No 'total' or 'has_more' field guidance.