moodle-dev
The most complete Moodle development toolkit for AI coding assistants β skills, slash commands, and subagents that turn your assistant into a Moodle expert. Native plugin for Claude Code; ships with adapters for Cursor, GitHub Copilot, Aider, Continue, and a paste-anywhere bundle.
Scaffolds plugins, writes XMLDB upgrades, audits privacy/security, generates PHPUnit + Behat tests, builds AMD modules, reviews PRs β all following official Moodle coding standards (PSR-4, frankenstyle, MOODLE_INTERNAL, GPL headers, get_string, $DB).
π Companion MCP server:
moodle-mcpβ livemoodledev.iodocumentation search inside Claude Desktop / Code, Cursor, Continue, Cline.pipx install moodle-mcp.
Why this plugin
Claude already knows PHP. It does not know:
- Moodle's frankenstyle conventions (
local_<name>,mod_<name>,block_<name>, ...) - XMLDB editor workflow +
upgrade_plugin_savepointrules - Privacy API contracts (
null_providervsrequest\plugin\provider) - Capability + sesskey +
require_loginsecurity pattern - Moodle 4.4+ Hooks API vs legacy
lib.phpcallbacks pluginfile.phpfile-serving callback- Behat + PHPUnit Moodle harness (
resetAfterTest, generators, tags) - AMD/RequireJS + grunt build
- Mobile app remote templates +
get_remote_addons
This plugin teaches Claude all of it. Auto-activates when Claude detects Moodle work.
Install
Claude Code (native plugin)
/plugin marketplace add https://github.com/SaadRahman01/claude-moodle-dev
/plugin install moodle-dev@moodle-dev
(If [email protected] SSH auth fails, use the full https:// URL as shown above.)
Local dev: /plugin marketplace add /absolute/path/to/claude-moodle-dev.
Verify: /plugin list.
One-liner installer (any non-Claude assistant)
./install.sh <cursor|copilot|aider|continue|generic> [--dest <path>]
Defaults to current directory. Or copy manually as below.
Cursor
Copy adapters/cursor/.cursor/ into your project (or ~/.cursor/ for global use). Each skill becomes an on-demand rule; agents and commands surface via @<name> mentions in chat.
GitHub Copilot
Copy adapters/copilot/.github/ into your repo. copilot-instructions.md is applied to every chat in the repo; per-skill chatmodes appear in the chat-mode picker.
Aider
Drop adapters/aider/CONVENTIONS.md into your project root and add it to .aider.conf.yml:
read:
- CONVENTIONS.md
Load individual skills on demand with /read-only adapters/aider/skills/<name>.md.
Continue.dev
Copy adapters/continue/ into ~/.continue/ (merge with existing config.yaml). Skills load as rules; commands appear as slash prompts.
Any other assistant
Paste relevant sections from adapters/generic/PROMPTS.md β it's one self-contained markdown file with every skill, agent, and command. Works with anything that takes a system prompt.
Companion MCP server: live Moodle docs
moodle-mcp is a separate Model Context Protocol server that gives any MCP-capable client (Claude Desktop / Code, Cursor, Continue, Cline, Windsurf) live access to the canonical Moodle developer documentation. The skills here teach conventions; the MCP server provides authoritative lookups.
What it adds
| Tool | What it returns |
|---|---|
search_moodle_docs(query, limit, offset) |
Top hits on moodledev.io with title, URL, headings, excerpt. Synonym expansion (capβcapability, wsβwebservice, hookβlistener), quoted-phrase boost, BM25 scoring, pagination. |
fetch_moodle_page(url) |
Full body + headings for one page β follow-up after a search. |
get_hooks_api_listeners() |
Core Hooks API index + detected hook classes. |
get_capability_docs(component?) |
Access API + RISK_* quick-reference; optional component scope. |
lookup_db_xmldb(query) |
XMLDB / schema / upgrade.php patterns. |
list_plugin_types() |
Every Moodle plugin type with one-line hint + docs URL. |
get_version_info() |
Current Moodle versions parsed from /general/releases. |
search_tracker(query, limit) |
Issue search against tracker.moodle.org (Jira). |
Plus MCP resources (moodle://docs/apis/...) and prompts (moodle-plugin-skeleton, moodle-capability-review, moodle-hooks-migration).
No API keys. Sitemap + disk cache + conditional GET. Pairs cleanly with this plugin.
Install (Claude Code)
Auto-wired when installing this plugin via marketplace. Requires uv on PATH:
brew install uv # or: pip install uv
The plugin's mcpServers entry runs uvx --from git+https://github.com/SaadRahman01/moodle-mcp moodle-mcp on demand β no manual pipx install needed.
Manual install (any client):
pipx install moodle-mcp
claude mcp add moodle moodle-mcp
Other clients: see moodle-mcp README.
What's inside
Skills (auto-activate)
| Skill | Triggers on |
|---|---|
moodle-plugin-development |
Creating/modifying any plugin (all types) |
moodle-phpunit-testing |
Writing/running PHPUnit tests |
moodle-behat-testing |
Writing/running Behat acceptance tests |
moodle-amd-javascript |
AMD modules, ES6, grunt build |
moodle-web-services |
REST/AJAX/external functions, tokens |
moodle-security-audit |
Security review, capability/sesskey audit |
moodle-privacy-gdpr |
Privacy provider, GDPR compliance |
moodle-performance |
MUC caching, query tuning, ad-hoc tasks |
moodle-accessibility |
WCAG 2.1 AA, ARIA, screen reader checks |
moodle-theme-development |
Boost child themes, SCSS, layouts |
moodle-upgrade-migration |
Cross-version upgrades, deprecations |
moodle-mobile-app |
Mobile app remote templates, addons |
moodle-hooks-api |
4.4+ Hooks API: authoring, listening, migrating magic callbacks |
Slash commands
| Command | What it does |
|---|---|
/moodle-new-plugin |
Scaffold a new plugin (asks type + name) |
/moodle-bump-version |
Bump version.php + add upgrade step |
/moodle-privacy-audit |
Check privacy provider correctness |
/moodle-security-review |
Run security checklist on a file/plugin |
/moodle-string-check |
Find hard-coded English needing get_string |
/moodle-codestyle |
Run phpcs with Moodle ruleset |
/moodle-mustache-lint |
Lint Mustache templates: a11y, security, hard-coded strings |
/moodle-capability-audit |
Cross-check db/access.php against runtime has_capability use |
Subagents
| Agent | Use case |
|---|---|
moodle-reviewer |
Deep PR review against Moodle coding standards |
moodle-scaffolder |
Generates a plugin skeleton from a brief |
Example: from prompt to plugin
You:
Build a
local_attendance_exportplugin that lets teachers export per-course attendance as CSV. Needs a capability, a settings page, and a CLI script.
Claude (with this plugin loaded) generates:
local/attendance_export/
βββ version.php # 2026050200, requires 2024042200
βββ settings.php # admin_setting_configtext for default delimiter
βββ lib.php # local_attendance_export_extend_navigation()
βββ cli/export.php # require($CFG->libdir . '/clilib.php'); cli params
βββ classes/
β βββ exporter.php # business logic, uses $DB
β βββ output/renderer.php
β βββ privacy/provider.php # null_provider (no user data stored)
βββ db/
β βββ access.php # local/attendance_export:export
β βββ install.xml # (empty β no tables)
βββ lang/en/local_attendance_export.php # pluginname, capability, settings strings
βββ tests/exporter_test.php # PHPUnit, resetAfterTest, generator
Every file follows Moodle conventions. require_capability + require_sesskey wired. PHPUnit test uses $this->getDataGenerator(). Privacy provider declared. version.php bumped correctly.
Example prompts
See EXAMPLES.md for 30+ prompts covering scaffolding, upgrades, testing, security audits, performance tuning, theme work, and mobile app integration.
Comparison
| Vanilla Claude | + moodle-dev | |
|---|---|---|
| Knows frankenstyle naming | partial | yes |
Bumps version.php correctly |
no | yes |
Adds upgrade_plugin_savepoint |
no | yes |
| Writes privacy provider | rarely | always |
Adds require_sesskey on POST |
no | yes |
Uses $DB not raw SQL |
partial | yes |
Uses get_string() not English literals |
no | yes |
| Generates passing PHPUnit + Behat | no | yes |
| Knows Moodle 4.4 Hooks API | no | yes |
Generates pluginfile.php callback |
no | yes |
| Mobile app remote templates | no | yes |
Repository layout
.claude-plugin/ # Claude Code plugin manifest
skills/ # canonical skills (Claude reads these directly)
agents/ # canonical subagents
commands/ # canonical slash commands
adapters/ # generated per-assistant β DO NOT hand-edit
cursor/.cursor/rules/*.mdc
copilot/.github/copilot-instructions.md + chatmodes/*.chatmode.md
aider/CONVENTIONS.md + skills/ + commands/
continue/config.yaml + rules/ + prompts/
generic/PROMPTS.md # paste-anywhere single-file bundle
scripts/build-adapters.py # regenerates adapters/ from canonical files
install.sh # one-liner adapter installer for non-Claude assistants
tests/run.sh # structural test harness (run before commit)
docs/ADAPTER_AUTHORING.md # how to add a new assistant
.githooks/pre-commit # phpcs + PHPUnit + version.php monotonicity (install: git config core.hooksPath .githooks)
.github/workflows/lint.yml # CI: JSON, frontmatter, adapter sync, links, spellcheck, actionlint
.github/workflows/release.yml # tag-driven release: bundle + changelog extraction + GH release
.github/CODEOWNERS # auto-review routing
.github/dependabot.yml # weekly GitHub Actions updates
SECURITY.md # vulnerability disclosure policy
Editing workflow
- Edit canonical files under
skills/,agents/, orcommands/. - Run
python3 scripts/build-adapters.pyto regenerate adapters. - Commit both. CI fails if
adapters/drifts from canonical source.
Compatibility
| Moodle | Status |
|---|---|
| 5.2 | supported (PHP 8.3 min, /public doc-root, React core, Oracle dropped β releases 2026-04-20) |
| 5.1 | supported (PHP 8.2 min, /public doc-root introduced, Routing Engine) |
| 5.0 | supported |
| 4.5 | supported (LTS) |
| 4.4 | supported (Hooks API) |
| 4.3 | supported (legacy callbacks) |
| 4.2 | supported (core_external namespace) |
| β€ 4.1 | best-effort (older external_api) |
PHP support: 8.1+ for Moodle 4.x, 8.2+ for 5.0/5.1, 8.3+ for 5.2. PHP 8.4 tested on 5.1+. Some skills note Moodle-version-specific differences.
Roadmap
- [ ]
moodle-question-bankskill (qtype/qbank deeper coverage) - [ ]
moodle-h5pskill - [ ]
moodle-lti-toolskill (LTI 1.3 tool/provider) - [ ]
moodle-analyticsskill (analytics models) - [ ]
moodle-cli-scriptslash command - [ ]
moodle-translation-exportslash command - [ ] MCP server wrapping
moodledev.iodocs search - [ ] MCP server for live Moodle dev instance (XMLDB editor, purge caches)
Vote / request: open an issue.
Contributing
PRs welcome β see CONTRIBUTING.md. Quick path:
- Fork
- Add a skill:
skills/<name>/SKILL.mdwithname+descriptionfrontmatter - Add a command:
commands/<name>.mdwith frontmatter - Add an agent:
agents/<name>.mdwith frontmatter - PR β CI lints JSON + frontmatter automatically
License
MIT β see LICENSE.
Code Claude generates with these skills should ship as GPL-3.0-or-later to be Moodle plugin directory compatible.
Credits
Built by Saad Rahman. Powered by Claude Code and the Moodle Developer Documentation.
If this saves you time, β the repo β helps others find it.