Brightspace MCP Server
Read-only MCP server that gives an AI access to a student's Brightspace (D2L) account — courses, grades, deadlines, content, people, discussions, videos, and instructor/TA dropbox workflows.
Courses & server state —
get_my_courseslists enrolled courses (name, code, ID);get_server_inforeports version, runtime, timezone, sign-in status, and request counters.Deadlines & calendar —
get_upcoming_due_dates(assignments, quizzes, graded discussions, plus events) andget_calendar_events(exams, labs, schedule changes, optionally generated due-date events) over a configurable time window.Grades & assignments —
get_my_gradesfor grade items/points/comments;get_assignmentsfor dropbox and quiz status, due dates, and rubric info;get_assignment_rubricfor criteria, levels, and released outcomes;get_assignment_filesto read attached specs/rubrics.Announcements —
get_announcements(recent, filterable by course/count/modified-since) andget_announcement_filesto read attached documents.Course content —
get_course_content(modules/topics tree with filters, depth, modified-since, availability),search_course(ranked keyword search across content, announcements, discussions), andget_syllabus.Files —
download_filereturns files inline as text/image blocks or saves to a host path; handles content topics, submission files, and announcement attachments.People —
get_roster(instructors/TAs by default, optionally students, with search),get_classlist_emails(all emails), andget_my_groups(project/discussion groups and members).Discussions —
get_discussionsbrowses forums, topics, and posts, drilling from all forums down to a single topic.Videos —
get_video_transcriptreads Kaltura/BoilerCast and YouTube transcripts with timestamps, paginated via offset/maxChars.Instructor/TA tools —
get_dropbox_folders,get_dropbox_submissions,get_dropbox_user_submissions,get_dropbox_feedback,get_rubrics_for_object, anddownload_dropbox_submission_filefor reviewing, grading, and downloading student submissions (students get a clear access-required note).
Enables retrieval of transcripts from YouTube videos embedded in Brightspace course content, allowing AI to summarize lecture recordings and answer questions about video content.
Brightspace MCP Server
By Rohan Muppa, ECE @ Purdue
Lets your AI see your Brightspace classes, so you can just ask:
"What's due this week?" · "Am I passing all my classes?" · "Summarize today's announcements" · "Turn my lecture slides into flashcards"
Works with Claude Desktop, Claude Code, Cursor, ChatGPT Desktop, Windsurf, and any other app that supports MCP (the standard way to plug tools into an AI). It only reads your courses — it never submits, edits, or deletes anything.
Get started in 3 steps
Install Node.js (version 20 or newer) if you don't have it. Download, run the installer, done.
Open a terminal and run the setup:
npx -y brightspace-mcp-server@latest setupIt asks for your school's Brightspace address, your username and password, and how you normally do two-factor sign-in (phone approval, authenticator code, or a browser window). Your password goes into your computer's own password store (Keychain on Mac, Credential Manager on Windows), never into a file. At the end it connects itself to Claude Desktop, Cursor, Antigravity, Codex, or Claude Code if you have them. If one of them already has a
brightspaceentry pointing somewhere else (an old local build, a fork), setup shows you that entry and asks before replacing it.On a Mac: when Keychain asks whether
nodemay use the saved Brightspace password, choose Always Allow, not just Allow. That lets later sign-ins (theauthcommand and questions from your AI app) read it without asking again.Restart your AI app and ask it something — the first question signs you in. If your phone asks you to approve a sign-in, approve it and ask again.
At one of these schools, add the flag and skip typing the address: --purdue, --suny, --western, --tudelft, --cuny, --leiden, --mcgill, --ngeeann, --javeriana.
Rather have the AI install it for you? Paste this into Claude Code, Cursor, Windsurf, Copilot, or Codex:
Install brightspace-mcp-server for me by following
https://github.com/RohanMuppa/brightspace-mcp-server/blob/main/LLMs.md
(use --purdue at Purdue, --suny at SUNY, --tudelft at TU Delft, --cuny at CUNY, --leiden at Leiden, --mcgill at McGill, --ngeeann at Ngee Ann Polytechnic, or --javeriana at Javeriana Cali).Using a different AI app? Add the command npx -y brightspace-mcp-server@latest to its MCP settings (on Windows: cmd /c npx -y brightspace-mcp-server@latest). Exact steps for each app: docs/troubleshooting.md.
Related MCP server: unofficial-magister-mcp
Does my school work?
If your school uses D2L Brightspace, yes. These have automatic sign-in built in:
School | Sign-in | Flag |
Purdue | Microsoft (phone approval, authenticator code, or browser) |
|
SUNY | Shared site with a campus picker |
|
Western University | Microsoft |
|
TU Delft | NetID (no two-factor) |
|
CUNY | CUNY Login, authenticator code each time |
|
Leiden University | SURFconext → Microsoft |
|
McGill University | Microsoft Entra |
|
Javeriana Cali | OneGate (password + authenticator code) |
|
Ngee Ann Polytechnic | Microsoft Entra |
|
Any other D2L school | Paste your Brightspace address; if the login page isn't recognized, a browser window opens so you can sign in by hand | none |
School-specific quirks: docs/sign-in.md.
Things to ask
About | Try |
Grades | "Am I passing all my classes?" · "Compare my grades across courses" · "Is there feedback on my midterm?" (quiz-scored grades link to the quiz, since quiz feedback, including feedback only viewable in LockDown Browser, isn't readable through the API) |
Due dates | "What's due in the next 48 hours?" · "Build me a study schedule for the week" |
Assignments and rubrics | "What does the lab 4 spec actually ask for?" · "Why did I lose points on the analysis criterion?" |
Quizzes and exams | "Which quizzes close this week?" · "Is there a midterm in the gradebook that isn't on my assignments list?" |
Announcements | "Did any professor post something important today?" · "Read the file attached to today's announcement" |
Course content | "Find the midterm review slides" · "Download every PDF from Module 5" · "Search this course for office hours" · or just read a file inline instead of saving it |
Syllabus | "What's the late policy in ECE 264's syllabus?" (if the course keeps its syllabus in an external tool such as Simple Syllabus, you get the link to open instead) |
People | "Who are the TAs for ECE 264?" · "Who is in my project group?" |
Discussions | "Summarize the latest posts in the final project thread" |
Lecture videos | "What did the professor say about pinch-off in Tuesday's recording?" (Kaltura, including BoilerCast LTI links, and YouTube) |
Calendar | "When is my midterm?" · "Is lab cancelled on Thursday?" |
For instructors and TAs | "Which students haven't submitted Lab 4 yet?" · "What feedback did I leave on this student's homework?" · "Download that student's submitted PDF" (students see a clear "instructor access required" note) |
Prompts
Apps with a prompt picker (like Claude Desktop) also offer four ready-made prompts, so you can start from one click instead of typing a question:
Prompt | Arguments | What it asks for |
| — | A 7-day rollup of what's due, what's new, and what changed in your grades, across every course |
|
| Analyzes grades for one course, or all of them, and flags missing or low-scoring items |
|
| Plans study time from upcoming due dates and calendar events |
|
| Syllabus, content outline, assignments, and grades for one course |
Settings you might want
All optional, set in your AI app's MCP env config or your shell. The full list is in LLMs.md.
Setting | What it does |
| Tick Microsoft's "Don't ask again" box so later sign-ins skip the second factor (off by default; not for shared computers). |
| Sign in with Microsoft Entra's passwordless phone approval, so no password is saved on the computer (off by default; Entra schools only). Every sign-in, including automatic ones, then waits for you to approve on your phone, so it suits interactive use, not unattended or scheduled jobs. |
| Show the browser window during sign-in, for MFA methods that need a click |
| On Duo, type a passcode instead of waiting for a push |
| Skip the browser entirely with a pasted cookie or token (how) |
| Limit which courses the AI sees, by course id |
| Include courses whose enrollment has ended |
| Turn off the new-version notice |
| Write a local, content-free log of tool calls and sign-in events, for debugging session problems (how) |
When it asks you to sign in
There's no separate login — asking a question signs you in, and it stays signed in on its own most days. When your school wants two-factor again, the number to approve shows up right in the answer; approve it on your phone and the assistant keeps checking on its own — each check waits up to 45 seconds and the original question completes as soon as the sign-in does, without you having to say you've approved it. If your AI client shows tool progress messages, the number appears while the question is still running instead. If it ever gets stuck, run this in a terminal:
npx -y brightspace-mcp-server@latest authOn a Mac, sign-in first reads your saved password from Keychain. If you picked a one-time Allow at the Keychain prompt, a later sign-in from your AI app or another terminal can fail or hang waiting for an approval nobody sees; pick Always Allow instead. That permission only lets the local Brightspace server read its own saved sign-in password, nothing else in your Keychain.
How often you're asked is up to your school, not this tool. Everything else about sign-in — Duo, authenticator codes, visible-browser mode, and running without a browser at all (Docker, WSL, hardware keys) — is in docs/sign-in.md.
Something not working?
Run
npx -y brightspace-mcp-server@latest doctorfirst — it checks your Node version, saved setup, credential store, Brightspace connectivity, saved sign-in, and installed version, and tells you exactly what to fix.Authentication failed: The native credential store is locked or unavailable.Your password store is locked or hasn't let this server read the saved password. Unlock it (on a Mac, log in or unlock Keychain Access), then runnpx -y brightspace-mcp-server@latest authagain, orsetupif that still fails, and choose Always Allow when Keychain asks.It works in the terminal but not in the app: the app starts it separately and may not see your password store yet — see docs/troubleshooting.md.
Which version do I have? Ask your AI "which version of the Brightspace server am I running?"
Still stuck? Open an issue and paste what the terminal printed.
For developers
Tool reference, response fields, and environment variables: LLMs.md. What's safe to build against: STABILITY.md. Licensed under the MIT License.
Available Tools
25 toolsdownload_dropbox_submission_fileDownload Dropbox Submission FileA
Download a specific file from a student's (or group's) dropbox submission to a local directory, for an instructor or TA. Use get_dropbox_submissions or get_dropbox_user_submissions first to find submissionId and fileId. Requires instructor or TA access to the course. IMPORTANT: Ask the user where they want to save the file before calling this tool. After identifying the file, suggest a clean readable filename and ask if they'd like to rename it.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID within that submission. | |
| courseId | Yes | Course ID the dropbox folder belongs to. | |
| folderId | Yes | Dropbox folder ID. | |
| downloadPath | Yes | Absolute path to the local directory where the file should be saved. | |
| submissionId | Yes | Submission ID, from get_dropbox_submissions or get_dropbox_user_submissions. | |
| customFilename | No | Custom filename for the downloaded file (include extension). If omitted, uses the original submission filename. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses the auth requirement, the workflow, and the rename behavior. It does not state whether an existing file at downloadPath is overwritten or what a successful response contains, which is a modest remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then prerequisites, then the interactive instructions. Every sentence earns its place, though the capitalized rename directive is slightly verbose for what it conveys.
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?
No output schema exists, but for a local-download tool the result is largely self-evident. The definition covers prerequisites, access control, and workflow; the only omission is explicit return/overwrite behavior.
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 baseline is 3. The description adds meaning by linking submissionId and fileId to their source tools and tying downloadPath/customFilename to the required user interaction (asking where to save, suggesting a filename), which goes beyond the schema 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 (download) and a precise resource (a file from a student's or group's dropbox submission) with an explicit audience (instructor or TA). This distinguishes it from the generic download_file and from the read-only get_dropbox_* siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite tools (get_dropbox_submissions / get_dropbox_user_submissions) to obtain submissionId and fileId, states the access requirement (instructor or TA), and gives sequencing instructions (ask for save location first, then suggest a rename). 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.
download_fileDownload FileA
Download a file from course content, assignment submissions, or an announcement's attachments. Use this when the user wants a file from Brightspace course content, dropbox submissions, or an announcement (newsId + fileId, from get_announcements). Two response modes: (1) INLINE (default — omit downloadPath): the file comes back directly in the tool response — extracted text for PDFs and Office documents, an image block for jpeg/png/gif/webp, or a short description for anything else — so it can be read immediately without touching any filesystem. This is the right choice in clients like Claude Desktop, whose analysis/sandbox tools cannot see a file the MCP server writes to its own host filesystem. (2) DISK (set downloadPath to an absolute path on the HOST filesystem the MCP server runs on): the file is saved there. Ask the user where to save it before using disk mode — never guess a directory. After identifying the file, suggest a clean readable filename (e.g., 'Lecture 7 - Memory Management.pdf' instead of 'L07_CS251_2026SP_v2.pdf') and pass it as customFilename, or omit it to keep the original. If a content-topic download fails because the file isn't released yet, the response explains why when Brightspace's module/topic metadata supports it (not yet open, ended, locked, or hidden).
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | No | Specific file ID within a dropbox submission, or an announcement attachment's file ID (with newsId). | |
| newsId | No | Announcement (news item) ID whose attachment to download. Requires fileId. | |
| 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 | No | Absolute path to the directory where the file should be saved on disk. Omit this to receive the file inline in the tool response instead — the right choice in clients like Claude Desktop, whose analysis/sandbox tools cannot see files an MCP server writes to its own host filesystem. Inline mode returns extracted text for PDFs and Office documents, an image block for jpeg/png/gif/webp, and a short description (pointing back to disk mode) for anything else, capped at 10MB and 400,000 characters of extracted text. | |
| 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?
With no annotations, the description carries the full burden and does so: it explains inline vs disk consequences, what inline returns per file type (extracted text, image block, short description), size/character caps (10MB, 400,000 chars), the requirement to ask before writing to disk, and graceful behavior when a file isn't released yet (metadata-driven explanation). This is rich disclosure of behavior beyond the structured fields.
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?
Purpose and mode choice are front-loaded, and most sentences carry actionable content. It is long, and the inline-mode explanation is repeated almost verbatim in both the main description and the downloadPath schema description, which is mild redundancy but not harmful.
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?
Despite having no output schema and no annotations, the description covers the input combinations, both return modes, size limits, and failure cases in enough depth for an agent to call it correctly. Nothing essential 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 coverage is 100%, so the baseline is 3, but the description adds practical meaning: it pairs newsId+fileId, ties fileId to submission/announcement context, and explains the intent of customFilename (suggest a clean readable name). It goes beyond restating the schema, though the downloadPath semantics are largely duplicated from the schema's own description.
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 (download a file) and enumerates the three source scopes: course content, assignment/dropbox submissions, and announcement attachments. It also distinguishes the two operating modes, so an agent understands both what it does and how it returns results without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use each mode: inline is 'the right choice in clients like Claude Desktop,' disk requires asking the user for a path, and newsId+fileId come 'from get_announcements.' This gives concrete routing rules and cross-references a sibling tool rather than leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_announcement_filesGet Announcement FilesA
Read the files an instructor attached to an announcement: prompt questions, a rubric, an updated schedule, slides. Call it with just courseId to see which announcements have attachments, then with newsId and fileId to read one. Use this when the user asks what a file attached to an announcement says. Returns the text itself. Use download_file (newsId + fileId) instead when the user wants the file saved to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | No | Attachment file ID to read. Requires newsId. Omit to list the files without reading them. | |
| newsId | No | Announcement (news item) ID. Omit to list every announcement in the course that has attachments. | |
| courseId | Yes | Course ID whose announcement attachments to look at. | |
| 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 exist, so the description carries the burden, and it does much of that: it discloses the dual behavior (listing vs reading), that the response is the extracted text itself, and that a sibling should be used for on-disk saving. It omits prerequisites/permissions and rate considerations, so it stops short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The usage rule and the two-step protocol are front-loaded, and every sentence contributes new information (what it reads, how to call it, when to use it, what it returns, when to use the alternative). 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?
For a read tool with no output schema and no annotations, the description covers the return value ('Returns the text itself'), the listing behavior, and the sibling routing. Only minor gaps remain, such as permissions or what the listing mode returns in detail.
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 each parameter (including the omit-to-list semantics of newsId/fileId and truncation via maxChars) is already documented in the schema. The description reinforces the mode-dependent usage but adds no syntax or format detail beyond the schema, which is the baseline-3 case.
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 ('Read the files an instructor attached to an announcement') and gives concrete examples of such files. It is clearly distinguishable from the sibling get_assignment_files (assignments vs announcements) and download_file.
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 it ('Use this when the user asks what a file attached to an announcement says'), names the alternative download_file and the exact condition that selects it ('when the user wants the file saved to disk'). It also documents the two-step call pattern (courseId to list, newsId+fileId to read).
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. Attachments are listed per announcement; fetch them with download_file (newsId + fileId) or read them with get_announcement_files.
| 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. | |
| modifiedSince | No | Only return announcements last modified at or after this ISO 8601 datetime (e.g. 2026-01-15T00:00:00Z). Announcements with no modified timestamp are always included. When set, the response reports how many announcements were filtered out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full behavioral burden. It usefully discloses that attachments are listed per announcement and how to retrieve them, but says nothing about ordering, pagination behavior, auth requirements, or rate limits. Read-only nature is only implied by 'Fetch'/'get'.
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, then scope, then trigger phrases and routing. No filler; each 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?
For a no-annotation, no-output-schema read tool, the description covers purpose, scope, triggers, and the attachment handoff well. It omits any note on result ordering or what the returned announcement objects look like, which the missing output schema would otherwise require.
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 count, courseId, and modifiedSince in detail (including the filtered-out reporting). The description only restates the courseId/all-courses distinction already present in the schema, adding no syntax or format detail beyond it.
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 recent announcements from your courses') plus scope ('filter to a specific course or get announcements across all courses'). An agent can distinguish it from get_announcement_files, download_file, and get_course_content from the description alone.
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 conditions ('when the user asks about announcements, news, updates from instructors, recent posts, or what professors said') and routes the attachment sub-case to named alternatives: download_file (newsId + fileId) or get_announcement_files. This is precise sibling routing, not inference.
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_assignment_rubricGet Assignment RubricA
Fetch the full grading rubric for a dropbox assignment: every criteria group, criterion, and achievement level with its points and description, plus the student's own graded outcome per criterion once it has been released. Use this when the user asks what a rubric wants, how an assignment will be graded, or why they got a particular score on a criterion.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID the assignment belongs to. | |
| assignmentId | Yes | Assignment (dropbox folder) ID, as returned by get_assignments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden, and it does disclose a non-obvious behavioral trait: the student's own graded outcome is returned only 'once it has been released,' which signals a conditional/latency facet an agent would otherwise miss. It does not mention permission requirements or behavior when no rubric is attached, but for a read-only fetch the disclosure is solid.
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, front-loaded with what is returned, followed by when to use it. Every clause adds information (return shape, release gating, trigger questions) with no filler or repetition.
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 enumerating the return payload and the conditional outcome field. It is complete for a two-parameter read tool, though it omits edge cases such as an assignment with no rubric attached and does not address the adjacent get_rubrics_for_object 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%, so both courseId and assignmentId are already documented in the schema (including the pointer to get_assignments). The description only restates the 'dropbox assignment' scoping already implied by the schema, adding no new format or constraint detail, so 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 a precise resource ('full grading rubric for a dropbox assignment'), and enumerates the returned structure (criteria groups, criteria, achievement levels, points, descriptions, plus the student's released outcome). It scopes itself with 'dropbox assignment,' which implicitly separates it from the generic get_rubrics_for_object sibling, but never names that alternative 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 second sentence gives concrete trigger scenarios: questions about what a rubric wants, how an assignment will be graded, or why a particular criterion score was received. That is clear when-to-use guidance, but it offers no exclusions or routing to the sibling get_rubrics_for_object for non-assignment or generic rubric lookups.
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. Read submissionStatus/attemptStatus, not just submission/attemptsUsed, to decide whether something was turned in: some tenants deny students access to submission or attempt data, in which case the status is "unknown" even though submission is null or attemptsUsed is 0. Never report an "unknown" item as missing, unsubmitted, or not attempted - say it could not be verified and point the user to Brightspace.
| 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 are provided, so the description carries the full behavioral burden. It discloses critical tenant-specific data access limitations and instructs the agent to read submissionStatus/attemptStatus rather than raw submission fields, explicitly warning against misreporting 'unknown' items as missing. This is rich, actionable transparency beyond typical tool descriptions.
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 return content, usage context, and a critical interpretation caveat. Every sentence earns its place with no redundancy or 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?
With no output schema and no annotations, the description adequately covers what the tool returns, when to use it, and how to interpret ambiguous status values. It is complete for a read-only, single-parameter tool that lists assignments and quizzes.
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% for the single courseId parameter, and the description only restates that omitting it returns all enrolled courses. It adds no new semantic detail (e.g., format, constraints) beyond what the schema already documents.
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 resources ('assignments and quizzes') with clear scope ('for a specific course or all enrolled courses'). It also describes returned content (dropbox submissions, due dates, status, rubric info), which differentiates it from narrower siblings like get_assignment_rubric or get_upcoming_due_dates.
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 user intents that should trigger this tool: 'assignments, homework, what to submit, quizzes, or assignment details and rubrics.' However, it does not name alternative tools or state when not to use this one, so it stops short of full routing guidance.
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 EventsA
Fetch course calendar events — exams, midterms, labs, recitations, review sessions, schedule changes, and deadlines instructors typed straight onto the calendar — across all your courses or one course, in a time window (default: the next 7 days). Use this when the user asks when an exam is, what's on their calendar, or what's happening this week.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of the window, ISO 8601 (e.g. 2026-01-22T00:00:00Z). Defaults to 7 days after from. | |
| from | No | Start of the window, ISO 8601 (e.g. 2026-01-15T00:00:00Z). Defaults to now. | |
| courseId | No | Course ID to get calendar events for. If omitted, returns events across all enrolled courses. | |
| includeGenerated | No | Include the events Brightspace generates from assignment, quiz, and discussion due dates (marked with generatedFrom). Off by default because get_upcoming_due_dates and get_assignments already report those. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose useful defaults (7-day window, from=now) and the reason includeGenerated is off by default. However it says nothing about ordering, pagination, result limits, or what an empty window returns, and doesn't address permission/auth needs. Solid on defaults, thin on output behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, and the usage trigger comes after the scoping details. The long em-dash enumeration of event types is informative but slightly padded; a shorter list would carry the same routing 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?
For a read-only fetch tool with no output schema and no annotations, the description covers scope, defaults, and cross-tool routing adequately. It doesn't describe the shape of returned events, but the core calling decision is well supported.
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 including the ISO 8601 format and defaults. The description restates the 7-day default window but adds no format or syntax detail beyond the schema. Baseline 3 is appropriate 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 verb (Fetch) and resource (course calendar events), and enumerates the event types it returns (exams, midterms, labs, recitations, review sessions, schedule changes, instructor-typed deadlines). It also distinguishes the scope (all courses vs one course) from sibling list-style tools, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions: 'Use this when the user asks when an exam is, what's on their calendar, or what's happening this week.' The includeGenerated param description routes the agent away from this tool for assignment/quiz/discussion due dates toward get_upcoming_due_dates and get_assignments. Lacks an explicit 'when not to use' for the main calendar surface, but the routing 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. A module or topic that isn't currently available carries isAvailable/availabilityStatus/availabilityMessage (and startDate/endDate when known) explaining why; absence of these fields means it's available now.
| 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. | |
| modifiedSince | No | Only return topics last modified at or after this ISO 8601 datetime (e.g. 2026-01-15T00:00:00Z), plus any module that contains a matching topic. Topics with no modified timestamp are always included. When set, the response reports how many topics were filtered out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explains that unavailable modules/topics expose isAvailable/availabilityStatus/availabilityMessage (plus startDate/endDate) and that field absence means currently available — non-obvious return-shape behavior. It omits any note on response size, pagination, or auth expectations.
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-loads the core fetch statement, then usage triggers, then parameter tips, then the availability caveat. Every sentence carries distinct information with no repetition.
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?
No output schema exists, so the description must convey return structure, and it names the node types and the availability-field convention. It is largely sufficient for a read-only fetch, though a fuller account of nesting/output shape would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters (baseline 3). The description still adds value by giving concrete moduleTitle examples ('Labs', 'Staff', 'Homeworks') and framing maxDepth as a table-of-contents view, reinforcing the intended usage.
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 (the content tree for a course) and enumerates its shape — modules, topics, files, links. This lets an agent distinguish it from siblings like get_syllabus or get_my_courses 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 positive triggers ('course materials, lecture slides, uploaded files, content structure, or what's in a course module') and tells the agent to use moduleTitle to target a single module rather than pulling the whole tree. It does not name a sibling tool as an alternative or state any when-not condition, so it stops short of the top score.
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_dropbox_feedbackGet Dropbox FeedbackA
Retrieve the existing feedback already saved for a specific user or group in a dropbox folder, for an instructor or TA — score, graded state, feedback text, and rubric assessment detail. Use this before drafting new feedback to see what has already been recorded. Requires instructor or TA access to the course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID the dropbox folder belongs to. | |
| entityId | Yes | User ID or group ID whose existing feedback to retrieve. | |
| folderId | Yes | Dropbox folder ID. | |
| entityType | Yes | Whether entityId identifies an individual user or a group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the access requirement (instructor/TA) and the shape of the returned data, and 'Retrieve' implies a read-only operation, but it doesn't state what happens when no feedback exists or any error/permission-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with the core purpose front-loaded before the usage cue and access note. The field enumeration adds length but serves meaning; nothing 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?
There is no output schema, so the description appropriately lists the returned fields itself, and it covers the access prerequisite. An agent has enough to call it correctly, though no note on empty results or pagination leaves a minor gap.
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 (courseId, folderId, entityType, entityId) are already documented including the user/group enum. The description restates the user-or-group concept but adds no format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (existing saved feedback for a user/group in a dropbox folder) and enumerates the returned fields (score, graded state, feedback text, rubric detail). An agent can distinguish this from the many get_dropbox_* siblings that deal with submissions or folders rather than feedback records.
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 says to use it 'before drafting new feedback to see what has already been recorded,' giving a clear usage context. It also states the access prerequisite (instructor or TA). However, it names no alternative tool or when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dropbox_foldersGet Dropbox FoldersA
List all assignment/dropbox folders for a course, for an instructor or TA. Returns folder ID, name, due date, start/end dates, submission type, visibility, and whether rubrics are attached. Use this to discover folderId values before calling get_dropbox_submissions, get_dropbox_user_submissions, get_dropbox_feedback, or get_rubrics_for_object. This reads the same folder listing a student's own client uses, so it is not gated to instructor/TA accounts the way get_dropbox_submissions, get_dropbox_feedback, and download_dropbox_submission_file are.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID to list dropbox (assignment) folders for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it discloses the permission model (reads the same folder listing a student client uses, unlike the gated submission/download tools) and enumerates the returned fields (folder ID, name, due/start/end dates, submission type, visibility, rubric attachment). Auth behavior and payload shape are both covered.
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, then return fields, then usage routing and the access nuance. The field enumeration is somewhat dense but earns its place given there is no output schema; no sentence is 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?
For a one-parameter read tool with no annotations and no output schema, the description covers purpose, return contents, downstream usage, and the permission caveat. An agent has everything needed to select and call it correctly without opening anything else.
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?
Only one parameter, courseId, and schema description coverage is 100%, so the schema already documents it fully. The description adds only the implied 'for a course' framing and no format or constraint details beyond the schema, 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 ('List all assignment/dropbox folders for a course') and immediately scopes the audience (instructor or TA). It is clearly distinguishable from the sibling submission/feedback tools, which operate on a single folder rather than listing folders.
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 routing guidance: use this to discover folderId values before calling get_dropbox_submissions, get_dropbox_user_submissions, get_dropbox_feedback, or get_rubrics_for_object. It also pre-empts a likely question by noting the tool is not gated to instructor/TA accounts the way those siblings are.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dropbox_submissionsGet Dropbox SubmissionsA
List every student's (or group's) submission to a dropbox folder, for an instructor or TA — submitter names, submission dates, late status, file lists, and feedback/grading status. Use get_dropbox_folders first to find folderId. Requires instructor or TA access; a student account gets a clear note instead of data (a student's own download_file / get_assignments already cover their own submission). Results are capped by limit (default 100, max 1000); a truncated response says so and only fetches feedback for the returned slice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum submissions to return. Default 100. The response reports the true total and whether it was truncated; feedback is only fetched for the returned slice. | |
| courseId | Yes | Course ID the dropbox folder belongs to. | |
| folderId | Yes | Dropbox folder ID to list submissions for. Use get_dropbox_folders to find it. | |
| activeOnly | No | When true, skip submissions that have already been fully graded (feedback published with a score). Default false: returns every submission, graded and ungraded. | |
| ignoreFeedback | No | When true, omit feedback status from each submission entry to reduce response size. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: instructor/TA-only access, a graceful 'clear note' for student accounts, limit capping (default 100, max 1000), explicit truncation signaling, and the side effect that feedback is only fetched for the returned slice. These are real behavioral traits an agent needs.
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-loads the purpose, then sequencing, then access/behavioral and pagination constraints in tightly packed sentences. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, yet the description covers access requirements, returned fields, the truncation/pagination model, and cross-tool sequencing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (including activeOnly and ignoreFeedback semantics) are already documented in the schema. The description's limit note restates what the schema already says, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('every student's/group's submission to a dropbox folder') and enumerates the returned fields. It is clearly distinguishable from siblings like get_dropbox_user_submissions and get_dropbox_feedback, so an agent can select it without opening other 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?
Explicitly routes the agent: use get_dropbox_folders first to get folderId, and steers students to download_file / get_assignments for their own submission. Both the when-to-use and the when-not/alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dropbox_user_submissionsGet Dropbox User SubmissionsA
Retrieve all submissions made by one specific student (or group) in a dropbox folder, for an instructor or TA — useful for reviewing a single student's work before drafting feedback. Use get_dropbox_submissions or get_roster to find the userId first. Requires instructor or TA access to the course.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | Yes | Brightspace user ID (or group ID for a group folder) whose submissions to retrieve. | |
| courseId | Yes | Course ID the dropbox folder belongs to. | |
| folderId | Yes | Dropbox folder ID. | |
| ignoreFeedback | No | When true, omit feedback status from the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It discloses the permission requirement (instructor or TA access) and the read-only nature implied by 'Retrieve,' but says nothing about the response shape, volume/pagination, or how feedback data behaves relative to the ignoreFeedback flag.
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, with the core action and scope front-loaded before the usage hint and the access caveat. No sentence is 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?
For a read-only retrieval tool with no output schema, the description covers purpose, scoping, prerequisite lookups, and access requirements. It stops short of describing what the response contains, but nothing essential 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 four parameters are already documented, including the note that userId may be a group ID. The description restates this in prose ('student (or group)') but adds no syntax or format meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Retrieve'), a specific resource ('submissions made by one specific student (or group) in a dropbox folder'), and an explicit audience (instructor or TA). It clearly distinguishes itself from the sibling get_dropbox_submissions, which returns the unfiltered set.
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 states the scenario (reviewing one student's work before drafting feedback), names the alternatives for a prerequisite step ('Use get_dropbox_submissions or get_roster to find the userId first'), and gives the access condition. The agent knows both when to reach for this tool and how to obtain the required identifier.
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_my_groupsGet My GroupsA
List the current user's project/discussion groups in a course, with each group's members. Use this when a student asks who is in their project group, lab group, or discussion group.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID to list the current user's project/discussion groups for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. 'List' implies a read-only, current-user-scoped operation, and the description does state that member data is included in the result, but it says nothing about permissions, pagination, or what happens for a course where the user has no groups.
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, with the capability stated first and the usage trigger second. Nothing to trim.
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 tool this is nearly complete: the description substitutes for the missing output schema by naming the return content (groups plus their members). It could still note permission expectations or empty-result behavior, but no critical information is missing 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?
Only one parameter and schema description coverage is 100%, so the schema already fully documents courseId. The description's 'in a course' phrasing confirms the scoping intent but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (current user's project/discussion groups in a course) and adds that members are included, which separates it from sibling roster/classlist tools that return whole-class data.
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 says when to use it: 'when a student asks who is in their project group, lab group, or discussion group.' It gives clear triggering contexts but names no exclusions or alternative (e.g. get_roster for the full class), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_rubrics_for_objectGet Rubrics for Dropbox FolderA
Retrieve the full rubric table (criteria, levels, and point values) attached to a dropbox folder, for an instructor or TA. Use get_dropbox_folders first to find folderId. Like get_dropbox_folders, this reads the folder listing's embedded rubric data, so it is not gated to instructor/TA accounts the way get_dropbox_submissions and get_dropbox_feedback are.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | Course ID the dropbox folder belongs to. | |
| folderId | Yes | Dropbox folder ID whose rubric(s) to retrieve full criteria/level detail for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden and does meaningfully address it: it discloses the data source (the folder listing's embedded rubric data) and the authorization profile relative to sibling tools. The phrase "for an instructor or TA" followed by "not gated to instructor/TA accounts" is slightly confusing, and it says nothing about the response shape or pagination.
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 retrieval purpose, then the prerequisite, then access-control context. Each sentence contributes, though the closing gating sentence is somewhat dense and introduces the minor audience ambiguity.
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 enumerates the returned content (criteria, levels, point values) and covers prerequisites and access behavior. Complete enough to call correctly, with only minor gaps around return format and pagination.
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 and folderId are already documented. The description adds only a discovery hint for folderId, which is more usage guidance than parameter semantics. Baseline 3 is appropriate 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 verb ("Retrieve") and resource ("full rubric table (criteria, levels, and point values) attached to a dropbox folder"), which distinguishes it from siblings like get_assignment_rubric and get_dropbox_folders. An agent can identify its scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite ("Use get_dropbox_folders first to find folderId") and positions the tool within the dropbox family by contrasting its gating with get_dropbox_submissions and get_dropbox_feedback. It lacks an explicit when-not rule versus get_assignment_rubric, which also returns rubric data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoGet Server InfoA
Report which version of the Brightspace MCP server is running, the Node.js runtime, platform, config file path, session state directory, configured school URL, whether a credential is stored, the server's local timezone and UTC offset, (once a browser sign-in has been saved) what Microsoft remembered: stay-signed-in and the Don't ask again MFA checkbox, (when signed in) the account's uniqueName/displayName as signedInAs, and this process's request counters (requests: responses by status class, network errors, cache hits/misses, coalesced joins, and token refreshes). Use this for troubleshooting, when the user asks which version they have, or what timezone/account dates are being computed against. Never contacts Brightspace and never returns secrets.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that it never contacts Brightspace and never returns secrets, and flags conditional fields (browser sign-in saved, when signed in). It stops short of stating response format or failure modes, but the safety profile is clearly communicated.
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?
Content is not padded, but it is delivered as one very long run-on sentence enumerating many return fields, which is hard to scan. The headline (which version is running) is front-loaded, but the middle clumps together unrelated details.
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 enumerates the returned fields, which is exactly what an agent needs to interpret results. It covers version, environment, config, identity, and counters adequately for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is no parameter semantics to add, and the schema confirms an empty object.
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 ('Report') and enumerates exactly what is reported (server version, Node runtime, platform, config path, timezone, account identity, request counters). This is unmistakably distinct from the Brightspace data-retrieval siblings like get_my_courses or get_announcements.
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 triggers: troubleshooting, user asking which version they have, or checking what timezone/account dates compute against. It also implicitly routes away from the data siblings by noting it 'never contacts Brightspace', though it does not name an explicit alternative tool.
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), quizzes, and graded discussion topics themselves, plus course calendar events such as exams and labs (type: event). 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, the description carries the full behavioral burden. It usefully discloses the data provenance (dropbox folders, quizzes, graded discussions, calendar events of type 'event'), which is real context, but says nothing about read-only safety, ordering, timezone handling, or pagination limits. Adequate but incomplete for a tool with zero annotation coverage.
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: the first front-loads the core action with provenance detail, the second handles usage. The source enumeration in sentence one is somewhat clause-heavy, but nothing is wasted and the order is sensible.
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 two-parameter read tool with no output schema and no annotations, the description covers what is fetched, from where, and when to call it. It does not hint at the returned structure (fields, sorting, time window defaults), which would help an agent interpret results, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (courseId, daysAhead) are already documented, setting the baseline at 3. The phrase 'across all your courses' does imply the unfiltered default behavior when courseId is omitted, which adds a small amount of meaning beyond the schema but not enough to raise the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (fetch upcoming due dates) and defines scope precisely: across all courses, derived from assignments, quizzes, graded discussions, plus calendar events of type 'event'. An agent can distinguish it from get_assignments or get_calendar_events because it is explicitly an aggregation across those sources.
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 trigger phrases: deadlines, what's due, upcoming work, what they need to do this week. That is strong when-to-use guidance, but it never names an alternative (e.g., get_calendar_events for non-graded events) or states exclusions, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_video_transcriptGet Video TranscriptA
Read the transcript of a video embedded in course content, such as a recorded lecture or explainer clip. Call it with courseId and topicId from get_course_content (typeFilter: 'video' or 'other'), or with videoUrl directly if you already have the link. Returns transcript text with timestamps, plus title and duration when available. Currently supports Kaltura (e.g. BoilerCast) and YouTube; other platforms return a clear message naming what isn't supported yet. Use offset/maxChars to page through a long transcript. Read only — this never marks the video as watched.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Character offset into the transcript to resume from. Pass back nextOffset from a truncated response to fetch the next piece. | |
| topicId | No | Content topic ID (from get_course_content) whose embedded video to transcribe. Requires courseId. | |
| courseId | No | Course ID the video belongs to. Required together with topicId unless videoUrl is given directly. | |
| maxChars | No | Maximum characters of transcript text to return in one call. The response reports whether it was truncated. | |
| videoUrl | No | Direct video URL to transcribe, e.g. the url field get_course_content already returned. Use instead of courseId/topicId when you already have the link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it declares read-only behavior ('never marks the video as watched'), enumerates supported platforms, and describes the unsupported-platform fallback message. It omits any auth/permission or rate-limit context, but covers the important side-effect disclosure.
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 call patterns then return/limitations/read-only. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description specifies return contents (timestamped transcript text, title, duration when available, truncation signal). Combined with platform and pagination notes, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters (baseline 3). The description adds cross-parameter relationships — the courseId/topicId pairing vs. standalone videoUrl, and the offset/maxChars paging loop — giving meaning beyond isolated field docs.
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 (read) and resource (transcript of a video embedded in course content), scoping it to recorded lectures/clips. Clearly distinguishable from sibling content tools like 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?
Gives explicit invocation paths: courseId+topicId sourced from get_course_content (typeFilter 'video'/'other'), or videoUrl directly. Names platform limits (Kaltura/YouTube only) and pagination via offset/maxChars.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_courseSearch CourseA
Search a course's content (modules, topics, file names), announcements, and discussion forums/topics by keyword in a single call, instead of reading the whole content tree. Use this when the user wants to find something specific, e.g. 'find the midterm review slides' or 'did anyone post about office hours'. Results are ranked: a result matching every query term ranks above one matching only some, and within that, a match in the title ranks above one only in the body text. If one source (e.g. discussions) can't be read, it's skipped and named in note rather than failing the whole search. This fans out over the entire content tree, announcements, and every discussion forum, so it can be slower than calling a single tool like get_course_content directly.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return, highest scoring first. | |
| query | Yes | Keyword(s) to search for, e.g. 'midterm review slides' or 'office hours'. | |
| courseId | Yes | Course ID to search within. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the ranking algorithm (all-terms match > partial, title > body), graceful degradation ('If one source... can't be read, it's skipped and named in `note`'), and the performance cost of fanning out. It omits auth/permission requirements and whether results are paginated beyond `limit`, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place, and the core purpose and examples are front-loaded. The opening sentence is heavily parenthesized, which slightly slows scanning, but 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?
For a 3-param, no-output-schema tool, the definition covers purpose, trigger conditions, ranking semantics, partial-failure behavior and cost, which is everything an agent needs to choose and call it correctly. Return shape is inferable from the ranking/note discussion even without an 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 description coverage is 100%, so the schema already documents courseId, query and limit with its own examples. The description restates the keyword-style query but adds no new format, constraint, or syntax information 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?
Opens with a specific verb+resource ('Search a course's content... announcements, and discussion forums/topics by keyword') and enumerates exactly what is searched. It also distinguishes itself from siblings by contrasting the fan-out search with 'reading the whole content tree' and with 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?
Explicitly states when to use it ('when the user wants to find something specific') with two concrete user-utterance examples. It also names an alternative path ('slower than calling a single tool like get_course_content directly'), giving the agent a real routing decision.
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.
17 tool updates
v3.9.7- Removed
check_auth - Added
download_dropbox_submission_file - Changed
download_file4 fields changed- changed
Input schema / properties / downloadPath / descriptionPrevious value: -"Absolute path to the directory where the file should be saved."New value: +"Absolute path to the directory where the file should be saved on disk. Omit this to receive the file inline in the tool response instead — the right choice in clients like Claude Desktop, whose analysis/sandbox tools cannot see files an MCP server writes to its own host filesystem. Inline mode returns extracted text for PDFs and Office documents, an image block for jpeg/png/gif/webp, and a short description (pointing back to disk mode) for anything else, capped at 10MB and 400,000 characters of extracted text." - changed
Input schema / properties / fileId / descriptionPrevious value: -"Specific file ID within a dropbox submission."New value: +"Specific file ID within a dropbox submission, or an announcement attachment's file ID (with newsId)." - added
Input schema / properties / newsIdAdded value: +{ + "description": "Announcement (news item) ID whose attachment to download. Requires fileId.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "courseId", - "downloadPath" -]New value: +[ + "courseId" +]
- Added
get_announcement_files - Changed
get_announcements1 field changed- added
Input schema / properties / modifiedSinceAdded value: +{ + "description": "Only return announcements last modified at or after this ISO 8601 datetime (e.g. 2026-01-15T00:00:00Z). Announcements with no modified timestamp are always included. When set, the response reports how many announcements were filtered out.", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", + "type": "string" +}
- Added
get_assignment_rubric - Added
get_calendar_events - Changed
get_course_content1 field changed- added
Input schema / properties / modifiedSinceAdded value: +{ + "description": "Only return topics last modified at or after this ISO 8601 datetime (e.g. 2026-01-15T00:00:00Z), plus any module that contains a matching topic. Topics with no modified timestamp are always included. When set, the response reports how many topics were filtered out.", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", + "type": "string" +}
- Added
get_dropbox_feedback - Added
get_dropbox_folders - Added
get_dropbox_submissions - Added
get_dropbox_user_submissions - Added
get_my_groups - Added
get_rubrics_for_object - Added
get_server_info - Added
get_video_transcript - Added
search_course
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 25 tools
Most tools map to a distinct resource+action and the descriptions actively disambiguate near-neighbors (e.g. get_dropbox_submissions vs get_dropbox_user_submissions, student get_assignment_rubric vs instructor get_rubrics_for_object). A few pairs still risk confusion: get_roster vs get_classlist_emails, and the file-reading trio get_announcement_files/get_assignment_files/download_file overlap in purpose.
The set is dominated by a predictable get_<noun> pattern (get_assignments, get_discussions, get_roster) with download_/download_dropbox_ for file retrieval. Minor deviations (search_course, get_video_transcript, get_my_grades) are still readable and fit the convention, so naming is nearly uniform.
At 25 tools it sits at the heavy end, spanning two audiences (student and instructor/TA) and many resources, so most tools are justified. However a few are thin or redundant (get_classlist_emails largely duplicates get_roster, get_assignment_rubric vs get_rubrics_for_object), pushing it to borderline.
Read coverage of the LMS domain is strong: courses, content, assignments, grades, discussions, calendar, announcements, files, groups, roster, and instructor dropbox workflows. The main gap is write operations — no submitting assignments, posting discussion replies, or recording grades/feedback — which an agent could still work around by directing the user to Brightspace.
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 gradedqualityCmaintenanceA remote MCP server for querying Canvas LMS courses, assignments, and grades. Enables natural language interaction with Canvas data via MCP clients like Claude Desktop.10 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.48 npm4MIT
- 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.-