
LearnWorlds
io.github.ohneben由 GitHub 账号 ohneben 发布v1.1.2更新于 Oct 24, 2026
All 94 LearnWorlds LMS API endpoints as safety-categorized MCP tools (read/write/destructive).
概览
把 LearnWorlds LMS 的全部 94 个 API 端点封装为带安全分类的 MCP 工具,让助手读取并管理课程、用户、报名与支付。
- 可以做什么
- 读取学校数据:用户、课程、课程包、报名、支付、订阅、优惠券、证书、席位、分销、社区、报表与事件日志
- 创建和更新记录,例如用户、报名、优惠券、用户组与学习进度
- 删除记录,例如用户、社区内容、席位、用户组与证书
- 每个工具都带有只读、写入或破坏性标记及 MCP 注解,描述中说明副作用、返回结构和错误码
- 适用场景
- 适合管理 LearnWorlds 网校的人员:希望助手直接回答用户、收入、课程完成情况等问题,或在对话中完成创建用户、报名、发放优惠券等日常操作,而无需切换界面。
- 运行要求
- 需要开通 API 访问的 LearnWorlds 网校,并提供 LEARNWORLDS_BASE_URL、LEARNWORLDS_API_TOKEN 与 LEARNWORLDS_CLIENT_ID(均为必填)。本地运行需 Docker(可用预构建镜像)或 Node.js 18 及以上源码运行;支持 stdio 或 Streamable HTTP 传输。若 HTTP 端点超出本机回环,必须设置 MCP_AUTH_TOKEN。
安装
在 SourceWeft 中
- 打开 控制台中的 LearnWorlds,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
ohneben's LearnWorlds MCP
License & checks
MCP registries
[MCP Registry] [Listed on mcpservers.org] [Learnworlds-MCP MCP server]
Run your LearnWorlds school in plain language from AI assistants like Claude, Cursor, and any other MCP client.
This Model Context Protocol server exposes the LearnWorlds public API — all 94 endpoints, generated straight from the OpenAPI spec into MCP tools. Every tool is safety-categorized (🟢 read-only / 🟡 write / 🔴 destructive) so your assistant knows what an action does before it calls it. It runs over stdio (Claude Desktop and other local launchers) or Streamable HTTP (hosted in Docker), and ships with retries, client-side rate limiting, and request timeouts so it holds up against a live school.
Why you'll want this
Some MCP servers just forward an API. This one is built to be safe to hand to an LLM and easy to run for real:
How it compares
At the time of writing this appears to be the only dedicated LearnWorlds MCP server. You could instead point a generic OpenAPI→MCP wrapper at the spec — here's what that leaves on the table:
*Generic OpenAPI→MCP wrappers turn any Swagger/OpenAPI spec into MCP tools. They can reach the same endpoints, but treat every operation identically — no safety categories, no resilience, no deployment story, and no guardrails tuned for live school data. "➖" = varies by tool / not guaranteed. Snapshot from July 2026.
What you can do
Once it's connected, ask your assistant things like:
- "List the 10 most recent users who signed up this month."
- "Create a user for [email protected] and enroll her in the 'Pro' bundle."
- "Show me this month's payments and total revenue."
- "Which users haven't completed the 'Onboarding' course yet?"
- "Create a 20%-off coupon for the annual subscription plan."
- "Pull completion analytics for our top 5 courses."
Tools are generated automatically from the API and grouped into 🟢 read-only, 🟡 write, and 🔴 destructive — so a well-behaved host can treat each group differently.
How it works
The server parses the bundled OpenAPI spec into MCP tools (resolving $refs and
guarding against recursive schemas), tags each with its safety category, and injects
your bearer token and Lw-Client header on every outgoing request. Your credentials
stay in the server's environment — the model never sees or handles them.
Requirements
- A LearnWorlds school with API access — an access token and a Client ID (admin → Settings → Integrations → Developers), plus your school's API base URL. See Get your API credentials.
- Docker (Docker Desktop on macOS/Windows) for the quick start below — or Node.js ≥ 18 to run from source.
Quick start (Docker)
1. Add your credentials. Copy the example config and fill it in:
2. Start the server:
The bundled docker-compose.yml binds to 127.0.0.1:8765 only, so the server is
reachable from your machine but not the network.
3. Confirm it's running:
4. Connect your MCP client. The MCP endpoint is http://localhost:8765/mcp.
-
Claude Desktop — add a custom connector (Settings → Connectors) pointing at the URL, or bridge it locally with
mcp-remote. Add this undermcpServersin your config, then fully quit and reopen the app:(Drop the
--headerline if you leftMCP_AUTH_TOKENempty.) -
Claude Code — one command:
-
Claude Cowork — shares Claude Code's MCP config, so the command above makes the tools available there too.
Prefer a prebuilt image?
Every push to main publishes a ready-to-run image to the GitHub Container Registry,
so you can skip the local build entirely:
Get your API credentials
- Log in to your LearnWorlds school admin.
- Go to Settings → Integrations → Developers (the API screen).
- Copy your Access Token →
LEARNWORLDS_API_TOKEN, and your Client ID →LEARNWORLDS_CLIENT_ID. - Set
LEARNWORLDS_BASE_URLto your school's API base:https://<your-school>.learnworlds.com/admin/api. If your school uses a custom domain, use that host instead (e.g.https://academy.example.com/admin/api).
Put all three in .env. The server injects them on every request, so your assistant
never sees them.
Configuration
Everything is set in .env (copied from .env.example):
After changing .env, reload with docker compose up -d --force-recreate.
Tool safety categories
Each tool's description starts with one of these banners and carries the matching MCP annotations:
The 🟡 write tools total 27 (17 create + 10 update). Hosts that respect annotations
(Claude included) can require confirmation for destructiveHint tools and trust
readOnlyHint tools automatically.
Under the banner, every description follows the same layout so an agent can act on the first read instead of probing:
Run
npm run list-tools(no credentials needed) to print the full catalog and the per-category counts at any time.
Coverage by area (read / write / delete)
Run from source (stdio, no Docker)
Prefer the classic stdio mode for Claude Desktop? Build it locally:
Then point Claude Desktop at the compiled entrypoint in claude_desktop_config.json:
Keeping the spec current
The bundled spec/learnworlds-openapi.yaml is the source of truth for the tools. To
refresh against a newer API version, drop the new YAML in its place (or point
LEARNWORLDS_OPENAPI_PATH at it) and rebuild:
New paths become new tools automatically — no code changes needed.
Development
CI builds and tests every push across Node 20 and 22; pushes to main also publish a
Docker image to the GitHub Container Registry. When the version in server.json is one
the official MCP Registry does not yet list, that same run also publishes it there.
Notes & conventions
- Transports:
MCP_TRANSPORT=stdio(default) for local launchers;MCP_TRANSPORT=httpfor the always-on Streamable-HTTP server the Docker image runs. - Paging: most
gettools acceptpage(and endpoint-specific filters); LearnWorlds paginates list responses (commonly 20–50 items per page). - Rate limit: LearnWorlds allows 30 requests / 10 s; the server self-throttles at
LEARNWORLDS_MAX_REQUESTSperLEARNWORLDS_RATE_WINDOW_MS(default 25 / 10 s) and retries any429it still receives. - Request bodies: write tools take a
bodyargument; its schema is resolved from the spec and shown to the model.
Security
- Your API credentials live only in
.env, which is git-ignored. Never commit real secrets. If the token leaks, rotate it in LearnWorlds admin → Settings → Integrations → Developers (API). - The HTTP endpoint requires a token as soon as it is bound beyond loopback.
Without
MCP_AUTH_TOKENthe server refuses to start and the error explains what to do. Send it as anAuthorization: Bearer <token>header, ideally behind TLS. - On localhost too: without a token the
Hostheader is restricted to localhost names, so no web page can reach the endpoint via DNS rebinding. A loopback bind alone is not protection. Behind a reverse proxy, setMCP_ALLOWED_HOSTS. - Behind a reverse proxy, pin the
Hostheader in the proxy to the internal upstream name and put exactly that intoMCP_ALLOWED_HOSTS. The check then does not depend on the public domain and survives a domain change. (Tip from @WinFuture23.) /healthsits behind the Host check but in front of the token check, so a platform health check needs no token. It additionally acceptslocalhost,127.0.0.1and[::1]at all times, so theHEALTHCHECKin the bundled Dockerfile keeps working when you pinMCP_ALLOWED_HOSTSto a public hostname. If your platform probes over HTTP from elsewhere, its hostname has to be in the list: Railway sendsHost: healthcheck.railway.app.
See SECURITY.md for the full policy and how to report a vulnerability.
Credits & license
An unofficial community integration for LearnWorlds; not affiliated with or endorsed by LearnWorlds. Built on the Model Context Protocol. Licensed under the MIT License.
来源:README.md,提交 980bdd1
工具
0版本历史
1- v1.1.2最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分