SCORM Packager (HTML → SCORM 2004) について
SCORM Packagerは、HTMLコースや対応する学習プラットフォームのエクスポートをSCORM 2004または1.2のパッケージに変換します。コース制作者やLMS運用者向けで、HTMLを保ちつつオフライン用アセットと学習トラッキングを追加し、既存パッケージも検証できます。
主な機能
- 01HTMLをSCORM 2004または1.2に変換
- 02オフライン用アセットのインライン化
- 03完了度・進捗・スコアの記録
- 04コース群の一括変換
- 05既存SCORMパッケージの検証
活用シーン
- 01HTML教材のLMSインポート準備
- 02モバイル学習コンテンツの移行
- 03LMSがパッケージを拒否する原因の調査
MCP 対応
MCPサーバーは、パッケージ作成用の`scorm_package`、SCORMアーカイブ検証用の`scorm_validate`、ヘルスチェック用の`scorm_selftest`を提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| html | string | いいえ | 変換する生の HTML コンテンツ(Claude Design の出力など)。これか input_path のどちらかを指定します。 |
| batch | boolean | いいえ | input_path を複数のコースを含む DIRECTORY として扱います(各サブディレクトリ、.zip、.html ファイルが 1 コース)。コースごとに 1 つのパッケージと統合レポートを生成します。コースタイトルのデフォルトはフォルダー/ファイル名です。`title` はプレフィックスとして使用されます。 |
| title | string | いいえ | コース/モジュールのタイトル。LMS に表示される manifest、organization、item のタイトルとして使用します。HTML 入力では必須です。モバイル学習の Excel エクスポートでは任意で、テンプレートファイル名から生成されます。 |
| format | enum | いいえ | 入力形式。'auto'(デフォルト)では署名から Claude Design .dc バンドルを検出します。上書きすると特定の処理パイプラインを強制できます。auto | self-contained-html | claude-design |
| base_url | string | いいえ | ネットワーク経由で相対/ルート相対アセット参照を解決するベース URL です(HTML が相対 URL を使用し、input_path が指定されていない場合にのみ必要です)。 |
| language | string | いいえ | コンテンツの言語タグ(BCP-47)。例:'fr-FR'、'en-US'、'it-IT'。デフォルト:'fr-FR'。ソースで宣言されていない場合は <html lang> に適用されます。 |
| identifier | string | いいえ | Manifest 識別子。省略時は title から自動生成されます。 |
| input_path | string | いいえ | ディスク上の HTML ファイルの絶対パス。そのフォルダーを相対アセットの解決に使用します。これか html のどちらかを指定します。 |
| output_dir | string | いいえ | .zip パッケージの出力先ディレクトリ。デフォルトは $SCORM_OUTPUT_DIR または ~/scorm-packages です。 |
| vendor_cdn | boolean | いいえ | Claude Design(.dc)バンドルの場合:CDN ライブラリ(React/Babel…)をパッケージにダウンロードし、オフラインで実行できるようにします(window.__resources 経由、ソースのパッチ適用は不要)。デフォルト:true。 |
| mastery_score | number | いいえ | 合格しきい値 0..1。スコアに基づく合否判定(cmi.score.scaled から passed/failed を設定)を有効にし、manifest に sequencing objectives を追加します。コンテンツは window.SCORM2004.score(raw,min,max) または 'scorm:score' CustomEvent を通じてスコアを報告します。 |
| scorm_version | enum | いいえ | 生成するパッケージの SCORM エディションです。'2004'(デフォルト、第 4 版)または旧式の LMS 用の '1.2' を指定します。挿入されるランタイムは両方の LMS API に適応して動作します。この指定は manifest と同梱 schemas を制御します。2004 | 1.2 |
| auto_milestones | boolean | いいえ | HTML に [data-jalon] マイルストーンが宣言されていない場合、ドキュメント構造(sections、次に articles、次に headings。最大 8 個)から 'view' マイルストーンを自動生成します。デフォルト:true。 |
| success_on_completion | boolean | いいえ | モジュール完了時に cmi.success_status='passed' も報告します(data-scorm-success="on-completion" の追加と同等)。デフォルト:false。 |
詳細
scorm-mcp-server
自己完結型の HTML、Claude Design の
.dcバンドル、または モバイルラーニングプラットフォームのコンテンツエクスポート(Excel のアクティビティテンプレート+メディア)を、あらゆる LMS にインポートできる SCORM 2004(または 1.2) パッケージに変換します。アセットを埋め込んで 100%オフラインで動作し、完了状況/進捗/スコアのトラッキングを追加し、ADL スキーマを同梱します。

同梱のローカルハーネス(scorm-test-harness.html)でパッケージを再生した様子:進捗 0 → 100%、完了状況、LMS API 呼び出しのライブログ(エラー 0 件)。イメージ画像。
3 つのツールを提供する MCP サーバーです。scorm_package は完成した HTML 学習モジュールを、SCORM 準拠のあらゆる LMS にインポートできる .zip(PIF)に変換します。scorm_validate は既存の SCORM zip(どのツールで作成されたものでも)を検査し、LMS が拒否する理由を正確に説明します。scorm_selftest は 1 秒で完了するヘルスチェックです。
原則:書き換えずにラップする。 HTML はそのまま保持され、ツールが行うのは次の処理だけです。
- すべてのアセット(CSS、
@import、フォント、JS、画像、srcset、ファビコン)をデータ URI として埋め込みます → 100%オフラインで動作します。 - 小さなランタイムを追加し、セッションをまたいだ 再開に対応しながら、完了状況、進捗(%)、所要時間を報告します。
- マニフェストを生成し、公式 ADL XSD スキーマ 15 個を同梱します — マニフェストはスキーマに照らして検証されます(単なる「整形式」ではなく、実際の適合性を確認します)。
✅ 状況 — 実際の LMS で検証済み
- 自動チェック 325/325 件に合格:コンバーター 23 件 · ランタイム 15 件 · MCP 15 件 · スキーマ適合性(
xmllint)1 件 · セキュリティ 6 件 · 機能 11 件 · 自動マイルストーン 13 件 · V2(バンドル/.dc/スコア)21 件 · 出力ディレクトリ 10 件 · トラッキングシグナル 9 件 · 強化 32 件 · SCORM 1.2 29 件 · CLI/バッチ 12 件 · Web UI 16 件 · モバイルラーニング移行 44 件 · パッケージ検証 35 件 · 設問レベルのインタラクション 33 件 — さらに、追加の厳格ランタイムチェック(scorm-again)6 件。 - SCORM Cloud(実際の LMS): 問題なくインポートされ(SCORM 2004 4th Ed. と認識、「マニフェストに問題はありません」)、ダッシュボードには 完了状況 = 完了、合格状況 = 合格、時間を記録済みと表示されます。
入力形式
入力(input_path または html) | 処理 |
|---|---|
自己完結型の単一 .html(例:Claude Design の「standalone HTML」エクスポート) | アセットを埋め込み、ランタイムを追加 — v1 の処理経路 |
フォルダーまたは .zip(複数ファイルのモジュール) | ツリー全体を保持し、エントリー HTML にアセットを埋め込み、すべてのファイルをマニフェストに記載 |
Claude Design の .dc バンドル(*.dc.html + support.js + _ds/) | 自動検出し、CDN ライブラリ(React/Babel など)を window.__resources 経由でオフライン用に同梱(ソースのパッチ不要)。ランタイムは support.js の前に追加 |
モバイルラーニングプラットフォームのコンテンツエクスポート(Excel のアクティビティテンプレート+media/) | 自動検出し、テンプレートからインタラクティブな HTML コースを再構築します — 情報/トランジション/フラッシュカード、クイズの設問、メディアコード([media:…]、[H1:…]、[quote:…]、!!)、cmi.score を報告する採点付きクイズ — その後パッケージ化します。コースのタイトルはテンプレート名から取得します。--batch を使うと、カタログ全体を一度の実行で移行できます |
.dc バンドルはフォルダーまたは .zip として渡してください(単独の .dc.html は、関連ファイルがないと機能しません)。
スコアとクイズ(任意)
mastery_score(0..1)を設定すると、スコアに基づく合否判定が有効になり、マニフェストにシーケンス目標が追加されます。コンテンツからスコアを1行で報告してください。SCORM の知識は不要です。
window.SCORM2004.score(8, 0, 10); // raw, min, max
window.dispatchEvent(new CustomEvent("scorm:score", { detail: { raw: 8, min: 0, max: 10 } }));
window.dispatchEvent(new CustomEvent("scorm:progress", { detail: 0.5 })); // 0..1
window.dispatchEvent(new CustomEvent("scorm:complete"));
ランタイムはこれらを cmi.score.* に対応付け、mastery_score に基づいて success_status = passed/failed を設定し、完了状況と進捗を報告します。(dc:* イベント名もエイリアスとして使用できます。)
設問単位のトラッキング(v2.3) — 各回答を cmi.interactions レコードとして報告することで、LMS の成績表に合計点だけでなく、どの設問を間違えたかも表示できます。
window.SCORM2004.interaction({
id: "quiz1-q3", type: "choice",
description: "Which colour is the brand?",
learnerResponse: "Blue", correctResponse: "Red",
result: false, latencyMs: 12000,
});
// or, without touching the API:
window.dispatchEvent(new CustomEvent("scorm:interaction", { detail: { id: "q3", result: true } }));
方言に対応(2004 の learner_response/timestamp と 1.2 の student_response/time、incorrect と wrong)しており、設計上、可能な範囲で処理します。LMS がインタラクションの書き込みを拒否した場合は警告がログに記録され、セッションは続行されます。モバイルラーニングの移行で生成されたクイズは、各設問について、設問文、学習者の回答、正答、回答時間を含むレコードを1件ずつ、自動的にインタラクションとして報告します。
SCORM 1.2、バッチモード、CLI(v2.1)
SCORM 1.2 — scorm_version: "1.2" を渡すと、1.2 のマニフェストが生成されます(同梱の 1.2 XSD で検証され、mastery_score が設定されている場合は adlcp:masteryscore も含まれます)。注入されるランタイムは適応型で、ホスト側の LMS が公開する API(API_1484_11 または API)に接続し、データモデル(単一の lesson_status、0-100 のスコア、HH:MM:SS 形式のセッション時間、4096 文字の中断データ)を対応付けます。また、passed ステータスをより低いステータスに変更することはありません。
バッチ — batch: true を指定すると、input_path をコースのディレクトリとして扱います(各サブディレクトリ、.zip、または .html が1つのコースになります)。コースごとに1つのパッケージが生成され、統合された batch-report.json が作成されます。1つのコースに問題があっても、ほかのコースには影響しません。
CLI — MCP クライアントは不要です。
npx -y scorm-mcp-server ui # local drag & drop web UI
npx -y scorm-mcp-server pack course.html --title "My course"
npx -y scorm-mcp-server pack ./courses --batch --scorm-version 1.2
npx -y scorm-mcp-server validate pkg.zip # conformance-check an existing package
npx -y scorm-mcp-server selftest # 1-second health check
Web UI — ui を実行すると、localhost のページが開きます。.html または .zip をドロップし、SCORM のエディションと任意の合格点を選んで、パッケージをダウンロードできます。すべてお使いのマシン上で実行され、ファイルがアップロードされることはありません。
ライブラリ — buildPackage() は、パイプラインや SaaS バックエンド向けの公開 API です。
import { buildPackage } from "scorm-mcp-server";
const r = await buildPackage({ html, title: "My course", scormVersion: "1.2", masteryScore: 0.6 });
// r.zip (Buffer) · r.fileName · r.warnings · r.milestoneIds …
診断 — scorm_selftest MCP ツールは、組み込みの固定 HTML をパッケージ化し、バージョン、所要時間、出力パスを報告します。これにより、「サーバーの問題」と「入力の問題」を1秒で切り分けられます。
任意の SCORM パッケージを検証(v2.3)
「この zip が LMS に拒否されるのはなぜ?」— scorm_validate は、ここで生成されたものに限らず、あらゆる SCORM パッケージを検証します。入力は変更されません。
npx -y scorm-mcp-server validate course.zip # human-readable report
npx -y scorm-mcp-server validate course.zip --json # machine-readable
検証項目:zip の読み取り可否、ルートにある imsmanifest.xml(よくある「フォルダーごと zip にした」間違いを検出し、修正方法を提示します)、マニフェストの形式、SCORM エディション(2004/1.2)の検出、起動可能な組織/アイテム/リソースの連鎖、起動ファイルとアーカイブ内のすべての <file href> の存在(大文字・小文字のみが異なる不一致に警告します。Windows では動作しても、Linux の LMS サーバーでは失敗します)、さらに公式 ADL スキーマに対する完全な XSD 検証。パッケージ内の XSD を優先して使い、ない場合は埋め込みコピーにフォールバックするため、スキーマが同梱されていないパッケージも検証できます。CI パイプライン向けに終了コード 0/1 を返します。また、scorm_validate MCP ツールと validatePackage() ライブラリ API としても利用できます。
インストール
オプション 0 — インストールせずにオンラインで試す
https://scormpackager.vercel.app — コースをドロップし、SCORM のエディションを選んで、パッケージをダウンロードできます。 ファイルはメモリ上で処理され、保存されませんが、サーバーには送信されます。 実際の作業には、何もマシンの外部に送信されない以下のローカルオプションをお使いください (4 MB の制限もありません)。
オプション A — ワンクリック(推奨)
Releases から scorm-mcp-server-x.y.z.mcpb をダウンロードし、Claude Desktop → Settings → Extensions で .mcpb をドラッグ&ドロップして、出力フォルダーを選び、有効にします。
オプション B — npm(任意の MCP クライアント)
インストール手順は不要です。クライアントの MCP 設定に以下を追加します(Claude Desktop の場合は ~/Library/Application Support/Claude/claude_desktop_config.json)。
{
"mcpServers": {
"scorm": {
"command": "npx",
"args": ["-y", "scorm-mcp-server"],
"env": { "SCORM_OUTPUT_DIR": "/ABSOLUTE/PATH/scorm-packages" }
}
}
}
レジストリ名:io.github.giacomomaria81/scorm-mcp-server(MCP レジストリ)。
オプション C — ソースから(開発者向け)
git clone <this-repo> && cd scorm-mcp-server
npm install # dist/ is prebuilt; npm run build is optional
次に、設定で node /ABSOLUTE/PATH/scorm-mcp-server/dist/index.js を指定します。
Claude を再起動します。これで scorm_package ツールを利用できます。
使い方
会話の中で、Claude Design を使ってモジュールを作成し、**「このモジュールを SCORM としてパッケージ化して」**と伝えます。Claude が scorm_package を呼び出し、.zip のパスを返します。
進捗と完了 — そのまま使えます
事前準備は不要です。HTML でマイルストーンが宣言されていない場合、パッケージャーがドキュメント構造から自動生成します(セクション → 記事 → 見出し、最大 8 個、トリガーは view)。通常の HTML でも、最初から意味のある進捗を確認できます。auto_milestones: false で無効にできます。HTML に手を加えず、完了時に success_status = passed にしたい場合は、success_on_completion: true を渡します。
宣言型マイルストーン(細かく制御する場合に推奨)
意味のあるステップを HTML に直接指定します。明示的に指定したマイルストーンは常に自動生成より優先されます。ランタイムは progress_measure = milestones_reached / total を計算し、すべてに到達すると completion_status = "completed" に設定します。
| 属性 | 効果 |
|---|---|
data-jalon="unique-id" | マイルストーンを宣言します |
data-trigger="view" | 表示範囲内にスクロールされたときに到達します(デフォルト) |
data-trigger="click" | クリック時に到達します |
data-trigger="ended" | 動画または音声の再生終了時に到達します |
<section data-jalon="intro" data-trigger="view">…</section>
<button data-jalon="read-pitch" data-trigger="click">I read it</button>
<video data-jalon="demo" data-trigger="ended">…</video>
推奨:マイクロモジュールあたり 4~8 個のマイルストーン。再開は自動です(cmi.suspend_data + cmi.location)。進捗が後退することはありません。
プログラムによるマイルストーン — window.SCORM2004.reach("quiz-passed") は、ID を持つ data-jalon 要素がなくても動作します。未登録の ID はその場で宣言され、合計数に加算されます。正確な分母を保つため、到達前に登録するには、早い段階で window.SCORM2004.declare("quiz-passed") を使用します。どちらも再開後に保持されます。
成功ステータス(オプトイン) — 任意の要素(例:<body>)に data-scorm-success="on-completion" を追加すると、モジュールの完了時にランタイムが cmi.success_status="passed" も設定します。指定しない場合、success_status は書き込まれません。
言語 — ソース HTML で言語が宣言されていない場合、ツールの language(BCP-47、デフォルトは fr-FR)が <html lang="…"> に適用されます。
セキュリティ — アセット参照はモジュールフォルダー内に制限されます。フォルダー外を指す ../ または絶対パスはインライン化されず、警告が出力されます。
LMS アカウントなしでテストする
小さなローカルサーバー経由で scorm-test-harness.html を開き、生成した .zip をドロップします。
python3 -m http.server 8000 # then open http://localhost:8000/scorm-test-harness.html
進捗率、完了状態、LMS API 呼び出しの全ログがリアルタイムで表示されます(エラーは 0 件が想定されます)。
ビルドとテスト
npm install
npm run build # tsc -> dist/
npm test # 325 checks across 17 suites (xmllint required for the schema tests)
# bonus: validate against a strict independent SCORM 2004 runtime
npm i -D scorm-again && node test/scorm-again.test.mjs
要件:Node ≥ 20、およびスキーマテスト用の xmllint(libxml2-utils)。
プロジェクト構成
src/ index.ts (MCP server + CLI) · converter.ts (inlining + manifest + zip) · runtime.ts (injected SCORM runtime) · validate.ts (package conformance checker) · tom.ts (mobile-learning migration) · ui.ts (local web UI)
dist/ compiled output (shipped)
schemas/ 15 ADL XSD (SCORM 2004 4th Ed.) + schemas12/ (4 XSD SCORM 1.2), bundled into every package
test/ 17 suites (converter / runtime / mcp / schema / validation / interactions / migration…) + fixtures
ARCHITECTURE.md design decisions, data flow, testing strategy
scorm-test-harness.html local browser SCORM player (fake LMS, no account)
manifest.json MCPB manifest (for building the .mcpb desktop extension)
プライバシーポリシー
この拡張機能は完全にローカルで実行されます。データ収集、テレメトリー、第三者への送信はありません。ネットワークを使用するのは、オフラインパッケージに埋め込むために、ユーザー自身の HTML が参照するアセットをダウンロードする場合のみです。ポリシー全文:PRIVACY.md。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。