Kourses MCP by usefulapi

List memberships, check member access, add members and grant or revoke access in Kourses.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
68%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • LOWTool 'kourses_list_member_memberships' name length outside 3-30 rangein kourses_list_member_memberships
  • LOWTool 'kourses_grant_membership_access' name length outside 3-30 rangein kourses_grant_membership_access
  • LOWTool 'kourses_revoke_membership_access' name length outside 3-30 rangein kourses_revoke_membership_access

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,141Tokens (tool definitions)
~1.7 KBTypical response size
Moderate attention impact (0.89% of 128k context)

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-http

What it can do

Tool inventory

Tools (5)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded5 tools