SCORM(スコーム、Sharable Content Object Reference Model)とは、eラーニングの教材とLMS(学習管理システム)のあいだで、受講の開始・進み具合・点数・合否をやり取りするための規格です。米国防総省のADL(Advanced Distributed Learning)が策定し、教材をZIPにまとめる「パッケージ」の仕様と、教材のJavaScriptがLMSへ値を書き込む「実行時API」の仕様の2本立てです。この記事では、SCORM 1.2と2004の違い、imsmanifest.xmlの最小構成、API探索と呼び出しの順序、後継のxAPIとcmi5の仕組みを、仕様の値とコードで示します。最後に、自社のLMSでどこまでSCORMに対応するかの判断基準をまとめます。
まとめ:SCORMは教材とLMSの通信規格、新規開発で選ぶ版と自社実装の範囲
SCORMに対応したLMSなら、どのオーサリングツールで作った教材でも、ZIPを取り込むだけで受講状況を記録できます。新しく教材を書き出すなら、LMS側の対応が最も広いSCORM 1.2が無難な選択です。完了と合否を別々に記録したい、または再開位置のデータが4,096字を超える長い教材なら、SCORM 2004(3rd Edition以降)を選びます。
LMSを自社で作る場合、最初に実装するのはSCORM 1.2の取り込みと再生です。マニフェストの解析、教材を開くiframe、APIオブジェクトの3つで動きます。SCORM 2004のシーケンシングは、要件として名指しで求められたときだけ追加します。LMSの外の学習記録が要件にあるなら、SCORMを拡張せず、xAPIと起動ルールを決めたcmi5を検討してください。
SCORMとは:教材をZIPで渡すパッケージ仕様と進捗を送る実行時APIの2本柱
SCORMは教育の中身や教え方を定める規格ではありません。教材とLMSをつなぐ配線の決まりだけを定めた、純粋に技術的な規格です。
SCORMを構成するコンテンツパッケージとランタイム、教材とLMSの役割分担
1つ目の仕様はコンテンツパッケージです。教材のHTML・画像・動画・JavaScriptを1つのZIPにまとめ、ZIPのルートにimsmanifest.xmlという目録を置きます。LMSはこの目録を読んで、教材のタイトル、章の構成、最初に開くHTMLファイルを知ります。
2つ目は実行時の仕様(ランタイム)です。LMSが教材をブラウザで開くと、教材のJavaScriptはLMSが用意したAPIオブジェクトを探し、その関数を呼んで「受講中」「85点」「合格」といった値を書き込みます。通信はブラウザの中で完結し、サーバーへの送信はLMS側の責任です。
| 担当 | 教材(SCO)がすること | LMSがすること |
|---|---|---|
| パッケージ | 目録と全ファイルをZIPにまとめる | ZIPを展開して目録を読む |
| 起動 | 起動されるHTMLを用意する | iframeか別ウィンドウで開く |
| 実行時 | APIを探して値を書き込む | APIを提供し値を保存する |
SCOは、LMSが起動して記録を取る教材の単位です。1つのZIPに複数のSCOを入れれば、章ごとに受講状況を分けて記録できます。
SCORM 1.2・2004とxAPI・cmi5の規格の系譜と管理団体の違い
現場で使われているSCORMは、1.2と2004の2系統です。2004には2nd・3rd・4th Editionがあり、版によってデータ項目の上限値が変わります。どちらもADLの規格で、教材がLMSの中で開かれることを前提にしています。
この前提を外したのがxAPI(旧称Tin Can API)です。学習の記録をJSONの文として、LRS(Learning Record Store)というサーバーへHTTPで送ります。xAPIは1.0.3版を改善する形で標準化が進み、IEEE 9274.1.1-2023として2023年10月6日に発行されました。2026年10月時点のIEEEのページではActive Standardで、関連規格としてISO/IEC/IEEE 39274-1-1-2025も掲載されています。
cmi5は、xAPIの上に「LMSが教材をどう起動し、何をもって完了とするか」を決めたプロファイルです。cmi5仕様のQuartz 1st Editionは2016年6月1日付で、AICCのリポジトリで公開されています。
SCORM 1.2と2004の違い:完了と合否の分離とsuspend_dataの上限
1.2と2004の違いは多岐に見えますが、教材とLMSを作る側が困るのは状態の持ち方と文字数の上限の2点です。順に見ます。
1.2のlesson_statusと2004の2項目、完了と合否の状態値の対応表
SCORM 1.2は、完了と合否をcmi.core.lesson_statusという1つの項目で持ちます。2004はこれを、最後まで見たかを表すcmi.completion_statusと、合格したかを表すcmi.success_statusの2項目に分けました。値の一覧はRustici SoftwareのSCORM Run-Time Referenceに1.2と2004を並べて載っています。
- 1.2の
cmi.core.lesson_status:passed・completed・failed・incomplete・browsed・not attemptedの6値 - 2004の
cmi.completion_status:completed・incomplete・not attempted・unknownの4値 - 2004の
cmi.success_status:passed・failed・unknownの3値
1.2で困るのは「最後まで見たが、テストは不合格」を1つの値で表せないことです。failedを入れれば合否は残るものの、最後まで見たかどうかは消えます。修了条件が「全ページ閲覧」と「80点以上」の両方なら、2004の2項目のほうが集計が素直です。点数も2004は-1から1に正規化したcmi.score.scaledを持てるので、満点が違う教材どうしを比べられます。
suspend_dataの4,096字と64,000字の差が長い教材の再開で効く場面
cmi.suspend_dataは、教材が「どのページまで進んだか」「どの問題にどう答えたか」を保存しておく自由記述の欄です。次に開いたとき、教材はこの値を読んで続きから再開します。上限はSCORM 1.2が4,096字、2004の2nd Editionが4,000字、3rd・4th Editionが64,000字です。
上限を超えた値をどう処理するかは規格の外で、LMSごとに異なる部分です。保存に失敗すれば再開位置が失われるため、受講者には最初のページからのやり直しが必要です。オーサリングツールは回答履歴やスライドの訪問状況をsuspend_dataに詰め込むため、スライドや設問の多い教材ほど4,096字に近づきます。長い教材は章ごとにSCOを分けるか、3rd Edition以降の2004で書き出すかのどちらかで対処します。
2004のシーケンシングで学習順序を制御する教材と1.2で足りる教材の線引き
SCORM 2004には、シーケンシングと呼ばれる学習順序の制御が入っています。「第1章の確認テストに合格するまで第2章を開けない」「不合格なら補習のSCOへ回す」といった規則を、マニフェストの中にXMLで書き、LMSがその規則に従って次に開くSCOを決めます。
章の順番を守らせたいだけなら、LMS側の「前のコースを修了したら次を開放する」設定で足ります。シーケンシングが効くのは、1つのZIPの中で分岐や補習を組む資格試験対策のような教材です。LMS側から見ると、規則の解釈を誤るとSCOが開けなくなる、SCORM対応で最も手間のかかる部分です。
SCORMパッケージの作り方:imsmanifest.xmlの最小構成と取り込み側の解析
パッケージはオーサリングツールが自動で書き出しますが、目録の中身を知っていれば、取り込めないときの原因を切り分けられます。
SCORM 1.2のimsmanifest.xml最小例と名前空間・scormtype
SCORM 1.2で1つのSCOだけを持つ教材の目録は、次の形になります。metadataで版を宣言し、organizationsで章の構成を、resourcesで起動するファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<manifest identifier="jp.example.compliance-2026" version="1"
xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2"
xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd
http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd
http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd">
<metadata>
<schema>ADL SCORM</schema>
<schemaversion>1.2</schemaversion>
</metadata>
<organizations default="org_1">
<organization identifier="org_1">
<title>情報セキュリティ研修 2026</title>
<item identifier="item_1" identifierref="res_1">
<title>第1章 パスワードと多要素認証</title>
<adlcp:masteryscore>80</adlcp:masteryscore>
</item>
</organization>
</organizations>
<resources>
<resource identifier="res_1" type="webcontent" adlcp:scormtype="sco" href="index.html">
<file href="index.html"/>
<file href="js/course.js"/>
</resource>
</resources>
</manifest>
つまずきやすいのは2か所です。1つはadlcp:scormtypeの綴りで、1.2は小文字のt、2004はadlcp:scormTypeと大文字のTになります。値は記録を取る教材ならsco、画像やCSSのような部品ならassetです。もう1つはschemaversionの書き忘れで、版の宣言が無い目録は、取り込めるLMSと拒否するLMSに分かれます。ZIPにまとめるときは、展開した直下にimsmanifest.xmlが来るように、フォルダごとではなく中身を選んで圧縮してください。
LMSの取り込み処理でマニフェストから版と起動ファイルを読むPython
LMSを作る側では、アップロードされたZIPを展開し、目録から版と起動ファイルを取り出す処理が入口になります。標準ライブラリだけで書いた最小の例です。
import sys
import xml.etree.ElementTree as ET
def read_manifest(path):
"""imsmanifest.xml から SCORM の版と起動ファイルを取り出す"""
root = ET.parse(path).getroot()
ns = root.tag.split("}")[0].strip("{") # 既定の名前空間(1.2と2004で異なる)
q = lambda tag: f"{{{ns}}}{tag}"
version = root.findtext(f"{q('metadata')}/{q('schemaversion')}", default="").strip()
# 版の判定:1.2 はそのまま、2004 は "2004 4th Edition" などの文字列が入る
if version == "1.2":
scorm = "SCORM 1.2"
elif version.startswith("2004"):
scorm = f"SCORM {version}"
else:
raise ValueError(f"未対応のschemaversion: {version!r}")
resources = {r.get("identifier"): r for r in root.iter(q("resource"))}
launches = []
for item in root.iter(q("item")):
ref = item.get("identifierref")
if ref in resources:
res = resources[ref]
# 1.2 は scormtype、2004 は scormType(大文字T)。両方を見る
kind = next((v for k, v in res.attrib.items()
if k.endswith("}scormtype") or k.endswith("}scormType")), "")
launches.append((item.findtext(q("title")), res.get("href"), kind))
return scorm, launches
if __name__ == "__main__":
scorm, launches = read_manifest(sys.argv[1])
print(scorm)
for title, href, kind in launches:
print(f"{kind}: {href} ({title})")
上の1.2の目録に対して実行するとSCORM 1.2とsco: index.html (第1章 パスワードと多要素認証)が出力されます。schemaversionを2004 4th Editionにした2004形式の目録ではSCORM 2004 4th Editionと判定されました。どちらもPython 3.14.7で実行して確かめた結果です。
実運用では、この前段でZIPの検査を入れます。展開先の外へ書き出すパス(../を含むファイル名)を拒否し、展開後の合計サイズに上限を設けてください。教材のZIPは利用者や外部の制作会社がアップロードするもので、信頼できる入力ではありません。
SCORMの実行時API:教材のJavaScriptが進捗と点数をLMSへ書き込む手順
教材がLMSと話す手段は、LMSがウィンドウに置いたJavaScriptのオブジェクトだけです。教材はまずそのオブジェクトを見つけ、決まった順序で関数を呼びます。
APIとAPI_1484_11をparentとopenerから探すAPI探索の上限回数
LMSは、SCORM 1.2ならAPI、2004ならAPI_1484_11という名前のオブジェクトを、教材を開いたフレームの親ウィンドウに置きます。教材は自分のウィンドウからparentを順にたどって探し、見つからなければ別ウィンドウで開かれたとみなしてopener側を探します。SCORM API Discovery Algorithmsに載っている参考実装では、たどる回数の上限は1.2が7回、2004が500回です。
LMSを作る側は、教材をLMSと同じオリジンから配信してください。別ドメインのCDNから配信すると、ブラウザの同一オリジン制約で親ウィンドウのオブジェクトに触れず、教材は記録なしで動きます。
LMSInitializeからLMSFinishまでの呼び出し順と状態を保存するコード
SCORM 1.2の教材側のコードは、探索・初期化・値の読み書き・確定・終了の順に並びます。関数名と項目名は前出のRun-Time Referenceに沿っています。
// SCORM 1.2:親ウィンドウをたどって API を探す(7階層まで)
function findAPI(win) {
let tries = 0;
while (!win.API && win.parent && win.parent !== win) {
if (++tries > 7) return null;
win = win.parent;
}
return win.API || null;
}
const api = findAPI(window) || (window.opener && findAPI(window.opener));
function start() {
api.LMSInitialize("");
if (api.LMSGetValue("cmi.core.lesson_status") === "not attempted") {
api.LMSSetValue("cmi.core.lesson_status", "incomplete");
}
return api.LMSGetValue("cmi.suspend_data"); // 前回の続きの位置
}
function finish(score) {
api.LMSSetValue("cmi.core.score.raw", String(score));
api.LMSSetValue("cmi.core.lesson_status", score >= 80 ? "passed" : "failed");
api.LMSSetValue("cmi.suspend_data", JSON.stringify({ page: 12 }));
api.LMSCommit("");
api.LMSFinish("");
}
2004では関数名からLMSが外れ、Initialize・GetValue・SetValue・Commit・Terminateになります。項目名もcmi.core.lesson_statusがcmi.completion_statusとcmi.success_statusに分かれます。このコードは呼び出し順を示す例で、本稿では実際のLMS上での動作確認はしていません。
記録の取りこぼしは、LMSFinishの前に受講者がタブを閉じたときに起きます。ページを移るたびにLMSCommitを呼び、pagehideイベントでも終了処理を走らせてください。
xAPI・cmi5とSCORMの違い:LRSへ送るStatementと起動ルールの標準化
SCORMが記録できるのは「LMSにログインして教材を開く」場面だけです。アプリやシミュレーター、対面研修の出欠といったLMSの外の学習を記録するためにxAPIが作られました。
xAPIのStatementをLRSへPOSTするcurlの例とバージョンヘッダの扱い
xAPIの記録の単位はStatementと呼ばれるJSONで、「誰が・どうした・何を」の3つが骨格です。xAPI仕様のデータモデル編はactor・verb・objectの3つを必須とし、idを省いたStatementにはLRSがIDを振ると定めています。社員番号で学習者を識別し、点数と合否を付けて送る例です。
curl -X POST "https://lrs.example.com/xapi/statements" \
-u "LRS_KEY:LRS_SECRET" \
-H "Content-Type: application/json" \
-H "X-Experience-API-Version: 1.0.3" \
-d '{
"actor": { "objectType": "Agent",
"account": { "homePage": "https://lms.example.com", "name": "emp-00123" } },
"verb": { "id": "http://adlnet.gov/expapi/verbs/completed",
"display": { "ja-JP": "完了した" } },
"object": { "id": "https://lms.example.com/courses/security-2026/ch1",
"definition": { "name": { "ja-JP": "第1章 パスワードと多要素認証" } } },
"result": { "score": { "scaled": 0.85 }, "success": true, "completion": true }
}'
xAPI仕様の通信編では、X-Experience-API-Versionヘッダはすべてのリクエストとレスポンスに必須で、1.0系のLRSは1.1.0以上を指定したリクエストを400 Bad Requestで拒否します。POSTは複数のStatementをまとめて送れて、成功すると200 OKと保存したIDの配列が返ります。ID付きで1件だけ送るPUTの成功応答は204 No Contentです。認証方式はHTTP Basic認証とOAuth 1.0などが定義されています。上のcurlは仕様に沿って組んだ例で、本稿では実在のLRSへ送信していません。
学習者はメールアドレスでも識別できますが、社内研修なら社員番号をaccountで送れば、LRSに個人情報を残さずに済みます。
cmi5の起動URLに付く5つのパラメータとmoveOnで揃える完了判定
xAPIはLRSへの送り方を決めていますが、LMSが教材をどう開き、教材がどこへ何を送ればよいかを教材に伝える方法は決めていません。cmi5はここを固定しました。LMSは教材(cmi5ではAUと呼びます)のURLに、次の5つのクエリパラメータを付けて起動します。
endpoint:StatementをPOSTするLMS側のxAPIのURLfetch:教材が認証トークンを受け取るためにPOSTするURLactor:学習者を表すAgentのJSON(機微な個人情報は入れない)registration:受講登録を表すUUIDactivityId:教材のActivity ID
完了の判定は、コース構造を書いたcmi5.xmlのmoveOn属性で教材ごとに決めます。値はPassed・Completed・CompletedAndPassed・CompletedOrPassed・NotApplicableの5つで、省略時はNotApplicableです。教材が送る動詞もcompleted・passed・failedなど9つに決められており、SCORMの「LMSが起動し、決まった値で完了を判定する」性質をxAPIで再現しています。
SCORM・xAPI・cmi5の記録先・通信方式・LMS対応を並べた比較表
| 観点 | SCORM 1.2・2004 | xAPI | cmi5 |
|---|---|---|---|
| 記録先 | LMS | LRS | LMSが持つLRS |
| 通信方式 | ブラウザ内のJavaScript | HTTPでJSONを送信 | HTTPでJSONを送信 |
| LMSの外の学習 | 記録できない | 記録できる | LMSが起動したものだけ |
| 起動と完了の決まり | 規格で決まっている | 決まっていない | 規格で決まっている |
| パッケージ | imsmanifest.xml | 規定なし | cmi5.xml |
LMS側の対応状況には大きな差があります。OSSの代表格であるMoodleの公式ドキュメントのSCORM FAQでは、SCORM 1.2はMoodle 2.1以降で対応し、SCORM 2004は対応していないと明記されています(2026年10月時点)。xAPIはサードパーティのプラグインで対応する形です。「SCORM対応」と書かれたLMSでも、2004やxAPIまで扱えるとは限らないため、手元の教材の版で取り込みを試すまでは判断しないでください。
自社LMSでSCORM対応を作る範囲と、xAPI・cmi5へ進むべき条件の判断基準
SCORM対応は、どこまで作るかで工数が大きく変わります。要件の段階で範囲を切っておけば、作らなくてよい部分に予算を使わずに済みます。
SCORM 1.2の取り込みと再生だけを自社LMSに実装すべき条件
市販のオーサリングツールで作った教材や、購入した既製の教材を自社のLMSで配信したい場合は、SCORM 1.2の取り込みと再生を実装します。作るのは、ZIPの検査と展開、マニフェストの解析、教材を開くiframe、APIオブジェクトとそこから受けた値の保存の4つです。受講者の進捗と点数がLMSの帳票に出れば、研修の修了管理は成り立ちます。
既製のLMSで足りないのは、多くの場合SCORMではなく人事システムとの連携や独自の修了条件です。SCORMの再生は1.2に絞り、残りの工数を連携と帳票に回してください。教材の取り込みから受講履歴の連携までを一体で設計するeラーニングシステム開発(LMS)では、対応するSCORMの版と、xAPIを将来入れるかどうかを要件定義の最初に決めます。LMSの機能と自社開発の判断の全体像はLMSの機能・選び方と自社開発の判断軸を解説した記事で整理しています。
SCORM 2004のシーケンシング実装やLRS自前構築が過剰になる場面
シーケンシングを自前で実装するのは、分岐や補習を組み込んだ2004の教材を大量に抱えていて、それを捨てられない場合に限ります。章の順番を守らせたいだけなら、LMSのコース設定で対応可能です。2004の教材がわずかなら、1.2で書き出し直すほうが安く済みます。
xAPIも同じで、「将来の拡張性のため」だけを理由にLRSを自前で構築するのは過剰です。現場作業のチェックリストやシミュレーターの操作ログのように、LMSの外の学習記録が要件にあるときに入れます。その場合も起動と完了判定はcmi5に合わせ、教材の作り手との取り決めを規格の参照で済ませます。
よくある質問
SCORMについて、検索の多い質問に答えます。
SCORMとLMSの違いは何ですか?
LMSは受講者・コース・受講履歴を管理するシステムそのもので、SCORMは教材とLMSがやり取りするための規格です。SCORMに対応したLMSは、SCORM形式の教材のZIPを取り込み、受講状況と点数を自動で記録します。対応していないLMSでは、動画やPDFは配信できても教材の中のテスト結果を受け取れません。選定時は1.2と2004のどちらに対応しているかまで確かめてください。
SCORMは古い規格で、もう使われていないのですか?
現役です。Moodleの公式ドキュメントが今もSCORM 1.2の対応状況を案内しているように、LMSが教材を取り込む形式としてSCORMは使われ続けています。後継のxAPIは2023年にIEEE 9274.1.1として標準化されましたが、LMSの外の学習を記録しない研修では、SCORMから移る理由は薄いままです。
PowerPointの資料をSCORM教材にできますか?
できます。PowerPointを読み込んでSCORM形式で書き出せるオーサリングツールを使い、閲覧の判定条件やテストを付けてから、SCORM 1.2か2004のZIPとして書き出すのが一般的です。自前で作る場合は、スライドを画像かHTMLに変換し、imsmanifest.xmlと実行時APIを呼ぶJavaScriptを足します。
SCORM教材の動作確認はどこで行えばよいですか?
配信に使う本番と同じLMSの検証環境で確かめるのが確実です。同じSCORM 1.2の教材でも、LMSによってsuspend_dataの扱いや完了の表示が違うためです。LMSを持っていない段階では、SCORMパッケージを再生できる検証用のサービスで先に確かめます。見るのは、最後まで受講したときの完了、途中で閉じて開き直したときの再開、テストの点数です。
SCORM 1.2と2004のどちらで教材を書き出すべきですか?
配信先のLMSが2004に対応していると確認できない限り、1.2で書き出します。1.2はLMS側の対応が最も広く、Moodleのように2004に対応していないLMSでも動きます。2004を選ぶのは、完了と合否を別々に記録したい場合と、再開用のデータが4,096字を超える長い教材の場合です。その場合も、配信先のLMSで2004の教材が正しく記録されるかを事前に確かめてください。
関連記事
- LMSとは?学習管理システムの機能・選び方・自社開発の判断軸を解説:SCORM教材を配信するLMSの機能と選び方の全体像
- eラーニングとは?仕組み・種類・メリットと導入で失敗しない進め方を解説:SCORM教材を含むeラーニングの種類と導入の進め方
- eラーニングシステムの比較で差がつく7つの軸|候補を3社に絞る手順と自社開発の分岐点:教材規格への対応を含めた製品の比べ方
- eラーニングシステムの費用は4費目で見る|ID課金と教材制作費の内訳と自社開発の損益分岐:SCORM教材の制作費とLMSの費用の内訳
- 研修管理システムとは?集合研修の運営を一元化する機能とLMSとの違い・自社開発の判断軸:集合研修とeラーニングの記録を一元化する場合に