moodle-mcp
Provides tools for accessing Tokyo University of Technology's Moodle, including logging in via a dedicated browser, retrieving deadlines, courses, announcements, and activity details, downloading course files, and optionally submitting assignment files when enabled.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@moodle-mcpwhat assignments are due this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
moodle-mcp
東京工科大学の Moodle(学内ゲートつき)を AI から読むためのローカル MCP サーバー。 利用者の PC で動き、MCP クライアント(Claude Desktop / Claude Code / Antigravity CLI など)が stdio で起動する。
AI エージェントにこのリポジトリを渡して作業させる場合は AGENTS.md も読ませる。
使える人・環境
次をすべて満たす場合だけ動く。満たさない環境では導入しても Moodle を読めない。
東京工科大学(TEU)の Moodle アカウントを持っている
画面のある PC(macOS / Windows / Linux デスクトップ)で実行する。 初回ログインで本人がブラウザを操作するため、サーバー・SSH・コンテナ・クラウドでは使えない
PC で動く MCP クライアントを使う(下記「対応クライアント」)
Python 3.11 以上、または uv
Mac・Windows 実機での導入とログイン後の取得は未確認(確認手順と記録)。
Related MCP server: ufora-mcp
方針
東京工科大学(TEU)の Moodle 専用。URL・日本語表示・学内ゲートを前提とし、
他大学の Moodle は対応範囲に含めない。MOODLE_BASE_URL による URL 変更は廃止した。
環境変数 MOODLE_MCP_PROFILE_DIR で専用プロファイルの保存先を変更できる。
MOODLE_MCP_BROWSER_CHANNEL=chrome または msedge でインストール済みの
ブラウザを使える(未指定なら Playwright 同梱 Chromium)。
トランスポート: stdio。認証・アップロード URL・ダウンロード URL は持たない(ローカルのパスを直接読み書きする)
ブラウザ: Playwright の
launch_persistent_contextで専用プロファイルの Chromium を起動する学内ゲートのチケットは接続元に紐づくため、利用者の PC 上のブラウザで本人がログインする
初回とログイン切れのときだけウィンドウを出して手でログイン。以降は headless
普段使いの Chrome のプロファイルには CDP でつなげない(Chrome 側の制限)
Moodle とのやりとりはすべてブラウザのページ内で行う(
page.evaluateのfetch・DOM 読み取り)。 古い TLS を Node 側が拒否するのと、ゲートの Cookie とsesskeyが要るため取得処理はトランスポートから切り離し、CLI(
moodle deadlinesなど)からも呼べるようにする。 MCP 非対応でもシェルが使えるエージェントや人が使える書き込み(課題提出)は既定で無効。設定で有効にする
対応クライアント(2026-10 時点)
使える: Claude Desktop、Claude Code、Antigravity CLI(
~/.gemini/config/mcp_config.json)など PC で動くもの使えない: claude.ai・Gemini などの Web 版とスマホアプリ(クラウドから接続するためローカルに届かない)
導入(ソースから)
リポジトリを clone した利用者 PC で実行する。uv を使う場合:
git clone https://github.com/kadmalcun/moodle-mcp.git
cd moodle-mcp
uv sync # .venv を作り、uv.lock どおりに依存を入れる
uv run playwright install chromium # Chrome / Edge を使うなら省略可(後述)
uv run moodle login # 専用ブラウザでログインし、終わったらブラウザを終了する
uv run moodle deadlines # JSON が出れば成功uv を使わない場合(Windows は .venv\Scripts\ に読み替える):
python -m venv .venv
.venv/bin/pip install -e .
.venv/bin/playwright install chromium
.venv/bin/moodle loginインストール済みの Chrome / Edge を使う場合は環境変数 MOODLE_MCP_BROWSER_CHANNEL=chrome(または msedge)を
指定し、playwright install chromium を省略できる。
MCP クライアントには .venv 内の moodle-mcp の絶対パスを stdio サーバーとして登録する
(Windows は .venv\\Scripts\\moodle-mcp.exe)。
{"mcpServers":{"moodle":{"command":"/absolute/path/to/moodle-mcp/.venv/bin/moodle-mcp"}}}登録後にクライアントを再起動し、ツール一覧に moodle_deadlines などが出ることを確認する。
SDK は 公式 Python SDK v1 を使用する。
手動ログイン
moodle login(MCP では moodle_login)で専用ブラウザが開く。
学内ゲート・Google・Moodle にログインし、Moodle の画面を確認してブラウザを終了する
(Mac はウィンドウを閉じるだけでは終わらないので ⌘Q)。
終了後に headless でログイン状態を確認する。パスワードはツールに渡さない。
ログイン操作には時間制限を設けていないため、MCP クライアントの待機時間にも注意する。
普段使いのブラウザでログイン済みでも、専用プロファイルでは初回ログインが必要。
同じプロファイルを複数の MCP/CLI プロセスから同時に使わない。
MCP ツール
ツール: moodle_login、moodle_deadlines、moodle_course、
moodle_announcements、moodle_activity、moodle_download_file。
提出ツールは既定では公開しない(有効化は後述)。ダウンロードは保存先の絶対パスを指定し、既存ファイルは上書きしない。
ログイン要求が返ったら moodle_login を実行してから読み取りを再試行する。
CLI
uv run moodle ...、.venv/bin/moodle ...、python -m moodle_mcp ... のいずれでも同じ。
moodle login
moodle deadlines --days-overdue 14
moodle course 'コース名の一部'
moodle announcements --days 30
moodle activity 123 --type assign
moodle download --cmid 456 --output /absolute/path/to/material.pdf
moodle servelogin はブラウザを閉じた後に認証を確認して終了する。
読み取りコマンドの成功結果は stdout の JSON、実行エラーは stderr の JSON。
終了コードは成功0、実行エラー1、引数エラー2、ログイン要求3、中断130。
--help と引数エラーは argparse の通常の表示。serve の stdout は MCP 通信専用。
CLI 終了時はブラウザを閉じる。MCP サーバーでは5分アイドルで閉じる。
提出ツール(任意)
MOODLE_MCP_ENABLE_SUBMISSIONS=true を設定して起動した場合だけ、
MCP の moodle_submit_files を公開する。CLI も同じ設定が必要。
MCP クライアントのサーバー設定では env にこの変数を追加して再起動する。
# macOS / Linux(Windows PowerShell は $env:MOODLE_MCP_ENABLE_SUBMISSIONS = 'true')
export MOODLE_MCP_ENABLE_SUBMISSIONS=true
moodle submit 123 /absolute/path/to/report.pdf
# 下見の課題名、ファイル名、SHA-256、既存ファイルの置換計画と problems を確認する。
# 利用者が提出を了承した後にだけ --confirm を付けて再実行する。MCP の引数は cmid、paths(ローカルパスの配列)、confirm(既定 false)。
下見ではアップロード・削除・保存を実行しない。実行前に対象とファイルを再確認する。
同名ファイルは置換し、それ以外の既存ファイルは残す。保存だけで提出になる課題がある。
ローカルでの読み込みは合計100 MiBまで。Moodle 側の個数・容量・形式の制約も下見で返す。
オンラインテキストの編集や、下書き保存後の提出確定操作には対応しない。
配布物からの導入
PyPI・公開リリースへの公開は未実施。wheel と .mcpb は dist/ に生成されるが、
dist/ はリポジトリに含めていない。clone しただけでは存在しないので、
先に「配布物の作成」の手順で作るか、作成者から受け取る。
ソースから使うだけなら上の「導入(ソースから)」で足りる。
uvx(Claude Code 等)
uv を先にインストールする。 wheel のパスには利用者 PC にコピーした実際のパスを指定する。
uvx --from /absolute/path/moodle_mcp-0.1.0-py3-none-any.whl moodle --help
uvx --from /absolute/path/moodle_mcp-0.1.0-py3-none-any.whl playwright install chromium
uvx --from /absolute/path/moodle_mcp-0.1.0-py3-none-any.whl moodle login同梱 Chromium の代わりにインストール済み Chrome を使う場合は、環境変数
MOODLE_MCP_BROWSER_CHANNEL=chrome を指定する。この場合は Chromium の導入を省略できる。
Windows PowerShell では $env:MOODLE_MCP_BROWSER_CHANNEL = 'chrome' と指定する。
stdio クライアントの設定例(Windows はパスの \ を \\ にするか / を使う):
{
"mcpServers": {
"moodle": {
"command": "uvx",
"args": ["--from", "/absolute/path/moodle_mcp-0.1.0-py3-none-any.whl", "moodle-mcp"]
}
}
}GUI から uvx が見つからない場合は command に uvx の絶対パスを指定する。
PyPI に公開した後は uvx --from moodle-mcp==0.1.0 moodle-mcp に置き換えられるが、現時点では使わない。
.mcpb(Claude Desktop)
dist/moodle-mcp-0.1.0.mcpb を利用者 PC で開き、拡張機能としてインストールする。
公式 MCPB の uv ランタイム仕様
に対応したホストが必要。依存関係の初回導入にはネットワークを使う。
この配布形式は既定でインストール済み Google Chrome を使う。Edge を使う場合は
設定の「ブラウザ」を msedge にする。MCPB 自体にはブラウザ・ログイン情報を同梱しない。
「課題提出を有効にする」は既定でオフ。導入後に moodle_login を呼び、本人がログインする。
実機での導入・認証・読み取りは 確認手順 に沿って確認する。
開発
uv sync
uv run python -m unittest discover -s tests # Moodle には接続しない。画面・ログインも不要テストは標準の unittest で、Moodle とブラウザはモックする。追加の依存は要らない。
コードの構成と変更時のルールは AGENTS.md にまとめている。
配布物の作成(開発者向け)
uv lock --check
uv build # dist/ に wheel・sdist
uv run python scripts/build_mcpb.py
npx --yes @anthropic-ai/mcpb@2.1.2 validate manifest.json
npx --yes @anthropic-ai/mcpb@2.1.2 info dist/moodle-mcp-0.1.0.mcpbwheel・sdist と、許可したソースファイルだけを含む .mcpb を dist/ に出力する。
.venv、ブラウザのプロファイル、Cookie は含めない。MCPB の依存バージョンは
uv.lock に固定する。版を上げるときは pyproject.toml と manifest.json の version をそろえる。
ライセンス
Available Tools
6 toolsmoodle_activityBRead-only
活動の本文・添付・提出状況を読む。modtype は assign/resource/quiz 等。
| Name | Required | Description | Default |
|---|---|---|---|
| cmid | Yes | ||
| modtype | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds that the tool surfaces body content, attachments, and submission status, which tells the agent what to expect back, but says nothing about permissions or whether enrollment/access checks apply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler, and the primary action is front-loaded. It is arguably too terse given the unexplained cmid, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotation gaps, the main remaining burden is teaching the agent what cmid is and how it relates to modtype. One of two required parameters is undocumented, so the definition is minimally adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It partially does by giving modtype example values (assign/resource/quiz), which is genuinely useful, but cmid is left completely unexplained — neither its meaning nor where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (読む/read) with a clear resource (活動/activity) and enumerates what is returned: body, attachments, and submission status. This distinguishes it from siblings like moodle_course or moodle_deadlines, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus moodle_course or moodle_download_file, nor any preconditions. Usage is only implied by the tool name and the modtype examples, leaving the agent to infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_announcementsCRead-only
直近 days 日のお知らせを読む。
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds nothing further: no indication of whether a moodle_login session is required, how many announcements are returned, ordering, or pagination limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the scope constraint front-loaded and no filler. It is efficient, though the terseness edges toward under-specification rather than tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no annotation detail beyond read-only, an undocumented parameter, and a likely login prerequisite implied by the sibling moodle_login, the description leaves too much for the agent to guess. It should at minimum say whether authentication is needed and what the response contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only labels the parameter 'Days' with a default of 30. The description does clarify that `days` is a lookback window into the recent past, which is genuine added meaning, but it doesn't state boundaries or format expectations beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (お知らせを読む = read announcements) scoped to the last `days` days, which is clearly understandable. However, it never distinguishes itself from the sibling moodle_deadlines, which an agent could plausibly confuse with 'recent announcements'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, or alternative-tool guidance is given. The agent must infer from the name alone whether to call this or moodle_deadlines for time-sensitive course information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_courseARead-only
コース名で検索し、教材・活動一覧を読む。
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and destructiveHint annotations already declare this as a safe read operation, and the description's '読む' is consistent with that. However, it adds almost no behavioral detail beyond the annotations, such as result format, scope, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with zero waste and front-loads the key action and result. It is appropriately sized for a one-parameter read-only tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple read-only nature, one required parameter, and absence of an output schema, the description is largely complete: it says to search by course name and read a list of materials/activities. It could optionally clarify the returned fields or matching behavior, but nothing critical is missing for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does so for the sole required parameter by stating that the query is a course-name search, which is sufficient for correct invocation even without additional match-format details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search by course name and read the list of materials/activities. It is clear what the tool does, though it does not explicitly distinguish itself from siblings such as moodle_activity or moodle_announcements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'コース名で検索し' implies the tool is used for course-name lookup, but there is no explicit guidance on when to use it versus moodle_activity or other siblings, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_deadlinesARead-only
締切一覧と提出状況。days_overdue は過去何日まで含めるか。
| Name | Required | Description | Default |
|---|---|---|---|
| days_overdue | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered and the description does not need to repeat it. It adds that results include submission status, which is useful return-shape context, but says nothing about auth prerequisites, ordering, or whether this covers all courses or only enrolled ones.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The purpose is stated first and the parameter explanation follows, so an agent gets the essentials in one pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description is the only source for what comes back, and it only says 'deadline list and submission status' without field detail. With one parameter and safety already covered by annotations, the definition is adequate to invoke the tool but thin on result expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the single parameter — and it does, clarifying that days_overdue is how many days into the past to include, resolving the otherwise ambiguous name. It stops short of stating how 0 behaves or whether the value is clamped, which is a minor residual gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the two things returned: a deadline list and submission status. That is a clear resource statement an agent can act on. It lacks an explicit verb and does not differentiate from siblings, though the sibling set (login, course, announcements, activity, download_file) is distinct enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for upcoming/past Moodle deadlines. There is no explicit statement of when to use it, what it excludes, or whether authentication via moodle_login must happen first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_download_fileB
教材をローカルの output パスに保存。cmid または Moodle ファイル url の一方が必要。上書きしない。
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| cmid | No | ||
| output | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false. The description adds real value beyond them by stating '上書きしない' (does not overwrite), which pins down what happens to an existing file — a detail the annotations do not encode. It does not cover auth requirements, directory creation, or error behavior on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler — destination first, then the input requirement, then the overwrite caveat. Every sentence carries an actionable fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% parameter coverage, the description covers purpose, inputs, and the non-overwrite behavior adequately. It stops short on what the call returns (a path? a confirmation?) and on any authentication or failure-mode context, which matters for a tool that writes to disk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it names the output destination, explains cmid and url, and adds a mutual-requirement rule ('one of the two') that the schema's anyOf plus single required field does not enforce. It still doesn't say what form cmid or url should take.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: saving course material to a local output path. No sibling tool (login, deadlines, course, announcements, activity) overlaps with file download, so sibling differentiation is implicitly satisfied, though the description never says so explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'cmid or url is required' is a parameter constraint, not usage guidance. There is no statement of when to reach for this tool versus the browsing siblings, and no prerequisite is mentioned (e.g. that a session/login must exist first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_loginA
利用者 PC にログイン用ウィンドウを開く。本人がログインしてブラウザを終了するまで待つ。 Mac ではウィンドウを閉じるだけではブラウザが終わらないので、⌘Q で終了するよう利用者に伝える。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false, which doesn't tell the agent much about this tool. The description adds the crucial behavior: it opens a UI window on the user's machine and blocks until the person logs in and closes the browser, plus the macOS ⌘Q caveat. What's missing is timeout/failure handling and whether the login persists for later calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the wait semantics, then the platform-specific instruction. Every sentence carries information the agent or user needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and thin annotations, the description carries the burden well by explaining the interactive blocking flow and the user-facing instruction. It is slightly incomplete about what happens after the window closes (is the agent's session now authenticated, what if login fails).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. Schema coverage is 100% for an empty object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and object (opens a login window on the user's PC) plus the wait condition, which clearly separates it from the sibling tools that all read Moodle data. It never names a sibling explicitly, so the differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: because the tool waits for a human to log in, an agent can infer it is the interactive prerequisite before the read-oriented siblings. The description never says when to call this instead of them, nor what to do if a session already exists or the user abandons the login.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
moodle_activity - First observed
moodle_announcements - First observed
moodle_course - First observed
moodle_deadlines - First observed
moodle_download_file - First observed
moodle_login
TDQS
Scored across 6 tools
Each tool has a distinct purpose: authentication, deadlines, course lookup, announcements, activity details, and file download. Course vs. activity is a natural list/detail split, not an ambiguous overlap.
All tools consistently use the moodle_ prefix and snake_case. The suffixes mix noun-style names (course, deadlines) with verb-style names (login, download_file), but the pattern remains highly readable.
Six tools is well-scoped for a Moodle assistant focused on login, deadlines, courses, announcements, activities, and downloads. Each tool earns its place without obvious redundancy.
The read-only surface covers core course reading, deadlines, announcements, and file downloads. However, important Moodle workflows such as assignment submission, grade viewing, and forum interaction are absent, creating notable gaps.
Maintenance
Related MCP Connectors
Web search, data extraction and controlled browser automation for AI assistants via OAuth.
Let your AI agent operate any website through a real, logged-in browser session.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Read, crawl and act on websites, signed in as the user, and turn any site into an API.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Moodle LMS via browser automation, using a server and browser extension to keep credentials local and route commands securely.4 npmMIT
- AlicenseBqualityAmaintenanceEnables AI clients to read a student's own UGent Ufora (D2L Brightspace) data, including courses, announcements, deadlines, grades, course materials, and PDF text, over stdio or local Streamable HTTP. All operations are read-only and run locally against the student's authenticated session.192MIT
- AlicenseNot gradedqualityBmaintenanceConnects Claude, Cursor, Codex and other AI assistants to Canvas LMS through a normal browser sign-in (SSO and MFA included) instead of an access token, letting them read courses, assignments, rubrics, announcements, discussions, grades, calendar and inbox, and read or save course files locally. It is strictly read-only, sending only GET requests, and keeps all session data on the user's own machine.4MIT
- AlicenseNot gradedqualityCmaintenanceLets AI assistants read a student's Canvas LMS/Moodle courses, deadlines, announcements, grades and course files using their normal browser login instead of an access token. It is read-only and keeps all session data and downloads on the user's own machine.58 npm1MIT