mcp-sliit-courseweb
Allows AI agents to interact with SLIIT Courseweb (Moodle), enabling them to list enrolled modules, sync course materials and lecture slides, retrieve assignment deadlines, and access exam marksheets without manual browsing.
SLIIT Courseweb MCP Server ๐
Bridge SLIIT Courseweb (Moodle) into Claude Code, Antigravity, OpenAI Codex, ChatGPT & Cursor.
๐ฌ Quick Video Showcase
Watch Claude Code autonomously parse a 103-page PDF exam marksheet, locate a student's grade breakdown, and delta-sync lecture slides without opening a single browser tab:
Compressed 720p 60fps faststart preview (600 KB). Captured live running in Claude Code CLI.
Related MCP server: School MCP
๐ก Why This Exists
SLIIT Courseweb is the central hub for lecture materials, lab sheets, and assignment submissions. But every semester, students face the same bottlenecks:
โณ Slow loading during peak hours: Courseweb crawls right before assignment submission deadlines.
๐ 100+ Page Exam Marksheet PDFs: Midterm and final marks are released as massive multi-page PDFs where finding your IT number is a chore.
๐ฆ Manual Download Fatigue: Downloading 14 weeks of lecture slides, lab exercises, and tutorial answers requires clicking dozens of links.
โฐ Missed Deadlines: Assignment cutoffs are scattered across individual course tabs.
The Solution: An open-source Model Context Protocol (MCP) server that allows your AI agent (Claude Code, Cursor, Antigravity, Windsurf) to query Courseweb directly. Your agent acts as your personal academic assistant.
โก 1-Prompt Agent Self-Installation
You don't need to manually edit JSON configuration files. Just copy the prompt for your favorite AI assistant, paste it into the agent chat, and let the agent configure itself!
๐ง Claude Code CLI
Please configure the SLIIT Courseweb MCP server for Claude Code CLI:
1. Run: git clone https://github.com/kesaruhasun/mcp-sliit-courseweb.git
2. Inside the folder run: npm install && npm run build
3. Add to Claude Code MCP registry:
claude mcp add sliit_courseweb node "$(pwd)/build/index.js" -e HEADLESS=true
4. Run `claude mcp list` to verify the server is connected.
5. Remind me to perform `interactive_login` if my session token is expired.๐ฆ Google Antigravity
Antigravity, please self-configure the SLIIT Courseweb MCP server:
1. Clone `https://github.com/kesaruhasun/mcp-sliit-courseweb.git` or inspect the local repo.
2. Run `npm install` and compile TypeScript using `npm run build`.
3. Add the `sliit_courseweb` definition into your MCP configuration (`mcp_config.json`) pointing `command` to `node` and `args` to the absolute path of `build/index.js`.
4. Confirm tool schema registration for `list_modules`, `sync_module`, and `get_deadlines`.
5. Guide me on running `interactive_login` or injecting `MoodleSession` via `set_session_cookie`.๐ข OpenAI Codex
You are OpenAI Codex. Please install and self-configure the SLIIT Courseweb MCP server in this workspace:
1. Clone the repository if not already present:
git clone https://github.com/kesaruhasun/mcp-sliit-courseweb.git
2. Navigate into `mcp-sliit-courseweb` and compile:
npm install && npm run build
3. Register the MCP server via Codex CLI:
codex mcp add sliit_courseweb --env HEADLESS=true -- node "$(pwd)/mcp-sliit-courseweb/build/index.js"
(or configure [mcp_servers.sliit_courseweb] in ~/.codex/config.toml or .codex/config.toml)
4. Confirm tool schema registration for `list_modules`, `get_deadlines`, and `sync_module`.
5. Guide me on running `interactive_login` for Microsoft MFA or injecting `MoodleSession` via `set_session_cookie`.๐ฌ ChatGPT Desktop App (macOS & Windows)
Connect SLIIT Courseweb MCP directly to ChatGPT Desktop App:
Clone & compile:
git clone https://github.com/kesaruhasun/mcp-sliit-courseweb.git cd mcp-sliit-courseweb && npm install && npm run buildStart the local SSE bridge (supports ChatGPT remote MCP protocol):
npx -y supergateway --port 8000 -- node build/index.jsIn ChatGPT Desktop App:
Go to Settings โ Connectors (or Developer Mode).
Toggle Developer Mode ON and click "Add MCP Server".
Server Name:
SLIIT CoursewebServer URL:
http://localhost:8000/sse
In any chat, prompt ChatGPT: "List my enrolled Courseweb modules and check any upcoming deadlines."
โฌ Cursor Composer / IDE
You are my Cursor Composer agent. Please install and self-configure the SLIIT Courseweb MCP server in this workspace:
1. Clone the repository if not present:
git clone https://github.com/kesaruhasun/mcp-sliit-courseweb.git
2. Navigate into `mcp-sliit-courseweb` and compile:
npm install && npm run build
3. Create or update `.cursor/mcp.json` in the workspace root with:
{
"mcpServers": {
"sliit_courseweb": {
"command": "node",
"args": ["${workspaceFolder}/mcp-sliit-courseweb/build/index.js"],
"env": {
"HEADLESS": "true"
}
}
}
}
4. Confirm tool schema registration for `list_modules`, `get_deadlines`, and `sync_module`.
5. Guide me on running `interactive_login` for Microsoft MFA or injecting `MoodleSession` via `set_session_cookie`.๐ฉ Windsurf Cascade
Cascade, please install the SLIIT Courseweb MCP server for this session:
1. Clone `https://github.com/kesaruhasun/mcp-sliit-courseweb.git` and compile: `npm install && npm run build`.
2. Add the configuration to `~/.codeium/windsurf/mcp_config.json`:
{
"mcpServers": {
"sliit_courseweb": {
"command": "node",
"args": ["<ABSOLUTE_PATH_TO_BUILD_INDEX_JS>"],
"env": { "HEADLESS": "true" }
}
}
}
3. Restart your MCP connection and test by running `get_deadlines`.๐ช Claude Desktop
Add this snippet to your claude_desktop_config.json (~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"sliit_courseweb": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/mcp-sliit-courseweb/build/index.js"],
"env": {
"SLIIT_USERNAME": "ITxxxxxxxx",
"SLIIT_PASSWORD": "your_password",
"HEADLESS": "true"
}
}
}
}๐ Login Methods
Courseweb is protected by SLIIT's Microsoft Office 365 Single Sign-On (SSO) and Multi-Factor Authentication (MFA). This MCP server supports two seamless login strategies:
Method 1: Interactive Browser Login (Recommended for Local Machines)
Ideal for macOS, Windows, or Linux with a desktop GUI:
In your agent chat, run the
interactive_logintool:"Run interactive_login to sign into Courseweb."A Playwright Chromium browser window pops up, navigates to
courseweb.sliit.lk, and automatically fills your email and password.Complete the Microsoft Authenticator 2-digit number match on your phone.
Once authenticated, the browser captures your session and securely persists cookies to
storage_state.json. All future requests run 100% headlessly in the background!
Method 2: Session ID / Cookie Injection (Headless Cloud & VMs)
Ideal for headless Linux servers, GitHub Codespaces, or remote VMs where opening a browser window is not possible:
Open your laptop browser, navigate to courseweb.sliit.lk, and log in.
Press
F12(orCmd + Option + I) to open Developer Tools โ Console.Paste this one-liner and press Enter to copy your active session cookie:
copy(document.cookie.split('; ').find(row => row.startsWith('MoodleSession=')).split('=')[1])Tell your AI assistant:
"Use set_session_cookie with this value: <PASTE_COOKIE_HERE>"You're immediately logged in without any browser UI!
๐ ๏ธ Complete MCP Tool Reference
This server provides 9 specialized tools exposed via the Model Context Protocol:
Tool | Purpose | Key Parameters | Example Prompt |
| Lists all enrolled modules, codes, and Moodle course IDs | None | "What modules am I registered for this semester?" |
| Scrapes upcoming assignment submission deadlines and calendar events | None | "What assignments are due in the next 7 days?" |
| Fetches course notices, exam schedules, and lecturer broadcasts |
| "Did the Distributed Systems lecturer post any exam notices?" |
| Detects newly posted files or modified sections in a course |
| "Check if any new tutorial answers were uploaded to Software Architecture." |
| Delta-downloads all slides, lab sheets, and materials (MD5 hashed) |
| "Download all slides from Computer Networks to ./slides/networks." |
| Downloads a specific file or syllabus document directly |
| "Download the lecture 4 PDF from this URL." |
| Inspects submission status, grading grade, and marker comments |
| "Did my SE4020 assignment 1 get graded yet?" |
| Scrapes any Courseweb URL into clean, LLM-ready markdown |
| "Scrape the main page for module 14202 and summarize the syllabus." |
| Launches Playwright browser for Microsoft SSO & MFA approval | None | "Run interactive login." |
| Manually injects |
| "Set Moodle session cookie to 9a8b7c6d5e4f..." |
๐ Student Superpowers
Superpower 1: 103-Page Exam Marksheet PDF Search
Instead of waiting 5 minutes for a 20MB PDF to render in your browser and searching line by line, let your agent download and parse it:
Prompt: "Check Courseweb for the Software Engineering Midterm marks PDF. Download it and find the score for IT21000000. Give me my class percentile and average."
Superpower 2: Intelligent Delta File Syncing
Never download duplicate files again. sync_module computes MD5 checksums for every file, creating local mirrors and downloading only fresh slides:
Prompt: "Sync all lecture materials for Machine Learning to ./ML_Lectures. Only download newly uploaded slides."
Superpower 3: Autonomous Weekly Academic Standup
Prompt: "List all assignments due across all my modules this Sunday. Generate a priority to-do list with time estimates."
โ๏ธ Manual Build & Development
If you prefer building and running from source manually:
# 1. Clone repository
git clone https://github.com/kesaruhasun/mcp-sliit-courseweb.git
cd mcp-sliit-courseweb
# 2. Install dependencies
npm install
# 3. Compile TypeScript
npm run build
# 4. Configure environment
cp .env.example .env
# Edit .env with your SLIIT credentials:
# SLIIT_USERNAME=ITxxxxxxxx
# SLIIT_PASSWORD=your_password
# HEADLESS=true
# 5. Start MCP Server (stdio mode)
node build/index.js๐ Live Landing Page & Multilingual Support
Check out the interactive web portal at https://sliitcoursewebmcp.kesaru.me.
๐ฑ๐ฐ Spoken Sinhala (เทเทเถเทเถฝ): Explains MCP and Courseweb automation in casual student terms with Apple SF-style Sinhala typography (
Gemunu Libre/Sinhala MN).๐ฑ๐ฐ Spoken Tamil (เฎคเฎฎเฎฟเฎดเฏ): Native Sri Lankan Tamil explanations for students across all campuses.
โก Interactive Prompt Builder: Instant copy-paste blocks for Claude, Antigravity, Cursor, and Windsurf.
๐ฅ Live Video Player: Stream the 60fps launch showcase directly in your browser.
๐ก๏ธ Fair Use & Institutional Disclaimer
This project is an independent open-source utility developed for personal educational efficiency and is not officially affiliated with or endorsed by SLIIT.
The server uses polite request throttling and intelligent MD5 caching to avoid generating unnecessary server load on campus infrastructure.
Users are responsible for keeping their institutional credentials secure and complying with campus IT acceptable use policies.
๐จโ๐ป Author & Contributions
Built with โค๏ธ by Kesaru Hasun.
๐ Portfolio & Blog: kesaru.me
๐ GitHub: @kesaruhasun
๐ฌ Questions or bug reports? Open an Issue or submit a Pull Request!
Available Tools
10 toolscheck_assignment_statusC
Check the submission status, grading status, and feedback for a specific assignment
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The Moodle assignment URL (e.g. mod/assign/view.php?id=123) |
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 reveals the categories of data returned, but says nothing about authentication (notable given siblings like interactive_login and set_session_cookie), rate limits, or whether the caller must be the student or a teacher. For a zero-annotation tool this is a real gap.
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 efficient sentence with the verb and the three checked aspects front-loaded and no filler. It is appropriately sized, though its brevity leaves the transparency gaps noted elsewhere.
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 one simple parameter and no output schema, the description minimally suffices to know what the tool returns conceptually. But with no annotations, it omits auth requirements and caller-role expectations that an agent would need before calling it.
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 100%, so the single url parameter and its Moodle format example are already fully documented in the schema. The description adds no syntax or format detail beyond that, which makes the baseline 3 appropriate.
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 a specific verb (Check) and enumerates the resources inspected: submission status, grading status, and feedback for a specific assignment. This is far more concrete than a tautology and clearly distinct from siblings like list_modules or get_deadlines. It does not, however, explicitly contrast itself with any sibling 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?
There is no statement of when to use this tool versus alternatives, nor any prerequisites or exclusions. The use case can be inferred from the purpose, but nothing in the text guides tool selection among the nine siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_module_updatesC
Check for new materials or announcements in a specific module
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The ID of the course to check |
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 doesn't say whether this is a read-only check, whether 'checking' mutates a seen/unread state, whether it requires authentication, or what the result contains. 'Check for new' implies read but leaves mutation semantics ambiguous.
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 filler. It is appropriately sized, though it wastes the opportunity to disambiguate against siblings in the same breath.
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 tool with no annotations and no output schema, the description should clarify return content (e.g., new materials vs. announcements) and its relationship to get_announcements. Instead it leaves the module-vs-course scope mismatch unresolved, so the agent cannot be confident about what it will get back.
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 100% and the single courseId parameter is fully documented in the schema, so the baseline is 3. The description adds no syntax or format detail, and its mention of 'module' conflicts with the course-level parameter, which adds mild confusion rather than clarity.
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 clear verb+resource ('check' + 'new materials or announcements in a module'), so the agent knows the general intent. However, it does not differentiate from the sibling get_announcements, and it says 'a specific module' while the only parameter is courseId, blurring the scope of what is actually checked.
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 guidance is given. With siblings like get_announcements, sync_module, and list_modules present, the agent has no stated criteria for choosing this tool over those, and no prerequisites (auth, session) are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileC
Download a file from Courseweb (e.g. PDFs, lab sheets) given its resource URL
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The Moodle resource URL to download from | |
| outputDir | No | Optional: Directory to save the file. Defaults to ./downloads |
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 and falls short. It never states that the tool writes to local disk, whether an existing file is overwritten, what authentication is required, or what happens for non-file URLs. Only the schema hints at the destination directory.
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 zero filler; the verb, resource, examples, and required input all appear immediately.
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 annotations and no output schema, the description should explain the tool's side effects and result (e.g., returns a saved file path) and any auth or overwrite behavior. None of that is present, leaving significant gaps for a write-to-disk operation.
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 100%, so both url and outputDir are already documented in the schema, making 3 the baseline. The description reinforces that url is a Moodle resource URL and clarifies the file types expected, but adds no format or syntax detail beyond the schema.
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 (Download) and resource (file from Courseweb) and clarifies scope with examples (PDFs, lab sheets) plus the required input (resource URL). It does not, however, distinguish itself from a plausible sibling like scrape_page, which could also fetch content from Courseweb.
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 guidance on when to prefer this over scrape_page, nor any prerequisites such as needing an authenticated session first (siblings set_session_cookie and interactive_login suggest auth is a real concern). Usage is only implied by the phrase 'given its resource URL'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_announcementsB
Get general site announcements from Courseweb
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and 'Get' is the only signal that this is a read. It says nothing about authentication needs, caching, pagination, or whether announcements are site-wide versus per-course, so an agent cannot predict behavior beyond the trivial read implication.
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 filler or repetition. It is efficient, though it is so terse that it omits useful context rather than being verbose.
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 read tool with no output schema, the description is minimally adequate but omits what an announcement actually contains (title, date, body) and what 'general' scopes to. With no annotations to fall back on, a bit more behavioral context would be warranted.
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 per the rubric this is a baseline 4. The description has no parameters to explain and does not need to add anything here.
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 clear verb ('Get') and resource ('general site announcements from Courseweb'), which is enough to distinguish it from siblings like get_deadlines and list_modules. It does not, however, explicitly contrast itself with any sibling or clarify the scope of 'general' (site-wide vs. course-specific).
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 when-to-use guidance, no mention of prerequisites (e.g., whether a session/login is required), and no alternative named. The agent is left to infer that this is simply the announcements fetcher.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deadlinesB
Fetch all upcoming assignment deadlines and events from Courseweb
| 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 entire behavioral burden. It does not say whether a Courseweb session/cookie is required (siblings set_session_cookie and interactive_login suggest authentication is a real concern), how far ahead 'upcoming' reaches, whether results span all courses, or how they are ordered, so an agent cannot predict the call's behavior.
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 that names the action, the data, and the source with no filler. It is efficient, though the brevity is partly 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 parameters, no output schema, and no annotations, the description is the sole carrier of context. It covers what is returned at a high level but leaves the time window of 'upcoming', authentication requirements, and result shape unspecified, which is adequate but not complete for a data-fetching tool.
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 and the schema is an empty object, so there is nothing for the description to compensate for. Baseline 4 applies; no parameter semantics are missing.
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 (Fetch) plus a clear resource (upcoming assignment deadlines and events) and even names the source system, Courseweb. It is distinguishable from siblings like get_announcements or check_assignment_status by the 'deadlines and events' framing, but it never explicitly addresses those near-neighbors, so it falls short of a 5.
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 only usage signal is the word 'upcoming', which implies a forward-looking planning use case. There is no statement of when to prefer this over get_announcements or check_assignment_status, no prerequisites, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interactive_loginA
Open a browser window to manually log in to SLIIT Courseweb (useful for MFA)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a real behavioral trait beyond the empty schema: this is interactive, opens a browser, and requires manual user action, which matters for MFA. However it says nothing about what happens after login (whether a session is persisted, whether the call blocks, timeouts, or what the caller must do next).
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 that states the action, the target, and the motivating condition with zero waste.
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-param tool with no output schema the description is nearly sufficient, but given the sibling set_session_cookie it should explain the relationship (does this establish the session used by the other tools?) and the expected post-login flow. That connective information is missing.
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 and schema coverage is 100%, so there is nothing for the description to clarify; baseline 4 applies.
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: it opens a browser window so the user can manually log in to SLIIT Courseweb. That clearly distinguishes it from siblings like set_session_cookie or scrape_page, though it never names the sibling it complements.
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 parenthetical '(useful for MFA)' implies the situation that calls for this tool, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g., when a non-interactive cookie/session path is preferred).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modulesB
List all enrolled modules on SLIIT Courseweb
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it discloses almost nothing: not whether an authenticated session is required, not whether the result is paginated or cached, not what happens if the user is not enrolled in any modules.
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 filler or redundant restatement of the tool name. Every word 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 no output schema and no annotations, the description should at minimum cover the auth/session prerequisite and what the returned module list looks like. Neither is addressed, leaving the agent to infer setup steps from sibling tool names.
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 there is nothing for the description to disambiguate; the baseline of 4 applies. The stated scope ('enrolled modules') is the only semantic content and it is consistent with the empty schema.
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 ('modules') with scope ('enrolled') and platform ('SLIIT Courseweb'), so it is distinguishable from get_announcements and get_deadlines. It does not, however, differentiate itself from near-neighbours like check_module_updates or sync_module.
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 when-to-use guidance and no alternatives named, even though sync_module and check_module_updates operate on the same resource. The presence of set_session_cookie and interactive_login siblings implies an auth prerequisite that is never mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrape_pageB
Scrape the text content of any Courseweb URL to investigate the layout
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to scrape |
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 says it returns text content (implying a read), but never states whether authentication is required (the presence of set_session_cookie and interactive_login siblings strongly suggests it is), whether the scrape is rate-limited, how dynamic content is handled, or what happens 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?
A single short sentence with the verb and resource front-loaded and no redundancy. The 'investigate the layout' clause is the only slightly expendable element.
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 one-parameter tool with no output schema, the description adequately conveys the return type (text content). However, with no annotations and a sibling set centered on sessions and logins, the omission of auth expectations leaves a real gap for an agent deciding whether it can call this directly.
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 100% with a single documented url parameter, so the baseline is 3. The description adds only the qualifier 'any Courseweb URL', which scopes the domain but adds no format or syntax detail beyond the schema.
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 (scrape) and resource (text content of a Courseweb URL), which distinguishes it from download_file and the login/session siblings. The trailing phrase 'to investigate the layout' muddies the intent slightly by framing it as a debugging aid rather than a content-retrieval 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?
'To investigate the layout' implies a use case but gives no guidance on when to prefer this over download_file or the structured siblings like get_announcements. No exclusions, prerequisites, or alternatives are named, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_session_cookieA
Manually set the MoodleSession cookie (useful for headless VMs where you can't use a browser)
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | The value of the 'MoodleSession' cookie from your browser's DevTools |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It does add real behavioral context by explaining this is a manual substitute for browser login, but it omits key traits: whether it overwrites an existing cookie, whether the value is validated, what happens on an invalid/expired cookie, and whether the session persists across 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?
One sentence with a purposeful parenthetical; nothing is padding and the core action is front-loaded before the use-case qualifier.
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 setter with full schema coverage and no output schema, the description covers purpose and scenario adequately. It could be stronger by explicitly relating itself to interactive_login as the alternative auth path and noting error/validation behavior, but the essentials are present.
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 100% and the schema already explains the single 'value' parameter and where to obtain it (DevTools). The description adds no format, validation, or encoding detail beyond the schema, so the baseline of 3 applies.
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 ('set the MoodleSession cookie'), which is unambiguous and distinguishable from list/scrape siblings. The parenthetical about headless VMs further narrows the scenario, though it never names the browser-based alternative (interactive_login) directly.
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 when-to-use condition: headless VMs where a browser isn't available. It implies the alternative (browser-based interactive login) without explicitly naming it or stating exclusions, so it falls just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_moduleC
Bulk download all files (PDFs, lab sheets, etc.) from a specific course module
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The ID of the course to sync (e.g. 8805) | |
| outputDir | No | Optional: Directory to save the files. Defaults to ./downloads |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, yet it omits the key question for a tool named 'sync': whether existing files are skipped, overwritten, or duplicated. It also says nothing about auth/session prerequisites (siblings include set_session_cookie/interactive_login), runtime cost of a bulk download, or rate 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?
One sentence, zero filler, with the operation and target front-loaded. It could have used a few more words to cover sync semantics without becoming bloated.
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 side-effecting download tool with no annotations and no output schema, the description should disclose overwrite behavior and what is returned (count, paths, errors). Those gaps leave an agent unable to predict the effect of repeated invocations.
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 100% โ both courseId and outputDir (with default ./downloads) are fully documented, so baseline is 3. The description's 'PDFs, lab sheets, etc.' describes content types, not parameters, and adds no syntax or format meaning beyond the schema.
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 ('bulk download') and resource ('all files ... from a specific course module'), and the 'bulk' wording implicitly contrasts with the sibling download_file (single file). It never names that sibling explicitly, so differentiation is left to inference.
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 guidance on when to use this rather than download_file, scrape_page, or check_module_updates. An agent must guess whether sync means 'fetch only new/changed files' or 're-download everything'.
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.
10 tool updates
v0.1.0- First observed
check_assignment_status - First observed
check_module_updates - First observed
download_file - First observed
get_announcements - First observed
get_deadlines - First observed
interactive_login - First observed
list_modules - First observed
scrape_page - First observed
set_session_cookie - First observed
sync_module
TDQS
Scored across 10 tools
Most tools have distinct purposes (list_modules vs get_deadlines vs download_file vs sync_module). There is mild overlap between get_announcements (site-wide) and check_module_updates (module-specific), and between download_file (single) and sync_module (bulk), but descriptions clarify the boundaries well enough.
Nearly all tools follow a consistent snake_case verb_noun pattern (list_modules, get_deadlines, check_module_updates, download_file, sync_module, check_assignment_status, set_session_cookie). Only interactive_login deviates slightly (adjective_noun) and the auth-related verbs (set/interactive) differ from the read/download verbs, but the overall style is predictable.
Ten tools is well-scoped for a Courseweb/Moodle student client, covering listing, monitoring, downloading, assignment status, and authentication without redundancy. Each tool appears to earn its place.
The surface covers the core student lifecycle: modules, announcements, updates, deadlines, downloads, assignment status, and two complementary auth paths. Gaps remain (e.g. grades/transcript retrieval, forum/quiz access, search), but these are minor and the core workflow has no dead ends.
Maintenance
Related MCP Connectors
Model Context Protocol server for Studex tools, notifications, and profile integrations
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoโฆ
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseBqualityFmaintenanceA Model Context Protocol server that provides browser automation capabilities using Playwright. This server enables LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment.3214,310 npm5,666MIT
- FlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that helps students manage academic workflows by integrating with Canvas and Gradescope to fetch deadlines, download course materials, and sync with macOS Calendar or Reminders.8-
- AlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server that provides seamless access to Moodle developer documentation from moodledev.io. It enables AI assistants and other MCP clients to search, browse, and retrieve Moodle development documentation with version-specific support.4MIT
- FlicenseAqualityDmaintenanceEnables read-only querying of Moodle as a student, including courses, assignments, grades, forums, and files, using a personal web services token.11-