Helper documentation

Helper turns a Skool community into tools an AI assistant can call. There are two ways to use it: add the MCP server to an LLM client (Claude, or any Model Context Protocol client), or call the REST API directly from code. Both run the same actions and use the same API key.

Overview

Every request is authenticated with an API key (sk_live_…) and scoped to your account and the Skool communities you've connected. Helper holds an encrypted Skool session for each community, so you never pass cookies or passwords on individual calls.

1 · Get an API key

Register an account, then copy the key shown once on the confirmation screen. You can also mint additional keys later.

Create an account →

Or mint a key over HTTP with your account email + password:

curl -X POST https://tryhelper.co/v1/api-keys \
  -H "content-type: application/json" \
  -d '{"email":"you@example.com","password":"…","name":"my-key"}'

# → { "success": true, "id": "...", "token": "sk_live_..." }  (token shown once)

2 · Connect a Skool community

Tell Helper which community to manage and provide the Skool admin login for it. Helper logs in once, encrypts the session, and refreshes it automatically. The groupSlug is the last path segment of the community URL — skool.com/my-community.

curl -X POST https://tryhelper.co/v1/groups/connect \
  -H "authorization: Bearer sk_live_..." \
  -H "content-type: application/json" \
  -d '{"groupSlug":"my-community","email":"admin@example.com","password":"…"}'
Use the login of a Skool owner or admin of the community. Write actions (approve, ban, post, edit courses…) require admin rights, exactly as they would in the Skool UI.

Connect an MCP client

Add Helper as a custom connector so an assistant can call the tools directly. In Claude: Settings → Connectors → Add custom connector, then paste the MCP URL:

When the client asks how to authenticate, choose one of:

Once connected, the model sees 36 tools. A typical run: it calls skool_list_groups to find your groupSlug, then skool_groups_info for category/label ids, then an action like skool_posts_create. Just ask in natural language — “approve everyone pending and DM them a welcome.”

Programmatic MCP clients speak streamable HTTP / JSON-RPC at the same URL. A tools/call looks like:

POST https://tryhelper.co/mcp
authorization: Bearer sk_live_...
content-type: application/json

{
  "jsonrpc": "2.0", "id": 1,
  "method": "tools/call",
  "params": {
    "name": "skool_posts_create",
    "arguments": {
      "groupSlug": "my-community",
      "title": "Welcome!",
      "content": "Glad you're here.",
      "labelId": "<from skool_groups_info>"
    }
  }
}

Call the REST API

Prefer raw HTTP? Every tool maps to a single endpoint: POST /v1/execute with an action, a groupSlug, and the action's params.

curl -X POST https://tryhelper.co/v1/execute \
  -H "authorization: Bearer sk_live_..." \
  -H "content-type: application/json" \
  -d '{
    "action": "posts:list",
    "groupSlug": "my-community",
    "params": { "maxPages": 2 }
  }'

# → { "success": true, "data": { "items": [ ... ], "pagination": { ... } } }

List pending members and approve one:

# 1. find pending join requests
{ "action":"members:list", "groupSlug":"my-community", "params":{ "t":"pending" } }

# 2. approve by the membershipId returned above
{ "action":"members:approve", "groupSlug":"my-community", "params":{ "membershipId":"123" } }

Action parameters

The MCP tool name and the REST action are two faces of the same call. The tool's input schema is the action's params (minus groupSlug, which is always top-level). For example the tool skool_posts_create ↔ action posts:create takes title, content, and labelId. Most calls follow a read-then-write pattern:

In an MCP client you don't need to memorize parameters — each tool ships a full input schema and description telling the model exactly what to pass and what to call first.

Tool / action list

35 community actions, plus skool_list_groups (lists the communities connected to your account). MCP tool name on the left, REST action in the middle.

MCP toolREST actionWhat it does
skool_list_groupsList the Skool communities connected to your account.
Community
skool_groups_infogroup:getGet metadata about one of your connected Skool groups (name, members, post categories/labels, plan, etc.).
Posts & comments
skool_posts_listposts:listList posts in a connected Skool group.
skool_posts_getposts:getGet a single post (and its comment tree) by its post name/slug.
skool_posts_createposts:createCreate a post.
skool_posts_editposts:editEdit an existing post by its id.
skool_posts_deleteposts:deleteDelete a post (or a comment — comments are posts) by its id.
skool_posts_upvoteposts:upvoteLike (upvote) a post by its id.
skool_posts_unvoteposts:unvoteRemove your like (unvote) from a post by its id.
skool_posts_pinposts:pinPin a post to the top of the group feed (owner/admin only).
skool_posts_unpinposts:unpinUnpin a post from the group feed (owner/admin only).
skool_posts_commentposts:commentComment on a post, or reply to a comment.
Members
skool_members_listmembers:listList members of a group.
skool_members_approvemembers:approveApprove a pending membership request by its membershipId (member.id from a pending list).
skool_members_removemembers:removeRemove a member from the group by membershipId (member.id from skool_members_list).
skool_members_banmembers:banBan a member from the group by membershipId (member.id from skool_members_list).
skool_members_coursesmembers:coursesGet a member's classroom course access and progress by membershipId (member.id from skool_members_list) — which courses they can access and whether each is completed.
skool_members_paymentsmembers:paymentsGet a member's payment/invoice history by membershipId (member.id from skool_members_list).
skool_members_exportmembers:exportExport the group's members as a CSV (email, join date, tier, application answers).
Classroom
skool_classroom_listclassroom:listList classroom courses (and their structure) in a group.
skool_classroom_create_courseclassroom:createCourseCreate a classroom course.
skool_classroom_update_courseclassroom:updateCourseUpdate an existing course's settings by its unitId (the course id): title, description, and/or cover image.
skool_classroom_create_unitclassroom:createUnitCreate a folder or page inside a course.
skool_classroom_delete_unitclassroom:deleteUnitDelete a classroom unit (course/folder/page) by its id.
skool_classroom_set_bodyclassroom:setBodySet a classroom lesson/page's title, body, and optional video by its unitId (the page/module id).
Video
skool_videos_create_uploadvideos:createUploadStart a lesson video upload.
skool_videos_getvideos:getGet a lesson video's processing status/metadata by videoId.
Files
skool_files_uploadfiles:uploadUpload an image/file to the group and get back a public URL to embed (e.g.
Calendar
skool_calendar_listcalendar:listList calendar events in a group (returns each event's id, for editing/deleting).
skool_calendar_createcalendar:createCreate a calendar event.
skool_calendar_editcalendar:editEdit a calendar event.
skool_calendar_deletecalendar:deleteDelete a calendar event by its eventId.
Messages
skool_messages_list_channelsmessages:channelsList your direct-message (chat) channels — each with the other participant and the channel id needed to send.
skool_messages_search_usersmessages:searchUsersSearch users you can start a DM with, by name.
skool_messages_sendmessages:sendSend a direct message to an existing chat channel.
skool_messages_dm_membermessages:dmMemberDirect-message a member of a group in one step: opens (or reuses) the DM channel with that member and sends the message.

Responses & errors

Every action returns a JSON envelope:

// success
{ "success": true, "data": { /* action-specific */ } }

// failure
{ "success": false, "error": "rate limited", "errorCode": "RATE_LIMIT" }

Auth & rate limits

Get started →   Back to home