Skip to main content
Glama

SLIIT Courseweb MCP Server ๐Ÿš€

Bridge SLIIT Courseweb (Moodle) into Claude Code, Antigravity, OpenAI Codex, ChatGPT & Cursor.

MCP Protocol Live Website Node.js TypeScript License: MIT


๐ŸŽฌ 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:

  1. Clone & compile:

    git clone https://github.com/kesaruhasun/mcp-sliit-courseweb.git
    cd mcp-sliit-courseweb && npm install && npm run build
  2. Start the local SSE bridge (supports ChatGPT remote MCP protocol):

    npx -y supergateway --port 8000 -- node build/index.js
  3. In ChatGPT Desktop App:

    • Go to Settings โ†’ Connectors (or Developer Mode).

    • Toggle Developer Mode ON and click "Add MCP Server".

    • Server Name: SLIIT Courseweb

    • Server URL: http://localhost:8000/sse

  4. 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:

Ideal for macOS, Windows, or Linux with a desktop GUI:

  1. In your agent chat, run the interactive_login tool:

    "Run interactive_login to sign into Courseweb."
  2. A Playwright Chromium browser window pops up, navigates to courseweb.sliit.lk, and automatically fills your email and password.

  3. Complete the Microsoft Authenticator 2-digit number match on your phone.

  4. Once authenticated, the browser captures your session and securely persists cookies to storage_state.json. All future requests run 100% headlessly in the background!

Ideal for headless Linux servers, GitHub Codespaces, or remote VMs where opening a browser window is not possible:

  1. Open your laptop browser, navigate to courseweb.sliit.lk, and log in.

  2. Press F12 (or Cmd + Option + I) to open Developer Tools โ†’ Console.

  3. Paste this one-liner and press Enter to copy your active session cookie:

    copy(document.cookie.split('; ').find(row => row.startsWith('MoodleSession=')).split('=')[1])
  4. Tell your AI assistant:

    "Use set_session_cookie with this value: <PASTE_COOKIE_HERE>"
  5. 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

list_modules

Lists all enrolled modules, codes, and Moodle course IDs

None

"What modules am I registered for this semester?"

get_deadlines

Scrapes upcoming assignment submission deadlines and calendar events

None

"What assignments are due in the next 7 days?"

get_announcements

Fetches course notices, exam schedules, and lecturer broadcasts

courseId (optional)

"Did the Distributed Systems lecturer post any exam notices?"

check_module_updates

Detects newly posted files or modified sections in a course

courseId

"Check if any new tutorial answers were uploaded to Software Architecture."

sync_module

Delta-downloads all slides, lab sheets, and materials (MD5 hashed)

courseId, outputDir

"Download all slides from Computer Networks to ./slides/networks."

download_file

Downloads a specific file or syllabus document directly

url, outputPath

"Download the lecture 4 PDF from this URL."

check_assignment_status

Inspects submission status, grading grade, and marker comments

assignmentId

"Did my SE4020 assignment 1 get graded yet?"

scrape_page

Scrapes any Courseweb URL into clean, LLM-ready markdown

url

"Scrape the main page for module 14202 and summarize the syllabus."

interactive_login

Launches Playwright browser for Microsoft SSO & MFA approval

None

"Run interactive login."

set_session_cookie

Manually injects MoodleSession cookie for headless environments

cookie

"Set Moodle session cookie to 9a8b7c6d5e4f..."


๐ŸŒŸ Student Superpowers

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 tools
check_assignment_statusC

Check the submission status, grading status, and feedback for a specific assignment

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe Moodle assignment URL (e.g. mod/assign/view.php?id=123)

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe ID of the course to check

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe Moodle resource URL to download from
outputDirNoOptional: Directory to save the file. Defaults to ./downloads

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to scrape

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

sync_moduleC

Bulk download all files (PDFs, lab sheets, etc.) from a specific course module

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe ID of the course to sync (e.g. 8805)
outputDirNoOptional: Directory to save the files. Defaults to ./downloads

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 10 tool updatesv0.1.0
    • First observedcheck_assignment_status
    • First observedcheck_module_updates
    • First observeddownload_file
    • First observedget_announcements
    • First observedget_deadlines
    • First observedinteractive_login
    • First observedlist_modules
    • First observedscrape_page
    • First observedset_session_cookie
    • First observedsync_module

TDQS

B3.3/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    A 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.
    32
    14,310 npm
    5,666
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A 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.
    4
    MIT