Brightspace MCP Server
This MCP server connects AI assistants to D2L Brightspace for read-only access to course data.
Grades: Fetch grade breakdowns for one course or all courses, including points, percentages, and comments.
Assignments & quizzes: List assignments, quizzes, due dates, status, and rubric info; detect graded work missing from standard listings.
Assignment files: Read attached specs, rubrics, or starter files (PDF, DOCX, XLSX, PPTX, text) or download them to disk.
Course content: Browse the content tree (modules, topics, files, links), filter by type or module title, and download files.
Syllabus: Retrieve course overview text and optionally download the syllabus attachment.
Announcements: Get recent announcements from a specific course or across all courses.
Due dates: See upcoming deadlines across courses for a configurable number of days ahead.
Roster & emails: Get instructors, TAs, and optionally students with names, emails, and roles; fetch classlist emails.
Discussions: Explore forums, topics, and posts within a course.
Authentication & session management: Automatic login, MFA support (number matching, authenticator codes, visible browser), and session renewal; includes an
authCLI for interactive MFA.
Brightspace MCP Server
By Rohan Muppa, ECE @ Purdue
Talk to your Brightspace courses with AI. Ask about grades, due dates, quizzes, announcements, and more. Works with Claude Desktop, Claude Code, Cursor, ChatGPT Desktop, Windsurf, and any MCP client.
This is an MCP (Model Context Protocol) server that connects your AI to D2L Brightspace so it can pull your grades, assignments, syllabus, and course content on demand.
Connects to D2L Brightspace. Automatic login supports Purdue's Microsoft Entra flow and SUNY campus selection. Other schools need a compatible automated sign-in flow; unsupported login pages return an actionable error.
Try It
"Download my lecture slides and turn them into interactive flashcards" "Grab every assignment rubric and build me a visual dashboard of what I need to hit for an A"
Related MCP server: unofficial-magister-mcp
Install
You need: Node.js 20+ and an available native credential store: macOS Keychain, Windows Credential Manager, or Linux Secret Service. Linux requires secret-tool and an unlocked desktop keyring. Install libsecret-tools on Debian/Ubuntu, or the package providing secret-tool on your distribution. A container or SSH session without Secret Service cannot persist authentication in v2.
Option 1: Let your AI do it
Paste this into Claude Code, Cursor, Windsurf, Copilot, Codex, or any AI coding assistant:
Install brightspace-mcp-server for me by following
https://github.com/RohanMuppa/brightspace-mcp-server/blob/main/LLMs.md
(use --purdue if I'm at Purdue, or --suny if I'm at a SUNY campus).Option 2: Run it yourself
npx -y brightspace-mcp-server@latest setupPurdue students can add --purdue to skip entering the school URL:
npx -y brightspace-mcp-server@latest setup --purdueSUNY campuses share one Brightspace site, so --suny also asks which campus
you're at and skips SUNY's campus picker when you sign in:
npx -y brightspace-mcp-server@latest setup --sunyThe wizard saves your password in the native credential store and asks how you complete MFA. Authentication can wait for approval or number matching, prompt in the terminal for a code from Google Authenticator or another app, or open a visible browser for other interactive methods. The wizard can configure Claude Desktop, Cursor, Codex Desktop and CLI, and Claude Code when they are installed. Restart your AI client when it finishes.
Any other D2L school: run setup without a flag and paste your Brightspace URL (for example https://yourschool.brightspace.com).
Search your client's docs for how to add an MCP server. The server command to register is:
npx -y brightspace-mcp-server@latestOn Windows, npx must be wrapped: cmd /c npx -y brightspace-mcp-server@latest
You still need to run npx -y brightspace-mcp-server@latest setup first to save your credentials.
For Codex Desktop and Codex CLI, run:
codex mcp add brightspace -- npx -y brightspace-mcp-server@latestCodex Desktop and CLI use the same user configuration on a computer. Restart the desktop app or start a new CLI session after registration.
For Claude Code, run:
claude mcp add --scope user brightspace -- npx -y brightspace-mcp-server@latestClaude Desktop uses a separate configuration, which the setup wizard can update automatically.
Session Expired?
There is nothing to log into first. Ask for your grades and the sign-in happens as part of that request, so the assistant never has to check whether you are authenticated before it can answer. Starting your AI client touches Brightspace not at all: a restart on its own will never set off an MFA prompt.
Returning the next day normally requires no action. The server renews short-lived API tokens over HTTPS using the saved Brightspace session. If that session ends, a browser restores your saved Microsoft session and tries silent SSO. Approval and code-based modes stay headless; when an automatic run needs a code, run the auth command below to enter it securely in the terminal.
If visible-browser mode is configured, the window stays open for up to five minutes so you can finish credentials and MFA manually when automatic sign-in cannot continue. Rerunning setup preserves your previous hidden or visible choice as the prompt default.
Your school's policy controls when MFA is required. There is no local 24-hour cutoff, and the server no longer discards browser state after one hour. A network outage preserves the saved session and returns a temporary error.
If you miss an MFA request, automatic browser authentication pauses for five minutes before trying again. Existing tokens and HTTP token renewal still work. Browser-based SSO also pauses because Microsoft can send another phone prompt during a redirect, even without a password submission. Run this command in a terminal to retry immediately, see a number match, or enter an authenticator code:
npx -y brightspace-mcp-server@latest authMFA at Purdue commonly uses Microsoft Authenticator number matching: enter the terminal-displayed number on your phone. Google Authenticator and other one-time-code apps work too, with no setting to change: run the auth command above in a terminal and it prompts for the code when your provider asks for one. Pick the visible-browser option during setup only if your identity provider needs interaction the server cannot drive. The MCP also sends authentication progress as logging notifications to clients that display them. Some desktop clients hide server logs, so use the terminal command above for interactive MFA.
What You Can Ask About
Topic | Examples |
Grades | "Am I passing all my classes?" · "Compare my grades across all courses" |
Assignments | "What's due in the next 48 hours?" · "Summarize every assignment I haven't turned in yet" · "Give me the link to submit HW 4" |
Quizzes | "Which quizzes close this week?" · "Is Quiz 3 timed, and does it have a grace period?" |
Assignment files | "What does the lab 4 spec actually ask for?" · "Summarize the rubric attached to the project" |
Exams | "Is there a midterm in the gradebook that isn't on my assignments list?" |
Announcements | "Did any professor post something important today?" · "What did my CS prof announce this week?" |
Course content | "Find the midterm review slides" · "Download every PDF from Module 5" |
Roster | "Who are the TAs for ECE 264?" · "Get me my instructor's email" |
Discussions | "What are people saying in the final project thread?" · "Summarize the latest discussion posts" |
Planning | "Build me a study schedule based on my upcoming due dates" · "Which class needs the most attention right now?" |
Assignment results cross-check the visible course table of contents and gradebook. This catches quizzes and other graded work that some Brightspace courses omit from their normal assignment or quiz listings.
Security
Your school URL and username live in
~/.brightspace-mcp/config.json. Your password lives in the native credential store. macOS and Windows use@napi-rs/keyring; Linux usessecret-tooldirectly to require Secret Service without a temporary kernel-key fallback. Linux secrets travel through stdin, never command-line arguments.Each account directory stores
session.jsonfor access tokens andstorage-state.encrypted.jsonfor cookies and browser storage. Both use AES-256-GCM with a random key held in the native credential store. The application never writes new plaintext password or browser-state snapshots.D2L_SESSION_DIRchanges the local root of these account directories.On Unix, session files are mode 0600 and their directory is mode 0700. Security also depends on your operating-system account: software running as you may be able to access the same credential store. Runtime memory and recoverable v1 files in Trash are outside the encrypted-file guarantee.
All traffic to Brightspace is HTTPS.
On startup the server asks the npm registry whether a newer version exists. When running through
npx, it clears this package's own stale npx cache directories so the next start downloads the new version. It never installs anything itself. SetD2L_NO_UPDATE_CHECK=1to turn the check off.Read only: this server never submits, posts, or changes anything in Brightspace.
Contributing & Forking
Want to add your school, build a new tool, or fix something? Fork the repo, make your changes, and open a pull request. If it gets merged, it ships to every user automatically.
git clone https://github.com/RohanMuppa/brightspace-mcp-server.git
cd brightspace-mcp-server
npm install
npm run dev # tsc in watch mode
npm test # vitest, must be green before you open a PRAdd your school: Add a preset to SCHOOL_PRESETS in src/setup.ts. If your school's login flow is different, add a handler in src/auth/.
Add a new tool: Create a file in src/tools/, add the schema in schemas.ts, export it in src/tools/index.ts, and register it in src/index.ts. Use any existing tool as a template.
Run your own version: You can also fork and run it independently. Clone it, build it, and point your AI client to the local build/index.js instead of using npx. No npm needed. Just know that forks don't receive updates from this repo automatically. If your changes could help others, consider opening a PR.
Licensed under the MIT License.
Updates
Automatic, in both places it matters.
The MCP server is registered as npx -y brightspace-mcp-server@latest, so your AI client pulls the newest version every time it starts a session.
The auth CLI updates itself too. If you installed globally with npm install -g, that copy stays at whatever version you installed it at because npm never revisits it. So when the CLI notices it is behind, it re-runs itself through npx -y brightspace-mcp-server@latest auth and you get the current code. You are not prompted and there is nothing to confirm.
One caveat worth knowing: a re-exec runs the newest code, but it does not overwrite the old copy on disk. npm ls -g will still report the version you installed. To actually replace it:
npm install -g brightspace-mcp-server@latest
npx clear-npx-cacheThen restart your AI client. The server and the CLI both check npm on startup, and the server re-checks every few hours. A version mismatch warning appears only when a command available in your current shell resolves to an outdated copy. Dormant installs under inactive Node versions and old npx cache entries are ignored.
Set D2L_NO_UPDATE_CHECK=1 to switch all of this off.
What's new in 3.0.0
Signing in is part of the first tool call. The separate
check_authtool is gone, and so is the step where the assistant had to ask about your login before it could answer anything. This removes a tool, so any saved prompt that namescheck_authneeds updating.Starting the server makes no network requests. API versions are discovered by the first request that needs them, and a tenant that is briefly unreachable no longer stops the server from starting.
Concurrent tool calls on a cold session share one sign-in instead of racing, so you get one MFA prompt rather than several.
Failed sign-ins now explain themselves in the tool's answer: a locked keychain, a paused MFA cooldown, or a network outage each say what to do.
A missed MFA prompt pauses automatic sign-in for five minutes instead of four hours.
Authenticator-code MFA (Google Authenticator and similar) works, with the code entered in the terminal.
Every command the server prints is pinned to
@latest, so following its own advice can never run a stale copy.
What's new in 2.0.0
Headless saved-credential login and terminal MFA, with silent session reuse across restarts.
Native secure credential storage and encrypted browser-state migration from v1.
Removed the one-hour browser-state cutoff and destructive profile recovery.
Process-level authentication coordination, failed-MFA cooldown, and transport errors that preserve your session.
Publishing waits for the test matrix on macOS, Windows, and Linux.
Report a bug · MIT · Copyright 2026 Rohan Muppa
Available Tools
13 toolscheck_authCheck Authentication StatusA
Check if you are authenticated with Brightspace. Run the brightspace-auth CLI first to authenticate. Use this when the user asks if they're logged in, if authentication is working, or when other tools return auth errors.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description implies read-only check and suggests appropriate usage context. Lacks detail on return value or potential error states, but sufficient for simple auth check.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, dramatically front-loaded. First sentence states purpose, second gives prerequisites, third lists use cases. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no output schema tool, description fully explains what it does, prerequisites, and when to use it. Complements sibling tools well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters defined; schema covers 100%. Description does not add parameter info, but with zero parameters, baseline is 4 per guidelines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool checks authentication status with Brightspace. Distinct from siblings which handle file downloads, course content, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to run a CLI first, specifies when to use: when user asks about login status or when auth errors occur from other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileDownload FileA
Download a file from course content or assignment submissions to a local directory. Use this when the user wants to download, save, or get a file from Brightspace course content or dropbox submissions. IMPORTANT: You MUST ask the user where they want to save the file before calling this tool. Never guess or assume a download directory. After identifying the file to download, suggest a clean readable filename to the user (e.g., 'Lecture 7 - Memory Management.pdf' instead of 'L07_CS251_2026SP_v2.pdf') and ask if they'd like to rename it. Pass their preferred name as customFilename, or omit it to keep the original.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | No | Specific file ID within a dropbox submission. | |
| topicId | No | Content topic ID to download (for course content files). | |
| courseId | Yes | Course ID the file belongs to. | |
| folderId | No | Dropbox folder ID (for submission/feedback file downloads). | |
| downloadPath | Yes | Absolute path to the directory where the file should be saved. | |
| customFilename | No | Custom filename for the downloaded file (include extension). If not provided, uses the original filename from Brightspace. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool downloads (writes) files and mentions user interaction (asking for path/rename). However, it lacks details on overwrite behavior, permissions, size limits, or error handling, which are important for a file download operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is 4 sentences with no fluff. It immediately states the purpose, then provides usage context, and ends with actionable guidelines. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description is thorough in covering purpose, usage, and parameter context. It lacks only minor behavioral details (e.g., overwrite). Overall, it is well-rounded for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds significant value: it explains the two types of file sources (course content via topicId vs dropbox via folderId/fileId) and how customFilename works. It also advises on when to use each parameter, going beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Download a file from course content or assignment submissions to a local directory' with a specific verb ('download') and resource ('file from course content or dropbox submissions'). It distinguishes from sibling tools (no other download tools exist) and provides context for use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this when 'the user wants to download, save, or get a file from Brightspace course content or dropbox submissions'. It includes critical guidance: 'You MUST ask the user where they want to save the file before calling this tool' and suggests suggesting a clean filename, giving concrete examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_announcementsGet AnnouncementsA
Fetch recent announcements from your courses. Can filter to a specific course or get announcements across all courses. Use this when the user asks about announcements, news, updates from instructors, recent posts, or what professors said.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Maximum number of announcements to return | |
| courseId | No | Course ID to get announcements for. If omitted, returns recent announcements across all courses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Implies read-only operation via 'fetch', but omits details like recency definition or impact of missing parameters. No annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with front-loaded purpose and actionable usage hints. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple 2-parameter tool with no output schema. Could clarify 'recent' timeframe but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already describes both parameters fully (100% coverage). Description adds marginal value by linking courseId absence to cross-course results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool fetches announcements, distinguishes from siblings like get_assignments or get_discussions, and specifies filtering options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage examples (announcements, news, updates) but lacks exclusion guidance or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignment_filesGet Assignment FilesA
Read the files an instructor attached to an assignment: the spec or instructions PDF, a starter workbook, a rubric document. Call it with just courseId to see which assignments have attachments, then with folderId and fileId to read one. Use this when the user asks what an assignment requires, what the instructions say, or to summarize a handout. Returns the text itself. Use download_file instead when the user wants the file saved to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | No | Attachment file ID to read. Requires folderId. Omit to list the files without reading them. | |
| courseId | Yes | Course ID whose assignment attachments to look at. | |
| folderId | No | Assignment (dropbox folder) ID. Omit to list every assignment in the course that has attachments. | |
| maxChars | No | Maximum characters of extracted text to return. The response reports whether it was truncated. | |
| extractText | No | Extract readable text from the file. Works for PDF, DOCX, XLSX, PPTX, and plain text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly states that the tool reads and 'Returns the text itself,' implying a read-only operation rather than a download. It does not mention auth requirements or unsupported file type edge cases, but core behavior is transparent enough for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: resource identification, call patterns, use cases, return behavior, and the sibling alternative are all covered in three compact sentences. The core purpose is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description still covers the main invocation modes, the output nature, the supported file formats via schema, and the key sibling alternative. An agent has enough context to call this tool correctly without further investigation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful workflow semantics: 'Call it with just courseId to see which assignments have attachments, then with folderId and fileId to read one.' This clarifies parameter relationships beyond the schema field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete action and resource: 'Read the files an instructor attached to an assignment,' and names likely file types (PDF, workbook, rubric). It also distinguishes itself from the sibling download_file by contrasting reading versus saving, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use conditions: 'when the user asks what an assignment requires, what the instructions say, or to summarize a handout.' It also names the alternative: 'Use download_file instead when the user wants the file saved to disk.' It even prescribes a two-step call pattern, which removes ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignmentsGet AssignmentsA
Fetch assignments and quizzes for a specific course or all enrolled courses. Shows dropbox submissions and quizzes with due dates, status, and rubric info. Use this when the user asks about assignments, homework, what to submit, quizzes, or assignment details and rubrics.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | No | Course ID to get assignments for. If omitted, returns assignments for all enrolled courses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that the operation is a fetch (read-only) and describes returned data. No contradictions; additional behavioral details like authentication or pagination are not critical for a simple read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, concise and front-loaded. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description provides adequate detail about return values (dropbox submissions and quizzes with due dates, status, rubric info). Could mention if results are paginated, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with parameter 'courseId' described. Description adds crucial context: omitting it returns assignments for all enrolled courses. This adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Fetch assignments and quizzes' with specific resources (dropbox submissions, quizzes) and details (due dates, status, rubric info). It distinguishes itself from siblings like get_course_content or get_my_grades by specifying the data type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use this when the user asks about assignments, homework, what to submit, quizzes, or assignment details and rubrics.' Does not mention when not to use or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_classlist_emailsGet Classlist EmailsA
Fetch all email addresses for everyone in a course — instructors, TAs, and students. Use this when the user wants a list of emails for a class, needs to email the whole class, or wants contact info for everyone enrolled.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID to get emails for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description fails to disclose authentication requirements, side effects, or any behavioral traits. It implies a read operation but without explicit statement, leaving the agent without critical safety cues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff, front-loaded with purpose then usage scenarios. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter. Description covers purpose and usage but omits return format (e.g., list of emails, comma-separated). Adequate but could improve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter with a description. The tool description does not add additional semantic value beyond the schema, meeting baseline for 100% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches email addresses for all roles (instructors, TAs, students) in a course. It uses specific verb and resource, and distinguishes from siblings like get_roster by focusing solely on emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage scenarios such as when the user wants a list of emails for a class. Lacks explicit when-not-to-use or alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_contentGet Course ContentA
Fetch the content tree for a course showing modules, topics, files, and links. Use this when the user asks about course materials, lecture slides, uploaded files, content structure, or what's in a course module. Use moduleTitle to filter to a specific module (e.g. 'Labs', 'Staff', 'Homeworks') instead of fetching the entire tree. Use maxDepth to limit recursion depth for a table-of-contents view.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID to get content tree for. | |
| maxDepth | No | Limit recursive depth of the content tree. Depth 1 returns top-level modules with direct children only. Useful for getting a table of contents without all nested content. | |
| typeFilter | No | Optional filter to narrow results by content type. | all |
| moduleTitle | No | Case-insensitive substring match on module titles. Only returns modules whose title contains this string (e.g. 'Labs', 'Staff', 'Homeworks'). Children of matching modules are included in full. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It describes 'fetch' implying read-only, but does not explicitly state no side effects or auth requirements. However, it gives clear behavioral insights on filtering and depth, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with purpose, followed by usage and parameter tips. No wasteful words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, full schema coverage, and no output schema, the description covers key use cases and parameter usage. It mentions the content tree components (modules, topics, files, links), but could provide more detail on the return structure. Still, it's sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline is 3. The description adds practical usage guidance for moduleTitle and maxDepth beyond the schema descriptions, such as 'table-of-contents view', improving parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a course content tree listing modules, topics, files, and links. It distinguishes from sibling tools like get_assignments or get_discussions by focusing on course materials and structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool (user asks about course materials, lecture slides, etc.) and provides parameter guidance (moduleTitle, maxDepth). It does not explicitly state when not to use, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_discussionsGet DiscussionsA
Fetch discussion board content for a course including forums, topics, and posts. Use this when the user asks about discussion boards, forum posts, class discussions, or wants to see what's been posted. Provide just courseId to list all forums and their topics. Add forumId to get topics and posts for a specific forum. Add both forumId and topicId to get all posts in a specific discussion topic.
| Name | Required | Description | Default |
|---|---|---|---|
| forumId | No | Specific forum ID to get topics and posts for. If omitted, returns all forums. | |
| topicId | No | Specific topic ID to get posts for. Requires forumId. | |
| courseId | Yes | Course ID to get discussion boards for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description focuses on functionality without mentioning behavioral traits like read-only nature, authentication needs, or side effects. For a fetch operation, this is adequate but could be more transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences. Front-loaded with purpose. No redundant information. Efficiently conveys parameter combinations and usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 100% schema coverage, no output schema, and no annotations, the description is complete for a simple fetch tool. It covers all parameter scenarios. Lacks mention of return format or whether it's read-only, but these are not critical for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers all parameters with descriptions. Description adds significant value by explaining how parameters interact hierarchically (e.g., just courseId lists forums, add forumId for topics, add topicId for posts). This clarifies usage beyond individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Fetch' and resource 'discussion board content for a course including forums, topics, and posts'. It distinguishes from sibling tools like get_announcements and get_assignments which cover different content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'when the user asks about discussion boards, forum posts, class discussions, or wants to see what's been posted.' Provides parameter usage patterns but does not mention when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_coursesGet My CoursesA
Fetch your enrolled Brightspace courses with names, codes, and IDs. Use this when the user asks about their courses, enrolled classes, what they're taking this semester, or needs a course ID for other queries.
| Name | Required | Description | Default |
|---|---|---|---|
| activeOnly | No | Only return currently active courses. Defaults to the server's configured activeOnly setting (true unless overridden). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure burden. 'Fetch' clearly indicates a read-only operation and 'your enrolled' defines scope, but it does not disclose authentication requirements, error behavior, or the fact that the result is a list. It is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. The first sentence states the core purpose, and the second provides actionable usage triggers. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description covers the essential context: what is returned and when to use it. It could mention that no other prerequisites exist or how results are ordered, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter activeOnly is fully described in the input schema, including its default behavior, so the schema covers the parameter semantics completely. The description adds no parameter-specific guidance, which is acceptable given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Fetch') and resource ('your enrolled Brightspace courses') and enumerates the fields returned (names, codes, IDs). It is unambiguously distinct from siblings like get_course_content or get_roster, so an agent can immediately tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit triggers: user asks about courses, enrolled classes, this semester, or needs a course ID for other queries. It does not explicitly mention when not to use it or name alternatives, but the use cases are concrete and sufficient for most situations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_gradesGet My GradesA
Fetch your grade breakdown for a specific course or all enrolled courses. Shows grade items with points, percentages, and comments. Use this when the user asks about grades, scores, marks, GPA, academic performance, or how they're doing in a class.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | No | Course ID to get grades for. If omitted, returns grades for all enrolled courses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavioral traits. It only mentions output format (points, percentages, comments) but does not state that it is a read-only operation, any permissions needed, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with key information. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and no output schema, the description provides adequate context: action, scope, output content, and usage hints. Missing explicit read-only declaration, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with a clear description for courseId. The description adds context about the response but no additional parameter semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches grade breakdowns for a specific course or all courses, with specific fields (points, percentages, comments). It distinguishes itself from sibling tools like get_assignments by focusing on grades.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use: when user asks about grades, scores, marks, GPA, academic performance. Does not mention when not to use or alternatives, but the guidance is clear and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rosterGet Course RosterA
Fetch the roster for a course including instructors, TAs, and optionally students with their names, emails, and roles. Use this when the user asks about classmates, instructor contact info, TA emails, professor names, or who's in a class. By default returns only instructors and TAs for privacy. Use includeStudents to get full class list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum users to return. Default 100. The response reports the true total and whether it was truncated. | |
| courseId | Yes | Course ID to get roster for. | |
| searchTerm | No | Optional search term to filter by name. | |
| includeStudents | No | Include students in results. Default is instructors and TAs only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It reveals a key privacy-related default: 'By default returns only instructors and TAs for privacy' and explains that includeStudents provides the full class list. This goes beyond the schema's default value by adding rationale and context. It does not cover permissions or result formatting, but the central behavioral trait is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The first sentence states the core operation and scope, the second gives concrete usage triggers, and the third explains the default and how to override it. Every sentence earns its place and key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fetch tool with no output schema and no annotations, the description plus fully documented schema covers the essential aspects: what is returned, default behavior, and when to use it. It does not mention truncation or search filtering, but those are already explained in the parameter descriptions. Minor gap: no explicit note about the response shape, but the content description suffices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds marginal value by explaining includeStudents in terms of the default privacy behavior, but it does not elaborate on limit, searchTerm, or courseId beyond what the schema already provides. This is adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Fetch the roster for a course' and enumerates the contents (instructors, TAs, optionally students) plus names, emails, and roles. It gives clear use cases (classmates, instructor contact info, TA emails, professor names), but does not explicitly differentiate from the sibling get_classlist_emails, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when the user asks about classmates, instructor contact info, TA emails, professor names, or who's in a class,' giving clear context for when the tool is appropriate. It does not name any alternative tool or provide exclusions, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_syllabusGet Course SyllabusA
Fetch the syllabus/overview text and optional attachment for a course. Returns the course overview description as markdown. If downloadPath is provided, also downloads the syllabus attachment (e.g. PDF). IMPORTANT: You MUST ask the user where they want to save the file before calling this tool with a downloadPath.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID to get syllabus for. | |
| downloadPath | No | Absolute path to the directory where the attachment should be saved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the tool returns markdown text, conditionally downloads attachments, and requires user consent for file saving. Without annotations, it covers key behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all essential: purpose, return format, conditional behavior, and critical usage note. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all necessary information for a two-parameter tool: input, output format, conditional download, and user-consent requirement. No output schema needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds value beyond schema by explaining that downloadPath triggers a download and that the text is markdown. Schema already describes both parameters fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch' and the resource 'syllabus/overview text and optional attachment', distinguishing it from sibling tools like get_assignments or get_course_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit instruction to ask the user for file save location before using downloadPath, but does not explicitly state when not to use the tool or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_due_datesGet Upcoming Due DatesA
Fetch upcoming due dates across all your courses, derived from the due dates on assignments (dropbox folders) and quizzes themselves. Use this when the user asks about deadlines, what's due, upcoming work, or what they need to do this week.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | No | Filter to a specific course ID | |
| daysAhead | No | Number of days ahead to look for due dates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It usefully explains that due dates are derived from assignments and quizzes, which adds context beyond the schema. However, it doesn't describe output shape, timezone handling, or whether past-due items are excluded, which are relevant for this kind of aggregation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: one states what the tool does and where the data comes from, the other gives clear usage cues. There is no redundancy or filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, data source, and usage triggers, which is sufficient for a simple read-only aggregation tool with optional parameters. Since there is no output schema, a little more detail about the returned due-date format would make it fully complete, but the core calling context is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both courseId and daysAhead. The description reinforces the default 'across all courses' behavior and the upcoming-time window, but it doesn't add meaningful parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Fetch upcoming due dates across all your courses.' It also clarifies the source (assignments/dropbox folders and quizzes). It doesn't explicitly differentiate from sibling tools like get_assignments, but the aggregated 'across all courses' framing makes the intent clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit trigger conditions: 'when the user asks about deadlines, what's due, upcoming work, or what they need to do this week.' It lacks explicit when-not-to-use guidance or alternative tool names, so it falls just short of a 5.
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.
3 tool updates
v2.0.0- Added
get_assignment_files - Changed
get_my_courses2 fields changed- removed
Input schema / properties / activeOnly / defaultRemoved value: -true - changed
Input schema / properties / activeOnly / descriptionPrevious value: -"Only return currently active courses"New value: +"Only return currently active courses. Defaults to the server's configured activeOnly setting (true unless overridden)."
- Changed
get_roster1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum users to return. Default 100. The response reports the true total and whether it was truncated.", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "integer" +}
2 tool updates
v1.0.4- Changed
download_file1 field changed- added
Input schema / properties / customFilename / maxLengthAdded value: +255
- Changed
get_roster1 field changed- added
Input schema / properties / searchTerm / maxLengthAdded value: +200
12 tool updates
v1.0.7- First observed
check_auth - First observed
download_file - First observed
get_announcements - First observed
get_assignments - First observed
get_classlist_emails - First observed
get_course_content - First observed
get_discussions - First observed
get_my_courses - First observed
get_my_grades - First observed
get_roster - First observed
get_syllabus - First observed
get_upcoming_due_dates
TDQS
Scored across 13 tools
Most tools map cleanly to distinct resources, but get_classlist_emails and get_roster overlap significantly since both provide contact/roster information, and get_assignment_files vs download_file could confuse users around file retrieval. Overall, descriptions are detailed enough to resolve most ambiguity.
All tools follow a clear verb_noun snake_case convention, with the vast majority using get_ (check_auth and download_file being sensible action verbs). The naming pattern makes the tool surface predictable and easy to navigate.
13 read-only LMS tools is a well-scoped set for a student-facing assistant. Each tool covers a meaningful query category without unnecessary redundancy or bloat.
The server comprehensively covers common student read-only needs: authentication, courses, grades, assignments, due dates, announcements, discussions, content, syllabus, and roster/contact info. It lacks any write or submission capabilities, but those appear outside the intended scope, leaving only minor potential gaps like calendar or assignment-submission details.
Maintenance
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA remote MCP server for querying Canvas LMS courses, assignments, and grades. Enables natural language interaction with Canvas data via MCP clients like Claude Desktop.9 npmMIT
- AlicenseAqualityDmaintenanceAn MCP server for accessing Dutch school schedules from Magister. Enables Claude and other MCP-compatible AI assistants to query school schedules, drop-off times, and pick-up times.49 npm3MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that connects AI assistants to university D2L Brightspace and Piazza, enabling query of courses, grades, assignments, deadlines, files, and Piazza posts.7MIT
- FlicenseNot gradedqualityBmaintenanceA Model Context Protocol (MCP) server that connects AI coding agents to your Moodle LMS. Fetch assignments, grades, deadlines, and sync everything to Obsidian automatically.-