MCP server: turn self-contained HTML, a Claude Design (.dc) bundle or a mobile-learning platform content export into a SCORM 2004/1.2 package any LMS can import — offline assets, milestone/score tracking, bundled ADL schemas.
Three tools with generally strong schemas and descriptions, but inconsistent depth. scorm_package has exceptional parameter documentation (30+ fields with detailed descriptions explaining milestones, success criteria, language tags, etc.); scorm_validate is minimal but appropriate for its single-purpose; scorm_selftest is a diagnostic with no parameters. All tools properly registered with input schemas visible in src/index.ts. Descriptions are clear and detailed (scorm_package ~800 chars, well above median of 194 chars). However, output schemas are NOT documented in the source code, tool responses are returned as structured objects but no schema is declared. Error handling is implicit (buildPackage likely returns errors, but no recovery guidance pattern visible). Tool names follow verb_noun pattern correctly (scorm_* prefix is clear namespace). Parameters use proper Zod types with constraints (min/max on numeric, enums for format/scorm_version, URL validation for base_url). No evident security issues, no credentials in parameters, file paths are validated via resolveOutputDir(). Risk annotations present (WRITE for scorm_package, READ_ONLY for validators). Composition is appropriate: three separate tools, each with single responsibility.
Convert a self-contained HTML document, a folder, a .zip, a Claude Design (.dc) bundle OR a mobile-learning platform content export (Excel activity templates + media) into a SCORM package (.zip) — SCORM 2004 4th Edition by default, or SCORM 1.2 for legacy LMSs. Use this to turn a finished learning module (for example HTML produced by Claude Design) into a file that any SCORM-compliant LMS can import. The conversion is faithful: the HTML is preserved, external assets are inlined as data URIs so the package runs 100% offline, and a small runtime is injected to report completion and progress. MIGRATION FROM MOBILE-LEARNING PLATFORMS: if the input zip/folder contains Excel activity templates (mobile course cards, quiz games...) plus a media folder — the format produced by the platform's content export — the tool rebuilds an interactive HTML course from them (info/transition/flash cards, scored quizzes reporting cmi.score, media embedded, the platform's layout codes rendered) and packages it. No title needed: it is derived from the template file names. Combined with batch mode this migrates a whole course catalogue in one call. PROGRESS / COMPLETION MODEL (milestones): The author can mark meaningful steps with data-jalon + optional data-trigger: - <section data-jalon="histoire-produit" data-trigger="view"> ... </section> (counts when scrolled into view; "view" is the default) - <button data-jalon="argumentaire" data-trigger="click">J'ai lu</button> (counts on click) - <video data-jalon="geste" data-trigger="ended"> ... </video> (counts when playback ends) AUTOMATIC FALLBACK: if the HTML declares NO milestone, they are generated automatically from the document structure (sections → articles → h2 → h3, capped at 8, trigger "view"). So plain HTML "just works" with meaningful progress — you do NOT need to ask the author to add attributes first. Explicit data-jalon attributes always take precedence (recommended for click/video steps). The runtime reports cmi.progress_measure = milestones_reached / total, and sets cmi.completion_status = "completed" once all milestones are reached. Progress and scroll position resume across sessions via cmi.suspend_data / cmi.location. Content can also call window.SCORM2004.reach(id) / declare(id).
1-second diagnostic to verify the server is operational.
Output schemas are not documented. Tool responses return structured objects (e.g., {zip_path, manifest_path, size_kb, manifest_xml, report} for scorm_package), but no JSON Schema or TypeScript interface is declared in the tool definition. LLMs cannot plan downstream operations or extract specific fields without knowing what structure to expect.
scorm_validate description is terse (11 words: 'Conformance-check ANY existing SCORM zip and explain import failures.'). While accurate, it lacks context on when to call this tool vs scorm_package, what fields the result contains, or how to act on validation failures. Should explain the recovery path: e.g., 'Returns a detailed report of spec violations; use this to diagnose why an LMS rejected a package.'
scorm_selftest description is vague (1 sentence: '1-second diagnostic to verify the server is operational.'). LLMs cannot reason about when to call it or what success means. Should clarify: 'Returns {ok: true, version, timestamp}. Call this first to confirm the server is running and ready to convert SCORM packages.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 72 | 2026-07-28+ | v2 |
Conformance-check ANY existing SCORM zip and explain import failures.
Error handling is implicit and not documented. The code calls buildPackage() and presumably returns errors, but no structured error response format or recovery guidance is visible in the tool definitions. E.g., if mastery_score is invalid (outside 0..1), what exactly does the error message say? Is it retryable?
scorm_package has complex interdependencies between parameters that are not fully documented. E.g., 'title' is 'Required for HTML inputs; optional for a mobile-learning Excel export', but the tool logic for detecting Excel vs HTML is not explained. If the LLM passes both html and input_path, which takes precedence? This should be explicit.