Learning Studio / agents
Connect through MCP
Use the same validated course-editing path as the editor.
Connect a compatible assistant to read and edit courses through Learning Studio’s validated operations. The assistant acts with your account’s permissions.
Connect
Section titled “Connect”Configure your MCP client with the Learning Studio app origin followed by /mcp, then complete OAuth authorization. Use the app origin, not this help center’s domain.
| Task | Tools |
|---|---|
| Discover and read | list_courses, get_course, list_course_versions |
| Course workspace | create_course, duplicate_course, rename_course, archive_course, delete_course, move_course |
| Folders | list_folders, create_folder, rename_folder, delete_folder |
| Check and reuse | validate_course, get_course_alignment, list_templates |
| Edit content | apply_course_ops |
| AI | draft_course, suggest_course_edit, suggest_blueprint, suggest_design, build_from_blueprint, rewrite_text, suggest_distractors, suggest_objective_levels, draft_rubric, record_ai_decision |
| Review comments | list_comments, add_comment, resolve_comment |
| Reports | get_assessment_plan, export_alignment_csv |
| Dev build only | list_frameworks, get_framework, create_checkpoint, add_media_from_url, export_package, import_package_from_url, get_publication, publish_course, unpublish_course |
| Founder only, dev build only | founder_* tools for reviewers, access, join links, Reviewer Mode feedback, agent-test quiz grading and AI evaluation |
Check the tools discovered by your client for their exact argument schemas. Workspace writes and apply_course_ops take an idempotency key. AI drafting has a separate retry boundary described below. Read the latest version before applying course operations.
A reliable authoring sequence
Section titled “A reliable authoring sequence”- Create or locate the course.
- Read its content and version.
- Prepare native operations with fresh IDs.
- Apply operations, then read back and validate.
- Check the rendered result in the app.
AI edit, blueprint, design, rewrite, wrong-answer, objective-level and rubric tools return suggestions. Apply design, level and rubric operations with apply_course_ops and the baseVersion those tools return, not a version from a later read. Then call record_ai_decision with the suggestion’s eventId. If the save conflicts, the course changed: request the suggestion again. draft_course creates a new course; it is not a suggestion-only operation. Comments are saved on the review thread and do not change course content. list_frameworks, get_framework, create_checkpoint and add_media_from_url appear only when the dev build enables them. A production build does not. add_media_from_url stores the file in a course the caller owns; it does not place a block on a page. Use archive when you want to keep the course for later; delete only when you intend permanent removal.
The founder_* tools are for the founder’s own agents on the dev build. Every call checks that the signed-in account is a founder and refuses anyone else. Tools that send email, delete reviewers, end access or revoke a join link do nothing unless the call includes confirm: true and an idempotencyKey; repeating a call with the same key returns the first result. founder_submit_quiz_attempt grades answers without saving an attempt, so it never affects quiz gating or results.
export_package, import_package_from_url, get_publication, publish_course and unpublish_course are also on the dev build only, for the signed-in caller. export_package returns a download link that lasts 15 minutes and does not change the course. Importing, publishing and unpublishing do nothing unless the call includes confirm: true and an idempotencyKey. Import accepts an https zip up to 32 MB and refuses private addresses the same way add_media_from_url does.
If a package import ends without a confirmed result, repeat the same request with the same idempotencyKey, URL, title, and folder. The import may already have committed. Once the archive has been staged, retries reuse that copy rather than downloading the URL again; do not start a new key just because the URL later expires. A successful response includes courseId and replayed, which is true when the existing import result was reused.
Plan outcome-first with backward design
Section titled “Plan outcome-first with backward design”An agent can plan a course the way Backward Design does in Learning Design: results first, then evidence, then pages.
- Read the course and its objective IDs with
get_course. - Ask for that plan with
suggest_design, or apply onecourse.design.updateyourself. The tool takes the current version, a brief, andapproach(academicorperformance). It returns unsaved ops:course.settings.updatefor the objectives andcourse.design.updatefor the design. Apply them with the returnedbaseVersion, then callrecord_ai_decision. A design you write yourself is the whole plan: the approach, the outcome, roles and tasks (performance) or transfer goals and understandings (academic), links from objectives to them, and the evidence learners will produce. - Plan pages with
suggest_blueprintorcourse.blueprint.update, then build them. - Send the design again with each evidence item’s
realisedBypointing at the page, block or question that carries it. - Call
get_course_alignment. With backward design on it returnsdesignChecks, each with a message,whyandhelpSlug(the help-center section that explains it). They are advice and never block anything. Add a check’scheckIdandsubjectIdtodesign.dismissedto hide one that doesn’t apply.
Understand course quality checks lists every check. The repository’s external agent guide has a complete example design.
Input reference
Section titled “Input reference”courseId and folderId are UUID strings. Optional fields are marked with ?. Workspace write keys are 8–100 characters; use a new key for a different intended write.
| Tool | Inputs |
|---|---|
list_courses, list_folders |
No arguments |
list_templates |
kind? (block or section) |
get_course, list_course_versions, validate_course, get_course_alignment |
courseId |
create_course |
title (1–200 characters), idempotencyKey, language? (up to 16), folderId? (UUID or null) |
duplicate_course, rename_course |
courseId, title (1–200), idempotencyKey |
archive_course |
courseId, archived (boolean), idempotencyKey |
delete_course |
courseId, idempotencyKey |
move_course |
courseId, folderId (UUID or null), idempotencyKey |
create_folder |
name (1–120), idempotencyKey |
rename_folder |
folderId, name (1–120), idempotencyKey |
delete_folder |
folderId, idempotencyKey |
apply_course_ops |
courseId, baseVersion (integer ≥1), idempotencyKey, ops (1–500), label? (up to 200) |
draft_course |
text (up to 60,000), mode? (prompt or document), title?, language? |
suggest_course_edit |
courseId, baseVersion, instruction (3–2,000), scopeSectionId?, scopeBlockId? |
suggest_blueprint |
courseId, baseVersion, brief (10–4,000), length? (short, medium, long) |
suggest_design |
courseId, baseVersion, brief (10–20,000), approach (academic or performance), audience? (customers or employees). audience applies only to performance: omit it to use the course audience, or customers when the course has none. Academic ignores it. Returns baseVersion, ops (course.settings.update and course.design.update), rationale, sources, promptVersion, and eventId. Nothing is saved |
build_from_blueprint |
courseId, baseVersion |
rewrite_text |
courseId, text (1–8,000 characters), instruction (3–1,000), context? (up to 8,000) |
suggest_distractors |
courseId, sectionId, blockId, questionId, count (1–5). The question must be single choice or multiple choice, with at least one correct option |
suggest_objective_levels |
courseId, baseVersion, objectiveIds? (at most 12 stored ids). Omit objectiveIds to cover every objective that is not retired. Apply the returned ops with the returned baseVersion |
draft_rubric |
courseId, baseVersion, and objectiveIds? and/or evidenceId. Apply the returned ops with the returned baseVersion |
record_ai_decision |
eventId (the suggestion id), decision (accepted, rejected, edited, or expired), targetIds? |
list_comments |
courseId, status? (open or resolved) |
add_comment |
courseId, body (1–4,000), and either threadId or both sectionId and blockId |
resolve_comment |
courseId, threadId, status (open or resolved) |
get_assessment_plan |
courseId, format (markdown or csv) |
export_alignment_csv |
courseId |
list_frameworks |
No arguments. Present only on a dev build that enables founder tools |
get_framework |
frameworkId (for example bloom-revised) |
create_checkpoint |
courseId, label (1–120 characters) |
add_media_from_url |
courseId (a course the caller owns), url (https only, up to 50 MB, image, video, audio or PDF) |
get_course_alignment also returns a strength array, as GET /courses/:id/alignment does, with one entry per objective × scored-question link. Each entry includes objectiveId, questionId, blockId, sectionId, and strength (aligned, below_level, kind_too_weak, or unclassified). When a framework drove the result, the entry also includes frameworkId, objectiveLevelId, and questionLevelId; when the question type limited rigor, ceilingLevelId. An author acceptance adds overrideReason and the link counts as aligned. The same response includes assessmentBlueprint (scored-point shares by objective and framework level, optional targets, and deviations with id blueprint_weight_deviation). Set targets through apply_course_ops with course.settings.update and assessmentTargets, as in the HTTP alignment section. Pass format: "csv" to get the alignment CSV as text instead; the default JSON response also includes timeEstimates.
For suggest_course_edit, provide a content page’s scopeSectionId or a block’s scopeBlockId. The schema marks them optional, but the current runtime requires a valid page scope and rejects the cover or a chapter. If both are present they must refer to the same page. Suggestions cannot edit other pages.
MCP does not expose the HTTP dryRun option. Use the HTTP operation endpoint when validation without saving is required.
Drafting retry boundary
Section titled “Drafting retry boundary”draft_course requires at least 20 trimmed characters for a prompt or 200 for document text. It creates a course and has no idempotency key. If its response is interrupted, list courses and check whether creation completed before trying again. Suggestion tools can also invoke paid model requests on each retry even though they do not save course content.
List visible courses from the Projects page
Section titled “List visible courses from the Projects page”A browser-local WebMCP tool exposes the filtered course list to an agent. The list_visible_courses tool is read-only and respects the active search, folder, and label filters on the Projects page, so an agent can see the same courses the author sees.