Moodle MCP
Provides read-only access to a student's Moodle site, including listing enrolled courses, browsing course sections and materials, viewing upcoming deadlines, downloading individual files, and syncing lecture slides or all course files into folders.
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's due this week on Moodle?"
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
An MCP server that gives AI tools (SlideMate, Claude Desktop, Claude Code, Codex) read-only access to a student's Moodle: courses, materials, links and deadlines. It can also download every course's lecture slides into one folder per course.
It defaults to LSE Moodle (https://moodle.lse.ac.uk) but works with any Moodle site: set MOODLE_BASE_URL.
It uses Moodle's official mobile web-services API (the one the Moodle app uses), so it reads data rather than
scraping pages, and sign-in goes through your university's normal SSO + MFA in a real browser window.
Install (macOS, one command)
Paste this into Terminal. It installs uv (which brings its own Python, so you don't
need Xcode or Apple's Command Line Tools), installs moodle-mcp, then opens Chrome so you can sign in to Moodle once:
curl -LsSf https://astral.sh/uv/install.sh | sh && ~/.local/bin/uv tool install --managed-python https://github.com/Mattlo0546/moodle-mcp/archive/refs/heads/main.zip && ~/.local/bin/moodle-mcp loginSign-in uses Google Chrome. Without Chrome, run ~/.local/share/uv/tools/moodle-mcp/bin/playwright install chromium
first. To update later, run the install command again with --reinstall after tool install.
Related MCP server: schoolbridge
Tools
Tool | What it does |
| Opens a browser for university SSO + MFA and saves a token. Tries a silent refresh first. |
| Who you're signed in as, which site, and where files download to |
| Your enrolled courses, most recently used first |
| A course's sections with materials, links, activities and due dates |
| Upcoming assignments and quizzes, soonest first |
| Save one file (a |
| With no course: download the PDFs from every current course, in the background. With a course: download all of its files. |
Courses can be named loosely: "MY452", "regression" or the course id all work. A full sync skips courses that
have ended, and files you already have.
Use it
SlideMate
Settings → Connections & sync → Add server…:
Name:
moodleCommand:
moodle-mcpArguments:
serve
Press Test: it should list 8 tools. SlideMate notices moodle_sync, so the library's Pull button
downloads new slides from all your current courses, and moodle_login is used when the sign-in has expired. Files
go straight into SlideMate's library (its first slides folder), as <folder>/<course>/…, and each Moodle course
becomes a course in SlideMate. Keep Tutor ticked and the tutor can check your deadlines and course pages too.
Claude Code
claude mcp add moodle -- ~/.local/bin/moodle-mcp serveClaude Desktop / other MCP clients
{
"mcpServers": {
"moodle": { "command": "/Users/YOU/.local/bin/moodle-mcp", "args": ["serve"] }
}
}Then ask things like "what's due this week on Moodle?" or "pull everything from MY452".
Command line
moodle-mcp login # sign in (opens Chrome)
moodle-mcp status # who you're signed in as
moodle-mcp courses # your courses
moodle-mcp sync # PDFs from every current course
moodle-mcp sync MY452 # every file in one courseSettings (all optional)
Environment variables win over ~/.moodle-mcp/config.json.
Variable | Default | Meaning |
|
| Your Moodle site |
| SlideMate's first slides folder, else | Where downloads go |
|
| Browser for sign-in; |
|
| Where the token and the sign-in browser profile live |
How sign-in works
Moodle sites behind SAML single sign-on with MFA have no password a script can post. Instead this uses Moodle's
mobile-app login handshake: it opens admin/tool/mobile/launch.php with a random passport, you sign in once in the
browser, and Moodle redirects back with a signed, base64-encoded web-service token, which is decoded and saved. The
browser profile remembers the SSO session, so later refreshes usually need no clicks.
Privacy
Access: read-only. It can't submit work, post or change anything on Moodle.
Storage: the token stays on your computer (
~/.moodle-mcp/token.json, readable only by you). Delete it to sign out. Data goes directly between your computer and your Moodle site.
Development
uv run --with pytest pytest # offline tests against a fake Moodle: sync, sign-in expiry, MCP over stdioMIT licensed.
Available Tools
8 toolsmoodle_browseA
Show a course's sections with their materials, links and activities. course can be a
course id, short name, or part of the full name.
| Name | Required | Description | Default |
|---|---|---|---|
| course | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does convey that the operation is a non-mutating read ('Show') and characterizes the returned content (sections, materials, links, activities), but says nothing about login/auth prerequisites, pagination, or failure modes for an unknown course identifier.
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 sentences, zero filler, with the primary action front-loaded and the parameter clarification trailing. Every clause earns its place.
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?
For a single-parameter browse tool with no output schema and no annotations, the description covers purpose and argument format adequately. The notable remaining gap is that it never signals the likely prerequisite of being logged in (moodle_login is a sibling), which an agent would need to know before calling.
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%, yet the description compensates well by specifying that `course` accepts a course id, a short name, or part of the full name. That is meaningful added semantics an agent could not infer from the bare string parameter, though exact matching behavior (case sensitivity, ambiguity on partial matches) remains unspecified.
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 ('Show') and resource (a course's sections with their materials, links and activities), so an agent can tell it apart from moodle_download at a glance. It does not explicitly contrast itself with moodle_courses, which also operates on course-level data.
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 implied by the purpose – browse the contents of a known course – but there is no explicit 'use this when' statement and no mention of alternatives such as moodle_courses (list all courses) or moodle_download (fetch a file). The only guidance offered concerns the `course` argument format, not when to pick this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_coursesA
List the user's enrolled Moodle courses (most recently accessed first).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses ordering ('most recently accessed first'), but omits auth requirements, pagination behavior, read-only assurance, and any rate-limit or safety context.
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, front-loaded sentence with no waste. The parenthetical ordering detail is useful and earns its place.
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?
For a zero-parameter list tool with an output schema, the description covers purpose and ordering. It lacks usage guidance and auth context, but the output schema handles return values, making it nearly 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?
The tool has zero parameters, so the baseline is 4. The description adds no parameter information, but there are no parameters to describe.
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 ('List') and resource ('user's enrolled Moodle courses') with an ordering scope. It is clear enough to distinguish from siblings like moodle_browse or moodle_sync, but it does not explicitly name or differentiate against any alternative tool.
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 or when-not-to-use guidance is provided, and no alternatives are named. The description implies usage only through its statement of function, but offers no context, prerequisites, or routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_deadlinesB
List upcoming assignments, quizzes and other dated activities, soonest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the sort order ('soonest first'), but omits whether the call is read-only, any auth/precondition, and how the limit interacts with results. That is a meaningful gap for a zero-annotation tool.
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 sentence with no waste, front-loading the resource and the ordering constraint. Nothing extraneous is present.
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?
The output schema means return values need no explanation, and the tool is simple (one optional param, no nesting). However, the undocumented 'limit' parameter and absence of any usage or behavioral context leave the definition just 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, yet it never mentions the single 'limit' parameter or its default of 20. The meaning of the only parameter is left entirely undocumented.
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 gives a specific verb and resource ('List upcoming assignments, quizzes and other dated activities') and adds scope ('upcoming', 'soonest first'). It is easily distinguishable from siblings like moodle_login, moodle_courses, or moodle_sync, though it does not explicitly name or contrast with any of them.
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 implied by the phrasing — an agent can infer this is the tool for deadlines — but there is no explicit when-to-use, when-not-to-use, or comparison to alternatives such as moodle_browse or moodle_courses. Guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_downloadA
Download one Moodle file. Pass the fileurl from a moodle_browse result; the file is saved
under the download folder (optionally in subdir).
| Name | Required | Description | Default |
|---|---|---|---|
| subdir | No | ||
| fileurl | Yes | ||
| filename | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry full behavioral burden. It discloses the save location and optional subdir, but doesn't state whether it overwrites existing files, how it handles large files, whether authentication is required, or what happens on failure. The 'saved under the download folder' detail is useful but incomplete for a file-writing operation.
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, front-loaded with the action, then the parameter workflow and save location. Nothing is wasted and the essential information comes first.
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?
For a 3-parameter file-download tool with no annotations and no output schema, the description gives the minimum: what it does, the key input source, and the save behavior. It's incomplete regarding authentication, failure modes, overwrite behavior, and the filename parameter, but covers the basic call path.
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 document all three parameters. It explains fileurl (from moodle_browse) and subdir (optional folder), which is helpful, but it completely omits filename. One of three parameters is undocumented in both schema and description, a significant 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 states a specific verb (Download) and resource (one Moodle file), and it carefully distinguishes itself from sibling moodle_browse by explaining it consumes a fileurl from a browse result. However, it doesn't fully differentiate itself from moodle_sync, which might also retrieve files, leaving a minor ambiguity about when to prefer a direct download over a sync.
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?
It gives clear context: pass the fileurl from a moodle_browse result, and optionally place it in subdir. It doesn't explicitly exclude other usage patterns or mention prerequisites like requiring authentication or an active session, but the workflow guidance is solid and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_loginA
Sign in to Moodle. Opens a Chrome window on the user's Mac at the university sign-in page; the user completes SSO + MFA there and a web-service token is saved for the other tools. Tries a silent refresh first, so it often finishes without any window.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses a visible side effect (a Chrome window opens on the user's Mac), required human action (SSO + MFA), the persistent artifact (a saved token), and the non-obvious silent-refresh path. It omits failure/timeout behavior and any statement about what the caller sees on abort, which keeps it from a 5.
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 that front-load the core action and then layer in the mechanism, user action, and silent-refresh optimization. Every clause earns its place; there is no filler or restated name/title.
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?
For an interactive auth tool with no annotations and no output schema, the description covers the essentials: what opens, who acts, and what persists for downstream tools. The remaining gaps are the undocumented timeout parameter and unstated failure modes, which are modest against how much flow context is already given.
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 single parameter timeout_seconds has 0% schema description coverage, and the description never mentions a timeout or its default of 300 seconds, so neither source explains what the value controls. The description compensates with valuable narrative about the login flow but adds nothing about the one parameter's meaning or units.
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+resource ('Sign in to Moodle') and immediately explains the mechanism: a Chrome window at the university sign-in page, SSO + MFA, and a saved web-service token. This clearly distinguishes it from siblings like moodle_status, moodle_courses, and moodle_sync, which operate on data rather than establishing the session.
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 description makes the prerequisite relationship explicit: a token 'is saved for the other tools,' so an agent can infer this must be called before authenticated siblings. It also clarifies that a silent refresh means the tool 'often finishes without any window,' which frames the expected flow. It stops short of saying what to do when other tools fail due to auth, so it's clear context but not explicit when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_statusA
Check the Moodle session: which site, signed in as whom, and the download folder.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It conveys that this is a non-mutating session inspection and enumerates the returned fields, but it says nothing about failure behavior (e.g. what happens when no session exists) or whether it touches the network.
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 sentence with zero padding, front-loaded on the verb and resource, followed by the concrete data points returned. Nothing needs trimming.
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, the description must convey the return values, and it lists the three key pieces of session state. It falls just short by not indicating how the tool behaves when no valid session exists, which an agent checking login status would want to know.
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 schema has nothing to document and the baseline is 4. The description correctly does not invent parameter semantics and instead spends its words on returned state.
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 ('Check') and resource ('the Moodle session') plus the three things it reports: site, signed-in user, and download folder. That is clear enough for an agent to distinguish it from moodle_login or moodle_courses, though it never explicitly contrasts itself with those siblings.
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: calling a status tool makes sense to verify session/login state, likely before or after moodle_login. There is no explicit when-to-use statement, no mention of prerequisites, and no named alternative, so the agent must infer the context itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_syncA
Download course files to // (SlideMate's library if it's set up, else ~/MoodleFiles).
With a course (id, short name or part of the name), downloads every file in it and returns the result.
Without one, downloads the PDFs (lecture slides, readings) from every current course in the background and
returns {"running": true}; call moodle_sync_status until it reports the result. Existing files of the same
size are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| course | No | ||
| skip_existing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly delivers: it discloses destination-path resolution (SlideMate library vs ~/MoodleFiles), background execution, the literal {"running": true} return for the bulk mode, and the same-size skip rule. It omits auth/precondition requirements and any indication of whether a skipped file is reported, so it falls short of fully transparent.
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?
Both modes are front-loaded in the first sentence and the async contract is stated compactly with the literal return value. The text is dense but nearly every clause carries operational information; only the destination-path parenthetical is a slight detour.
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, the description correctly assumes responsibility for return shapes and does so for the bulk mode ("running": true plus polling instruction). It also explains the destination layout and skip rule. It stops short of describing what the with-course synchronous result contains, which leaves a gap for a tool with zero structured return documentation.
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 compensate. It does well for `course` by spelling out accepted forms (id, short name, or partial name), which the schema's bare string type does not convey. However, `skip_existing` is only implied via "Existing files of the same size are skipped" and the behavior when set to false is never stated.
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 ("Download course files") and clearly splits the two operating modes by presence of `course`. It distinguishes itself from moodle_sync_status by pointing at it as the polling companion, but says nothing to separate it from the sibling moodle_download, which an agent could easily confuse it with.
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?
Gives concrete when-to-use guidance for both branches: pass a course to download one course synchronously, omit it to bulk-download PDFs from all current courses in the background, and call moodle_sync_status to get the eventual result. It names the alternative tool for the async path, but offers no exclusion guidance versus moodle_download or moodle_browse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_sync_statusA
Progress of a sync started by moodle_sync without a course: {"running": true, "progress": …} while it runs, then the result (a summary, files per course and any errors).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the polling behavior (progress while running) and the final return contents (summary, files per course, errors), which is useful. However, it omits authentication requirements, rate limits, and whether the call blocks, which are important for a status tool with no annotation coverage.
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 sentence that front-loads the purpose and then describes the return shape. It is dense but has no wasted words. Slightly run-on, but acceptable.
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 annotations, the description compensates reasonably by describing the progress object and final result contents including errors. It doesn't cover authentication or polling frequency, but for a zero-parameter status endpoint it is mostly 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?
The tool takes zero parameters, so the baseline is 4. No parameter details are needed, and the description correctly does not introduce any.
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 purpose: reporting progress and final result of a sync started by moodle_sync without a course. It names the sibling that creates the sync and distinguishes itself as the status endpoint. Lacks explicit differentiation from moodle_status, but clearly differentiates from moodle_sync.
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?
Gives a clear condition for when to use it: after starting a sync via moodle_sync without a course. Doesn't explicitly state when not to use it or what to use if a course was specified, but the context is sufficient for an agent to infer usage.
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.
8 tool updates
v0.2.0- First observed
moodle_browse - First observed
moodle_courses - First observed
moodle_deadlines - First observed
moodle_download - First observed
moodle_login - First observed
moodle_status - First observed
moodle_sync - First observed
moodle_sync_status
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: login, status, courses, browse, deadlines, download, sync, and sync progress. The only mild overlap is moodle_download (single file) vs moodle_sync (bulk download), but the descriptions make the boundary clear.
All tools use a consistent snake_case moodle_ prefix with predictable noun/verb naming. The moodle_sync / moodle_sync_status pairing is a standard and intuitive convention for a long-running operation.
Eight tools is well-scoped for a Moodle client covering auth, discovery, and download workflows. Each tool earns its place with no redundant or filler entries.
The surface covers the full browse-and-download lifecycle including auth, session check, course listing, content browsing, deadlines, and bulk sync. It lacks write-side operations like assignment submission or grade retrieval, but for its apparent read/download focus the coverage is solid.
Maintenance
Related MCP Connectors
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Your personal data for AI — Telegram, bank, courses, Zoom & more, scoped to you.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to access Canvas LMS academic data such as courses, assignments, grades, and events via MCP tools.-
- AlicenseNot gradedqualityBmaintenanceConnects Canvas LMS (and other school platforms) to AI agents, enabling them to monitor assignments, grades, announcements, and changes, then rank work, brief students, or build study plans via MCP tools.1MIT
- AlicenseAqualityBmaintenanceGives Claude, Codex, Cursor and any other MCP client read access to your courses, content, files, grades, deadlines, announcements and discussions, using your own browser session.3132 npm2MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to browse your own university courses by downloading files, slides, announcements, deadlines, grades and lecture transcripts to your machine, then answering questions and searching across them through MCP tools. It logs in with your own account and refreshes only what changed.MIT