D2L BrightSpace MCP
A read-only D2L Brightspace MCP server that lets AI assistants answer questions about your courses, deadlines, grades, files, and updates.
Get a prioritized to-do list and upcoming due dates with real submission status, so submitted work is not suggested again.
List enrolled courses, grades, assignments, quizzes, rubrics, and assignment attachments.
Read course content/modules, syllabus, announcements, discussions, rosters, and class email lists.
Calculate your current grade, best/worst possible final grade, and what you need to hit a target grade.
Export unfinished deadlines to an .ics calendar and read Brightspace calendar events such as exams and labs.
Download course files or assignment submission files to a local folder you choose.
Get a catch-up summary of new announcements, newly graded work, unread discussions, and unattempted quizzes.
Use built-in prompts for planning your week, weekly digests, grade targets, exam prep, assignment summaries, and catching up.
Allows CrewAI agents to retrieve Brightspace course information and deadlines.
Enables GitHub Copilot in VS Code to access Brightspace data such as assignments and grades.
Allows JetBrains AI Assistant to read Brightspace assignments, grades, and course materials.
Provides LangChain agents with tools to interact with Brightspace data.
Enables LangGraph agents to access Brightspace for task management and grade retrieval.
Enables OpenAI-based agents (Codex, Agents SDK) to interact with Brightspace.
Integrates Pydantic AI with Brightspace to query academic data.
Allows Vercel AI SDK to access Brightspace data for agents.
Integrates Warp with Brightspace to fetch academic information like deadlines and grades.
An MCP (Model Context Protocol) server that gives AI assistants and agents read access to your Brightspace courses: due dates with real submission status, grades, assignments, rubrics, course content, announcements, discussions and class lists. It works at any school that uses D2L Brightspace, including schools with Microsoft, Duo, Okta or Shibboleth single sign-on.
Quick start
You need Node.js 20 or newer and Google Chrome or Microsoft Edge.
npx brightspace-d2l-mcp setupThat's it. Setup asks for your school, opens a browser so you can sign in, and connects every AI app it finds. Then ask your AI:
"What should I work on right now?"
New to this? The step-by-step setup guide walks through everything with pictures of each step. Using a specific app? See the guides for Claude and ChatGPT, or how this compares to other Brightspace MCP servers.
Related MCP server: Brightspace MCP Server
How it compares
People usually weigh a few Brightspace MCP servers before picking one. Here are the three differences that come up most, with the full comparison for the rest:
Server | Submission status | Sign-in (SSO) | Target grade |
Brightspace MCP (this repo, | Every due date says whether you already handed the work in, and the to-do list skips what is done | Real browser window where you sign in yourself, so any SSO works: Microsoft, Duo, Okta, Shibboleth. No password stored |
|
brightspace-mcp-server by RohanMuppa | Shown in its assignments tool | Automated sign-in that saves your password in Keychain or Credential Manager, with presets for nine schools | No target-grade tool in its published list |
brightspace-mcp by JhostinAleck | Lists the files you submitted | Configured automation: HTTP login, headless browser with a Microsoft preset, Duo push, or pasted cookies |
|
Shown on each dropbox folder | Real browser window where you sign in with your school's SSO | No target-grade tool in its published list | |
@exhabition/brightspace-mcp (Rust) | Has assignment and submission readers | Visible Chromium window, Microsoft SSO only | No target-grade tool in its published list |
"No target-grade tool in its published list" means we could not find one in each project's public README and tool list as of October 2026, not that it can never be added. Spot a mistake in the table? Open an issue and it will be fixed.
Switching from brightspace-mcp-server
If you are running brightspace-mcp-server by RohanMuppa and want to try this one, you only change the package name. Everything else stays where it is.
In your MCP config, find the brightspace entry inside mcpServers and swap the command:
{
"mcpServers": {
"brightspace": {
"command": "npx",
"args": ["-y", "brightspace-d2l-mcp@latest"]
}
}
}On Windows, wrap the launch in cmd /c the same way you do now:
{
"mcpServers": {
"brightspace": {
"command": "cmd",
"args": ["/c", "npx", "-y", "brightspace-d2l-mcp@latest"]
}
}
}Then restart the app. If you would rather not edit files, run npx brightspace-d2l-mcp setup: it asks for your school, opens a browser window so you sign in, and writes this entry for you. You can also print the exact JSON for any app with npx brightspace-d2l-mcp config.
What carries over and what doesn't
Status | |
The | Same here, so a config entry and any saved prompt that points at the |
Tool names | They differ. See which tools this one has in the Tools table above and ask your AI for those names instead |
Your Brightspace account and courses | Nothing to move. This server signs in as you and sees the courses you are enrolled in, same as before |
A | Both names are read here too, so a course filter in your env block keeps working. |
Whatever the first server saved on your computer | It is left alone. This server stores its own settings and session in |
Want to go back? Put the old command back in the same spot. Both servers can even be configured side by side under two different server names, but one AI app talking to two Brightspace servers at once tends to be more confusing than it is worth.
A few things the first server does are not done here: it can sign you in without a browser window by saving your password in your computer's credential store, and it ships presets for several named schools. This server always opens a normal browser window where you sign in yourself, which is what makes any single sign-on work, and all it keeps afterward is your browser session.
What you can ask
Try asking | |
✅ What's left | "What should I work on right now?" · "What haven't I submitted yet?" |
📅 Deadlines | "What's due this week?" · "Anything due tomorrow?" |
📊 Grades | "What are my grades?" · "Am I passing Calculus?" |
📢 Announcements | "Did any professor post something today?" |
📚 Course content | "Find the midterm review slides" · "Summarize the Lab 3 instructions" |
📎 Assignment files | "What does the rubric for the project ask for?" |
💬 Discussions | "What are people saying in the final project thread?" |
👥 Class list | "Who's the TA for my networking course?" |
🎯 Target grade | "What do I need on the final to get an 80?" · "Can I still pass?" |
🗓️ Calendar | "Put my deadlines in my calendar" |
📝 Exams | "When is my midterm?" · "What's on my schedule this week?" |
🔔 What's new | "Catch me up" · "Did anything get graded?" |
It knows what you've already handed in
Most tools only see due dates, so they keep telling you to do work you've finished. This one checks your actual submission for every assignment:
Status | Meaning |
| Done. Never suggested as a to-do. |
| Still needs doing. |
| The dropbox hasn't opened; shows when it will. |
| You can no longer submit. |
| Quizzes: Brightspace doesn't show students their quiz attempts, so your AI will ask you. |
Tools
17 MCP tools for D2L Brightspace. Everything reads from Brightspace and nothing is ever changed there:
Tool | What it does |
| Prioritized to-do list across every course: what's due soon, overdue, not open yet, and already done |
| Upcoming deadlines with the real submission status of each assignment |
| Your enrolled courses with names, codes and ids |
| Grade breakdown per course with points, percentages and instructor comments |
| Assignments (dropboxes) and quizzes with due dates, status and rubrics |
| Reads the instructions, handouts and rubric files attached to an assignment |
| Course modules, lecture slides, files and links |
| Course syllabus and overview |
| Recent announcements (news) from your instructors |
| Discussion forums, topics and posts |
| Instructors and TAs with contact info, optionally the full class list |
| Email addresses for everyone in a course |
| Saves a course file or submission to a folder you choose |
| Where you stand in a course and what you need on the remaining work to hit a target grade |
| Builds a calendar file (.ics) of your unfinished deadlines for Google Calendar, Apple Calendar and Outlook |
| Exams, tests, labs, classes and other events from your course calendars |
| Catch-up across every course: new announcements, newly marked work, unread discussions and untried quizzes |
Built-in prompts
Apps that support MCP prompts show these as one-click shortcuts or slash commands:
what_should_i_do_now · plan_my_week · weekly_digest · grade_target · exam_prep · summarize_assignment · put_deadlines_in_my_calendar · catch_me_up · when_are_my_exams
Works at any Brightspace school
Every school signs in differently: Microsoft, ADFS, Duo, Shibboleth, Okta, Google, campus pickers, or Brightspace's own form. Instead of guessing how your school works, setup opens a normal browser window and you sign in exactly like you do every day, text codes and authenticator apps included.
After that it stays signed in quietly in the background. If your school ever asks you to sign in again, the browser window simply pops up and closes by itself when you're done.
Does my school work?
If your school uses D2L Brightspace, yes. Setup opens a normal browser window so any sign-in works, including Microsoft, Duo, Okta and Shibboleth.
School | Status |
One college | Tested by the author |
Any other D2L school | Should work. Open an issue with yours and I will add it here |
Works with your AI app or agent
Connected automatically by setup: Claude Desktop · Claude Code · Cursor · VS Code (GitHub Copilot) · Windsurf · OpenAI Codex · Gemini CLI · Cline · Roo Code · OpenCode · Zed · LM Studio · Kiro
One copy-paste away: ChatGPT (developer mode) · Continue · Goose · JetBrains AI Assistant · Warp · Amp · Msty · Jan · AnythingLLM
Agent frameworks: OpenAI Agents SDK · Claude Agent SDK · LangChain / LangGraph · Vercel AI SDK · Mastra · CrewAI · Pydantic AI · LlamaIndex
It runs over stdio for local apps and streamable HTTP (serve --http) for ChatGPT and hosted agents.
See docs/agents.md for copy-paste setup for every one of these.
Install it with your AI
Paste this into Claude Code, Cursor, Windsurf, Copilot or Codex and it will set everything up for you.
Install brightspace-d2l-mcp for me by following
https://github.com/AnonymousOnyx22/brightspace-d2l-mcp/blob/main/llms.txtCommands
Command | What it does |
| Pick your school, sign in, connect your AI apps. On Windows the window closes by itself when done ( |
| Sign in again |
| Show your school, whether you're signed in, and connected apps |
| Check Node, your school, sign-in and connected apps, and say how to fix anything wrong |
| Delete the saved session |
| Remove from all AI apps and delete all local data |
| Run over HTTP for ChatGPT and HTTP-based agents |
| Print the MCP config JSON for any other app |
When a newer version is out, commands ask whether to update first. Set BRIGHTSPACE_NO_UPDATE_CHECK=1 to turn that off.
npx brightspace-d2l-mcp setup --school yourschool.brightspace.com # skip the school question
npx brightspace-d2l-mcp setup --apps claude-desktop,cursor # only connect these apps
npx brightspace-d2l-mcp setup --skip-login # sign in later, on first use
npx brightspace-d2l-mcp setup --yes # accept every defaultApp ids: claude-desktop, claude-code, cursor, vscode, windsurf, codex, gemini-cli, cline, roo-code, opencode, zed, lm-studio, kiro.
Privacy and security
Your password is never seen or stored. You type it into your school's own sign-in page in a real browser.
Read-only. It can't submit, post, or change anything in Brightspace. No tool sends anything but GET requests, the API client has no write methods at all, and a test fails the build if one is ever added. See how read-only is enforced.
Local only. Everything runs on your computer and talks only to your school's Brightspace. There's no server in between, and no analytics.
Uses the official Brightspace API with the same access you have in your browser.
Your session is saved in
~/.brightspace-d2l-mcp/, readable only by your user account.logoutdeletes it;uninstalldeletes everything.
Troubleshooting
Something not working? docs/troubleshooting.md walks through an app that shows no Brightspace tools, a setup window that never opens, and a single sign on that keeps failing, with the exact message each one prints. It starts with npx brightspace-d2l-mcp doctor.
Install Google Chrome or use Microsoft Edge (already on Windows).
Or install a private copy of Chromium with npx playwright install chromium.
Sign in to Brightspace in your browser, then copy the address from the address bar (any page works). If it says your site "runs Blackboard" or "Canvas", your school doesn't use Brightspace.
Fully quit Claude Desktop (tray icon → Quit, not just closing the window), then run setup again.
Claude Desktop rewrites its settings while it's open, so setup offers to restart it for you.
Some schools end sessions every few hours. When that happens a browser window opens so you can sign in again.
Run npx brightspace-d2l-mcp doctor to find out what is wrong, status for a quick look, or login to sign in right away.
If you'd rather it never opens a window on its own, add "autoLogin": false to ~/.brightspace-d2l-mcp/config.json.
Add course ids to ~/.brightspace-d2l-mcp/config.json:
{ "excludeCourses": [123456, 789012] }Or keep only specific ones with "includeCourses". Ask your AI "list my courses with their ids" to find them.
FAQ
Run npx brightspace-d2l-mcp setup. It connects Claude Desktop and Claude Code automatically. Then ask Claude about your courses.
Yes. This connects Brightspace to the AI app you already use (Claude, ChatGPT, Cursor, GitHub Copilot, Gemini and others), so you can ask about deadlines, grades and course files in plain English instead of clicking through every course.
Run npx brightspace-d2l-mcp serve --http, expose it with a tunnel, and add the URL as a connector in ChatGPT developer mode. docs/agents.md walks through each step.
Run npx brightspace-d2l-mcp setup. It finds Cursor, VS Code, Windsurf and 10 other apps and connects them for you.
Yes. Local agents and SDKs launch it with npx -y brightspace-d2l-mcp@latest, and ChatGPT or HTTP-based agents use npx brightspace-d2l-mcp serve --http. docs/agents.md has copy-paste setup for ChatGPT, the OpenAI Agents SDK, Claude Agent SDK, LangChain, Vercel AI SDK and more.
No. Brightspace API keys normally require an administrator. This uses your own student sign-in instead, so it sees exactly what you see in Brightspace, and nobody at your school has to set anything up.
Change the package name in your MCP config: replace brightspace-mcp-server with brightspace-d2l-mcp in the same brightspace entry, then restart the app. Or run npx brightspace-d2l-mcp setup and let it write the entry for you. Switching from brightspace-mcp-server covers what carries over and what does not.
Yes. You sign in yourself in a real browser window, so any sign-in method your school uses works.
Yes. Ask "what do I need on the final to get an 80 in Calculus?" and get_grade_outlook uses the weights Brightspace reports to give your current percentage, your best and worst possible final grade, and the average you need on everything left.
Yes. Ask your AI to put your deadlines in your calendar. export_due_dates_calendar makes an .ics file with a link back to Brightspace and a one day reminder on each event, and only includes work you have not handed in.
Any school on D2L Brightspace, whether the address looks like yourschool.brightspace.com, yourschool.desire2learn.com, or a custom domain like learn.yourschool.edu.
No. It's read-only on purpose.
No. It's an independent open-source project that uses the official Brightspace API with your own sign-in. It isn't affiliated with or endorsed by D2L.
Development
git clone https://github.com/AnonymousOnyx22/brightspace-d2l-mcp.git
cd brightspace-d2l-mcp
npm install
npm run build
npm test
node build/index.js setup # connects your AI apps to this local buildTools live in src/tools/, sign-in in src/auth/, and setup in src/cli/.
Issues and pull requests are welcome.
More free student MCP servers
All free, open source and read only where they touch your accounts. Browse the full list at brightspacemcp.com/more-mcps.
Server | What it does |
Canvas LMS for AI, read only. Due dates, missing work, grades and announcements. | |
Moodle for AI, read only. Due dates, overdue work, grades and announcements. | |
Google Classroom for AI, read only. Todos, due dates, missing work and grades. | |
GPA, grade conversion and the grade you need on the final, for AI. Works offline, no account. | |
APA, MLA and Chicago citations from a DOI, an ISBN or typed details. No account. | |
Exam study schedules, spaced repetition dates, pomodoro plans and assignment milestones. Works offline. | |
Search scholarly papers, find open access copies and related work through OpenAlex. No key needed. |
License
MIT © AnonymousOnyx22
D2L and Brightspace are trademarks of D2L Corporation. This project is not affiliated with D2L.
Available Tools
17 toolsdownload_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.
export_due_dates_calendarExport Due Dates To CalendarAIdempotent
Builds an iCalendar (.ics) file of upcoming assignments and quizzes that opens in Google Calendar, Apple Calendar and Outlook. Each event has a link back to Brightspace and a one day reminder. By default only unfinished work is included. Pass downloadPath (an absolute folder) to save the file, otherwise the calendar text is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | No | Only include this course | |
| daysAhead | No | How many days ahead to include | |
| downloadPath | No | Absolute path to a directory. When given, the .ics file is saved there instead of returned as text. | |
| includeSubmitted | No | Also include work that is already submitted or graded. Default is only work still left to do. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that events carry Brightspace links, include a one-day reminder, default to unfinished work, and that output is either a saved file or inline calendar text. This is meaningful behavioral context the agent would otherwise have to guess, though file overwrite behavior is not addressed.
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 the artifact produced, followed by behavioral defaults and the output-mode decision. No sentence is wasted.
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 self-contained export tool with no output schema and fully documented parameters, the description supplies the product format, compatibility, reminder/link behavior, default filtering, and output mode — everything needed to invoke it 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 coverage is 100%, so every parameter is already documented. The description adds only the practical framing of downloadPath as an absolute folder versus inline return, which is a marginal supplement rather than new syntax or defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact ('Builds an iCalendar (.ics) file') plus the content scope ('upcoming assignments and quizzes'), which clearly distinguishes it from read-only siblings like get_upcoming_due_dates and get_calendar_events.
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?
Explains the default behavior (only unfinished work) and the two output modes tied to downloadPath, giving clear operational context. It does not explicitly name when to prefer this over get_upcoming_due_dates or get_calendar_events, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_announcementsGet AnnouncementsARead-only
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?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered and the bar is lower. The description adds only that results are "recent" with an optional course scope, without disclosing ordering, what "recent" means, pagination, or how a course-less call behaves at scale.
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 tight sentences, purpose front-loaded, then scope, then triggers. The middle sentence partly duplicates what the schema already states about courseId being optional, but the text is still economical with no padding.
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-required-parameter read tool with a 100%-documented schema and annotations covering the safety profile, the description covers what, when, and scope. The only real omissions (ordering, recency window, pagination) are minor for a simple list tool with no output schema.
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%, so both parameters (count, courseId) are already fully documented in the schema, including the omitted-courseId behavior. The description restates the courseId semantics but adds no format, default, or constraint 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 gives a specific verb+resource ("Fetch recent announcements") and states the scope (your courses, optionally one course). It stops short of distinguishing itself from adjacent retrieval siblings like get_discussions or get_whats_new, and the phrase "recent posts" slightly blurs the announcements-vs-discussions line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete user-intent triggers ("announcements, news, updates from instructors, recent posts, or what professors said"), which is clear usage context. It names no exclusions or alternative tools (e.g., when to prefer get_whats_new or get_discussions), so it falls 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.
get_assignment_filesGet Assignment FilesARead-only
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?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds non-obvious behavior: the two-phase invocation (list with courseId, then read with folderId+fileId) and that it returns extracted text rather than a file. It doesn't discuss auth scope or per-file size limits beyond what the schema states.
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, front-loaded with purpose, then the call pattern, then triggers, then the alternative. No filler; each sentence either routes the agent or explains a mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so ('Returns the text itself'), while truncation is handled by the schema's maxChars description. No output schema requirement is unmet, and no annotation gap remains for a read-only 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 coverage is 100%, so each parameter is already documented, giving a baseline of 3. The description goes further by explaining how parameters combine into two distinct modes (courseId alone lists, folderId+fileId reads one), which is workflow meaning the schema describes only per-field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read the files an instructor attached to an assignment') and enumerates the concrete artifact types (spec PDF, starter workbook, rubric). It also explicitly distinguishes itself from the sibling download_file, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ('what an assignment requires, what the instructions say, summarize a handout') and a named alternative with its selecting condition ('Use download_file instead when the user wants the file saved to disk'). It also prescribes the two-step call pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignmentsGet AssignmentsARead-only
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?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful content scope (due dates, status, rubric info) but says nothing about authentication, pagination, empty-result behavior, or ordering. With annotations carrying the safety burden, this is an adequate-but-thin addition.
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 tight sentences with the core purpose front-loaded, then return content, then usage triggers. Every sentence earns its place 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?
There is no output schema, so the description correctly compensates by describing what comes back (submissions, quizzes with due dates, status, rubric info). Combined with the annotations, an agent has enough to call it correctly; only ordering/volume behavior is unaddressed.
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% and the single courseId parameter is fully documented, including the default behavior when omitted. The description adds no syntax, format, or constraint detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Fetch assignments and quizzes') and states the scope ('a specific course or all enrolled courses'). It also enumerates the returned artifacts (dropbox submissions, quizzes), which helps separate it from sibling tools like get_todo or get_upcoming_due_dates, though it never names those siblings explicitly.
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 final sentence gives concrete user-intent triggers: 'assignments, homework, what to submit, quizzes, or assignment details and rubrics.' That is clear routing context, but it offers no exclusions or alternatives, so an agent must infer why it should pick this over get_todo or get_upcoming_due_dates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_eventsGet Calendar EventsARead-only
Events from the Brightspace course calendar: exams, tests, labs, classes, office hours and other dated events that instructors post, plus due-date events. Use this when the user asks when an exam or test is, what is on their schedule, or what is happening on a day. For what work is left to hand in, use get_todo instead.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Only events whose title or description contains this text, for example 'exam' or 'midterm' | |
| courseId | No | Only include this course | |
| daysBack | No | Also include events from this many days ago | |
| daysAhead | No | How many days ahead to include |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful scope context beyond that: it is the Brightspace course calendar, and it includes due-date events in addition to posted events, which matters given overlapping siblings like get_upcoming_due_dates. It does not cover result ordering or pagination behavior, a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: what it returns, when to call it, and which sibling to prefer instead. Zero filler and the scoping 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 read-only, no-required-param query tool with a fully documented schema and no output schema, the definition covers purpose, triggers, and the sibling boundary. The one thing not addressed is what the returned events look like or how they are ordered, which an agent might want before formatting results.
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 all four parameters (search, courseId, daysBack, daysAhead) are already documented in the schema. The description adds no extra syntax or semantics for them, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (events from the Brightspace course calendar) and enumerates the content types it returns (exams, tests, labs, classes, office hours, due dates). It also explicitly distinguishes itself from sibling get_todo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger conditions ('when the user asks when an exam or test is, what is on their schedule, or what is happening on a day') and names the alternative to use for a different need ('for what work is left to hand in, use get_todo instead'). When-to-use and when-not-to-use are both explicit.
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 EmailsARead-only
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. Returns emails only, with no names or roles. For names, roles or finding a specific instructor or TA, use get_roster instead.
| 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?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful return-shape context ('Returns emails only, with no names or roles'), which matters because there is no output schema. It stops short of pagination or ordering details, but the additions exceed what annotations provide.
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 tight sentences: purpose first, then usage scenarios, then the routing exclusion. Every sentence earns its place and the most decision-relevant 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 one-parameter read tool, the description covers purpose, usage, return contents, and the alternative. With no output schema, the note that only emails (no names/roles) are returned closes the main gap an agent would otherwise have.
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?
There is a single parameter with 100% schema description coverage ('Course ID to get emails for'), so the schema fully documents it. The description adds no syntax or format detail beyond that, which is the expected baseline when the schema does the heavy lifting.
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 all email addresses for everyone in a course') and enumerates the covered groups (instructors, TAs, students). It explicitly distinguishes itself from the sibling get_roster, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete triggering scenarios ('needs to email the whole class', 'contact info for everyone enrolled') and names the alternative tool plus the condition that selects it ('For names, roles or finding a specific instructor or TA, use get_roster instead'). When-to-use and when-not-to-use are both covered.
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 ContentARead-only
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?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-scope behavior are covered structurally. The description adds only the return shape (modules/topics/files/links), and with no output schema it does not mention pagination, size limits, or how deep an unfiltered tree may go. Useful context, but modest given the read-only 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?
Three sentences, each earning its place: purpose first, then when-to-use triggers, then the two optional narrowing parameters. Front-loaded and free of 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?
With no output schema, the description correctly shoulders the burden of stating what is returned (a content tree of modules, topics, files, links) and how to scope it. It stops short of describing traversal size, ordering, or truncation behavior for deep trees, but is otherwise sufficient for correct invocation.
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 all four parameters, making 3 the correct baseline. The description reinforces moduleTitle with filter semantics ('instead of fetching the entire tree') and maxDepth with purpose ('table-of-contents view'), adding rationale but no new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('content tree for a course') and enumerates what the tree contains: modules, topics, files, and links. This distinguishes it cleanly from siblings like get_syllabus, get_assignment_files, or download_file, which each target a narrower resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger contexts ('when the user asks about course materials, lecture slides, uploaded files, content structure'), which is strong when-to-use guidance. It also advises using moduleTitle to avoid fetching the entire tree and maxDepth for a TOC view, but it never names an alternative sibling tool for overlapping needs (e.g. get_syllabus).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_discussionsGet DiscussionsARead-only
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?
Annotations already establish the safety profile (readOnlyHint=true, openWorldHint=true), so the description only needs to add operational context. It does so by disclosing how the result set expands or narrows with each parameter combination. It omits pagination, result-size, and permission behavior, which keeps it out of the top tier.
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 with zero waste: purpose, usage triggers, then the three parameter combinations in increasing specificity. Front-loaded and scannable; nothing repeats the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only three documented parameters, the description carries the return-value burden and does: it states that forumId returns topics and posts and that topicId returns all posts. An agent has everything needed to call this correctly at each level of specificity.
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%, so the baseline is 3. The description goes beyond the schema by explaining the interaction between forumId and topicId in terms of returned content, not just the 'requires forumId' constraint the schema states. It adds meaning rather than restating field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch discussion board content for a course') and enumerates the sub-resources covered (forums, topics, posts). The resource is clearly distinct from every sibling tool (announcements, assignments, content, roster), so an agent can select it without cross-referencing 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?
Gives explicit user-intent triggers ('discussion boards, forum posts, class discussions') and a precise escalation ladder: courseId alone, add forumId, add forumId+topicId. It stops short of naming an alternative tool to use instead (e.g. get_announcements for announcements), so it is clear but not fully comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_grade_outlookGrade Outlook And Target CalculatorARead-only
Works out where the user stands in one course and what they need on the remaining work to reach a target grade. Returns the current percentage, the best and worst possible final grade, and the average they must score on everything left to hit targetPercent. Use for "what do I need on the final to get 80?", "can I still pass?" or "am I on track?". For the raw grade items, use get_my_grades instead.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID to analyze. | |
| totalWeight | No | Total weight of the course. Almost always 100. | |
| targetPercent | No | The final grade the user wants, as a percentage (for example 80). Omit to just get the current standing and best/worst case. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint, so safety is covered; the description adds genuinely new behavioral detail about what is computed and returned (current percentage, best/worst final grade, required average) and that omitting targetPercent yields standing only. It does not discuss computation assumptions for ungraded or unweighted items, so it falls short of the top mark.
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?
Front-loaded statement of output, then concrete example queries, then the routing sentence. Every sentence carries weight, though the quoted example queries are somewhat redundant with the opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the return-value burden and does so explicitly, and annotations already cover the safety profile. Usage, alternative, and outputs are all present, so nothing needed for correct invocation 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?
Schema description coverage is 100%, so all three parameters (including totalWeight's near-always-100 note and targetPercent's omit behavior) are already documented in the schema. The description only restates targetPercent's role via the 'must score on everything left to hit targetPercent' sentence; it adds no syntax or format guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('works out where the user stands in one course and what they need...') and names the sibling it is not ('For the raw grade items, use get_my_grades instead'). An agent can distinguish it from get_my_grades 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('what do I need on the final to get 80?', 'can I still pass?') and an explicit alternative for the raw-data case. Both when-to-use and when-not-to-use are covered.
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 CoursesARead-only
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?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the return shape (names, codes, IDs), but says nothing about pagination, ordering, or whether inactive/future enrollments appear by default.
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 tight sentences, front-loaded with the resource and payload, followed by usage triggers. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-param read tool with no output schema, the description covers what is fetched and when to reach for it. It could be slightly more complete by noting the default active-only filtering behavior that the schema documents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single activeOnly parameter and its server-default behavior are already fully documented. The description does not mention activeOnly at all, so it adds no meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (your enrolled Brightspace courses) and enumerates the payload (names, codes, IDs). This differentiates it cleanly from siblings like get_my_grades, get_assignments, and get_course_content without needing to open any schema.
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?
Supplies concrete trigger phrasings ("their courses", "enrolled classes", "what they're taking this semester") and routes the agent to this tool when a course ID is needed for other queries. No explicit when-not clause, but the trigger list is specific enough to drive selection.
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 GradesARead-only
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?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description goes further by disclosing the shape of the return data (grade items with points, percentages, and comments), which matters since no output schema exists. It stays silent on error cases (e.g., invalid course ID or unenrolled course), which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and its scope, then return content, then usage triggers. The trigger sentence is a long enumeration but each clause is a plausible user phrasing, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with no output schema, the description covers the operation, the default scope, the returned fields, and when to invoke it. The only missing piece is routing guidance versus the adjacent get_grade_outlook 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 description coverage is 100% and the single courseId parameter is fully documented, including the omit-to-return-all default. The description merely restates that same default ("a specific course or all enrolled courses") without adding format or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Fetch your grade breakdown") plus the scope (one course or all enrolled courses), which is more than a tautology. It does not explicitly differentiate itself from the sibling get_grade_outlook, so the agent must infer the boundary between a raw grade breakdown and an outlook projection.
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 an explicit trigger list (grades, scores, marks, GPA, academic performance, how they're doing in a class) that maps user utterances to this tool. There are no exclusions or named alternatives, so the agent gets clear positive guidance but no disambiguation against get_grade_outlook.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rosterGet Course RosterARead-only
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. For just a plain list of email addresses to copy or email everyone, use get_classlist_emails instead.
| 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?
Annotations already declare readOnlyHint and openWorldHint, but the description adds important behavioral context: by default only instructors and TAs are returned for privacy, and includeStudents expands the result to the full class list. It also previews the returned fields (names, emails, roles).
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 front-loaded with the core action and followed by concise usage, default behavior, and alternative routing. Every sentence earns its place without 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?
With no output schema, the description provides enough return-value context (names, emails, roles), explains the privacy-sensitive default, and clarifies when to use includeStudents versus the sibling email-list tool. No critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the input schema. The description reinforces includeStudents and its privacy default, but does not add meaning beyond the schema for limit or searchTerm.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: fetch the roster for a course. It also distinguishes the tool from the sibling get_classlist_emails by explaining that this returns richer user details while get_classlist_emails is for a plain email list.
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 names user intents that should trigger the tool, such as classmates, instructor contact info, TA emails, and professor names. It also gives the condition for using includeStudents and routes a specific alternative use case to get_classlist_emails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_syllabusGet Course SyllabusARead-only
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?
Annotations already cover read-only and open-world behavior, but the description adds real value beyond them: the dual read/download behavior triggered by downloadPath, the markdown return format, and the required user-consent step before writing a file. It does not describe failure modes for an invalid courseId or a bad download path.
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 the primary action and return value, with the conditional download behavior and the user-consent warning ordered by importance. There is minor overlap between the opening 'optional attachment' phrasing and the later downloadPath sentence, but nothing wasteful enough to penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states what is returned (overview as markdown) and explains the file-download branch and the user-consent prerequisite. Combined with a fully documented 2-param schema and safety annotations, an agent has what it needs, though error/edge-case behavior is unaddressed.
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%, so both parameters are already documented. The description restates that downloadPath triggers an attachment download, which adds mild behavioral framing but no format or syntax detail beyond the schema's 'absolute path to the directory' description. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('syllabus/overview text and optional attachment for a course'), and clarifies the return format (markdown overview). This cleanly separates it from siblings like get_announcements, get_assignments, or get_course_content without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: pass downloadPath only when the attachment should also be downloaded, plus a mandatory pre-call step (ask the user where to save). It does not name an alternative for retrieving files (e.g. the sibling download_file), so there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todoWhat To Do NowARead-only
Prioritized to-do list across all courses: unfinished work due soon, recently overdue work, work not open yet, items to double-check (quizzes), and work already submitted. Use this first when the user asks what to work on, what's left, or what they should do now. For a plain chronological list of deadlines or a custom date range, use get_upcoming_due_dates instead.
| Name | Required | Description | Default |
|---|---|---|---|
| daysAhead | No | How many days ahead to include | |
| includeOverdueDays | No | Also include unfinished work that was due this many days ago |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description goes further by disclosing the composition of the result set (unfinished/due-soon, overdue, not-yet-open, quizzes needing double-check, already submitted), which is genuinely useful behavioral context given there is no output schema. It stops short of noting pagination, ordering guarantees, or result caps, so it is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste: the resource plus bucket enumeration comes first, the usage trigger second, and the sibling routing last. Every clause earns its place 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?
For a read-only query tool with full schema coverage and no output schema, the description supplies everything needed: what it returns (the bucket composition), when to call it, and when to call a sibling instead. Nothing an agent needs in order to select and invoke it correctly 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?
Schema description coverage is 100%, so both parameters (daysAhead, includeOverdueDays) are already documented with defaults and bounds. The description implies the concepts of 'due soon' and 'recently overdue' but adds no format, units, or interaction details beyond what the schema provides. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (prioritized to-do list) and scopes it precisely across all courses, then enumerates the five buckets it contains (due soon, overdue, not open yet, quizzes to double-check, already submitted). It explicitly names the sibling it is not, so an agent can distinguish it from get_upcoming_due_dates 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection criteria: 'Use this first when the user asks what to work on, what's left, or what they should do now.' It also names the alternative and the condition that selects it ('For a plain chronological list of deadlines or a custom date range, use get_upcoming_due_dates instead'), 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.
get_upcoming_due_datesGet Upcoming Due DatesARead-only
Upcoming due dates across all courses, with whether each assignment is already submitted (submissionStatus: submitted, graded, draft, not_submitted, not_open_yet, closed, past_due, restricted, unknown). Dates are UTC ISO strings; convert to the user's local time. Use for deadlines, what's due and date ranges, in date order. For advice on what to do first, use get_todo instead.
| 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?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds genuinely new context: the enumerable submissionStatus values, that dates are UTC ISO strings, that conversion to local time is required, and that results are date-ordered. Missing pagination/limit behavior, but the added semantic detail is substantial.
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 dense sentences, front-loaded with the core purpose and with no wasted preamble. The inline enum enumeration is long but functional since no output schema exists to carry it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully discloses the key return field (submissionStatus values) and the date encoding plus local-time conversion requirement. Combined with 100% schema coverage for inputs, an agent has what it needs; only ordering/pagination specifics are thin.
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%, so both parameters (courseId, daysAhead) are already fully documented in the schema. The description only implicitly gestures at them via 'all courses' and 'date ranges', adding no syntax or format beyond the schema. 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?
States a specific verb+resource ('upcoming due dates across all courses') with clear scope and even names the sibling it is not (get_todo). An agent can distinguish it from get_assignments and export_due_dates_calendar 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage ('for deadlines, what's due and date ranges') and routes the agent away with a named alternative and condition ('For advice on what to do first, use get_todo instead'). 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_whats_newWhat's NewARead-only
One catch-up summary across all courses: new announcements, unread assignment feedback (newly marked work), unread discussion posts and quizzes not attempted yet. Use this when the user asks what's new, what they missed, whether anything was graded or posted, or for a daily or weekly catch-up.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | No | Only check this course | |
| sinceDays | No | How many days back to look for new announcements |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral content by defining what counts as 'new' (newly marked work, unread posts, unattempted quizzes) and that the result spans all courses unless scoped. It omits return ordering, result limits, and whether sinceDays applies beyond announcements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the aggregate scope front-loaded before the usage triggers. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so by enumerating the four result categories, which is enough to set expectations. It stops short of describing ordering, volume limits, or the fact that sinceDays is schema-scoped to announcements only, which leaves a small ambiguity for a read tool with zero required parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both courseId ('Only check this course') and sinceDays (default 7, min 1, max 30) are already documented in the schema. The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — a 'catch-up summary across all courses' — and enumerates the exact categories it aggregates (announcements, unread assignment feedback, unread discussion posts, unattempted quizzes). This clearly distinguishes it from sibling single-domain tools like get_announcements, get_discussions and get_todo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases: 'what's new', 'what they missed', 'whether anything was graded or posted', and 'daily or weekly catch-up'. It does not name a when-not case or point at an alternative (e.g. use get_announcements for a single course's full announcement history), but the intended context is unambiguous.
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.
2 tool updates
v1.3.0- Added
get_calendar_events - Added
get_whats_new
2 tool updates
- Added
export_due_dates_calendar - Added
get_grade_outlook
13 tool updates
v1.0.0- First observed
download_file - First observed
get_announcements - First observed
get_assignment_files - 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_todo - First observed
get_upcoming_due_dates
TDQS
Scored across 17 tools
Descriptions are unusually careful, explicitly cross-referencing alternatives (get_todo vs get_upcoming_due_dates, get_roster vs get_classlist_emails, get_assignment_files vs download_file). There is still a mild cluster of deadline/time tools (get_upcoming_due_dates, get_calendar_events, export_due_dates_calendar, get_whats_new) that overlap conceptually, but each has a distinct output and the descriptions steer selection well.
All names use consistent snake_case with clear verb_noun structure (get_announcements, get_my_grades, download_file, export_due_dates_calendar). No mixed conventions or vague verbs; the pattern is predictable throughout.
17 tools is slightly heavy but justified for the breadth of an LMS surface (courses, assignments, grades, content, discussions, roster, calendar). Each tool maps to a distinct resource or view, so few feel redundant, though the deadline-related set pushes the count up a bit.
Broad read coverage: announcements, assignments, due dates, todo, courses, grades, content, discussions, files, roster, syllabus, calendar, and a catch-up summary. Gaps are mostly write/action operations (submitting assignments, posting to discussions, sending messages), which may be intentional for a read-focused server.
Maintenance
Related MCP Connectors
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with D2L Brightspace LMS, providing access to assignments, grades, course content, calendar events, and announcements through automated SSO authentication.1215 npm12MIT
- AlicenseAqualityAmaintenanceMCP server for Brightspace (D2L): check grades, due dates, announcements, rosters & more using Claude, ChatGPT, Cursor, or any MCP client. Built with TypeScript and the D2L REST API.25300 npm59MIT
- AlicenseNot gradedqualityDmaintenanceA local MCP server for Canvas LMS that enables querying courses, assignments, grades, modules, and more from any MCP-compatible AI client.10 npmMIT
- 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