# Skool Course

> >

- **Type:** Skill
- **Install:** `agentstack add skill-nulightjens-jensai-skills-skool-course`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [NulightJens](https://agentstack.voostack.com/s/nulightjens)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [NulightJens](https://github.com/NulightJens)
- **Source:** https://github.com/NulightJens/jensai-skills/tree/main/skool-course

## Install

```sh
agentstack add skill-nulightjens-jensai-skills-skool-course
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Skool Course Creator & Updater

Automate course creation and lesson content management on Skool.com using Chrome DevTools MCP.

**IMPORTANT**: Read `references/skool-structure.md` FIRST. It contains the proven code snippets for every operation. The patterns below reference those snippets.

## Prerequisites

1. Chrome open with remote debugging: `--remote-debugging-port=9333`
2. Logged into the Skool group
3. Classroom page visible
4. Chrome DevTools MCP connected

## Input Formats

### Format A: Structured Markdown (preferred)
```markdown
# Course: [Course Title]
## Module 1: [Module Title]
### Lesson 1.1: [Lesson Title]
[Lesson content in HTML-ready markdown]
```

### Format B: Course Outline Directory
A directory holding an outline file plus one markdown file per lesson draft, for example `course-outline.md` alongside a `lesson-drafts/*.md` folder. Read the outline for module and lesson order, then read each draft for its body content.

### Format C: Conversational
Collect: course title, modules, lesson titles, lesson content interactively.

## Core Procedure: Updating a Lesson (3 Steps)

This is the reliable flow. Every step is required. See `references/skool-structure.md` for exact code.

### Step 1: Navigate + Open Editor + Set Content

```
1. navigate_page -> lesson URL
2. wait_for -> lesson title text (5s timeout)
3. evaluate_script -> click pencil button (SVG path starts with 'M19.2555', y between 100-300)
4. evaluate_script -> Promise-poll for '.tiptap.ProseMirror.skool-editor2' with el.editor (5s timeout)
5. evaluate_script -> el.editor.commands.setContent(htmlString) + el.focus() + el.editor.commands.focus('end')
```

### Step 2: Trigger React Dirty State

```
type_text -> " "
```

**CRITICAL**: This is the step that makes saves work. Without it, setContent() updates the DOM but React doesn't detect the change, SAVE stays disabled, and content is lost on navigation.

**DO NOT substitute** with dispatchEvent(), focus(), or any JavaScript-only approach. Only the MCP type_text tool fires real keyboard events that React picks up.

### Step 3: Click SAVE

```
evaluate_script -> find button with textContent 'SAVE' && !disabled, click it
```

Must return `'SAVED'`. If it returns `'save still disabled'`, retry Step 2.

## Creating New Pages

### Method 1: Three-Dot Menu on Module Header (primary method)
Each module in the sidebar has a three-dot menu that appears on hover, next to the collapse caret. Click it, choose "Add page", and a new blank page appears in the module. Navigate to it and populate with the 3-step procedure.

**Automation:** Hover on the module header first (to reveal the menu), take a snapshot to find the three-dot button, click it, then look for "Add page" in the dropdown.

### Method 2: Repurpose Orphan "New page" Entries
Navigate to an existing blank "New page" URL, enter edit mode, change the title via the Title input, add content, save.

## Creating Modules (Folders)

From the course overview page, look for "Add folder" or "+" buttons. Click, fill module title, save.

## Full Course Creation Flow

1. **Parse content**: extract modules + lessons
2. **Connect**: list_pages, find Skool tab, verify state
3. **Create course**: find "New course" button, fill title/description
4. **Create modules**: add folders in order
5. **Create lessons**: add pages within each module
6. **Populate content**: use the 3-step procedure for each lesson
7. **Verify**: reload random lessons, check content persisted

## Lesson Content Format (HTML)

Pass HTML to setContent():
```html
Heading
Text with bold and code.
Ordered item
Unordered item
```

Use `&amp;` for `&` in HTML strings. Tested up to ~3,200 chars per lesson.

## Throughput & Verification

- ~20-30 seconds per lesson
- Verify every 10 lessons by reloading a page and checking content
- Confirm each save returned `'SAVED'` before moving on

## Selector Durability

Skool is a React SPA with no public API, so this skill drives the real UI. Its DOM class names, styled-component hashes, and SVG path data change whenever Skool ships a frontend update. The procedures find elements dynamically (by visible text, by editor instance, by button state) wherever that is possible, but a few anchors are necessarily literal: the pencil-button SVG path prefix `M19.2555`, the editor class `.tiptap.ProseMirror.skool-editor2`, and the sidebar wrapper classes used for the module three-dot menu.

If a step returns `0` or `'not found'` and the page clearly looks correct in a screenshot, assume the selector has drifted rather than the logic. Take a snapshot, locate the current element, and update the selector in `references/skool-structure.md`. The three-step save procedure itself (open editor, fire a real keystroke, click SAVE) has outlived several selector refreshes.

## Error Recovery

| Problem | Solution |
|---------|----------|
| Editor not mounting | Retry pencil click, re-check with Promise poll |
| SAVE stays disabled | Retry type_text " " |
| Content lost after nav | SAVE didn't fire, so always check the return value |
| Page in edit mode already | Skip pencil click, go straight to setContent |
| Lost in UI | Navigate directly to lesson URL |
| Selector returns not found | Snapshot the page, find the current element, refresh the selector |

## Reference

All code snippets, selectors, and troubleshooting: `references/skool-structure.md`

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [NulightJens](https://github.com/NulightJens)
- **Source:** [NulightJens/jensai-skills](https://github.com/NulightJens/jensai-skills)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-nulightjens-jensai-skills-skool-course
- Seller: https://agentstack.voostack.com/s/nulightjens
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
