Kourses MCP by usefulapi
List memberships, check member access, add members and grant or revoke access in Kourses.
Should I use this
Quality & Safety
Findings (3)
- LOWin kourses_list_member_memberships
- LOWin kourses_grant_membership_access
- LOWin kourses_revoke_membership_access
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"kourses": {
"url": "https://kourses.usefulapi.io/mcp"
}
}
}Remote endpoints
https://kourses.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (5)
🟢kourses_list_memberships(page, per_page)
List the published memberships of the Kourses website this key belongs to. Each has an id, name, slug and URL. Kourses API: GET /memberships.
Input Schema
{
"type": "object",
"properties": {
"page": {
"description": "Page number (default 1).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"per_page": {
"description": "Results per page (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢kourses_list_member_memberships(member)
List the memberships a member can access now (permissions that have not expired). Give the member by id or email. Kourses API: GET /members/{member}/memberships.
Input Schema
{
"type": "object",
"properties": {
"member": {
"type": "string",
"minLength": 1,
"maxLength": 254,
"description": "Member id or email address."
}
},
"required": [
"member"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴kourses_create_member(email, first_name, last_name, country, state, ...)
Create a member on the Kourses website. If a member with this email already exists, the given fields OVERWRITE the stored ones and the status is 'updated'. Sends an activation email only when send_activation_notification is true (default false here; the API default is true). Kourses API: POST /members.
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
"description": "Member email address (the member's identity in Kourses)."
},
"first_name": {
"description": "First name (Kourses default: 'Unnamed').",
"type": "string",
"maxLength": 255
},
"last_name": {
"description": "Last name (Kourses default: 'Member').",
"type": "string",
"maxLength": 255
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$"
},
"state": {
"type": "string",
"maxLength": 255
},
"city": {
"type": "string",
"maxLength": 255
},
"zip": {
"description": "Postal code.",
"type": "string",
"maxLength": 64
},
"address": {
"type": "string",
"maxLength": 255
},
"address_2": {
"description": "Apartment, suite, etc.",
"type": "string",
"maxLength": 255
},
"title": {
"description": "Profile title.",
"type": "string",
"maxLength": 255
},
"send_activation_notification": {
"description": "Email an activation link to a new member (default false).",
"type": "boolean"
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴kourses_grant_membership_access(member, membership_id, ends_at, skip_drip_schedule, run_email_integrations, ...)
Give a member access to a membership, optionally until a date. No email is sent unless send_notification is true. Repeating a call keeps one permission, but sends the email again when send_notification is true. Kourses API: POST /members/{member}/memberships/{membership}/permissions.
Input Schema
{
"type": "object",
"properties": {
"member": {
"type": "string",
"minLength": 1,
"maxLength": 254,
"description": "Member id or email address."
},
"membership_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Membership id (from kourses_list_memberships)."
},
"ends_at": {
"description": "When the access stops working: YYYY-MM-DD or YYYY-MM-DD hh:mm:ss.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}( \\d{2}:\\d{2}:\\d{2})?$"
},
"skip_drip_schedule": {
"description": "Skip the membership's drip schedule (default false).",
"type": "boolean"
},
"run_email_integrations": {
"description": "Run the membership's email integrations (default false).",
"type": "boolean"
},
"send_notification": {
"description": "Email the member about the new access (default false).",
"type": "boolean"
}
},
"required": [
"member",
"membership_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴kourses_revoke_membership_access(member, membership_id, ends_at)
Remove a member's access to a membership now, or on ends_at when it is given. The member loses the content they paid for; confirm first. Kourses API: DELETE /members/{member}/memberships/{membership}/permissions.
Input Schema
{
"type": "object",
"properties": {
"member": {
"type": "string",
"minLength": 1,
"maxLength": 254,
"description": "Member id or email address."
},
"membership_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Membership id (from kourses_list_memberships)."
},
"ends_at": {
"description": "When the access stops working: YYYY-MM-DD or YYYY-MM-DD hh:mm:ss.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}( \\d{2}:\\d{2}:\\d{2})?$"
}
},
"required": [
"member",
"membership_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence