moodle-mcp
moodle-mcp
Moodle用のModel Context Protocol (MCP) サーバー。AIエージェントがWebサービスを介して、レッスン、リソース、アクティビティなどの教育コンテンツをMoodle上で公開・管理できるようにします。冪等性が保証されています。
ステータス: v0.1 MVP。
概要
moodle-mcp は、stdioベースのMCPサーバーです。一連の高レベルなファサードと、低レベルな ws_raw プリミティブを公開し、標準的な教育用「Ficha」(YAMLフロントマター付きのマークダウンファイル)を、Moodleコースのセクション、ページ、リソース、アクティビティとして公開します。すべての書き込みは idnumber によるアップサート(更新または挿入)で行われるため、同じFichaを再公開しても重複が作成されることはありません。
主な利用者: Italicia の言語学習ワークフローを駆動するClaude Desktop。ただし、これは汎用的なオープンソースアダプターであり、MCP対応エージェントとWebサービスが有効なMoodle 4.x/5.xインスタンスであれば誰でも使用できます。
v0.1で公開されているツール
ツール | 目的 |
| コースのスナップショット: メタデータ、セクション、最近MCPで公開されたレッスン、登録者数。 |
| FichaClase(絶対マークダウンパス)をMoodleセクションおよびモジュール更新として公開。 |
| 上記と同様だが、強制的に非表示にし、プレビューURLを返す。 |
| 以前に非表示にしていたセクションとそのモジュールを学生に公開する。 |
| エスケープハッチ: MoodleのWS関数を直接呼び出す。 |
v0.1には含まれていません(v0.2以降で計画中): publicar_ficha_examen, sync_alumnos_csv, HTTP/SSEトランスポート, GIFTビルダー, マルチパートアセットアップロード, 自動モジュール作成。
インストール
# Via npx (recommended for Claude Desktop)
npx -y @marcosnahuel/moodle-mcp
# Or install globally
npm install -g @marcosnahuel/moodle-mcpNode.js 20以上が必要です。
設定 (環境変数)
変数 | 必須 | デフォルト | 説明 |
| はい | — | Moodleインスタンスの完全なHTTPS URL。 |
| はい | — | 編集権限を持つWebサービス用トークン。 |
| いいえ |
| リクエストごとのタイムアウト。 |
| いいえ |
| 一時的な障害時の再試行回数。 |
| いいえ |
| トークンバケットレート制限。 |
| いいえ |
|
|
| いいえ |
|
|
Claude Desktopの設定
claude_desktop_config.json に追加します(OSごとの正確なパスについては examples/setup-claude-desktop.md を参照してください):
{
"mcpServers": {
"moodle": {
"command": "npx",
"args": ["-y", "moodle-mcp"],
"env": {
"MOODLE_URL": "https://your-moodle.example.com",
"MOODLE_WS_TOKEN": "your-ws-token"
}
}
}
}Claude Desktopを再起動します。上記の5つのツールがエージェントから利用可能になるはずです。
例
1. アクションを実行する前にコースのスナップショットを取得する
// tool call
{
"name": "obtener_contexto_curso",
"arguments": { "course_id": 42, "incluir_ultimas_clases": 5 }
}レスポンス(省略):
{
"course": { "id": 42, "fullname": "Italiano A1", "shortname": "ITA-A1", "format": "topics", "startdate": 1700000000 },
"secciones": [{ "id": 100, "name": "Unidad 3", "section": 3, "visible": true, "modules_count": 6 }],
"ultimas_clases": [{ "seccion_id": 100, "seccion_name": "Unidad 3", "ficha_idnumber": "mcp:a9993e364706816aba3e2571" }],
"matriculados": { "total": 18, "docentes": 1, "alumnos": 17 }
}2. FichaClaseを公開する(まずプレビュー)
{
"name": "publicar_preview",
"arguments": {
"ficha_path": "/home/alicia/fichas/italiano/a1-2026/u3/c5.md",
"course_id": 42
}
}レスポンスには、Aliciaが確認のために開くことができる preview_url が含まれています。承認されたら:
{
"name": "confirmar_preview",
"arguments": { "seccion_id": 100, "recursos_ids": [501, 502, 503] }
}3. エスケープハッチ — 生のWS関数を呼び出す
{
"name": "ws_raw",
"arguments": {
"function_name": "core_webservice_get_site_info",
"params": {}
}
}レスポンス:
{ "data": { "sitename": "Aula Italicia", "release": "5.0.2+", ... } }冪等性
このMCPによって作成されるすべてのリソースは、以下の形式の安定した idnumber を持ちます:
mcp:<first 24 chars of sha1(ficha.id + "|" + component_id)>同じFichaを再公開すると、idnumber によって既存のリソースが検索され、その場で更新されます。重複は作成されません。いつでもどこでも安全に再試行できます。
v0.1の注意点
v0.1は、その機能の境界について誠実です。以下のことは確実に行えます:
コース、そのセクション、モジュールの検索。
mcp:idnumberプレフィックスによる「所有」リソースの検索。既存モジュールの可視性の更新(プレビュー → 確認ワークフロー)。
安定した
codeフィールドを持つ構造化されたMoodleエラーの表示。トークンのログ記録やスタックトレースの伝播は行いません。
v0.1ではまだ以下のことはできません:
マルチパートを使用したMoodleドラフトファイル領域へのアセットファイルのアップロード。アセットアップロード用に計画された呼び出しは
advertenciasで報告されます。初回は手動でシードしてください。Webサービスを通じた新しいセクションやモジュールの作成。モジュールがまだ存在しない場合、ツールはステータス
"missing"とadvertenciaを返します。local_wsmanagesections(または同等のもの)をインストールし、それらのエンドポイントを接続するのはv0.2の作業です。
どちらのギャップも、実際のMoodle Dockerに対して実行される tests/integration/ の統合スイートによって推進されます。
開発
git clone https://github.com/marcosnahuel/moodle-mcp
cd moodle-mcp
npm install
npm run typecheck # tsc --noEmit
npm test # vitest unit suite
npm run test:coverage # with v8 coverage (≥80% enforced)
npm run build # tsup → dist/
# Integration — requires docker
docker compose -f tests/integration/docker-compose.test.yml up -d
export MOODLE_TEST_URL=http://localhost:8081
export MOODLE_TEST_TOKEN=<generate in Moodle admin>
export MOODLE_TEST_COURSE=<course id>
npm run test:integration
docker compose -f tests/integration/docker-compose.test.yml down -vセキュリティ
トークンは決してログに記録されません。ログレコードのどのフィールドにトークンが表示されても、
***に置き換えられます。エラーメッセージ内のURLも同様に編集されます。
MOODLE_ALLOW_INSECURE=true(開発用のみ)でない限り、HTTPSが必須です。MCPはWebサービスRESTを介してのみMoodleと通信します。Cookie認証、Webスクレイピング、直接的なDBアクセスは行いません。
貢献
課題、PR、コミットの規約については CONTRIBUTING.md を参照してください。
このプロジェクトに参加することで、CODE_OF_CONDUCT.md を遵守することに同意したものとみなされます。
ライセンス
MIT © 2026 Italicia — LICENSE を参照してください。
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MarcosNahuel/moodle-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server