Skip to content
All docs

AI and automation

MCP tool reference

Every tool the Bitty Course MCP server offers, with the access each needs and its arguments. Generated from the server itself.

View as Markdown

Your assistant sees only the tools its token allows. Every tool works inside the token's workspace; nothing takes a workspace or user argument. See MCP server for setup.

Tool Needs
get_workspace Any token
get_course Any token
get_course_links Any token
get_workspace_stats Any token
get_course_stats Any token
list_discounts Any token
get_discount Any token
create_discount A token that builds (drafts or publish)
set_discount_active A token that builds (drafts or publish)
create_course A token that builds (drafts or publish)
update_course A token that builds (drafts or publish)
set_course_cover A token that builds (drafts or publish)
add_section A token that builds (drafts or publish)
update_section A token that builds (drafts or publish)
remove_section A token that builds (drafts or publish)
add_lesson A token that builds (drafts or publish)
update_lesson A token that builds (drafts or publish)
move_lesson A token that builds (drafts or publish)
remove_lesson A token that builds (drafts or publish)
start_video_upload A token that builds (drafts or publish)
get_video_status Any token
publish_video A token that builds (drafts or publish)
set_chapters A token that builds (drafts or publish)
add_captions A token that builds (drafts or publish)
get_transcript Any token
add_attachment A token that builds (drafts or publish)
set_quiz A token that builds (drafts or publish)
publish_course A “Build and publish” token

get_workspace

The creator's workspace: plan, limits, usage, whether payments are set up, what this token may do, and its courses. Call this first.

Needs: Any token.

Arguments: none.

get_course

A course's details and full outline: sections, lessons (video, text or quiz), video and caption status, what still blocks publishing, and the private preview link.

Needs: Any token.

Arguments:

  • course_id (integer, required)

The links to share for a course: its public page (stays the same as lessons and videos change; shows "not available" until the course is published), the private preview, the studio page, and a ready-made link for each live coupon code (the code is applied when a student opens it).

Needs: Any token.

Arguments:

  • course_id (integer, required)

get_workspace_stats

Totals for the whole workspace over a date range, compared with the range before: net revenue (after refunds and Bitty Course fees, before Stripe fees), new students, active learners, watch time and lessons completed, plus each course's students, revenue, average progress and completion. No student names or emails.

Needs: Any token.

Arguments:

  • range (7d, 30d, 90d, 12m, all) — Date range: 7d, 30d (default), 90d, 12m or all.

get_course_stats

How one course is doing over a date range, without any student's name or email: page views, checkouts and new students; where students are (not started, under halfway, halfway or more, completed); and per lesson how many started and completed, watch time, where viewers stop in the video, quiz pass rates, the most-missed quiz questions, and comments waiting for the creator's reply. Use it to suggest improvements (e.g. a lesson where many students stop).

Needs: Any token.

Arguments:

  • course_id (integer, required)
  • range (7d, 30d, 90d, 12m, all) — Date range: 7d, 30d (default), 90d, 12m or all.

list_discounts

A course's coupon codes and timed sales, newest first, with their state (live, scheduled, ended, used_up, off), price, uses and coupon links.

Needs: Any token.

Arguments:

  • course_id (integer, required)

get_discount

One discount (by id or coupon code) and how it has been used: revenue, refunds, what students saved, checkouts holding a use right now, and each use's date and amount. No student names or emails: those are in the studio.

Needs: Any token.

Arguments:

  • course_id (integer, required)
  • discount_id (integer)
  • code (string)

create_discount

Create a coupon code (students enter it, or open its link) or a timed sale (everyone gets it until ends_at; the course page shows a countdown). Only on paid courses, by a workspace owner, and only when the creator asked for it: it changes what students pay. The lowest price wins; discounts don't stack. Amounts and dates can't be edited afterwards: turn it off and create another.

Needs: A token that builds (drafts or publish).

Arguments:

  • course_id (integer, required)
  • kind (coupon, sale, required)
  • code (string) — Coupons only, e.g. LAUNCH20.
  • name (string) — Sales show it on the course page, e.g. Launch week. Optional for coupons (for you).
  • percent_off (integer) — Percent off (100 = free access without checkout; coupons only). Give this or amount_off.
  • amount_off (number) — Fixed amount off in the course currency, e.g. 10 or 10.00. Give this or percent_off.
  • starts_at (string) — ISO 8601 with a zone, e.g. 2026-11-01T09:00:00-05:00. Omit to start now.
  • ends_at (string) — ISO 8601 with a zone. Required for a sale (the course page counts down to it).
  • max_redemptions (integer) — Coupons: how many students can use it. Omit for no limit.

set_discount_active

Turn a discount off (it stops applying; open checkouts keep their price) or back on. By id or coupon code; workspace owners only.

Needs: A token that builds (drafts or publish).

Arguments:

  • course_id (integer, required)
  • discount_id (integer)
  • code (string)
  • active (boolean, required)

create_course

Create a draft course. Nothing is visible to students until it is published. Prices are in the course currency (e.g. 49 or 49.00).

Needs: A token that builds (drafts or publish).

Arguments:

  • title (string, required)
  • tagline (string)
  • description (string) — Plain text; blank lines separate paragraphs.
  • outcomes (array) — What students will be able to do afterwards.
  • access (paid, free, invite) — free (sign up to watch), paid (one-time purchase) or invite (creator adds students)
  • price (number)
  • currency (usd)

update_course

Change a course's title, tagline, description, outcomes, access or price. Only the fields you pass change.

Needs: A token that builds (drafts or publish).

Arguments:

  • title (string)
  • tagline (string)
  • description (string) — Plain text; blank lines separate paragraphs.
  • outcomes (array) — What students will be able to do afterwards.
  • access (paid, free, invite) — free (sign up to watch), paid (one-time purchase) or invite (creator adds students)
  • price (number)
  • currency (usd)
  • course_id (integer, required)

set_course_cover

Set a course's cover image (16:9 works best, at least 1280 × 720). Send the image as base64.

Needs: A token that builds (drafts or publish).

Arguments:

  • course_id (integer, required)
  • filename (string, required)
  • content_type (image/png, image/jpeg, image/webp, required)
  • image_base64 (string, required)

add_section

Add a section (a chapter heading) to the end of a course's outline.

Needs: A token that builds (drafts or publish).

Arguments:

  • course_id (integer, required)
  • title (string, required)

update_section

Rename a section, move it to a new position in the outline (1 = first), or schedule it (drip): opens_after_days opens it that many days after each student enrolls; opens_at opens it for everyone at a time. Set either to 0 / "" to make the section available right away. Free previews and the team are never locked.

Needs: A token that builds (drafts or publish).

Arguments:

  • section_id (integer, required)
  • title (string)
  • position (integer)
  • opens_after_days (integer) — Days after a student enrolls; 0 clears the schedule.
  • opens_at (string) — ISO 8601 time with an offset, e.g. 2026-11-10T09:00:00-05:00; empty clears the schedule.

remove_section

Delete a section and every lesson in it from a course that has never been published.

Needs: A token that builds (drafts or publish).

Arguments:

  • section_id (integer, required)

add_lesson

Add a lesson to the end of a section. type: video (needs an uploaded video), text (reading only) or quiz (questions via set_quiz).

Needs: A token that builds (drafts or publish).

Arguments:

  • section_id (integer, required)
  • title (string, required)
  • type (video, text, quiz, required)
  • description (string) — One or two sentences shown in the outline.
  • notes (string) — Lesson notes under the video, plain text: blank lines for paragraphs, '- ' bullets, '## ' headings.
  • free_preview (boolean) — Anyone can watch this lesson without enrolling.

update_lesson

Change a lesson's title, description, notes, free preview or quiz pass mark. Only the fields you pass change.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • title (string)
  • description (string)
  • notes (string)
  • free_preview (boolean)
  • pass_percent (integer) — Quizzes only: score needed to pass.

move_lesson

Move a lesson to another section of the same course and/or to a position within its section (1 = first).

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • section_id (integer)
  • position (integer)

remove_lesson

Delete a lesson, with its videos, captions and files, from a course that has never been published. Published courses can't be changed this way.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)

start_video_upload

Authorize a resumable (tus 1.0) upload of a video file for a lesson. The bytes go straight to the video service, not through Bitty Course. Returns the tus endpoint and headers. If you can't upload files yourself, give the creator the lesson's upload_page link instead. Calling it again for the same file resumes.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • filename (string, required)
  • byte_size (integer, required)
  • content_type (video/mp4, video/quicktime, video/webm, video/x-matroska, video/x-m4v, required)

get_video_status

The status of a lesson's newest video (pending_upload, uploading, processing, ready, failed), whether it is the live one, and its caption languages.

Needs: Any token.

Arguments:

  • lesson_id (integer, required)

publish_video

Make a lesson's newest ready video the one students watch, at the same lesson link. Earlier versions are kept for rollback in the studio, and students' completion is preserved. Use this after uploading a replacement video; a lesson's first video goes live by itself.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)

set_chapters

Set the chapters of a lesson's live video, one per line as "time title" starting at 0:00 (e.g. "0:00 Welcome 1:20 Installing Turbo"). Take the times from get_transcript. Students see them under the video and can click to jump. An empty string removes them.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • chapters (string, required)

add_captions

Attach a WebVTT caption track to a lesson's newest video (one per language; students can turn captions on in the player). It replaces auto-generated captions in that language. Captions also become the lesson's transcript. For a replacement video, add captions before publish_video.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • language (string, required) — BCP 47 code, e.g. en or pt-BR
  • label (string, required) — Shown in the player, e.g. English
  • vtt (string, required) — The full WebVTT file, starting with WEBVTT.

get_transcript

The lesson video's transcript, from its captions, as '[mm:ss] text' lines. Use it to write descriptions, notes and quiz questions grounded in what was said. Auto-generated transcripts (machine_generated: true) can mishear names, jargon and code: don't quote them as exact.

Needs: Any token.

Arguments:

  • lesson_id (integer, required)
  • language (string)

add_attachment

Attach a downloadable file (worksheet, slides, code) to a lesson. Allowed types: pdf, zip, txt, md, csv, png, jpg, jpeg. Send it as base64. It becomes downloadable after a safety scan.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • title (string, required)
  • filename (string, required)
  • content_base64 (string, required)

set_quiz

Replace a quiz lesson's draft questions. Kinds: single (one correct answer), multiple (several correct), true_false (choices are True and False; mark which is correct). Add a short explanation per answer so students learn from mistakes. publish: true makes this version live for students.

Needs: A token that builds (drafts or publish).

Arguments:

  • lesson_id (integer, required)
  • pass_percent (integer)
  • publish (boolean)
  • questions (array, required)

publish_course

Publish a course so students can find and join it at its public link. Only call this after the creator explicitly asks to publish in this conversation, and then pass confirmed_by_creator: true. Returns what still blocks publishing if it can't.

Needs: A “Build and publish” token.

Arguments:

  • course_id (integer, required)
  • confirmed_by_creator (boolean, required) — true only when the creator asked to publish this course in the conversation