Quick reference (TL;DR for agents)
- What this enables: Goose reads AND writes to Skool — approve members, post, reply, publish courses — as a native MCP extension, driven by chat or autonomous task.
- Method: add the Apify-hosted Skool All-in-One API actor as a stdio extension via
goose configureor~/.config/goose/config.yaml. Apify’s MCP gateway exposes every action as a tool.- Auth flow:
auth:loginonce →cookiesstring in the extensionenv→ reuse for ~3.5 days.- Latency: ~2s per tool call (cookies cached) / ~10s on
auth:logincold start.- Cost: Apify pay-per-event (~$0.005–$0.01 per Skool action). Goose on your existing LLM provider.
Why Goose + Skool?
Skool has no official API. If Goose already runs your dev tasks, you don’t want to drop out of it to open the Skool web UI and click through member approvals or course uploads by hand.
Goose helped shape MCP, and its extension system is MCP all the way down — every extension you add is an MCP server, every server’s tools become callable by the agent. The Skool All-in-One API actor is hosted on Apify’s MCP gateway, so adding it is the same one-step flow as any other Goose extension. No SDK, no Playwright in your runtime — Goose can drive your whole Skool admin surface.
Why Goose specifically fits well here:
- Extension = MCP server, no special casing. Skool is just another stdio extension alongside your developer/computercontroller extensions.
- Interactive
goose configurewizard. Add the extension by answering prompts — name, command, timeout, env vars — no hand-edited JSON if you don’t want it. - Autonomous task runs. Goose is built to run multi-step tasks unattended; “every morning, approve verified applicants and post the digest” is a natural Goose recipe once the Skool extension is wired.
Setup — add the Skool extension (5 minutes)
1. Get your Apify API token
Sign up at apify.com — the free tier covers most communities. Grab a token from console.apify.com/account/integrations.
2. Get your Skool cookies (one-time, valid ~3.5 days)
Run this once and keep the returned cookies string — you’ll store it in the extension env:
curl -X POST \
"https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"action": "auth:login",
"email": "admin@yourcommunity.com",
"password": "your-skool-password",
"groupSlug": "your-community-slug"
}'
3. Add the extension
Option A — interactive (goose configure):
goose configure
# → Add Extension
# → Command-line Extension (STDIO)
# Name: skool
# Command: npx -y @apify/actors-mcp-server --token=YOUR_APIFY_TOKEN --actors=cristiantala/skool-all-in-one-api
# Timeout: 60 (seconds — auth:login needs headroom)
# Env: SKOOL_COOKIES=... SKOOL_GROUP_SLUG=your-community-slug
Option B — edit ~/.config/goose/config.yaml directly (on Windows: %APPDATA%\Block\goose\config\config.yaml). Add a skool entry under extensions:
extensions:
skool:
type: stdio
command: npx
args:
- "-y"
- "@apify/actors-mcp-server"
- "--token=YOUR_APIFY_TOKEN"
- "--actors=cristiantala/skool-all-in-one-api"
env:
SKOOL_COOKIES: "the-cookies-string-from-step-2"
SKOOL_GROUP_SLUG: "your-community-slug"
timeout: 300
4. Start a session and verify
goose session
The Skool actions are now available as tools. You can also load it for a single run without persisting config:
goose session --with-extension "npx -y @apify/actors-mcp-server --token=YOUR_APIFY_TOKEN --actors=cristiantala/skool-all-in-one-api"
How the connection works
Goose Apify Skool
───── ───── ─────
reads ~/.config/goose/config.yaml → starts @apify/actors-mcp-server (extension)
│ picks a tool + structured params
▼
[MCP call ───────────→ run-sync-get-dataset-items ──────────────→ api.skool.com]
{ action, cookies, groupSlug, ... } (login + WAF token +
│ │ buildId handled by actor)
◄──────── { success: true, data } ◄────────────────────────┘
│
Goose reports back / continues the task
Every Skool operation = one MCP tool call backed by one HTTP POST. The actor handles Playwright login, WAF token rotation, and Skool buildId changes for you.
Example session — clear the waitlist by chat
You start goose session and type:
List my pending Skool members and approve the ones with a real LinkedIn. Show me the rest so I can decide.
Goose calls, in sequence:
1. members:pending → fetches the approval queue
2. (reasons over each: LinkedIn reachable? survey specific? channel?)
3. members:batchApprove → approves the clear yeses in one call
4. prints the borderline ones for you → you decide the edge cases
End-to-end this replaces ~10 minutes of clicking through the Skool admin UI, at about a cent per approved member. Full walkthrough: Review & batch-approve your waitlist.
What you can ask Goose to do — full action surface
The actor exposes the entire Skool admin surface as MCP tools. You ask in plain English; Goose maps it to one of these actions. Full params for each: Actions reference.
Posts & comments
| Action | What it does |
|---|---|
posts:list / posts:filter |
List or filter posts (by date, label, unanswered) |
posts:get |
Fetch a single post |
posts:create |
Publish a post (plain text + optional label/video) |
posts:update / posts:delete |
Edit or delete a post/comment |
posts:createComment |
Comment on a post or reply to a comment |
posts:pin / posts:unpin |
Pin or unpin a post |
posts:vote |
Upvote / clear vote |
posts:getComments / posts:getCommentsFull |
Read a post’s comment tree (fast / full-scroll, no cap) |
Members
| Action | What it does |
|---|---|
members:list |
List active members |
members:pending |
List the approval queue |
members:approve / members:reject |
Approve or reject one applicant |
members:batchApprove |
Approve N applicants in one run |
members:ban |
Ban a member (destructive — confirm first) |
Events
| Action | What it does |
|---|---|
events:list / events:upcoming |
List calendar events (all / future only) |
Classroom (courses)
| Action | What it does |
|---|---|
classroom:listCourses / classroom:getTree |
List courses / read a course’s full tree |
classroom:createCourse / createFolder / createPage |
Build course structure |
classroom:setBody |
Set a lesson’s content (markdown → auto-converted to TipTap) |
classroom:updateCourse |
Edit course settings — cover, tier, privacy (read-then-write) |
classroom:updateResources |
Attach / detach downloadable files on a lesson |
classroom:deleteUnit |
Delete a course / folder / page (destructive — confirm first) |
Files & groups
| Action | What it does |
|---|---|
files:uploadImage / files:uploadFile |
Upload a cover image / a private attachment |
groups:get |
Read group metadata (incl. post categories) |
groups:setAutoDM |
Set the welcome DM new members receive |
System
| Action | What it does |
|---|---|
system:health / system:debug |
Healthcheck / SSR diagnostics |
auth:login |
Get fresh cookies (~3.5 day TTL) |
Production gotchas
x402-payment-requiredon every call: Not a billing issue — it’s a staleUNDER_MAINTENANCEflag from Apify’s heuristic. Open the actor page in Apify Console once to reset. Details in error handling.- Cookies expiring silently: When a call returns
errorCode: "WAF_EXPIRED", re-runauth:loginand updateSKOOL_COOKIESinconfig.yaml, then restart the session. Thehintfield tells Goose exactly this. parentIdfor comment replies: top-level comment →rootId == parentId == postId. Reply to a comment →rootId == postId,parentId == commentId. Mixing these is the most common silent bug.memberIdvsid: for approve/reject, passmemberIdfrommembers:pending, not theid. The wrong one gives a silent 404.- Extension
timeouttoo low forauth:login: Goose’s per-tool timeout (the wizard’s “Timeout in seconds”) must be ≥30s becauseauth:loginruns a real browser login (~10s). The example uses300. - Goose may need tool resources, not just tools: if your Goose build only surfaces MCP resources and not tool calls, update Goose — the actor exposes actions as MCP tools, which current Goose invokes directly.
Hand this to your agent
Don’t want to run the extension? Paste this primer into a Goose session (or any agent) and it knows how to drive Skool over plain HTTP in one shot:
You can operate a Skool community through the Apify-hosted "Skool All-in-One API"
actor (cristiantala/skool-all-in-one-api). Skool has no official API; this actor is it.
Every action is ONE HTTP POST:
POST https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/run-sync-get-dataset-items?token=$APIFY_TOKEN&build=latest&timeout=90
body: { "action": "<namespace>:<op>", "cookies": "$SKOOL_COOKIES",
"groupSlug": "<your-slug>", "params": { ...per action... } }
Auth: call "auth:login" with {email,password,groupSlug} ONCE, save the returned
`cookies` string, reuse it (~3.5 day TTL). On errorCode "WAF_EXPIRED", re-run auth:login.
Rules: members approve/reject use params.memberId (NOT id). Comment reply: parentId =
comment id, rootId = post id. Posts are plain text. ~25 writes/min hard limit (actor
queues — no retry loop). Every response is { success, data } or { success:false,
errorCode, hint } — read `hint` to recover.
Full action list + params: https://skool-api.cristiantala.com/docs/actions/
The full pattern library (function-calling specs, idempotency table, the LLM-readable hint contract) lives in Skool for AI agents.
See also
- Skool MCP — the general MCP pattern (Claude Desktop, Cursor, Cline) this page builds on
- Skool + Gemini CLI — the same MCP approach for Google’s Gemini CLI
- Skool + Claude — Anthropic API + Claude Desktop
- Skool for AI agents — full pattern library + function-calling specs
- Recipe: Use the Skool API as an MCP tool
- All integrations →
Plug Skool into Goose today
→ Use the Skool All-in-One API actor on Apify
- Pay-per-event (~$0.005–$0.01 per Skool action, ~$1.50/mo typical)
- Read AND write — full API surface (posts, comments, members, classroom, files, Auto DM)
- Native MCP extension — one
goose configurestep, no integration code to maintain
No Skool community yet? Launch one in 10 minutes — 14-day free trial.