Thinkific MCP Server
Enables AI assistants to manage Thinkific sites through the REST Admin API, providing tools for handling courses, students, enrollments, and orders. It features 24 specialized tools and resources with support for dual authentication and automatic rate-limit management.
README
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_TOKENis 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_KEYandTHINKIFIC_SUBDOMAIN, orTHINKIFIC_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, notmy-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 buildfirst — the server runs fromdist/ - Check stderr for error messages (stdout is reserved for MCP protocol)
API Documentation
- Thinkific REST API Reference
- Thinkific GraphQL API
- API Key Authorization
- OAuth Authorization
- Rate Limits
License
MIT — see LICENSE.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.