Coursebox MCP by usefulapi

Create courses, sections and lessons, fill lessons with AI, and publish courses in Coursebox.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,207Tokens (tool definitions)
~1.4 KBTypical response size
Moderate attention impact (1.72% of 128k context)

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-http

What it can do

Tool inventory

Tools (12)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded12 tools