Skip to main content
Glama

Monash Study Kit

Type Tech Release PyPI License Moodle/Ed read-only Docs

CI Monash Study Kit MCP server – quality and maintenance score on Glama

English · 中文

Connect Monash Moodle and Ed to the AI app on your computer (Claude, Codex, Cursor, VS Code and others), then just ask:

  • "What's due this week?": Moodle deadlines, assignments you may have missed, unfinished Ed lessons, latest announcements

  • "Anything new on Ed? Has anyone replied to my question?"

  • "Which week of FIT2102 covered monads? Which slide deck, which page?"

  • "What does the A2 spec ask for?", "What's my current grade in FIT2109?"

  • "Quiz me on FIT2109 week 3." In apps that support MCP Apps, to-dos, lesson progress and quiz questions also show up as small panels you can click

You can also run monash semester --days 7 for a combined private week view of Moodle deadlines, Ed lessons/replies and any locally cached attendance records. Add --ics to export a private semester.ics into the Study Kit data directory, or --ics /path/to/file.ics to choose a path. This is a one-time calendar snapshot, not a live subscription; deadline times must be verified with Moodle. No personal semester data is uploaded to Monash Hub.

By default, synced course files, login state and the local database stay on your own computer. Results returned by MCP tools go to the AI app you connect; its privacy policy applies. Optional remote access sends those results through the AI provider's connection, not through a server run by this project's maintainer. All Moodle and Ed tools are read-only: they never submit assignments, attempt quizzes or post on Ed. The optional school mail and attendance parts can draft mail, change labels or check you in, and only after you confirm each action.

Built for Monash Malaysia (times are handled as UTC+8); Australian campuses work too, see the FAQ.

Current release: 1.11.2 · Whole-course materials

Export course materials without an AI app. Install or upgrade, sign in and select your units, then run:

uv tool install --upgrade 'monash-study-kit[gmail]'
monash setup
monash google login  # only for course-linked Google files; separate read-only consent
monash export FIT1043 --sync --format both --to "./exports"

Replace FIT1043 with your unit code. Packages include Moodle files, Pages, Books, assignment instructions, Ed Lessons and accessible Google files; personal submissions, grades, mail and attendance are excluded. Check the package README for omissions. Version 1.11.2 fixes Windows PDF browser cold-start retries.

Actual 1.11.2 offline export and ZIP contents using synthetic course data

This screenshot comes from a real monash export run against synthetic local data, deliberately including a missing attachment and an unauthorized Google link to demonstrate omissions. No real account or course content is used. Omit --sync to export existing local data; sync and export again to retry missing materials. See the whole-course export guide.

What monash todo prints: Moodle deadlines, a possibly missed assignment, Ed lessons not started, new course files, announcements and unread replies

The picture is real output of monash todo against a database filled with made-up units, files and posts. Your AI app reads the same data through the MCP tools. Guide with more pictures: docs.secureview.tech/study-kit.


For the original v1.1 security review and the 1.5 feature review checklist, see security documentation. The earlier review does not automatically certify features added later.

Related MCP server: isu-moodle-mcp

Multiple accounts / course materials only (1.10.0)

Without --profile, or with --profile default, the existing default account keeps its directory rules and features. Named accounts store separate databases, files, credentials and browser sessions under <default data home>/profiles/<name>/. The base still follows MONASH_KIT_HOME > location.json > the platform default. default is reserved; other names must match [a-z0-9][a-z0-9_-]{0,31}.

monash --profile alice setup             # login and course selection only
monash --profile alice google login      # optional; drive.readonly only
monash --profile alice sync
monash --profile=alice export FIT1045 --sync
monash --profile alice mcp               # local stdio, materials tools only
monash profile list                      # manage from the default account
monash profile remove alice              # confirm, clear logins, keep materials
monash profile remove alice --all --yes   # also remove databases and materials

MONASH_KIT_PROFILE=alice also works; the command-line selection wins. Selection happens before importing service modules; an initialized Python process cannot switch accounts. Named profiles ignore individual directory overrides (MONASH_KIT_DATA, MONASH_KIT_SECRETS, MONASH_KIT_FILES, MONASH_KIT_ED_DATA, MONASH_KIT_ED_TOKEN, ED_TOKEN, and files_dir) to avoid sharing the default account's paths or credentials. Directories use mode 700 where supported.

Named profiles stay local: remote, connect, setup claude, and move are refused, and setup skips AI configuration. Sessions cannot be handed to remote services or AI configuration. Local stdio mcp can still be run manually. Profiles move together with the default data home rather than independently.

Named profiles force materials_only=true, even if settings or environment variables request false. The default account starts with false and can enable it with monash config materials_only true. While the mode is active, config can inspect this setting but cannot change it. To exit on the default account, temporarily override MONASH_KIT_MATERIALS_ONLY=false, then save false; named profiles cannot use this override.

Materials sync keeps Moodle files, Pages, Books, assignment descriptions and visible grading criteria, folders, linked Google files and Ed Lessons. It still reads Ed course lists to match unit codes, but never syncs discussions or replies. Gmail background sync, attendance reads and keepalive are skipped; Moodle login does not obtain a personal calendar link. doctor --deep checks materials and the search index only, skipping deadlines, submission status, grades and posts. Existing cached data is not deleted when enabling the mode.

Complete command policy in materials mode (refused commands return exit code 1):

  • Allowed: setup (login and course selection), login moodle/ed, google login/status/logout, sync, export, courses, status, doctor, open, library, config, grep, help, mcp; ed export/lessons/read/quiz; moodle ls/get; profile list/remove from the default account.

  • Config cannot change active materials_only; named profiles cannot change files_dir. moodle get only accepts course-resource/file entry points, rejecting grade pages and submission files.

  • Refused: all gmail and attendance commands; todo, due, semester, media, uninstall, update, connect, move, all remote, setup claude; ed courses/threads/search/show/new/following; moodle overview/due/calendar/assignments/grades/news/search/find/open/alerts/messages. New commands require an explicit allowlist entry.

The MCP tool list is exactly list_files, read_file, search_content, get_ed_lessons, export_ed_lessons; use_ed=false removes the last two. Other tools and their legacy aliases fail when called. Export writes a local zip without changing upstream course data and retains its local-write MCP annotation. Personal study prompts are unavailable. There is no arbitrary Drive browsing or search command/tool: Google exports only follow course links during sync.

profile list checks only credential-file presence and disk usage, never reading or printing credential contents. Removal first revokes the target profile's Drive and Gmail Google OAuth authorizations in order. Any revocation failure stops removal and preserves every local file for a retry; an earlier successful remote revocation cannot be undone. Once all revocations succeed, secrets/, browser-profile/ and attendance-browser/ are removed. Only --all removes the complete profile, including materials and databases. The default account and other profiles are untouched; Moodle receives no logout or other request. Ed API tokens have no revocation interface here: manually delete them at Ed API tokens.

1.9.0: more complete course exports

Moodle Pages, Book chapters, assignment descriptions and visible rubrics / marking guides are saved as Markdown. Moodle images are stored in course assets/ by content hash, and internal links to Page, Resource, Folder and Book activities are followed. Folder downloads preserve original names, subdirectories and case, reuse files for seven days, and fall back to individual downloads. Missing notebook images, case mismatches, empty pages and hidden grading criteria are explained in the index.

Ed Lessons document / code images hosted on edusercontent.com are cached locally, deduplicated by content and limited to 200 MB each. Failed images keep their original URL and an error record. Both Ed-only and whole-unit exports include assets/ with working relative references.

Google Slides and Docs export as PDF, Sheets as XLSX, and ordinary Drive files retain their format. Only file links found in Moodle and Ed Lessons are processed; Google Forms cannot be exported. Existing exports are reused while the file remains on disk. Successful file links disappear from generated link lists; failures retain their URL and a Chinese reason in the index.

uv tool install --reinstall 'monash-study-kit[gmail]'
monash google login                  # bundled desktop OAuth client
monash google login --client client.json
monash google status
monash config google_docs_format docx # default: pdf; Google Docs only
monash sync FIT1045 --refresh-google  # force Google exports to refresh
monash export FIT1045 --sync --json  # sync this Moodle unit, then matching Ed units
monash google logout                 # revoke first, then remove the local token

The bundled OAuth client is published but not verified by Google: on first authorization Google shows “Google hasn't verified this app”; choose Advanced → Go to Monash Student MCP (unsafe) to continue. Google caps unverified apps at 100 users, and a school-managed account may be blocked by its admins (Google links then stay as links, with the reason in the index). Google classifies drive.readonly as a restricted scope. It permits reading Drive files; this tool only downloads files linked from courses and does not enumerate your Drive. Google authorization shares the optional [gmail] dependency, but uses an independent flow and secrets/google-drive-token.json under the data home (MONASH_KIT_SECRETS can override the directory). Gmail authorization and gmail-token.json are unchanged. Credentials stay in the terminal / browser authorization flow; never paste them into chat.

Downloads use read-only GET requests. For Drive export-size or administrator restrictions, a fallback tries the existing Google session in the dedicated login browser. Cookies are used only in memory, never logged or separately saved, and redirects outside Google's domains stop. The fallback may still be blocked by policy; failures keep the original link and explain why. Missing authorization points to monash google login. Moodle Page, Resource and assignment view.php requests still record a view. Normal folder downloads and Book print requests avoid their view.php; the individual-file fallback must open the folder page and records a view.

monash export <unit> now exports Markdown body pages, link lists, quizzes and the index as PDF by default, alongside the original course files. Install Chrome, Edge or Brave to generate PDFs; if no browser is found, the export falls back to Markdown and explains this in the index and terminal. Use --format both to include PDF and Markdown, or --format md for Markdown only. For example, monash config export_format both saves PDF and Markdown as the default. Synced Markdown stays unchanged on your computer for AI, search and MCP. PDF generation runs offline in a fresh temporary browser profile, embeds only local exported images and omits remote images (keeping their alt text). PDFs are cached under data/pdf-cache/ (up to 500 MB); --json includes pdf.generated, pdf.cached and pdf.skipped_reason. monash ed export keeps its existing behavior.

Every sync checks newly discovered Ed units against tracked Moodle unit codes, including archived units and combined codes such as FIT1045/FIT1053; later user tracking choices are preserved. monash export <unit> --sync refreshes Moodle first, then the matching Ed Lessons (not forum threads), before exporting; --refresh-google also re-exports Google files. Run in a terminal, monash export first opens the system folder picker to choose where to save (defaulting to your last choice, else Downloads) and then starts; --to <folder> or --no-ask skip the dialog. It prints the destination and PDF progress as it goes. Ordinary exports use only local data. The README index includes all omission notes and failed Ed images, plus counts of link lists, remote Markdown images, Google links, successful exports and failures grouped by reason; --json exposes the same counts in statistics.

New tests use synthetic HTML / JSON, fake clients and mocked HTTP, with no real account requests. Ed code-challenge workspace downloads still require a real read-only response to establish the interface and are excluded, as are multi-account profiles.

Two parts, one codebase

The same core (login, sync, queries) serves two kinds of "users":

MCP: the interface for your AI app. Moodle and Ed both sit behind Okta + MFA, so the AI cannot get in by itself. The MCP server lets it look things up mid-conversation (tools such as get_study_todo, search_content, list_ed_updates):

  • Answers come from real data: deadlines, announcements and grades are fetched live, with sources such as "Workshop 5 Slides, page 25".

  • Both platforms at once: one "what do I need to do this week" checks Moodle deadlines, unfinished Ed lessons and announcements from both.

  • No manual copying: no downloading PDFs and re-uploading them. The AI finds the right file and reads only the pages it needs, saving time and usage.

  • Natural follow-ups: "What does the A2 spec require?" "Explain that week's functor material using the lecture notes."

CLI (the monash command): the interface for humans.

  1. Things only a person can do: installation, passing MFA in the login window, pasting the Ed token (tokens should never go through a chat, so they are only entered in the terminal).

  2. No AI needed: out of usage or just want a quick look? monash todo answers in a second (see Works without AI usage).

  3. Troubleshooting and maintenance: status, sync, update, uninstall.

In short: MCP turns your AI app into a TA who knows your units; the CLI handles setup, login and fallback. Ask in your AI app day to day, open the terminal occasionally.

Requirements

  • An AI app that supports local MCP: Claude Desktop (download) or Claude Code are set up automatically; Codex (including Codex in the ChatGPT desktop app), Cursor, VS Code, Windsurf and Gemini CLI take one more command (see Other AI clients)

  • Chrome, Edge or Brave (the Edge that ships with Windows is fine), used to log in to Moodle

  • A Monash account

Installation

The quickest way is one command, which installs uv, the kit and then starts monash setup (you can read the scripts first):

# macOS, in Terminal
curl -LsSf https://docs.secureview.tech/study-kit/install.sh | sh
# Windows, in PowerShell
powershell -ExecutionPolicy ByPass -c "irm https://docs.secureview.tech/study-kit/install.ps1 | iex"

Or do the same steps by hand:

macOS

Open Terminal (search "Terminal" in Launchpad) and run these one at a time:

curl -LsSf https://astral.sh/uv/install.sh | sh

After it finishes, close Terminal and open it again, then:

uv tool install monash-study-kit
monash setup

Windows

Open PowerShell (search "PowerShell" in the Start menu) and run these one at a time:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

After it finishes, close PowerShell and open it again, then:

uv tool install monash-study-kit
monash setup

uv is a Python tool manager. It sets up Python for you, so you don't need to install Python yourself.

First-time setup (monash setup)

Follow the prompts. There are four steps:

  1. Ed: opens Ed's API token page. Click Create Token, name it anything, copy the token and paste it back into the terminal (nothing is shown while pasting; that's normal). The token doesn't expire; delete it on the same page whenever you want to revoke it.

  2. Moodle: opens a separate browser window. Log in to Monash as usual (Okta + MFA). The window closes automatically once you're in. This window has its own profile and is completely isolated from your everyday browser: the tool only takes the Moodle session from this window and never reads anything from your normal browser.

  3. Units: tracks this semester's units by default, or pick your own.

  4. Connect your AI app: adds monash to Claude Desktop and Claude Code automatically.

    • On macOS it quits Claude Desktop first (Claude overwrites config edits made while it is running), then reopens it.

    • On Windows it asks you to fully quit Claude Desktop first: tray icon at the bottom right → right-click → Quit.

    • Using Codex, Cursor, VS Code, Windsurf or Gemini CLI? If this step says Claude Desktop is not found, ignore it. After setup, run monash connect codex (or cursor, vscode, windsurf, gemini) and restart that app.

At the end you can choose to sync right away. The first sync downloads all course files and takes a few minutes to around a quarter of an hour.

Then open your AI app. In Claude Desktop, "+" → Connectors in the chat box lists monash; leave it switched on. For other apps, monash connect shows which ones are connected.

What's new in 1.7

  • Download a whole unit's Ed materials as one zip. monash ed export FIT2109 packs the Ed Lessons you have synced into a zip in your Downloads folder: one folder per week with the PDFs, text pages and attachments, a Links.md per lesson (reading pages and the original Ed page) and a top-level README.md with your progress. --module "Week 3" packs one week, --open shows the zip in Finder. You can also ask your AI app "zip up my FIT2109 Ed materials", or use the button next to each unit on the monash library --open page. It works offline from files already on your computer.

  • Ed files are stored by unit code. Folders change from numeric ids to FIT2109/03 Week 3 - Editor-Modern IDE/12 W3 Workshop/01 Workshop 3 Slides.pdf, in the same order as on Ed. monash open ed opens them. The first sync after upgrading moves existing files instead of downloading them again.

  • Files attached inside Ed pages are downloaded too. Starter-code zips, handouts and other files that Ed hosts inside a lesson page are now downloaded and searchable; single files over 200 MB are skipped. A replaced PDF is downloaded again, and pages removed on Ed are removed locally.

  • The AI sees Ed files when listing materials. "What materials are there for FIT2109 week 3?" now lists Ed Lessons files through list_files, ready to read.

What's new in 1.6

  • Semester week view. monash semester --days 7 puts Moodle deadlines, Ed lessons and replies and cached attendance in one view; --ics exports the deadlines as a private calendar file.

What's new in 1.5

  • School mail (optional). Ask "anything in my email I need to deal with?" and get recent unread school mail, offline search, whole threads and attachment text. The AI can draft a reply, send a draft or archive mail, and only after you confirm each action.

  • Attendance (optional). "Which classes this week haven't I checked in to?" and "what's the code for today's workshop?", with each code's source. Reads follow your timetable and take a few seconds without opening a browser. Checked against the Malaysia campus portal.

  • No terminal needed to connect them. Say "connect my school email" or "connect my attendance" in your AI app; it installs what is missing and opens the sign-in window. No Google Cloud setup either.

  • Remote apps choose. With monash remote, each app you pair ticks which of these it may use.

  • Units without Ed can turn Ed off: monash config use_ed false.

Details: Optional: Gmail and attendance and the changelog.

What's new in 1.4

  • Study panels. In apps that support MCP Apps, "what do I need to do this week", "show my FIT2109 lesson progress" and "help me practise the week 3 quiz" also come with a small panel: deadline cards, lesson progress by module, and quiz questions you can click through. When you finish a quiz, the 交给 AI 批改 button sends your choices back to the chat and the AI explains them from the lesson. Nothing is submitted to Ed. Apps without panels still get the same text answers as before.

  • Find a Moodle activity by name. "Where is the week 7 workshop on Moodle?" now works through the new search_moodle_activities tool. It needs a Moodle login.

  • Browse your files without AI. monash library --open opens a page in your browser with every Moodle and Ed lesson file you have synced. Filter by unit, week or name and download the original. It only listens on 127.0.0.1, so other devices cannot open it.

  • Optional remote access. monash remote serve lets ChatGPT, or Claude on the web and phone, reach your own data over HTTPS. Use your own server and domain, or try it with a free Cloudflare quick tunnel on your own computer, which needs no account and no domain. Each app pairs with a one-time code from your terminal, and only the 16 read-only query tools are exposed. Nothing starts unless you run it. Steps are on Host it yourself.

1.4.1 adds library and remote to the summary at the top of monash --help. Everyday use on your own computer still needs no server, domain or extra account. Technical notes: docs/panels-library-remote.md.

Everyday use

Just ask in your AI app. While it is open, the tool works in the background:

  • syncs Ed and Moodle every hour (new posts, replies, course files) and refreshes the full-text index;

  • refreshes the Moodle session every 20 minutes (Moodle logs you out after 4 idle hours).

Not sure what to ask?

Use your own words: the AI picks tools by meaning, not keywords, so both "anything due this week" and "did I forget to submit something" reach the to-do tool. To see everything it can do:

  • Ask your AI "what can you do". In Claude you can also pick one of monash's preset prompts from the "+" menu (other apps show MCP prompts in their own place, or not at all): feature overview, this week's to-dos, Ed updates, find a topic, quiz review, assignment requirements, grades and feedback. Presets are only sent when you click them, so they cost nothing otherwise.

  • Run monash help in the terminal: every feature with an example question and the matching command.

When the Moodle login expires

After shutdown or a long sleep, the Moodle session expires. The AI will tell you and ask whether to log in. If you agree, it opens the login window on your computer; if Okta still remembers you, it logs in silently without even showing the window. You can also run it yourself:

monash login

While the login is expired, deadlines still work (they come from Moodle's calendar subscription link, which needs no login), and Ed features are unaffected.

Works without AI usage

The CLI doesn't use AI and consumes no usage. Run monash sync first, then:

I want to know

Command

What to do this week

monash todo

Deadlines

monash due (or monash due FIT2102)

Which file / page covers a topic

monash grep "git rebase"

New Ed posts and replies

monash ed new

Replies to my own posts

monash ed following

Read a full post

monash ed show FIT2102#42

Grades / possibly missed assignments

monash moodle grades FIT2102 / monash moodle assignments --missing

The difference is that nobody summarises for you; you get the raw information. Background sync and Moodle session refresh run while your AI app is open, because that is when the MCP server runs: they keep running even if your usage is exhausted; if the app is closed, run monash sync before querying and monash login if Moodle has expired.

Other AI clients

MCP is an open protocol and monash mcp is a standard local (stdio) MCP server, so any client that supports local MCP servers should in principle work. monash setup configures Claude Desktop and Claude Code. For the others, run monash setup first (login and units), then one command:

monash connect            # list clients and whether monash is connected
monash connect cursor     # or codex, vscode, windsurf, gemini

It adds only the monash entry to the client's config file with the full path to the program, keeps everything else, and saves a backup first. Codex is set up with codex mcp add when the codex command exists. --print shows the entry without changing anything, and --remove takes it out again. monash uninstall removes it from every client.

Verified: Claude Desktop and Claude Code with the local server. ChatGPT and Codex through a private remote integration on the v1.3.0 core: on 30 October 2026 Codex queried Moodle and Ed courses and ChatGPT's course query was confirmed. ChatGPT Plus works with the author's own domain and server.

On 30 October 2026 the 1.4.0 package from PyPI was also checked in a clean environment with made-up data: the stdio handshake, the 18-tool catalog, the three panels, monash library, and the whole monash remote sign-in and query flow using the Claude and ChatGPT callback addresses. None of this covers the native local Codex, Cursor, VS Code, Windsurf or Gemini CLI connections. monash connect writes the format from each vendor's official docs (as of 2026-10); the official docs take precedence.

To configure a client by hand instead, first find the full path of the monash program (many clients don't inherit your terminal's PATH):

  • macOS: run which monash, usually /Users/<you>/.local/bin/monash

  • Windows: run (Get-Command monash).Source in PowerShell, usually C:\Users\<you>\.local\bin\monash.exe

Replace /full/path/monash in the examples with your path. In JSON, Windows backslashes must be doubled (C:\\Users\\...); in TOML, use single quotes ('C:\Users\...').

Manual configuration

Client

Config location

Status

Codex CLI / Codex in the ChatGPT desktop app / Codex IDE extension

~/.codex/config.toml (shared by all three)

Untested

Cursor

~/.cursor/mcp.json

Untested

Windsurf

~/.codeium/windsurf/mcp_config.json

Untested

VS Code (Copilot)

Command Palette → MCP: Open User Configuration

Untested

Gemini CLI

~/.gemini/settings.json

Untested

ChatGPT, Claude web / mobile app

monash remote serve behind your own domain or a Cloudflare quick tunnel

ChatGPT Plus works with the author's domain; see Host it yourself

Codex (~/.codex/config.toml), or simply run codex mcp add monash -- /full/path/monash mcp:

[mcp_servers.monash]
command = "/full/path/monash"
args = ["mcp"]

Cursor (~/.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json) and Gemini CLI (~/.gemini/settings.json) use the same format:

{
  "mcpServers": {
    "monash": { "command": "/full/path/monash", "args": ["mcp"] }
  }
}

VS Code (mcp.json; note the outer key is servers, not mcpServers):

{
  "servers": {
    "monash": { "type": "stdio", "command": "/full/path/monash", "args": ["mcp"] }
  }
}

If the file already lists other servers, add the monash entry rather than overwriting the whole file. Restart the client afterwards.

Notes:

  • Login and unit selection are still done with monash setup. Without Claude installed, the last step reports "Claude Desktop not found"; just ignore it.

  • Background sync and Moodle session refresh only run while the client is open and the MCP server is running.

  • Tool descriptions are written with Claude in mind. Other models usually follow them fine, but this hasn't been verified.

  • If you'd rather not bother, the CLI works with no AI at all (see Works without AI usage); you can paste the output of monash todo and friends into any AI.

Agent skill

For coding agents that read skills (Claude Code, Codex, Cursor and others), there is a skill that tells the agent which monash command answers which question, how to handle assignment questions (brief and rubric first, then staff answers on Ed, each with a source), and what it must leave to you (logins, tokens, submitting):

npx skills add Waldo0926/monash-study-kit

The file is skills/monash-study-kit/SKILL.md. A test checks that every command in it still exists. npx skills is a third-party installer from Vercel and needs Node.js; you can also copy the file into your agent's skills folder by hand.

What can be searched

monash grep and the AI's course-material search cover:

  • Moodle course files (PDF, Word, PowerPoint, text and code)

  • PDFs in Ed Lessons, files attached inside Ed pages, plus content pages written directly in Ed

  • Course-notes websites: many units publish notes on a lecturer's public site, e.g. tgdwyer.github.io for FIT2102 or yqtian-se.github.io for FIT2109. Pages of this kind linked from Moodle or Ed are fetched, converted to text and stored in the Course notes (web) folder of your course files. Only pages the unit links to directly are fetched (no site-wide crawling), and each page is re-fetched at most once a week. University websites, videos, Google Docs and similar are skipped. To turn it off: monash config web_notes false

  • Lecture-recording transcripts (only with the [media] extra installed)

Privacy and security

  • Where data lives:

    • macOS: ~/Library/Application Support/monash-study-kit

    • Windows: %LOCALAPPDATA%\monash-study-kit

    That is only the default. The first monash setup asks where to keep the data and lists each drive with its free space; if C: has less than 5 GB free it recommends another drive. To move everything later (course files, database, logins, settings): close your AI apps, then monash move D:\MonashStudyKit. When the data lives elsewhere, the default folder keeps only a small location.json that points to it, and you do not need to log in again.

    It contains course files (files), the database (data), login credentials (secrets, readable only by your own user account) and the dedicated login window's profile (browser-profile). Run monash open to open the course-files folder, or monash open ed for Ed Lessons files (in data/ed-files, by unit code).

  • Stored credentials: the Moodle session cookie, the Ed API token and the Moodle calendar subscription link. They stay on your computer and are only used to talk to Moodle / Ed. Never send the secrets folder to anyone.

  • What the AI can see: only what a tool returns when you ask something (e.g. a list of deadlines, the full text of a post, the text of a course file). Tokens and cookies are never sent to the AI. Don't paste your Ed token into a chat either; it is only entered in the terminal.

  • Course library page: monash library only listens on 127.0.0.1 and only serves files that sync registered. It has no password, so don't forward it to the internet.

  • Optional remote mode: monash remote keeps the apps you paired in secrets/remote-mcp.db, storing only hashes of their tokens. Access tokens last an hour, refresh tokens 30 days and change on every use. monash remote revoke --all cuts every app off.

  • What it does to Moodle / Ed: read-only. Requests are spaced out, so it never hammers university systems like a crawler.

  • Complete removal:

    monash uninstall
    uv tool uninstall monash-study-kit

    monash uninstall removes it from Claude and the other AI clients and asks whether to delete all data. Finally, delete the token on Ed's settings page.

Token use

Every MCP tool's name, description and parameters are sent to the model at the start of each conversation, so they cost tokens even when unused. Measured with scripts/measure_tokens.py on 1.5.0 (estimate: 4 ASCII characters or 1 Chinese character per token):

Sent once per conversation

Tokens

19 tool definitions

3,107

Server instructions

270

Total

3,377

1.5.0 added start_school_service_setup (145), which lets you connect school mail or attendance by asking your AI app. It is hidden again once both are connected; with both connected the total is 5,132. In 1.4.0 the total was 3,232.

The instructions grew from 187 in 1.2.0 when the rule for assignment questions was added (brief and rubric first, then staff answers on Ed).

The largest single tool is search_ed_threads at 324.

What the answers cost, measured on one student's real data (4 Moodle units, 3 Ed courses, 376 indexed files) with --live:

Question

Tool answer

Pasting the files instead

What's due this week (get_study_todo)

3,336

Upcoming deadlines (list_moodle_due)

408

New on Ed (list_ed_updates)

3,934

Find "assignment" in course files (search_content)

2,596

25,466

Read the top hit, first page (read_file)

96

96

"Pasting the files instead" is the full text of every file the search hit. Searching first costs about 10% of that.

To measure your own answers (what a "what's due this week" or a course-file search returns, compared with pasting the whole files), run uv run python scripts/measure_tokens.py --live --query <word>. It prints only numbers. With ANTHROPIC_API_KEY set, --api uses Anthropic's free token-counting endpoint for exact counts.

Command reference

You can also query directly in the terminal without any AI:

Command

What it does

monash status

Login status, last sync time

monash help

Everything it can do, each with an example question and the matching command

monash doctor

Health check when something breaks: checks each item and tells you how to fix it; send the whole output to whoever helps you

monash doctor --deep

Also fetches from Moodle and Ed and cross-checks the tools against a second source: due dates against the calendar feed, the assignment page against the course structure, synced files against Moodle, search against the files on disk, local Ed posts against Ed. Prints only counts, unit codes, dates and activity ids

monash todo

This week: deadlines, possibly missed work, unfinished Ed lessons, announcements, unread replies

monash due [FIT2102]

Deadlines

monash grep "monad" [FIT2102]

Full-text search over course files, course-notes sites, Ed lesson pages and recording transcripts (with page numbers / timestamps)

monash sync

Sync now

monash login / monash login ed

Log in to Moodle / replace the Ed token

monash courses

Re-pick tracked units

monash open [ed]

Open the course-files folder (ed: Ed Lessons files)

monash library [--open]

Browse and download synced files in your browser (only on this computer)

monash moodle grades [FIT2102]

Grades and feedback

monash moodle assignments --missing

Possibly missed assignments

monash moodle news / find / get / messages / calendar

Announcements / find an activity / download one file / messages / calendar subscription link

monash ed new / following / search / show FIT2102#42

Ed updates / new replies to my posts / search / read a post

monash ed lessons FIT2109 / quiz FIT2109

Ed lesson progress / quiz questions (for revision)

monash ed read FIT2109 "W3 Pre-Class"

A whole lesson as Markdown: text slides, reading pages and PDFs in order, plus its quiz questions

monash ed export FIT2109 [--module "Week 3"] [--open]

Zip a unit's Ed materials by week into Downloads

monash export FIT1043 [--sync] [--to DIR|--no-ask] [--format pdf|both|md] [--dir] [--open]

Export a unit's course materials (Moodle + Ed Lessons) with an index of what was left out and why

monash config

View / change settings (restart your AI app afterwards)

monash connect [client]

Connect to Codex, Cursor, VS Code, Windsurf or Gemini CLI (see Other AI clients)

monash remote serve / pair / clients / revoke

Optional remote MCP for ChatGPT and Claude on the web (Host it yourself)

monash gmail todo / sync / search / thread

Optional school Gmail: unread inbox mail / sync / offline search / read a thread (setup)

monash attendance login / status / sync / overview / codes

Optional attendance: log in / status / read the portal / saved classes / find check-in codes

monash update

Update to the latest version

Add --json for JSON output (output is JSON automatically when piped; --text forces text). Every command has --help.

Exit codes (for scripts): 0 success, 1 bad arguments, 2 login required (monash login / monash login ed), 3 cannot reach Moodle/Ed or the server returned an error, 4 unit or post not found, 130 interrupted with Ctrl-C.

Lecture-recording transcripts (optional)

To let your AI know what was said in class, recordings can be turned into timestamped transcripts:

  • YouTube links in Ed "Week N … Recording" posts: YouTube captions are fetched directly, which is fast;

  • Zoom recordings: downloaded with the passcode from the post, then transcribed on your computer with Whisper (a two-hour lecture takes 20–30 minutes on an ordinary laptop).

These dependencies are large (about 1 GB) and not installed by default. To get them, reinstall with [media]:

uv tool install --reinstall "monash-study-kit[media]"

Then run it manually when needed (it never runs in the background, so it won't slow your computer down):

monash media

Videos uploaded directly to Moodle aren't downloaded by default either (often hundreds of MB); they are recorded as links. To download them: monash config download_videos true.

Optional: Gmail and attendance

New in 1.5.0. Both parts are off until you connect them and only run on your own computer.

  • School Gmail. Keeps a private copy of your Monash mailbox. Ask "anything in my email I need to deal with?" and the AI lists recent unread school mail (promotions and social updates left out), searches it offline, reads whole threads and the text of attachments (PDF, Office, images). Reading never marks mail as read.

  • Attendance. Reads your classes and check-in status from the attendance portal, so you can ask "which classes this week haven't I checked in to?" or "what's the code for today's FIT2102 workshop?". Codes are looked up in synced Moodle, Ed and school mail and shown with where they came from, for you to check. Only checked against the Malaysia campus portal.

If you only want to ask about your inbox in Claude or ChatGPT, their built-in Gmail connectors are the easiest way. The Gmail part here is for linking mail with attendance codes, searching mail and attachments offline, and using it in apps without a Gmail connector such as Codex or Cursor. No Google Cloud setup is needed: the package includes a Google app, and Google will show "this app isn't verified" (click Advanced, then continue). Using your own Google app instead is optional. The step-by-step guide (in Chinese) is docs/google-and-attendance-setup.md; what is accessed and stored is in PRIVACY.md. The easiest way is to ask your AI app: "connect my school email" or "connect my attendance". It installs what is missing, opens the sign-in window on your computer, and you only sign in; nothing is typed in a terminal and no password goes into the chat. The same steps in a terminal:

uv tool install --reinstall "monash-study-kit[gmail,attendance]"
monash gmail login
monash gmail sync
monash attendance login
monash attendance sync

Restart your AI app after logging in. While it is open, mail syncs in the background every 30 minutes (monash config gmail_sync_minutes, 0 turns it off); monash gmail sync updates it right away. Attendance follows your timetable instead of the clock: once on weekday mornings at 8 and 15 minutes after each class you have not checked in to yet, so nothing runs at night, at weekends or between classes (monash config attendance_auto_sync false turns it off). You or the AI can also ask for a read any time. A read is one plain request to the portal (about 5 KB, a few seconds, no browser); if the page ever looks different from what is expected it falls back to one headless browser page. On the Malaysia portal both ways gave the same result for all 15 days the portal offers, and monash attendance probe repeats that check on yours. monash status and monash doctor show both parts once they are on, and monash update keeps the extras you installed.

Logging in turns everything on in your AI app, including drafting, sending a draft, changing labels (archive, mark as read, star) and checking in to a class. The AI has to show you the full preview first and only runs it after you confirm that exact action; a check-in is only prepared when you say you attended. Mail is never permanently deleted. To keep mail read-only, log in with monash gmail login --read-only; to switch an action off, monash config gmail_manage_enabled false or monash config attendance_submit_enabled false.

With monash remote serve, each app you pair chooses on the pairing page which of these features it may use. Only features turned on on the server are offered, read-only ones start ticked and the write ones start unticked. So Claude on your phone can have attendance only and ChatGPT mail only, or neither. Apps paired earlier keep Moodle and Ed only until you pair them again, and monash remote clients shows what each app has.

Each part adds tool descriptions to every conversation: with both logged in it is about 1,900 tokens more (5,132 in total instead of 3,232); without logging in nothing changes.

Not verified yet: attendance submission, how long the attendance login lasts, and portals of campuses other than Malaysia.

Updating

monash update

Restart your AI app afterwards. On Windows it tells you to quit Claude first and which command to run next (a running program can't be overwritten); close Codex, Cursor or whichever app you use before updating.

You'll be told when a new version is out: an extra line after terminal commands, and a short mention when you ask your AI for your to-dos. It checks GitHub at most once a day and sends no personal information; to turn it off: monash config update_check false.

FAQ

monash doesn't show up in your AI app

Claude Desktop or Claude Code: run monash setup claude to reconnect. On Windows, fully quit Claude from the tray first. If it still fails, check for errors under Claude Desktop → Settings → Developer.

Codex, Cursor, VS Code, Windsurf or Gemini CLI: run monash connect to see whether the app is connected, then monash connect <app> and restart the app.

The login window won't open / "no browser found"

Install Chrome or Edge. If your browser lives somewhere unusual, point to it: monash config browser "C:\Program Files\...\chrome.exe". If an earlier dedicated login window is still open, close it first.

"Path too long" when syncing course files on Windows

By default Windows limits full paths to 260 characters, and unit name + week name + file name can exceed that. Store course files somewhere shorter: monash config files_dir C:\Monash, then monash sync.

My C: drive is full

Move all of the kit's data to another drive with monash move D:\MonashStudyKit (close Claude and other AI apps first). The program itself is small; if you also want uv and Python off C:, set UV_TOOL_DIR, UV_PYTHON_INSTALL_DIR and UV_CACHE_DIR to folders on another drive before installing.

My units don't use Ed

That's fine: deadlines, grades, course files, search, mail and attendance work without it. When monash setup asks for the Ed token, press Enter to skip and answer yes to "not using Ed". Or run monash config use_ed false at any time. After that sync, the to-do list and monash doctor stop mentioning Ed, and your AI app no longer lists the Ed tools. monash login ed turns it back on.

Australian campuses

Moodle shows times in your account's time zone; the default is Malaysia (UTC+8). For Australian campuses: monash config tz_offset 10 (11 during daylight saving).

Where are Ed "assignment deadlines"?

Most Ed lessons have no due date; Moodle is the source of truth for deadlines. The Ed-lesson part of get_study_todo follows your own progress (it lists unfinished lessons up to the week after the one you've reached).

Something is broken

Run monash doctor and follow the → after each item. If you need help, send the whole output; it contains no tokens, cookies or similar. You can also just tell your AI "monash isn't working" and it will run the same checks. The MCP background log is mcp.log in the data directory.

Reliability and changes (1.12.0)

monash status now distinguishes partial and complete syncs. Use monash sync --retry-failed to retry failures and monash changes --days 7 to review observed material, assignment, deadline and teacher-reply changes. The first observation establishes a baseline; deadline changes are recorded when you read deadlines. History stays local, and materials-only profiles omit personal information. Search warns when an older extraction is stale.

PDF reads through MCP support page_start / page_end with bounded caching. Directory re-exports clean obsolete generated files while preserving unrelated files and edited obsolete files. Silent Moodle recovery uses the dedicated browser profile and never opens an MFA window in the background; disable it with monash config auto_relogin false. For Australian daylight saving, use monash config timezone Australia/Melbourne. See behavior and limits.

Development

uv sync
uv run pytest
uvx ruff check src tests
uv run monash --help

Releasing: whenever src/ changes, bump __version__ in src/monash_study_kit/__init__.py (patch for bug fixes, minor for new features) and note what changed in CHANGELOG.md. The CI version-bump check blocks PRs that forget it. After merging, push a tag such as v1.1.0: release.yml checks the tag against __version__ and the changelog, runs the tests, builds the package, uploads it to PyPI with Trusted Publishing, installs it back from PyPI on all three OSes, and creates the GitHub release. Details are in docs/releasing.md.

See also CONTRIBUTING.md, SECURITY.md (how to report a problem), docs/security.md (what is protected and how it is tested) and docs/adr (design decisions).

Every PR also builds the wheel, checks what went into it (scripts/check_dist.py) and installs it into a clean venv to run monash --version, monash help and an MCP handshake (scripts/smoke_test.py), so a module left out of the package fails CI instead of failing for users.

How it fits together

flowchart LR
    Claude["Claude, Codex, Cursor and other local MCP apps"] -- "stdio (JSON-RPC)" --> MCP["mcp_server"]
    You["You, in a terminal"] --> CLI["cli / cli_ed"]
    MCP --> Core
    CLI --> Core
    subgraph Core["Shared core (runs on your computer)"]
        Jobs["jobs: sync + session refresh"]
        Query["features / edquery / todo"]
        Index["content_index: SQLite FTS5"]
    end
    Core -- "session cookie, read-only" --> Moodle["Moodle"]
    Core -- "API token, read-only" --> Ed["Ed"]
    Core -- "public pages only" --> Notes["Course-notes sites"]
    Login["browser_login + cdp: dedicated login window"] -- "Moodle cookie only" --> Core
    Web["ChatGPT / Claude on the web (optional)"] -- "HTTPS + OAuth" --> Remote["remote"]
    Remote --> Core
    Browser["Your browser"] -- "127.0.0.1 only" --> Library["library"]
    Library --> Core

Module

What it does

moodlelib, htmldom

Moodle client (cookie session, AJAX calls, downloads that never send the cookie off-site) and a small HTML tree for page parsing

syncer

Mirrors each unit's Moodle files into Unit/Week NN - Title/ folders

features, todo

Deadlines (with an iCal fallback when the session has expired), grades, assignments, announcements, the combined to-do list

edlib, edsync, edquery

Ed API client, incremental sync of posts and replies, local queries

lessons, lesson_reader

Ed Lessons: progress, slides, quiz questions, a whole lesson as Markdown

content_index, textextract, webnotes

Full-text search over PDFs, Office files, course-notes websites and transcripts

browser_login, cdp

Dedicated login window driven over the Chrome DevTools Protocol (a minimal WebSocket client in the standard library)

jobs, mcp_server, cli

Sync and keep-alive jobs, the MCP server, the command line

widgets, ui/panel.html

The study panels: what each tool attaches for MCP Apps hosts, and the single HTML page that draws them

library

monash library: the local, read-only page for browsing synced files

remote

monash remote: optional single-user remote MCP with pairing codes, OAuth and PKCE

doctor, doctor_deep, help_menu, update_check, claude_setup

Health check and --deep cross-checks, help and preset prompts, new-version notice, adding the server to Claude

recordings, transcribe

Optional: lecture recordings to timestamped transcripts ([media] extra)

Runtime dependencies are pypdf and, on Windows, tzdata; everything else (HTTP, SQLite, WebSocket, HTML parsing) uses the standard library. Tests run on macOS, Windows and Ubuntu with Python 3.10 and 3.13 in CI, and ruff checks for syntax errors, undefined names and unused imports.

License

MIT. This is an independent student-built tool, not affiliated with Monash University, Ed or Anthropic.

Available Tools

20 tools
export_ed_lessonsA

把一门课已同步的 Ed Lessons 课件按周打包成 zip,存到用户电脑的“下载”文件夹;用户要整门课课件时用。返回 zip 路径。

NameRequiredDescriptionDefault
courseYes课程号,如 FIT2109
moduleNo只打包某个模块,如 Week 3

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=false supplied, the description carries most of the burden and does well: it discloses that a zip file is written to the local Downloads folder, that it returns the zip path, and that only already-synced lessons are included. It omits overwrite behavior, file naming, and what happens if nothing has been synced yet.

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?

Two short clauses plus a return-value sentence, with the action, destination, and usage condition front-loaded. Every sentence carries information and there is no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter export tool with no output schema, the description covers what it does, where output goes, and what is returned. Missing edge-case behavior (unsynced course, existing zip, large courses) keeps it short of complete.

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 parameters (course and module) are already documented, including examples. The description's mention of packaging 'by week' loosely relates to the module parameter but adds no syntax or constraint beyond the schema, so the baseline 3 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?

The description states a specific verb and resource: it packages a course's already-synced Ed Lessons into a zip and saves it to the user's Downloads folder. The scope is narrow and understandable ('whole course courseware'), which implicitly contrasts with the per-lesson sibling get_ed_lessons, though that sibling is never named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage trigger: 'use when the user wants the whole course's courseware'. However, there is no explicit when-not guidance and no named alternative, so an agent must infer that per-lesson reading belongs to get_ed_lessons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ed_lessonsA
Read-only

读取 Ed Lessons:列进度、读单节或测验。Ed 讨论用 search_ed_threads;跨课件全文搜索用 search_content。返回 Lesson 列表/进度、正文或测验内容。

NameRequiredDescriptionDefault
quizNotrue=返回测验而非 Lesson 列表
courseYes课程号,如 FIT2102
lessonNoLesson 名称或编号;有值=读正文
moduleNo可选模块名称或编号
offsetNo正文字符起点,默认0
statusNo完成状态筛选
max_charsNo最大字符数,默认30000,最高100000

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, so the description's added value is its disclosure of mode-dependent output (Lesson list/progress, lesson body, or quiz content), which is meaningful because there is no output schema. It does not detail pagination or the offset/max_chars return behavior, keeping it just short of full transparency.

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?

Three compact sentences, zero filler. Purpose and modes come first, alternatives second, return value last – well front-loaded and each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully covers return values and routes to siblings, which is sufficient for a mode-switching read tool. Minor gaps remain around pagination behavior across the offset/max_chars parameters, but the schema documents those.

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 baseline is 3. The description gestures at the mode switching (list/lesson/quiz) but the concrete semantics (quiz=true returns quiz, lesson with a value reads the body) are already spelled out in the schema, so the description adds little beyond what structured fields provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (读取 Ed Lessons) and enumerates its three modes: list progress, read a single lesson, or read a quiz. It explicitly names the sibling tools it is not (search_ed_threads for discussions, search_content for full-text search), so an agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names two alternatives with the exact condition that selects each: use search_ed_threads for Ed discussions and search_content for cross-courseware full-text search. This is explicit when-to-use-else guidance, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_monash_statusA
Read-only

诊断登录、同步、索引和错误状态;报错或“用不了”时用。只需刷新数据用 sync_monash_data;登录过期且用户同意后用 start_monash_login。返回状态摘要或完整体检。

NameRequiredDescriptionDefault
fullNotrue=完整诊断;false=简要状态

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds that the tool returns either a status summary or a full checkup ('返回状态摘要或完整体检'), which tells the agent what output to expect. It doesn't describe auth requirements or rate limits, but for a read-only diagnostic tool this addition is meaningful beyond the annotation.

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?

The description is front-loaded with the tool's purpose, then usage guidance, then alternatives, in three tight sentences with no wasted words. Every sentence earns its place by either defining scope or routing to siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only diagnostic tool with one optional boolean parameter and no output schema, the description covers purpose, usage, alternatives, and expected return format. Annotations handle safety, and nothing an agent needs to call it correctly is missing.

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%, and the single parameter's meaning ('true=完整诊断;false=简要状态') is fully captured in the schema itself. The description's mention of '状态摘要或完整体检' maps to the same boolean but adds no syntax or format detail beyond what the schema already provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'diagnose' and lists specific resources: login, sync, indexing, and error status. It explicitly distinguishes itself from sibling tools by naming sync_monash_data and start_monash_login with their appropriate use cases, so an agent can tell them apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance ('报错或“用不了”时用') and names two alternative tools with the conditions that select them ('只需刷新数据用 sync_monash_data'; '登录过期且用户同意后用 start_monash_login'). This is exactly the kind of when/when-not/alternatives routing that usage guidelines require.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_moodle_gradesA
Read-only

读取 Moodle 成绩;无 course 看总览,有 course 看评分项、得分和反馈。提交状态用 list_moodle_assignments,不用于截止日历。

NameRequiredDescriptionDefault
courseNo课程号;省略=成绩总览
graded_onlyNotrue=仅已有成绩的项目

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds value beyond that by disclosing the output-shaping behavior (overview vs. detailed grade items/feedback), though it says nothing about permissions, pagination, or caching.

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?

Compact single statement, front-loaded with the purpose, then the conditional output, then the boundary cases. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so, explaining that callers get an overview or grade items/scores/feedback depending on the course param. Sufficient for a two-parameter read tool.

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 parameters are already documented in the schema. The description reinforces the course/no-course branch but adds no format or constraint detail beyond what structured data provides, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('读取 Moodle 成绩') and it distinguishes itself from siblings by naming list_moodle_assignments and the due-date calendar explicitly. An agent can tell this apart from list_moodle_assignments/list_moodle_due without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use routing: with no course param it returns an overview, with course it returns grade items/scores/feedback. It also names the correct alternative for submission status and states what it is NOT for (deadlines). Nothing 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.

get_moodle_messagesA
Read-only

读取 Moodle 私信;无 conversation_id 列对话,有值则读该对话,且不会标已读。论坛内容用 search_moodle_forum。返回对话或消息。

NameRequiredDescriptionDefault
limitNo数量上限;默认对话20、消息30
conversation_idNo对话 ID;省略=列对话

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already declared, the description adds valuable context beyond annotations: that reading messages does not mark them as read, and that it returns conversations or messages depending on the input. It does not cover permissions, rate limits, or pagination, but the added behavioral detail is meaningful.

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?

The description is very concise and front-loaded, starting immediately with the core purpose. Every sentence carries useful information, and there is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple two-parameter tool, no output schema, and existing readOnly annotation, the description covers all an agent needs: what it does, how the parameters affect behavior, when to use an alternative (forum), and what it returns. Nothing essential is missing.

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 parameter meanings are already fully documented in the schema. The description reiterates the conversation_id behavior (without it lists conversations, with it reads that conversation) but adds no new semantic details such as formats, constraints, or edge cases.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (读取/read) and resource (Moodle 私信/private messages), and explicitly distinguishes from the sibling search_moodle_forum by saying forum content should use that tool instead. It also clarifies the conditional behavior based on conversation_id, making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit alternative for forum content (search_moodle_forum), which is the most likely source of confusion among siblings. However, it does not explicitly state when to use this tool versus other non-forum Moodle tools, nor does it mention prerequisites or exclusions beyond the forum case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_study_todoA
Read-only

综合查看 Moodle/Ed 待办:截止、漏交、Lesson、公告和未读回复;问“这周要做/交什么”用。只查截止用 list_moodle_due;查提交状态用 list_moodle_assignments。返回分类待办。

NameRequiredDescriptionDefault
daysNo未来天数,默认7

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, covering the safety profile. The description adds genuine context beyond that: it discloses the aggregation scope across multiple sources and that output is categorized ('返回分类待办'). No auth/pagination behavior is described, but for a read-only reader this is adequate.

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?

Three tight clauses: purpose/scope, trigger context, and sibling routing. Zero filler and the aggregation scope is front-loaded before the alternatives.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a read-only aggregator: purpose, when-to-use, alternatives, and return shape ('返回分类待办') are all present, and annotations handle safety with no output schema needed. Minor gap is the absence of any note on result volume or freshness, but nothing essential is missing.

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 'days' parameter is fully documented in the schema (未来天数, 默认7). The description adds no syntax or format details beyond that, so baseline 3 applies as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (综合查看 Moodle/Ed 待办) and explicitly enumerates what it aggregates: deadlines, missed submissions, Lessons, announcements, unread replies. It also names the sibling tools it is not (list_moodle_due, list_moodle_assignments), so an agent can distinguish it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger context ('问"这周要做/交什么"用') and clear when-not routing: deadlines only → list_moodle_due, submission status → list_moodle_assignments. Alternative selection is fully specified rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_coursesA
Read-only

列出 Moodle/Ed 课程;问有哪些课或其他工具需要先确定课程时用。Moodle 未登录时回退本地课程表。返回课程代码、名称和标识。

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower; the description still adds real behavior by disclosing the fallback to the local course table when Moodle is not logged in. It does not describe pagination or result size limits, but the fallback note is substantive context beyond the annotation.

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?

Front-loaded with the verb and resource, then two short qualifiers (when to use it, fallback behavior) and the return fields. Every clause carries information and nothing is repeated from structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the returned fields (course code, name, identifier), and it covers the login-state edge case. For a zero-parameter listing tool that is complete enough to call correctly.

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; baseline 4 applies. The description correctly does not invent parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (列出课程/list courses) and names both data sources (Moodle/Ed). It also positions itself as the course-discovery hub that other tools depend on, which distinguishes it from the content-specific siblings like get_moodle_grades or list_moodle_due.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two concrete use conditions: when the user asks what courses exist, and when another tool first needs to resolve a course. No explicit when-not or named alternative is provided, but the triggering contexts are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ed_updatesA
Read-only

列 Ed 新帖、新回复和本人相关未读回复;浏览/搜索历史帖子用 search_ed_threads,读完整帖子用 read_ed_thread。返回更新分组和同步时间。

NameRequiredDescriptionDefault
peekNotrue=查看但不推进更新游标
limitNo活动上限,默认30
sinceNo起始时间:7d/12h/2w 或 ISO 日期时间
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value beyond that: it discloses the return shape (更新分组 and 同步时间) and, via the personal-scope wording plus the peek cursor semantics, signals that this is a cursor-advancing personal feed. That is meaningful context on top of the annotation.

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?

Three tightly packed clauses that are front-loaded: what it lists, then the sibling routing, then the return shape. No wasted words, though the sibling routing could be trimmed slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool it is essentially complete: annotations carry the safety profile, all params are schema-documented, and the description even states the return structure (groups + sync time) despite no output schema. Nothing critical is missing.

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 all four parameters (peek, limit, since, course) are already documented in the schema, including the cursor behavior of peek. The description adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (列/list) and resource (Ed 新帖、新回复、本人相关未读回复), and explicitly contrasts with the two sibling tools search_ed_threads and read_ed_thread. An agent can distinguish this from its siblings without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: browse/search historical posts → search_ed_threads, read a full post → read_ed_thread, while this tool surfaces fresh updates. The when-to-use and alternatives are named directly rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesA
Read-only

列已同步本地课件或外链,不搜索正文;搜正文用 search_content,读取 path 用 read_file。问“最近新上了什么课件”用 since_days。返回文件/外链和可供 read_file 使用的路径。

NameRequiredDescriptionDefault
weekNo教学周编号,如 8
linksNotrue=列外链;须同时给 course
queryNo按文件名或路径筛选
courseNo课程号,如 FIT2102;省略=全部
since_daysNo只看最近几天新同步的,新的排前面

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already covering the safety profile, the description adds real scope and output context: it does NOT search file bodies, and it returns both file/link entries and paths consumable by read_file. It stops short of describing pagination, ordering guarantees (other than 'new first' implied by since_days), or limits.

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?

Three dense clauses, purpose first, then exclusions/alternatives, then return-value note. No filler; every sentence carries routing or scoping information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with 5 fully documented optional params and no output schema, the description covers purpose, disambiguation from siblings, and the shape of what comes back. Nothing needed to call it correctly 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?

Schema coverage is already 100%, so baseline is 3; the description earns extra by tying since_days to a natural-language question ('最近新上了什么课件') and by framing links as the external-link mode. It does not add syntax detail for week/query/course, which the schema already handles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: listing already-synced local course files or external links, and explicitly distinguishes it from search_content (content search) and read_file (path reading). An agent can route cleanly among the three without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit exclusions are given ('不搜索正文'), alternatives are named ('搜正文用 search_content', '读取 path 用 read_file'), and a concrete trigger for since_days is provided ('最近新上了什么课件'). This is the when/when-not/alternatives pattern done well.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_moodle_assignmentsA
Read-only

列 Moodle 作业及截止、提交和可用成绩状态;仅看日历截止用 list_moodle_due,仅看成绩/反馈用 get_moodle_grades。missing_only 可只看可能漏交。

NameRequiredDescriptionDefault
courseNo课程号,如 FIT2102;省略=全部
missing_onlyNotrue=仅可能漏交的作业

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds the scope of returned data (deadline, submission, grade status) and the meaning of missing_only, but says nothing about pagination, result volume, or whether course omission aggregates across all courses beyond the schema's '省略=全部'.

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?

One dense sentence that front-loads purpose, then routes to the two alternatives, then notes the key filter mode. No filler and no repetition of the tool name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-optional-parameter, read-only list tool with no output schema, the description covers purpose, alternatives, and the main filter well. Minor gap: no mention of result shape or multi-course aggregation behavior, but nothing blocking correct invocation.

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 parameters are already documented (course format example, missing_only semantics). The description only restates the missing_only behavior, adding no new format or value detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (列/list) and resource (Moodle 作业) plus the exact scope it covers: 截止、提交和可用成绩状态. It also names the two sibling tools it is not, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives when-to-use-this vs alternatives: use list_moodle_due for calendar deadlines only, get_moodle_grades for grades/feedback only. It even flags the missing_only filter as a conditional usage mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_moodle_dueA
Read-only

列 Moodle 未来截止和日历事件;需要提交状态/作业详情用 list_moodle_assignments,需要成绩用 get_moodle_grades。未登录可回退 iCal。返回截止事件和时间。

NameRequiredDescriptionDefault
daysNo未来天数,默认14
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint already marks it as a safe read. The description adds meaningful behavior beyond annotations: it discloses the iCal fallback when not logged in and says it returns deadline events and times. It does not cover rate limits or pagination, but those are minor here.

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?

The description is compact and front-loaded: purpose first, sibling alternatives next, fallback and return content last. Every clause carries useful selection or behavior information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only list tool with no output schema, the description is nearly complete: it states scope, alternatives, auth fallback, and return content. Only minor details such as exact event ordering or timezone handling are absent.

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 days and course are already documented in the schema. The description does not add parameter syntax or constraints beyond the schema, so it meets the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource: listing Moodle future deadlines and calendar events. It explicitly distinguishes the tool from list_moodle_assignments and get_moodle_grades, so an agent can select it without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use this tool (upcoming deadlines/calendar events) and names the correct alternatives for submission status/assignment details and grades. It also gives a fallback condition for unauthenticated use, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_ed_threadA
Read-only

读取单个 Ed 帖子正文和回复;找帖子用 search_ed_threads,新动态用 list_ed_updates;live=true 先刷新。返回 Markdown,长内容支持分页。

NameRequiredDescriptionDefault
liveNotrue=先从 Ed 实时刷新该帖
offsetNoMarkdown 字符起点,默认0
threadYes帖子 ID、FIT2102#42 或 Ed 链接
max_charsNo最大字符数,默认30000,最高100000

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries the rest: it discloses the return format (Markdown), that long content is paginated, and that live=true triggers a real-time refresh from Ed. It does not cover auth requirements or error behavior, but the read-only safety profile plus format/pagination disclosure is solid added value.

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 compact sentence with the core action front-loaded, followed by sibling routing and the live flag, then return format. No redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with no output schema, the description supplies the essential missing pieces: output format (Markdown), pagination support, refresh semantics, and sibling alternatives. Remaining gaps (auth prerequisites, error cases) are minor for a read-only thread fetch.

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%, so all four parameters (thread, live, offset, max_chars) are already documented in the schema. The description only reinforces pagination and live refresh at a high level, adding little syntax or constraint detail beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: read a single Ed thread's body and replies. It explicitly distinguishes itself from the two nearest siblings (search_ed_threads for finding, list_ed_updates for new activity), so an agent can pick it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use search_ed_threads to locate a thread and list_ed_updates for new activity, implying this tool is for fetching a thread you already have an identifier for. It also states the live=true precondition for refreshing before reading.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_fileA
Read-only

读取 list_files/search_content 给出的课件路径;ZIP 用 inner,长内容用 offset/max_chars 分页。若要搜索未知文件先用 search_content。返回文本或 ZIP 清单。

NameRequiredDescriptionDefault
pathYeslist_files/search_content 返回的路径
innerNoZIP 内路径;省略=列 ZIP 清单
offsetNo字符起点,默认0
max_charsNo最大字符数,默认20000,最高100000

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safety profile, so the description's job is to add context, which it does: ZIP archives are traversed via `inner`, long payloads are paginated with offset/max_chars, and the return is text or a ZIP listing. It stops short of error behavior (missing path, oversized file, encoding), but the added behavioral detail exceeds the annotation.

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?

Three compact clauses, front-loaded with the primary action and dependency, then the ZIP and pagination conditions, then the fallback search guidance. Every sentence carries distinct operational information with zero padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With readOnlyHint covering safety and a 100%-documented schema, the description closes the remaining gaps by stating the return shape (text or ZIP listing) and the pagination model, which matters since no output schema exists. Only minor error/edge-case behavior is absent.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds use-case meaning: `inner` is the ZIP-internal selector (omitted = list the ZIP) and offset/max_chars are the pagination pair for long content. That is modest but genuine value beyond the raw schema strings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (读取/read) and resource (课件路径/course material file), and pins the scope to paths produced by list_files/search_content, distinguishing it from those siblings. An agent can tell this is the terminal read step in the list/search -> read workflow without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: paths come from list_files/search_content, and if the target file is unknown, use search_content first. This is a named alternative plus the condition that selects it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contentA
Read-only

全文搜索已同步课件/PDF/笔记/字幕;只列文件用 list_files,拿到 path 后用 read_file。返回匹配片段、文件路径和定位信息。

NameRequiredDescriptionDefault
limitNo命中上限,默认15,最高50
queryYes全文搜索关键词或短语
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries the rest; it discloses the return shape (matching snippets, file paths, and location info), which is valuable since no output schema exists. It stops short of pagination/limit behavior or scope limits beyond the sibling routing, so not 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single dense sentence, front-loaded with the core purpose and return values, followed by sibling routing. Every clause earns its place with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, alternative selection, and return content in one line for a read-only search tool whose annotations already carry the safety profile. An agent has everything needed to call it correctly.

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%, so all three params (query, limit, course) are already documented in the schema. The description adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (全文搜索/full-text search) and precise resource scope (已同步课件/PDF/笔记/字幕), and explicitly names the sibling tools it is not (list_files, read_file). An agent can distinguish this from every sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use-alternative routing: use list_files to merely enumerate files, and read_file once a path is obtained. This establishes a clear workflow and names the conditions that select each alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_ed_threadsA
Read-only

浏览或搜索 Ed 帖子;读完整正文/回复用 read_ed_thread,只看新动态用 list_ed_updates。返回帖子摘要;浏览模式支持 offset 分页。

NameRequiredDescriptionDefault
onlyNo状态筛选:收藏/关注/未看/本人/未读回复
typeNo帖子类型
limitNo条数上限,默认15,最高50
queryNo搜索标题/正文;省略=浏览帖子
sinceNo起始时间:7d/12h/2w 或 ISO 日期时间
courseNo课程号,如 FIT2102;省略=全部
offsetNo浏览结果偏移;搜索时忽略
categoryNoEd 分类
unansweredNotrue=仅未回答问题

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds behavior beyond that: the tool returns post summaries (not full bodies) and browse mode supports offset pagination, which is genuinely useful call-shaping context.

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?

Two tight sentences, front-loaded with the core verb+resource, followed by the routing alternatives and return/pagination note. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still tells the agent the return shape ('post summaries') and the pagination mode, and it points to siblings for full content. Complete enough for a read-only search tool, though return fields and summary limits are only roughly characterized.

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% — every one of the 9 parameters is already documented with enums, defaults and limits. The description only echoes the offset/pagination behavior, which the schema already notes as ignored during search. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (browse/search) and resource (Ed posts), and explicitly distinguishes itself from two siblings — read_ed_thread for full body/replies and list_ed_updates for new activity. An agent can route among the three without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names both alternatives with the exact condition that selects each: full content -> read_ed_thread, new activity only -> list_ed_updates. This is explicit when-to-use/when-not guidance, not inferred context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_moodle_activitiesA
Read-only

按名称找 Moodle 章节和活动,返回活动标识和链接;搜文件正文用 search_content。

NameRequiredDescriptionDefault
limitNo结果数,默认15,最多50
queryYes章节或活动名,如 week 7 workshop
courseNo课程号;省略=跟踪的课程

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already establishes the safe-read profile, and the description adds the useful fact that results are identifiers plus links. It says nothing about matching behavior (fuzzy vs exact name match), ranking, or what happens when nothing matches, which is the remaining behavioral burden.

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?

Two short clauses, front-loaded with the core purpose, and the alternative-tool pointer is appended last. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A simple read-only search with fully documented params and a stated return shape; an agent can call it correctly from this. Minor incompleteness on result ordering, empty-result behavior, and whether matching is substring or exact.

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 all three params (query, course, limit) have descriptions with defaults and examples, so the schema carries parameter semantics. The description adds no extra meaning about query syntax or course scoping beyond that baseline.

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 (search/find by name), resource (Moodle sections and activities), and return payload (activity identifier and link). It explicitly contrasts with search_content for file bodies, though it does not distinguish itself from other siblings like search_moodle_forum or list_moodle_assignments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear routing rule: use this for section/activity names, use search_content for file contents. No guidance on when to prefer the list_* siblings (list_moodle_due, list_moodle_assignments) over this name search, which leaves one meaningful gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_moodle_forumA
Read-only

查看/搜索 Moodle 公告和论坛:无 query 看公告,有 query 搜索。Ed 讨论请用 search_ed_threads。返回公告或匹配帖子摘要、正文片段和链接。

NameRequiredDescriptionDefault
limitNo数量参数;默认公告5、搜索10
queryNo搜索词;省略=最近公告
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers the safety profile. The description adds return behavior: announcements or matching post summaries, body snippets, and links. It does not discuss pagination, rate limits, or auth, but those are less critical for a simple read-only search tool.

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?

Very compact and front-loaded: the core behavior appears first, followed by the key alternative and return summary. Every clause earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with full schema coverage and annotations covering safety, the description supplies the missing context: query/no-query behavior, sibling routing, and expected return content. No output schema exists, but the description adequately summarizes returns.

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 all three parameters are fully documented in the schema itself. The description reinforces the query semantics and return shape but adds little parameter-level detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: viewing/searching Moodle announcements and forums. It also distinguishes the query/no-query behavior and names the sibling tool search_ed_threads for Ed discussions, so an agent can identify its scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says what to do without a query (see announcements), what to do with a query (search), and which alternative to use for Ed discussions (search_ed_threads). Usage conditions and exclusions are directly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_monash_loginA

仅在用户明确同意重新登录后使用:打开本机 Moodle 登录窗口;已登录则不重复打开,成功后自动同步。诊断请用 get_monash_status。

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real behavioral context beyond the readOnlyHint=false annotation: it requires explicit user consent, it is idempotent ('if already logged in, won't open again'), and it triggers an automatic data sync on success. It does not say what happens on failure/cancellation or that it opens an interactive window that blocks, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The consent precondition is front-loaded in the first clause, followed by behavior, then the routing hint to the diagnostic sibling. No redundant or filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description covers purpose, precondition, idempotency and the sync side effect, which is nearly all an agent needs. Error/cancellation behavior and what 'success' returns are the only unaddressed pieces.

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. Baseline 4 applies; the sentence about consent and idempotency is about invocation context rather than parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and object: opens the local Moodle login window, and it explicitly names the sibling tool (get_monash_status) that should be used instead for diagnostics. An agent can distinguish it from every other sibling without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('only after the user has explicitly agreed to re-login') and an explicit exclusion/alternative ('for diagnostics use get_monash_status'). Both when-to-use and when-not-to-use are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_school_service_setupA

用户要接入学校邮箱或考勤时用:自动装组件,在用户电脑上打开登录窗口;再调用看进度。

NameRequiredDescriptionDefault
serviceYesgmail=学校邮箱,attendance=考勤
read_onlyNotrue=邮箱只读,不让 AI 起草或改标签

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=false available, the description carries real weight by disclosing side effects: it installs a component on the user's machine and opens an interactive login window, which tells the agent this is not a silent background call. It does not say whether the call blocks until login completes or returns immediately, which is the main remaining 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 compact sentence that front-loads the trigger condition before describing behavior. The trailing "再调用看进度" is vague enough to be near-waste, but overall there is little filler.

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 two-parameter tool with no output schema and minimal annotations, the description covers what happens on the user's machine but omits the return semantics (does it return a setup handle or just an ack?) and the identity of the progress-checking tool. Enough to call it, not enough to sequence it confidently.

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%, so both parameters are already documented, including the service enum meanings. The description's mention of school email and attendance loosely maps to the service values but adds nothing about read_only or how the two services differ behaviorally. Baseline 3 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?

The description names a specific action and resource: initiating school email or attendance setup, including installing a component and opening a login window. It is clearly distinct from siblings such as start_monash_login, though it never explicitly names that sibling to sharpen the contrast.

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?

"用户要接入学校邮箱或考勤时用" gives a clear triggering condition, but the follow-up instruction "再调用看进度" refers to an unnamed tool, leaving the agent to guess which sibling to call next. No when-not-to-use or prerequisite guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_monash_dataA

刷新 Moodle/Ed 本地数据和全文索引;用户要求刷新或数据过旧时用。诊断错误用 get_monash_status;已在同步时不会重复启动。

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, so the description carries most of the behavioral burden and does add value: it discloses idempotency (no duplicate launch while syncing) and that a full-text index is rebuilt alongside local data. It stops short of stating expected duration, rate limits, or what state changes result, so it is strong but not exhaustive.

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?

Three tight clauses with the core action front-loaded, followed by the usage trigger and the sibling routing. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter action tool with no output schema, the description covers what it does, when to call it, the alternative, and the concurrency guard. It leaves the post-sync result state unstated, but nothing essential to invoking it correctly 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, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies no arguments are needed by giving a plain trigger-based invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (刷新/refresh) plus the exact resources affected (Moodle/Ed local data and full-text index), which no sibling claims. An agent can distinguish it from get_monash_status and the many read-only search/list siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggers (user asks for a refresh, or data is stale) and names the alternative for a different need (diagnosing errors → get_monash_status). It also states the when-not condition: if a sync is already running it will not start a second one.

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. 1 tool updatev1.11.2
    • Addedexport_ed_lessons
  2. 3 tool updatesv1.5.0
    • Changedlist_files1 field changed
      • addedInput schema / properties / since_days
        Added value: +{
        +  "description": "只看最近几天新同步的,新的排前面",
        +  "type": "integer"
        +}
    • Addedsearch_moodle_activities
    • Addedstart_school_service_setup
  3. 28 tool updatesv0.1.4
    • Removedcourses
    • Removeded_lessons
    • Removeded_thread
    • Removeded_threads
    • Removeded_updates
    • Addedget_ed_lessons
    • Addedget_monash_status
    • Addedget_moodle_grades
    • Addedget_moodle_messages
    • Addedget_study_todo
    • Addedlist_courses
    • Addedlist_ed_updates
    • Addedlist_moodle_assignments
    • Addedlist_moodle_due
    • Removedmonash_login
    • Removedmonash_status
    • Removedmonash_sync
    • Removedmoodle_assignments
    • Removedmoodle_due
    • Removedmoodle_forum
    • Removedmoodle_grades
    • Removedmoodle_messages
    • Addedread_ed_thread
    • Addedsearch_ed_threads
    • Addedsearch_moodle_forum
    • Addedstart_monash_login
    • Removedstudy_todo
    • Addedsync_monash_data
  4. 14 tool updatesv0.1.3
    • Changeded_lessons6 fields changed
      • addedInput schema / properties / lesson / description
        Added value: +"Lesson 名称或编号;有值=读正文"
      • changedInput schema / properties / max_chars / description
        Previous value: -"最大返回字符数"New value: +"最大字符数,默认30000,最高100000"
      • addedInput schema / properties / module / description
        Added value: +"可选模块名称或编号"
      • changedInput schema / properties / offset / description
        Previous value: -"字符偏移"New value: +"正文字符起点,默认0"
      • addedInput schema / properties / quiz / description
        Added value: +"true=返回测验而非 Lesson 列表"
      • changedInput schema / properties / status / description
        Previous value: -"完成状态"New value: +"完成状态筛选"
    • Changeded_thread4 fields changed
      • addedInput schema / properties / live / description
        Added value: +"true=先从 Ed 实时刷新该帖"
      • changedInput schema / properties / max_chars / description
        Previous value: -"最大返回字符数"New value: +"最大字符数,默认30000,最高100000"
      • changedInput schema / properties / offset / description
        Previous value: -"字符偏移"New value: +"Markdown 字符起点,默认0"
      • addedInput schema / properties / thread / description
        Added value: +"帖子 ID、FIT2102#42 或 Ed 链接"
    • Changeded_threads8 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回条数"New value: +"条数上限,默认15,最高50"
      • changedInput schema / properties / offset / description
        Previous value: -"结果偏移"New value: +"浏览结果偏移;搜索时忽略"
      • addedInput schema / properties / only / description
        Added value: +"状态筛选:收藏/关注/未看/本人/未读回复"
      • addedInput schema / properties / query / description
        Added value: +"搜索标题/正文;省略=浏览帖子"
      • addedInput schema / properties / since / description
        Added value: +"起始时间:7d/12h/2w 或 ISO 日期时间"
      • addedInput schema / properties / type / description
        Added value: +"帖子类型"
      • addedInput schema / properties / unanswered / description
        Added value: +"true=仅未回答问题"
    • Changeded_updates4 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回条数"New value: +"活动上限,默认30"
      • addedInput schema / properties / peek / description
        Added value: +"true=查看但不推进更新游标"
      • addedInput schema / properties / since / description
        Added value: +"起始时间:7d/12h/2w 或 ISO 日期时间"
    • Changedlist_files4 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102;省略=全部"
      • addedInput schema / properties / links / description
        Added value: +"true=列外链;须同时给 course"
      • addedInput schema / properties / query / description
        Added value: +"按文件名或路径筛选"
      • addedInput schema / properties / week / description
        Added value: +"教学周编号,如 8"
    • Changedmonash_status1 field changed
      • addedInput schema / properties / full / description
        Added value: +"true=完整诊断;false=简要状态"
    • Changedmoodle_assignments2 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / missing_only / description
        Previous value: -"仅可能漏交"New value: +"true=仅可能漏交的作业"
    • Changedmoodle_due1 field changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102;省略=全部"
    • Changedmoodle_forum3 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回条数"New value: +"数量参数;默认公告5、搜索10"
      • addedInput schema / properties / query / description
        Added value: +"搜索词;省略=最近公告"
    • Changedmoodle_grades2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号;省略=成绩总览"
      • changedInput schema / properties / graded_only / description
        Previous value: -"仅已有成绩"New value: +"true=仅已有成绩的项目"
    • Changedmoodle_messages2 fields changed
      • addedInput schema / properties / conversation_id / description
        Added value: +"对话 ID;省略=列对话"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回消息数"New value: +"数量上限;默认对话20、消息30"
    • Changedread_file4 fields changed
      • addedInput schema / properties / inner / description
        Added value: +"ZIP 内路径;省略=列 ZIP 清单"
      • addedInput schema / properties / max_chars / description
        Added value: +"最大字符数,默认20000,最高100000"
      • addedInput schema / properties / offset / description
        Added value: +"字符起点,默认0"
      • addedInput schema / properties / path / description
        Added value: +"list_files/search_content 返回的路径"
    • Changedsearch_content3 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回命中数"New value: +"命中上限,默认15,最高50"
      • addedInput schema / properties / query / description
        Added value: +"全文搜索关键词或短语"
    • Changedstudy_todo1 field changed
      • addedInput schema / properties / days / description
        Added value: +"未来天数,默认7"
  5. 10 tool updatesv0.1.1
    • Changeded_lessons4 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / max_chars / description
        Added value: +"最大返回字符数"
      • addedInput schema / properties / offset / description
        Added value: +"字符偏移"
      • addedInput schema / properties / status / description
        Added value: +"完成状态"
    • Changeded_thread2 fields changed
      • addedInput schema / properties / max_chars / description
        Added value: +"最大返回字符数"
      • addedInput schema / properties / offset / description
        Added value: +"字符偏移"
    • Changeded_threads4 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Ed 分类"
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回条数"
      • addedInput schema / properties / offset / description
        Added value: +"结果偏移"
    • Changeded_updates2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回条数"
    • Changedmoodle_assignments2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / missing_only / description
        Added value: +"仅可能漏交"
    • Changedmoodle_due1 field changed
      • addedInput schema / properties / days / description
        Added value: +"未来天数,默认14"
    • Changedmoodle_forum2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回条数"
    • Changedmoodle_grades1 field changed
      • addedInput schema / properties / graded_only / description
        Added value: +"仅已有成绩"
    • Changedmoodle_messages1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"最多返回消息数"
    • Changedsearch_content2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回命中数"
  6. 17 tool updatesv0.1.0
    • First observedcourses
    • First observeded_lessons
    • First observeded_thread
    • First observeded_threads
    • First observeded_updates
    • First observedlist_files
    • First observedmonash_login
    • First observedmonash_status
    • First observedmonash_sync
    • First observedmoodle_assignments
    • First observedmoodle_due
    • First observedmoodle_forum
    • First observedmoodle_grades
    • First observedmoodle_messages
    • First observedread_file
    • First observedsearch_content
    • First observedstudy_todo

TDQS

A4/5.0

Scored across 20 tools

Disambiguation4/5

Most tools have clearly distinct scopes, and descriptions actively cross-reference alternatives (e.g. list_moodle_due vs list_moodle_assignments vs get_moodle_grades; search_ed_threads vs list_ed_updates vs read_ed_thread). The riskiest overlap is get_study_todo versus the more granular Moodle listing tools, but the 'aggregate vs single-source' distinction is stated explicitly.

Naming Consistency4/5

Consistent snake_case with a verb_noun shape and readable domain prefixes (moodle_, ed_, file/content tools). Minor deviations: get_study_todo sits oddly among list_/get_ siblings, and start_school_service_setup is heavier than the rest, but nothing is ambiguous or chaotic.

Tool Count3/5

20 tools is on the heavy side for one server and forces the agent to choose among several near-parallel list/search tools across three data sources. Each tool does cover a distinct surface, but the surface could likely be consolidated (e.g. generic search/list across Moodle and Ed).

Completeness4/5

Strong read/search/sync coverage across Moodle, Ed and local files, including auth/setup and diagnostics, which covers the realistic study workflow. The main gap is that everything is read-only for course data: no replying to threads/messages, no marking read, and no assignment submission, so a few workflows dead-end.

Maintenance

ActivityActive
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides Claude with full access to Moodle learning management systems, enabling interaction with courses, files, assignments, grades, and calendar events. It also supports building Obsidian study vaults from course materials through automated knowledge graph creation.
    24 npm
    18
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables Claude to interact with Moodle via the official REST API for read-only tasks like listing courses, materials, assignments, submissions, and grades. Uses token-based authentication and emphasizes safe, no-write operations.
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to access a student's EPFL Moodle data—deadlines, course files, assignments, forums, and grades—through read-only tools.
    12
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides read-only access to a university's Moodle virtual campus, letting an AI assistant browse courses, sections and files, check upcoming deadlines, view assignment status and grades, and read forum announcements and threads. Authentication uses a Moodle token stored locally, with support for both undergraduate and postgraduate campus URLs.
    8
    MIT