ohneben's Model Context Protocol server for the LearnWorlds API — all 94 endpoints as safety-categorized MCP tools (read-only / write / destructive). Runs over stdio or Streamable HTTP, with Docker, retries, and rate limiting.
接入配置
选择客户端,复制配置,再按项目文档补齐环境变量。
claude mcp add learnworlds --env MCP_TRANSPORT='<MCP_TRANSPORT>' --env LEARNWORLDS_BASE_URL='<LEARNWORLDS_BASE_URL>' --env LEARNWORLDS_API_TOKEN='<LEARNWORLDS_API_TOKEN>' --env LEARNWORLDS_CLIENT_ID='<LEARNWORLDS_CLIENT_ID>' --env MCP_AUTH_TOKEN='<MCP_AUTH_TOKEN>' -- docker run -i --rm -e MCP_TRANSPORT -e LEARNWORLDS_BASE_URL -e LEARNWORLDS_API_TOKEN -e LEARNWORLDS_CLIENT_ID -e MCP_AUTH_TOKEN ghcr.io/ohneben/learnworlds-mcp:1.1.2~/.codex/config.toml
[mcp_servers.learnworlds]
command = "docker"
args = ["run", "-i", "--rm", "-e", "MCP_TRANSPORT", "-e", "LEARNWORLDS_BASE_URL", "-e", "LEARNWORLDS_API_TOKEN", "-e", "LEARNWORLDS_CLIENT_ID", "-e", "MCP_AUTH_TOKEN", "ghcr.io/ohneben/learnworlds-mcp:1.1.2"]
env = { MCP_TRANSPORT = "<MCP_TRANSPORT>", LEARNWORLDS_BASE_URL = "<LEARNWORLDS_BASE_URL>", LEARNWORLDS_API_TOKEN = "<LEARNWORLDS_API_TOKEN>", LEARNWORLDS_CLIENT_ID = "<LEARNWORLDS_CLIENT_ID>", MCP_AUTH_TOKEN = "<MCP_AUTH_TOKEN>" }
# codex mcp add learnworlds --env MCP_TRANSPORT='<MCP_TRANSPORT>' --env LEARNWORLDS_BASE_URL='<LEARNWORLDS_BASE_URL>' --env LEARNWORLDS_API_TOKEN='<LEARNWORLDS_API_TOKEN>' --env LEARNWORLDS_CLIENT_ID='<LEARNWORLDS_CLIENT_ID>' --env MCP_AUTH_TOKEN='<MCP_AUTH_TOKEN>' -- docker run -i --rm -e MCP_TRANSPORT -e LEARNWORLDS_BASE_URL -e LEARNWORLDS_API_TOKEN -e LEARNWORLDS_CLIENT_ID -e MCP_AUTH_TOKEN ghcr.io/ohneben/learnworlds-mcp:1.1.2~/.cursor/mcp.json
{
"mcpServers": {
"learnworlds": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"LEARNWORLDS_BASE_URL",
"-e",
"LEARNWORLDS_API_TOKEN",
"-e",
"LEARNWORLDS_CLIENT_ID",
"-e",
"MCP_AUTH_TOKEN",
"ghcr.io/ohneben/learnworlds-mcp:1.1.2"
],
"env": {
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"LEARNWORLDS_BASE_URL": "<LEARNWORLDS_BASE_URL>",
"LEARNWORLDS_API_TOKEN": "<LEARNWORLDS_API_TOKEN>",
"LEARNWORLDS_CLIENT_ID": "<LEARNWORLDS_CLIENT_ID>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"learnworlds": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"LEARNWORLDS_BASE_URL",
"-e",
"LEARNWORLDS_API_TOKEN",
"-e",
"LEARNWORLDS_CLIENT_ID",
"-e",
"MCP_AUTH_TOKEN",
"ghcr.io/ohneben/learnworlds-mcp:1.1.2"
],
"env": {
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"LEARNWORLDS_BASE_URL": "<LEARNWORLDS_BASE_URL>",
"LEARNWORLDS_API_TOKEN": "<LEARNWORLDS_API_TOKEN>",
"LEARNWORLDS_CLIENT_ID": "<LEARNWORLDS_CLIENT_ID>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"learnworlds": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"LEARNWORLDS_BASE_URL",
"-e",
"LEARNWORLDS_API_TOKEN",
"-e",
"LEARNWORLDS_CLIENT_ID",
"-e",
"MCP_AUTH_TOKEN",
"ghcr.io/ohneben/learnworlds-mcp:1.1.2"
],
"env": {
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"LEARNWORLDS_BASE_URL": "<LEARNWORLDS_BASE_URL>",
"LEARNWORLDS_API_TOKEN": "<LEARNWORLDS_API_TOKEN>",
"LEARNWORLDS_CLIENT_ID": "<LEARNWORLDS_CLIENT_ID>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"learnworlds": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"LEARNWORLDS_BASE_URL",
"-e",
"LEARNWORLDS_API_TOKEN",
"-e",
"LEARNWORLDS_CLIENT_ID",
"-e",
"MCP_AUTH_TOKEN",
"ghcr.io/ohneben/learnworlds-mcp:1.1.2"
],
"env": {
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"LEARNWORLDS_BASE_URL": "<LEARNWORLDS_BASE_URL>",
"LEARNWORLDS_API_TOKEN": "<LEARNWORLDS_API_TOKEN>",
"LEARNWORLDS_CLIENT_ID": "<LEARNWORLDS_CLIENT_ID>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"learnworlds": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"LEARNWORLDS_BASE_URL",
"-e",
"LEARNWORLDS_API_TOKEN",
"-e",
"LEARNWORLDS_CLIENT_ID",
"-e",
"MCP_AUTH_TOKEN",
"ghcr.io/ohneben/learnworlds-mcp:1.1.2"
],
"env": {
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"LEARNWORLDS_BASE_URL": "<LEARNWORLDS_BASE_URL>",
"LEARNWORLDS_API_TOKEN": "<LEARNWORLDS_API_TOKEN>",
"LEARNWORLDS_CLIENT_ID": "<LEARNWORLDS_CLIENT_ID>",
"MCP_AUTH_TOKEN": "<MCP_AUTH_TOKEN>"
}
}
}
}需要的环境变量
MCP_TRANSPORTLEARNWORLDS_BASE_URLLEARNWORLDS_API_TOKENLEARNWORLDS_CLIENT_IDMCP_AUTH_TOKEN
把占位值换成你自己的密钥;不要把密钥提交到代码仓库。