Coursebox MCP by usefulapi
Create courses, sections and lessons, fill lessons with AI, and publish courses in Coursebox.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"coursebox": {
"url": "https://coursebox.usefulapi.io/mcp"
}
}
}Remote endpoints
https://coursebox.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (12)
🟢coursebox_get_course_structure(course_id)
Read the sections (blocks) of a course, each with its lessons (activities), in order. Use it to find section and lesson ids. API: GET /api/Blocks with a filter on courseId.
Input Schema
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id (the id returned by Coursebox)."
}
},
"required": [
"course_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_create_course(name, description, language, passGrade, gradingMethod, ...)
WRITE. Create an empty draft course and return it with its id. The key's user becomes owner and admin. Counts toward the plan's course limit (over the limit the call fails with 403). API: POST /api/Courses/createCourse.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Course title."
},
"description": {
"description": "Short description shown on the course page.",
"type": "string"
},
"language": {
"description": "Course language code, e.g. en.",
"type": "string"
},
"passGrade": {
"description": "Pass mark in percent.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"gradingMethod": {
"description": "How completion is graded, e.g. completion.",
"type": "string"
},
"points": {
"description": "Points awarded on completion.",
"type": "number"
},
"searchable": {
"description": "Show the course in the catalogue once published.",
"type": "boolean"
},
"restartEnabled": {
"description": "Let learners restart the course.",
"type": "boolean"
},
"enrollmentEmail": {
"description": "Email learners when they are enrolled.",
"type": "boolean"
},
"avatarUrl": {
"description": "Public URL of the course image.",
"type": "string",
"format": "uri"
},
"backgroundUrl": {
"description": "Public URL of the banner image.",
"type": "string",
"format": "uri"
},
"code": {
"description": "Internal course code.",
"type": "string"
},
"skills": {
"description": "Skills shown on the landing page.",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_update_course(course_id, name, description, language, passGrade, ...)
WRITE. Change course details. Only the fields you send change. Editing a published course goes live at once. API: POST /api/Courses/updateAttributes.
Input Schema
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id (the id returned by Coursebox)."
},
"name": {
"description": "Course title.",
"type": "string",
"minLength": 1
},
"description": {
"description": "Short description shown on the course page.",
"type": "string"
},
"language": {
"description": "Course language code, e.g. en.",
"type": "string"
},
"passGrade": {
"description": "Pass mark in percent.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"gradingMethod": {
"description": "How completion is graded, e.g. completion.",
"type": "string"
},
"points": {
"description": "Points awarded on completion.",
"type": "number"
},
"searchable": {
"description": "Show the course in the catalogue once published.",
"type": "boolean"
},
"restartEnabled": {
"description": "Let learners restart the course.",
"type": "boolean"
},
"enrollmentEmail": {
"description": "Email learners when they are enrolled.",
"type": "boolean"
},
"avatarUrl": {
"description": "Public URL of the course image.",
"type": "string",
"format": "uri"
},
"backgroundUrl": {
"description": "Public URL of the banner image.",
"type": "string",
"format": "uri"
},
"code": {
"description": "Internal course code.",
"type": "string"
},
"skills": {
"description": "Skills shown on the landing page.",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"course_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_create_section(course_id, name, position)
WRITE. Add a section (module) to a course and return its id. Create sections in order: position 0, 1, 2. API: POST /api/Courses/{courseId}/blocks.
Input Schema
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id (the id returned by Coursebox)."
},
"name": {
"type": "string",
"minLength": 1,
"description": "Section title."
},
"position": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Place in the course, starting at 0."
}
},
"required": [
"course_id",
"name",
"position"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_rename_section(section_id, name)
WRITE. Rename a section (module). API: PATCH /api/Blocks/{sectionId}.
Input Schema
{
"type": "object",
"properties": {
"section_id": {
"type": "string",
"minLength": 1,
"description": "Section id (the id returned by Coursebox)."
},
"name": {
"type": "string",
"minLength": 1,
"description": "New section title."
}
},
"required": [
"section_id",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴coursebox_delete_section(section_id)
DESTRUCTIVE. Delete a section and all of its lessons. This cannot be undone. API: DELETE /api/Blocks/{sectionId}.
Input Schema
{
"type": "object",
"properties": {
"section_id": {
"type": "string",
"minLength": 1,
"description": "Section id (the id returned by Coursebox)."
}
},
"required": [
"section_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_create_lesson(section_id, name)
WRITE. Add an empty lesson to the end of a section and return its id. Fill it afterwards with coursebox_edit_lesson_with_ai. API: POST /api/Blocks/createActivity.
Input Schema
{
"type": "object",
"properties": {
"section_id": {
"type": "string",
"minLength": 1,
"description": "Section id (the id returned by Coursebox)."
},
"name": {
"type": "string",
"minLength": 1,
"description": "Lesson title."
}
},
"required": [
"section_id",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_move_lesson(section_id, lesson_id, position)
WRITE. Move a lesson to a position inside its section (0 = first). API: POST /api/Blocks/{sectionId}/activity-position.
Input Schema
{
"type": "object",
"properties": {
"section_id": {
"type": "string",
"minLength": 1,
"description": "Section id that holds the lesson (the id returned by Coursebox)."
},
"lesson_id": {
"type": "string",
"minLength": 1,
"description": "Lesson id (the id returned by Coursebox)."
},
"position": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "New position, 0 = first."
}
},
"required": [
"section_id",
"lesson_id",
"position"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴coursebox_delete_lesson(lesson_id)
DESTRUCTIVE. Delete a lesson with its content, quiz and assignment. This cannot be undone. API: POST /api/Activities/deleteActivity.
Input Schema
{
"type": "object",
"properties": {
"lesson_id": {
"type": "string",
"minLength": 1,
"description": "Lesson id (the id returned by Coursebox)."
}
},
"required": [
"lesson_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴coursebox_edit_lesson_with_ai(lesson_id, message, deep_edit)
WRITE (AI, not idempotent). Fill or change ONE lesson from a plain-language instruction. Coursebox's own AI writes text, layouts, images, video, translations, quizzes and assignments, and saves them. Send one lesson per call and put any exact text or exact quiz questions in the message. Check assistantMessage: the AI may ask a question. A call can take up to 5 minutes. Limit: 30 requests per minute per user. API: POST /api/Activities/editPageContentAgentic.
Input Schema
{
"type": "object",
"properties": {
"lesson_id": {
"type": "string",
"minLength": 1,
"description": "Lesson id (the id returned by Coursebox)."
},
"message": {
"type": "string",
"minLength": 1,
"description": "The instruction in plain language, at most 8 KB (UTF-8 bytes)."
},
"deep_edit": {
"description": "true (default): the AI may take up to 30 steps. false: a quicker, lighter pass.",
"type": "boolean"
}
},
"required": [
"lesson_id",
"message"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_publish_course(course_id, join_status)
WRITE. Publish a draft course. join_status "public" lets anyone on the portal join. "private" lets learners join only when enrolled or invited. Edits after publishing go live at once. Coursebox emails the course owner a confirmation. API: POST /api/Courses/publish.
Input Schema
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id (the id returned by Coursebox)."
},
"join_status": {
"type": "string",
"enum": [
"public",
"private"
],
"description": "Who can join."
}
},
"required": [
"course_id",
"join_status"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡coursebox_unpublish_course(course_id)
WRITE. Return a published course to draft, so learners cannot see it. API: POST /api/Courses/unpublish.
Input Schema
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"minLength": 1,
"description": "Course id (the id returned by Coursebox)."
}
},
"required": [
"course_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence