Install
$ agentstack add mcp-snaw80-moodle-mcp ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
mcp-moodle
An MCP server that exposes Moodle Web Services to any MCP-compatible AI assistant — Claude Code, Claude Desktop, Cursor, Codex, and others.
Ask your assistant things like "what's due this week?", "list my courses", "download the slides from CS101 week 3" — without leaving the chat.
Features
site_info— verify the token and get the authenticated userlist_my_courses— courses you're enrolled inget_course_contents— sections, modules, file URLssearch_courses— search the public cataloglist_assignments— assignments across one or all courseslist_quizzes— quizzes/QCMs in one or all visible coursesget_quiz_qcm_content— rendered QCM questions, readable text, and imagesupcoming_events— calendar deadlines and sessionsget_user_grades— your grades for a coursedownload_file— save any Moodle file locally (token appended automatically)
Works with any Moodle 3.5+ instance that has Web Services enabled.
Install
The recommended way is uv — no virtualenv to manage:
# One-off run (no install)
uvx mcp-moodle
# Or persist as a tool
uv tool install mcp-moodle
Plain pip works too:
pip install mcp-moodle
Update
If you installed with uv tool install, upgrade to the latest published version with:
uv tool upgrade mcp-moodle
If you run it one-off with uvx, force a fresh fetch with:
uvx --refresh mcp-moodle
For pip installs:
pip install -U mcp-moodle
Get a token
Moodle Web Services require a personal token. The package ships a helper that handles every common login flow — native accounts, SSO (Microsoft, Google, SAML, OAuth), or manual paste:
# Default: opens a Chromium window, you complete SSO, token is captured
uvx --from "mcp-moodle[token]" mcp-moodle-token https://moodle.example.org
# Native (non-SSO) account
uvx --from "mcp-moodle[token]" mcp-moodle-token https://moodle.example.org \
--method local --user jdoe
# Headless server fallback (paste the moodlemobile:// URL by hand)
uvx --from "mcp-moodle[token]" mcp-moodle-token https://moodle.example.org \
--method manual-mobile
The token is written to ./.env (chmod 600) as MOODLE_URL and MOODLE_TOKEN. Pass --stdout to print it to stdout instead.
> The [token] extra pulls in Playwright. First run downloads Chromium > (~150 MB, one-time). Skip the extra if you only ever use --method local, > --method web, or --method manual-mobile.
Configure your MCP client
Claude Code
claude mcp add moodle \
--env MOODLE_URL=https://moodle.example.org \
--env MOODLE_TOKEN=your_token_here \
-- uvx mcp-moodle
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"moodle": {
"command": "uvx",
"args": ["mcp-moodle"],
"env": {
"MOODLE_URL": "https://moodle.example.org",
"MOODLE_TOKEN": "your_token_here"
}
}
}
}
Cursor / other clients
Any MCP client that supports stdio servers works the same way: command uvx, args ["mcp-moodle"], env MOODLE_URL and MOODLE_TOKEN.
Verify it works
In your MCP client, ask: "call the moodle siteinfo tool"_. You should see your name, username, and the site URL.
Quiz / QCM content
Use list_quizzes to find quiz instance ids, then call get_quiz_qcm_content with the quiz id. The tool reuses the latest unfinished attempt when one exists. If no unfinished attempt exists, it returns requires_attempt_creation: true instead of starting an attempt silently; ask the user for permission, then call again with start_if_needed: true.
Each returned question keeps Moodle's raw html and also includes:
text— cleaned readable text with formula/image labels fromalt/titleimages— image metadata with the originalurland a token-free
download_url that can be passed to download_file
download_file automatically converts Moodle pluginfile.php URLs to the token-aware webservice/pluginfile.php form before downloading.
Development
git clone git@github.com:Snaw80/moodle-mcp.git
cd moodle-mcp
uv sync --all-extras
uv run mcp-moodle
Security notes
- Your token is the equivalent of a password for Moodle Web Services — keep
.env out of version control (the included .gitignore already does this).
- The server reads
MOODLE_TOKENfrom the environment and never logs it. download_fileappends the token to the URL; that URL is not logged either,
but be mindful if your client echoes tool arguments.
License
MIT — see [LICENSE](LICENSE).
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Snaw80
- Source: Snaw80/moodle-mcp
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.