Thinkific MCP Server
A production-quality Model Context Protocol (MCP) server for the Thinkific REST Admin API and GraphQL API. Lets AI assistants (Claude, GPT, etc.) interact with your Thinkific site directly β manage courses, students, enrollments, orders, coupons, communities, and more.
Features
- 108 MCP tools covering the full Thinkific API surface β 77 REST tools and 31 GraphQL tools
- Full REST coverage β courses, users, enrollments, orders, products, bundles, coupons, groups, instructors, reviews, promotions, categories, site scripts, external orders, publish requests, and more
- GraphQL support β queries and mutations for communities, posts, lessons, assignments, and advanced data access via
https://api.thinkific.com/stable/graphql
- 3 MCP resources for quick site overview data
- Dual authentication β API Key or OAuth Bearer token
- Pagination on every list endpoint (page + limit params)
- Rate-limit awareness β automatic retry with exponential back-off on 429 responses
- Structured error handling β human-readable errors, never crashes the server
- TypeScript β fully typed, strict mode, JSDoc throughout
Quick Start
1. Install
# Clone or copy the project
cd ~/Documents/thinkific-mcp
# Install dependencies
npm install
# Build
npm run build
2. Configure Authentication
You need one of the two auth methods:
Option A: API Key (single site)
Find your API key in your Thinkific admin: Settings β Code & Analytics β API.
export THINKIFIC_API_KEY="your-api-key"
export THINKIFIC_SUBDOMAIN="your-site-subdomain"
Option B: OAuth Token (multi-site apps)
export THINKIFIC_OAUTH_TOKEN="your-oauth-bearer-token"
3. Run
# Direct
node dist/index.js
# Or via npm
npm start
Usage with Claude Desktop
Add to your Claude Desktop MCP config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"thinkific": {
"command": "node",
"args": ["/path/to/thinkific-mcp/dist/index.js"],
"env": {
"THINKIFIC_API_KEY": "your-api-key",
"THINKIFIC_SUBDOMAIN": "your-subdomain"
}
}
}
}
Usage with OpenClaw / mcporter
# Register the server
mcporter add thinkific -- node /path/to/thinkific-mcp/dist/index.js
# Set env vars
mcporter env thinkific THINKIFIC_API_KEY=your-api-key
mcporter env thinkific THINKIFIC_SUBDOMAIN=your-subdomain
# Verify tools are visible
mcporter tools thinkific
REST Tool Reference
Users
| Tool | Description | Key Parameters |
|---|
list_users | List all users/students | page, limit |
get_user | Get user details by ID | user_id |
create_user | Create a new user | first_name, last_name, email, password?, roles?, company?, send_welcome_email? |
search_users | Search users by email/name | query, page, limit |
update_user | Update user details | user_id, fields to update |
delete_user | Delete a user | user_id |
Enrollments
| Tool | Description | Key Parameters |
|---|
list_enrollments | List enrollments (filterable) | page, limit, query_user_id?, query_course_id?, query_email? |
create_enrollment | Enroll a user in a course | course_id, user_id, activated_at?, expiry_date? |
get_enrollment | Get enrollment details by ID | enrollment_id |
update_enrollment | Update an enrollment | enrollment_id, fields to update |
Courses
| Tool | Description | Key Parameters |
|---|
list_courses | List all courses with pagination | page, limit |
get_course | Get a single course by ID | course_id |
Chapters
| Tool | Description | Key Parameters |
|---|
list_chapters | List chapters in a course | course_id, page, limit |
get_chapter | Get chapter details by ID | chapter_id |
Contents
| Tool | Description | Key Parameters |
|---|
list_contents | List lessons in a chapter | chapter_id, page, limit |
get_content | Get content/lesson details by ID | content_id |
Orders
| Tool | Description | Key Parameters |
|---|
list_orders | List orders (filterable) | page, limit, query_user_id?, query_email? |
get_order | Get order details by ID | order_id |
Products
| Tool | Description | Key Parameters |
|---|
list_products | List all products | page, limit |
get_product | Get product details by ID | product_id |
list_related_products | List related products | product_id, page, limit |
Bundles
| Tool | Description | Key Parameters |
|---|
list_bundles | List course bundles | page, limit |
get_bundle | Get bundle details by ID | bundle_id |
list_bundle_courses | List courses in a bundle | bundle_id, page, limit |
list_bundle_enrollments | List bundle enrollments | bundle_id, page, limit |
create_bundle_enrollment | Enroll a user in a bundle | bundle_id, user_id |
update_bundle_enrollment | Update a bundle enrollment | bundle_id, enrollment_id, fields to update |
Groups
| Tool | Description | Key Parameters |
|---|
list_groups | List all groups | page, limit |
get_group | Get group details by ID | group_id |
create_group | Create a new group | name |
delete_group | Delete a group | group_id |
Group Analysts
| Tool | Description | Key Parameters |
|---|
list_group_analysts | List analysts for a group | group_id, page, limit |
add_group_analyst | Add an analyst to a group | group_id, user_id |
remove_group_analyst | Remove an analyst from a group | group_id, user_id |
Group Users
| Tool | Description | Key Parameters |
|---|
add_user_to_group | Add a user to a group | group_id, user_id |
Coupons
| Tool | Description | Key Parameters |
|---|
list_coupons | List all coupons | page, limit |
create_coupon | Create a discount code | code, discount_type, discount_amount, note?, quantity?, product_ids?, expires_at? |
get_coupon | Get coupon details by ID | coupon_id |
update_coupon | Update a coupon | coupon_id, fields to update |
delete_coupon | Delete a coupon | coupon_id |
bulk_create_coupons | Bulk create coupons | count, coupon params |
Promotions
| Tool | Description | Key Parameters |
|---|
list_promotions | List promotions | page, limit |
create_promotion | Create a promotion | name, discount_type, discount_amount, promotion params |
get_promotion | Get promotion details by ID | promotion_id |
update_promotion | Update a promotion | promotion_id, fields to update |
delete_promotion | Delete a promotion | promotion_id |
get_promotion_by_coupon | Get promotion for a coupon code | coupon_code |
Categories
| Tool | Description | Key Parameters |
|---|
list_categories | List categories | page, limit |
create_category | Create a new category | name |
get_category | Get category details by ID | category_id |
update_category | Update a category | category_id, fields to update |
delete_category | Delete a category | category_id |
list_category_products | List products in a category | category_id, page, limit |
add_products_to_category | Add products to a category | category_id, product_ids |
remove_products_from_category | Remove products from a category | category_id, product_ids |
Course Reviews
| Tool | Description | Key Parameters |
|---|
list_course_reviews | List reviews (filterable) | course_id?, page, limit |
create_course_review | Create a course review | course_id, user_id, rating, title?, review? |
get_course_review | Get review details by ID | review_id |
Instructors
| Tool | Description | Key Parameters |
|---|
list_instructors | List instructors | page, limit |
create_instructor | Create an instructor profile | user_id, instructor fields |
get_instructor | Get instructor details by ID | instructor_id |
update_instructor | Update an instructor profile | instructor_id, fields to update |
delete_instructor | Delete an instructor profile | instructor_id |
Custom Profile Fields
| Tool | Description | Key Parameters |
|---|
list_custom_profile_fields | List all custom profile fields | (none) |
External Orders
| Tool | Description | Key Parameters |
|---|
create_external_order | Create an external order | user_id, product_id, order params |
refund_external_order | Refund an external order | order_id |
purchase_external_order | Process an external order purchase | order_id |
Product Publish Requests
| Tool | Description | Key Parameters |
|---|
list_publish_requests | List product publish requests | page, limit |
get_publish_request | Get a publish request by ID | request_id |
approve_publish_request | Approve a publish request | request_id |
deny_publish_request | Deny a publish request | request_id |
Site Scripts
| Tool | Description | Key Parameters |
|---|
list_site_scripts | List all site scripts | page, limit |
create_site_script | Create a site script | name, src, load_method?, location? |
get_site_script | Get site script details by ID | script_id |
update_site_script | Update a site script | script_id, fields to update |
delete_site_script | Delete a site script | script_id |
Site
| Tool | Description | Key Parameters |
|---|
get_site_info | Site overview (counts and settings) | (none) |
GraphQL Tool Reference
GraphQL tools use the Thinkific GraphQL endpoint: https://api.thinkific.com/stable/graphql
Queries
| Tool | Description | Key Parameters |
|---|
gql_site | Fetch site details via GraphQL | (none) |
gql_me | Get current authenticated user | (none) |
gql_course | Get course details by ID | id |
gql_course_by_slug | Get course details by slug | slug |
gql_user | Get user details by ID | id |
gql_user_by_email | Get user details by email | email |
gql_bundle | Get bundle details by ID | id |
gql_category | Get category details by ID | id |
gql_chapter | Get chapter details by ID | id |
gql_lesson | Get lesson details by ID | id |
gql_group | Get group details by ID | id |
gql_product | Get product details by ID | id |
gql_community | Get community details by ID | id |
gql_community_user | Get community user details | community_id, user_id |
gql_post | Get a community post by ID | id |
gql_space | Get a community space by ID | id |
Mutations
| Tool | Description | Key Parameters |
|---|
gql_create_post | Create a community post | space_id, content, title? |
gql_reply_to_post | Reply to a community post | post_id, content |
gql_update_post | Update a community post | post_id, content?, title? |
gql_follow_post | Follow a community post | post_id |
gql_unfollow_post | Unfollow a community post | post_id |
gql_pin_post | Pin a community post | post_id |
gql_unpin_post | Unpin a community post | post_id |
gql_move_post | Move a post to another space | post_id, space_id |
gql_react_to_post | React to a community post | post_id, reaction |
gql_bulk_add_users_to_groups | Bulk add users to groups | user_ids, group_ids |
gql_bulk_remove_users_from_groups | Bulk remove users from groups | user_ids, group_ids |
gql_mark_lesson_incomplete | Mark a lesson as incomplete for a user | lesson_id, user_id |
gql_view_lesson | Mark a lesson as viewed/complete for a user | lesson_id, user_id |
gql_update_assignment_submission | Update an assignment submission | submission_id, fields to update |
gql_update_product | Update a product via GraphQL | id, fields to update |
Resources
| Resource URI | Description |
|---|
thinkific://courses | JSON listing of all courses (first 100) |
thinkific://users | JSON listing of all users (first 100) |
thinkific://site | JSON overview with total counts |
Environment Variables
| Variable | Required | Description |
|---|
THINKIFIC_API_KEY | Yes (API Key auth) | Your Thinkific API key from Settings β Code & Analytics β API |
THINKIFIC_SUBDOMAIN | Yes (API Key auth) | Your Thinkific site subdomain (e.g. my-school from my-school.thinkific.com) |
THINKIFIC_OAUTH_TOKEN | Yes (OAuth auth) | OAuth2 Bearer token (alternative to API Key auth) |
Note: If THINKIFIC_OAUTH_TOKEN is set, it takes precedence over API Key auth.
Project Structure
thinkific-mcp/
βββ src/
β βββ index.ts # Entry point β server bootstrap
β βββ client.ts # Thinkific API client (auth, pagination, retry)
β βββ tools.ts # MCP tool definitions and handlers (REST)
β βββ gql-tools.ts # MCP tool definitions and handlers (GraphQL)
β βββ resources.ts # MCP resource definitions
β βββ types.ts # TypeScript interfaces for API responses
β βββ test.ts # Validation test script
βββ dist/ # Compiled JavaScript (after build)
βββ package.json
βββ tsconfig.json
βββ README.md
βββ LICENSE
βββ .gitignore
Development
# Build
npm run build
# Watch mode
npm run dev
# Type-check only
npm run lint
# Run tests (after build)
npm test
Troubleshooting
"Thinkific authentication not configured"
Set the required environment variables. You need either:
THINKIFIC_API_KEY and THINKIFIC_SUBDOMAIN, or
THINKIFIC_OAUTH_TOKEN
401 Authentication Error
- Verify your API key hasn't been rotated (keys are shown only once after reset)
- Confirm your Thinkific plan supports API access (Grow/Pro + Growth or above)
- Check the subdomain matches exactly (e.g.
my-school, not my-school.thinkific.com)
429 Rate Limit
The server automatically retries with exponential back-off (up to 3 retries). If you're consistently hitting rate limits, reduce request frequency or add pagination with smaller page sizes.
Empty Results
- Check that you're connecting to the correct site (verify subdomain)
- Some endpoints require data to exist first (e.g. no enrollments without courses and users)
Server Won't Start
- Ensure Node.js 18+ is installed:
node --version
- Run
npm run build first β the server runs from dist/
- Check stderr for error messages (stdout is reserved for MCP protocol)
API Documentation
License
MIT β see LICENSE.