Skip to main content
Glama
AnonymousOnyx22

D2L BrightSpace MCP

An MCP (Model Context Protocol) server that gives AI assistants and agents read access to your Brightspace courses: due dates with real submission status, grades, assignments, rubrics, course content, announcements, discussions and class lists. It works at any school that uses D2L Brightspace, including schools with Microsoft, Duo, Okta or Shibboleth single sign-on.

Quick start

You need Node.js 20 or newer and Google Chrome or Microsoft Edge.

npx brightspace-d2l-mcp setup

That's it. Setup asks for your school, opens a browser so you can sign in, and connects every AI app it finds. Then ask your AI:

"What should I work on right now?"

New to this? The step-by-step setup guide walks through everything with pictures of each step.

Related MCP server: Canvas MCP

What you can ask

Try asking

What's left

"What should I work on right now?" · "What haven't I submitted yet?"

📅 Deadlines

"What's due this week?" · "Anything due tomorrow?"

📊 Grades

"What are my grades?" · "Am I passing Calculus?"

📢 Announcements

"Did any professor post something today?"

📚 Course content

"Find the midterm review slides" · "Summarize the Lab 3 instructions"

📎 Assignment files

"What does the rubric for the project ask for?"

💬 Discussions

"What are people saying in the final project thread?"

👥 Class list

"Who's the TA for my networking course?"

It knows what you've already handed in

Most tools only see due dates, so they keep telling you to do work you've finished. This one checks your actual submission for every assignment:

Status

Meaning

submitted / graded

Done. Never suggested as a to-do.

not_submitted / draft

Still needs doing.

not_open_yet

The dropbox hasn't opened; shows when it will.

closed / past_due

You can no longer submit.

unknown

Quizzes: Brightspace doesn't show students their quiz attempts, so your AI will ask you.

Tools

13 read-only MCP tools for D2L Brightspace:

Tool

What it does

get_todo

Prioritized to-do list across every course: what's due soon, overdue, not open yet, and already done

get_upcoming_due_dates

Upcoming deadlines with the real submission status of each assignment

get_my_courses

Your enrolled courses with names, codes and ids

get_my_grades

Grade breakdown per course with points, percentages and instructor comments

get_assignments

Assignments (dropboxes) and quizzes with due dates, status and rubrics

get_assignment_files

Reads the instructions, handouts and rubric files attached to an assignment

get_course_content

Course modules, lecture slides, files and links

get_syllabus

Course syllabus and overview

get_announcements

Recent announcements (news) from your instructors

get_discussions

Discussion forums, topics and posts

get_roster

Instructors and TAs with contact info, optionally the full class list

get_classlist_emails

Email addresses for everyone in a course

download_file

Saves a course file or submission to a folder you choose

Works at any Brightspace school

Every school signs in differently: Microsoft, ADFS, Duo, Shibboleth, Okta, Google, campus pickers, or Brightspace's own form. Instead of guessing how your school works, setup opens a normal browser window and you sign in exactly like you do every day, text codes and authenticator apps included.

After that it stays signed in quietly in the background. If your school ever asks you to sign in again, the browser window simply pops up and closes by itself when you're done.

Works with your AI app or agent

Connected automatically by setup: Claude Desktop · Claude Code · Cursor · VS Code (GitHub Copilot) · Windsurf · OpenAI Codex · Gemini CLI · Cline · Roo Code · OpenCode · Zed · LM Studio · Kiro

One copy-paste away: ChatGPT (developer mode) · Continue · Goose · JetBrains AI Assistant · Warp · Amp · Msty · Jan · AnythingLLM

Agent frameworks: OpenAI Agents SDK · Claude Agent SDK · LangChain / LangGraph · Vercel AI SDK · Mastra · CrewAI · Pydantic AI · LlamaIndex

It runs over stdio for local apps and streamable HTTP (serve --http) for ChatGPT and hosted agents. See docs/agents.md for copy-paste setup for every one of these.

Commands

Command

What it does

npx brightspace-d2l-mcp setup

Pick your school, sign in, connect your AI apps

npx brightspace-d2l-mcp login

Sign in again

npx brightspace-d2l-mcp status

Show your school, whether you're signed in, and connected apps

npx brightspace-d2l-mcp logout

Delete the saved session

npx brightspace-d2l-mcp uninstall

Remove from all AI apps and delete all local data

npx brightspace-d2l-mcp serve --http

Run over HTTP for ChatGPT and HTTP-based agents

npx brightspace-d2l-mcp config

Print the MCP config JSON for any other app

npx brightspace-d2l-mcp setup --school yourschool.brightspace.com   # skip the school question
npx brightspace-d2l-mcp setup --apps claude-desktop,cursor          # only connect these apps
npx brightspace-d2l-mcp setup --skip-login                          # sign in later, on first use
npx brightspace-d2l-mcp setup --yes                                 # accept every default

App ids: claude-desktop, claude-code, cursor, vscode, windsurf, codex, gemini-cli, cline, roo-code, opencode, zed, lm-studio, kiro.

Privacy and security

  • Your password is never seen or stored. You type it into your school's own sign-in page in a real browser.

  • Read-only. It can't submit, post, or change anything in Brightspace.

  • Local only. Everything runs on your computer and talks only to your school's Brightspace. There's no server in between, and no analytics.

  • Uses the official Brightspace API with the same access you have in your browser.

  • Your session is saved in ~/.brightspace-d2l-mcp/, readable only by your user account. logout deletes it; uninstall deletes everything.

Troubleshooting

Install Google Chrome or use Microsoft Edge (already on Windows). Or install a private copy of Chromium with npx playwright install chromium.

Sign in to Brightspace in your browser, then copy the address from the address bar (any page works). If it says your site "runs Blackboard" or "Canvas", your school doesn't use Brightspace.

Fully quit Claude Desktop (tray icon → Quit, not just closing the window), then run setup again. Claude Desktop rewrites its settings while it's open, so setup offers to restart it for you.

Some schools end sessions every few hours. When that happens a browser window opens so you can sign in again. Run npx brightspace-d2l-mcp status to check, or login to sign in right away. If you'd rather it never opens a window on its own, add "autoLogin": false to ~/.brightspace-d2l-mcp/config.json.

Add course ids to ~/.brightspace-d2l-mcp/config.json:

{ "excludeCourses": [123456, 789012] }

Or keep only specific ones with "includeCourses". Ask your AI "list my courses with their ids" to find them.

FAQ

Run npx brightspace-d2l-mcp setup. It connects Claude Desktop and Claude Code automatically. Then ask Claude about your courses.

Yes. This connects Brightspace to the AI app you already use (Claude, ChatGPT, Cursor, GitHub Copilot, Gemini and others), so you can ask about deadlines, grades and course files in plain English instead of clicking through every course.

Run npx brightspace-d2l-mcp serve --http, expose it with a tunnel, and add the URL as a connector in ChatGPT developer mode. docs/agents.md walks through each step.

Run npx brightspace-d2l-mcp setup. It finds Cursor, VS Code, Windsurf and 10 other apps and connects them for you.

Yes. Local agents and SDKs launch it with npx -y brightspace-d2l-mcp@latest, and ChatGPT or HTTP-based agents use npx brightspace-d2l-mcp serve --http. docs/agents.md has copy-paste setup for ChatGPT, the OpenAI Agents SDK, Claude Agent SDK, LangChain, Vercel AI SDK and more.

No. Brightspace API keys normally require an administrator. This uses your own student sign-in instead, so it sees exactly what you see in Brightspace, and nobody at your school has to set anything up.

Yes. You sign in yourself in a real browser window, so any sign-in method your school uses works.

Any school on D2L Brightspace, whether the address looks like yourschool.brightspace.com, yourschool.desire2learn.com, or a custom domain like learn.yourschool.edu.

No. It's read-only on purpose.

No. It's an independent open-source project that uses the official Brightspace API with your own sign-in. It isn't affiliated with or endorsed by D2L.

Development

git clone https://github.com/AnonymousOnyx22/brightspace-d2l-mcp.git
cd brightspace-d2l-mcp
npm install
npm run build
npm test
node build/index.js setup     # connects your AI apps to this local build

Tools live in src/tools/, sign-in in src/auth/, and setup in src/cli/. Issues and pull requests are welcome.

License

MIT © AnonymousOnyx22

D2L and Brightspace are trademarks of D2L Corporation. This project is not affiliated with D2L.

Available Tools

13 tools
download_fileDownload FileA

Download a file from course content or assignment submissions to a local directory. Use this when the user wants to download, save, or get a file from Brightspace course content or dropbox submissions. IMPORTANT: You MUST ask the user where they want to save the file before calling this tool. Never guess or assume a download directory. After identifying the file to download, suggest a clean readable filename to the user (e.g., 'Lecture 7 - Memory Management.pdf' instead of 'L07_CS251_2026SP_v2.pdf') and ask if they'd like to rename it. Pass their preferred name as customFilename, or omit it to keep the original.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdNoSpecific file ID within a dropbox submission.
topicIdNoContent topic ID to download (for course content files).
courseIdYesCourse ID the file belongs to.
folderIdNoDropbox folder ID (for submission/feedback file downloads).
downloadPathYesAbsolute path to the directory where the file should be saved.
customFilenameNoCustom filename for the downloaded file (include extension). If not provided, uses the original filename from Brightspace.

TDQS

A4.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries full burden. It discloses that the tool downloads (writes) files and mentions user interaction (asking for path/rename). However, it lacks details on overwrite behavior, permissions, size limits, or error handling, which are important for a file download operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is 4 sentences with no fluff. It immediately states the purpose, then provides usage context, and ends with actionable guidelines. Every sentence earns its place.

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

Completeness4/5

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

Given 6 parameters, no output schema, and no annotations, the description is thorough in covering purpose, usage, and parameter context. It lacks only minor behavioral details (e.g., overwrite). Overall, it is well-rounded for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, but the description adds significant value: it explains the two types of file sources (course content via topicId vs dropbox via folderId/fileId) and how customFilename works. It also advises on when to use each parameter, going beyond the schema's basic descriptions.

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

Purpose5/5

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

The description clearly states 'Download a file from course content or assignment submissions to a local directory' with a specific verb ('download') and resource ('file from course content or dropbox submissions'). It distinguishes from sibling tools (no other download tools exist) and provides context for use cases.

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

Usage Guidelines5/5

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

The description explicitly says to use this when 'the user wants to download, save, or get a file from Brightspace course content or dropbox submissions'. It includes critical guidance: 'You MUST ask the user where they want to save the file before calling this tool' and suggests suggesting a clean filename, giving concrete examples.

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

get_announcementsGet AnnouncementsA

Fetch recent announcements from your courses. Can filter to a specific course or get announcements across all courses. Use this when the user asks about announcements, news, updates from instructors, recent posts, or what professors said.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoMaximum number of announcements to return
courseIdNoCourse ID to get announcements for. If omitted, returns recent announcements across all courses.

TDQS

A4/5.0
Behavior3/5

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

Implies read-only operation via 'fetch', but omits details like recency definition or impact of missing parameters. No annotations present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Two concise sentences with front-loaded purpose and actionable usage hints. No wasted words.

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

Completeness4/5

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

Adequate for a simple 2-parameter tool with no output schema. Could clarify 'recent' timeframe but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already describes both parameters fully (100% coverage). Description adds marginal value by linking courseId absence to cross-course results.

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

Purpose5/5

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

Clearly states the tool fetches announcements, distinguishes from siblings like get_assignments or get_discussions, and specifies filtering options.

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

Usage Guidelines4/5

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

Provides explicit usage examples (announcements, news, updates) but lacks exclusion guidance or alternatives.

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

get_assignment_filesGet Assignment FilesA

Read the files an instructor attached to an assignment: the spec or instructions PDF, a starter workbook, a rubric document. Call it with just courseId to see which assignments have attachments, then with folderId and fileId to read one. Use this when the user asks what an assignment requires, what the instructions say, or to summarize a handout. Returns the text itself. Use download_file instead when the user wants the file saved to disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdNoAttachment file ID to read. Requires folderId. Omit to list the files without reading them.
courseIdYesCourse ID whose assignment attachments to look at.
folderIdNoAssignment (dropbox folder) ID. Omit to list every assignment in the course that has attachments.
maxCharsNoMaximum characters of extracted text to return. The response reports whether it was truncated.
extractTextNoExtract readable text from the file. Works for PDF, DOCX, XLSX, PPTX, and plain text.

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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

The description gives explicit when-to-use conditions: 'when the user asks what an assignment requires, what the instructions say, or to summarize a handout.' It also names the alternative: 'Use download_file instead when the user wants the file saved to disk.' It even prescribes a two-step call pattern, which removes ambiguity.

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

get_assignmentsGet AssignmentsA

Fetch assignments and quizzes for a specific course or all enrolled courses. Shows dropbox submissions and quizzes with due dates, status, and rubric info. Use this when the user asks about assignments, homework, what to submit, quizzes, or assignment details and rubrics.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdNoCourse ID to get assignments for. If omitted, returns assignments for all enrolled courses.

TDQS

A4.5/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses that the operation is a fetch (read-only) and describes returned data. No contradictions; additional behavioral details like authentication or pagination are not critical for a simple read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

Two sentences, concise and front-loaded. Every sentence adds value with no redundancy.

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

Completeness4/5

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

Given no output schema, description provides adequate detail about return values (dropbox submissions and quizzes with due dates, status, rubric info). Could mention if results are paginated, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% coverage with parameter 'courseId' described. Description adds crucial context: omitting it returns assignments for all enrolled courses. This adds meaning beyond the schema.

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

Purpose5/5

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

Description clearly states 'Fetch assignments and quizzes' with specific resources (dropbox submissions, quizzes) and details (due dates, status, rubric info). It distinguishes itself from siblings like get_course_content or get_my_grades by specifying the data type.

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

Usage Guidelines4/5

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

Explicitly states when to use: 'Use this when the user asks about assignments, homework, what to submit, quizzes, or assignment details and rubrics.' Does not mention when not to use or alternatives, but context is clear.

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

get_classlist_emailsGet Classlist EmailsA

Fetch all email addresses for everyone in a course: instructors, TAs, and students. Use this when the user wants a list of emails for a class, needs to email the whole class, or wants contact info for everyone enrolled.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesCourse ID to get emails for.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. 'Fetch' clearly implies a read-only retrieval with no mutation, and the description specifies exactly what data is returned: email addresses for instructors, TAs, and students. It does not mention access requirements or rate limits, but these are less critical for a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is two sentences with no filler. It front-loads the core action and then provides practical usage context, making it easy for an agent to parse quickly.

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

Completeness4/5

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

The tool is simple with one parameter and no output schema. The description adequately explains the return content, but it does not specify the exact return structure (e.g., array of strings vs. objects) or explicitly contrast with get_roster. Overall it is complete enough for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the only parameter, courseId, is already documented as 'Course ID to get emails for.' The description adds no additional parameter-level detail beyond what the schema provides, so the baseline of 3 applies.

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

Purpose4/5

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

The description clearly states a specific verb and resource ('Fetch all email addresses for everyone in a course') and enumerates the included roles. It does not explicitly differentiate from the sibling get_roster, which may also involve contact information, so it stops short of a 5.

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

Usage Guidelines4/5

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

The description gives explicit when-to-use scenarios: wanting a list of emails for a class, emailing the whole class, or needing contact info for everyone enrolled. It does not mention when not to use it or name alternatives like get_roster, so it lacks exclusions.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesCourse ID to get content tree for.
maxDepthNoLimit 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.
typeFilterNoOptional filter to narrow results by content type.all
moduleTitleNoCase-insensitive substring match on module titles. Only returns modules whose title contains this string (e.g. 'Labs', 'Staff', 'Homeworks'). Children of matching modules are included in full.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It describes 'fetch' implying read-only, but does not explicitly state no side effects or auth requirements. However, it gives clear behavioral insights on filtering and depth, which is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is three sentences, front-loaded with purpose, followed by usage and parameter tips. No wasteful words; every sentence adds value.

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

Completeness4/5

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

Given 4 parameters, full schema coverage, and no output schema, the description covers key use cases and parameter usage. It mentions the content tree components (modules, topics, files, links), but could provide more detail on the return structure. Still, it's sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline is 3. The description adds practical usage guidance for moduleTitle and maxDepth beyond the schema descriptions, such as 'table-of-contents view', improving parameter understanding.

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

Purpose5/5

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

The description clearly states the tool fetches a course content tree listing modules, topics, files, and links. It distinguishes from sibling tools like get_assignments or get_discussions by focusing on course materials and structure.

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

Usage Guidelines4/5

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

The description explicitly says when to use the tool (user asks about course materials, lecture slides, etc.) and provides parameter guidance (moduleTitle, maxDepth). It does not explicitly state when not to use, but the context is sufficient.

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

get_discussionsGet DiscussionsA

Fetch discussion board content for a course including forums, topics, and posts. Use this when the user asks about discussion boards, forum posts, class discussions, or wants to see what's been posted. Provide just courseId to list all forums and their topics. Add forumId to get topics and posts for a specific forum. Add both forumId and topicId to get all posts in a specific discussion topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
forumIdNoSpecific forum ID to get topics and posts for. If omitted, returns all forums.
topicIdNoSpecific topic ID to get posts for. Requires forumId.
courseIdYesCourse ID to get discussion boards for.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Explicitly states when to use: 'when the user asks about discussion boards, forum posts, class discussions, or wants to see what's been posted.' Provides parameter usage patterns but does not mention when not to use.

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

get_my_coursesGet My CoursesA

Fetch your enrolled Brightspace courses with names, codes, and IDs. Use this when the user asks about their courses, enrolled classes, what they're taking this semester, or needs a course ID for other queries.

ParametersJSON Schema
NameRequiredDescriptionDefault
activeOnlyNoOnly return currently active courses. Defaults to the server's configured activeOnly setting (true unless overridden).

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdNoCourse ID to get grades for. If omitted, returns grades for all enrolled courses.

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Explicitly lists when to use: when user asks about grades, scores, marks, GPA, academic performance. Does not mention when not to use or alternatives, but the guidance is clear and sufficient.

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

get_rosterGet Course RosterA

Fetch the roster for a course including instructors, TAs, and optionally students with their names, emails, and roles. Use this when the user asks about classmates, instructor contact info, TA emails, professor names, or who's in a class. By default returns only instructors and TAs for privacy. Use includeStudents to get full class list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum users to return. Default 100. The response reports the true total and whether it was truncated.
courseIdYesCourse ID to get roster for.
searchTermNoOptional search term to filter by name.
includeStudentsNoInclude students in results. Default is instructors and TAs only.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose4/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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

The description explicitly says 'Use this when the user asks about classmates, instructor contact info, TA emails, professor names, or who's in a class,' giving clear context for when the tool is appropriate. It does not name any alternative tool or provide exclusions, so it earns a 4 rather than a 5.

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

get_syllabusGet Course SyllabusA

Fetch the syllabus/overview text and optional attachment for a course. Returns the course overview description as markdown. If downloadPath is provided, also downloads the syllabus attachment (e.g. PDF). IMPORTANT: You MUST ask the user where they want to save the file before calling this tool with a downloadPath.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesCourse ID to get syllabus for.
downloadPathNoAbsolute path to the directory where the attachment should be saved.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_todoWhat To Do NowA

Prioritized to-do list across all courses: unfinished work due soon, recently overdue work, work not open yet, items to double-check (quizzes), and work already submitted. Use this first when the user asks what to work on, what's left, or what they should do now.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysAheadNoHow many days ahead to include
includeOverdueDaysNoAlso include unfinished work that was due this many days ago

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does so by detailing the exact mix of items included: due-soon, overdue, not-open, quiz check-items, and submitted work. This goes well beyond a generic 'returns to-do list' and gives the agent a solid model of the tool's behavior, even if it doesn't mention output structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is two sentences, front-loading the core purpose and then immediately providing practical usage guidance. The category list is dense but structured and easy to parse. There is no filler or repetition of the tool name.

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

Completeness5/5

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

This is a low-complexity read-only retrieval tool with two optional, well-documented parameters. The description covers what the list contains, the scope, and when to use it. Since there is no output schema, the description's enumeration of categories effectively communicates the expected return content. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters fully, including defaults, ranges, and meanings, giving 100% schema description coverage. The tool description adds no additional parameter-specific context. Baseline of 3 is appropriate because the schema carries the descriptive load.

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

Purpose5/5

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

The description clearly defines the tool as a prioritized to-do list across all courses, enumerating specific categories like overdue, not-open, and submitted work. This distinguishes it from sibling tools such as get_upcoming_due_dates, which likely only covers due dates. The verb 'get' plus the resource 'to-do list' and the scope 'across all courses' makes the purpose unambiguous.

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

Usage Guidelines4/5

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

The description gives explicit usage context: 'Use this first when the user asks what to work on, what's left, or what they should do now.' This tells the agent when to invoke the tool. It does not explicitly name alternatives or provide when-not rules, but the clear trigger phrases are sufficient for most decision-making.

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

Upcoming due dates across all courses, with whether each assignment is already submitted (submissionStatus: submitted, graded, draft, not_submitted, not_open_yet, closed, past_due, restricted, unknown). Dates are UTC ISO strings; convert to the user's local time. Use for deadlines and what's due.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdNoFilter to a specific course ID
daysAheadNoNumber of days ahead to look for due dates

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It usefully discloses the submissionStatus values and the UTC ISO date format, including the need to convert to local time. It does not mention sorting, pagination, or the effect of optional filters, but the described behavior is meaningful and goes beyond a generic 'get' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is compact and front-loaded: it immediately states what the tool returns, then adds valuable detail about statuses and date formatting, and ends with a clear usage directive. No unnecessary words or repetition.

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

Completeness4/5

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

Given that there is no output schema and no annotations, the description covers the core return semantics, including submission statuses and date formats. It could mention optional filtering behavior or default daysAhead, but the schema already documents those defaults and range, so the description is reasonably complete for a straightforward read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both courseId and daysAhead. The description adds context about 'all courses' but does not enhance the meaning of the parameters themselves beyond the schema, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: get upcoming due dates across all courses, and clarifies the scope (all courses). It also distinguishes itself from general assignment listing by emphasizing submission status and deadlines, making the tool's purpose clear relative to siblings like get_assignments.

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

Usage Guidelines4/5

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

The description explicitly says 'Use for deadlines and what's due,' which gives the agent clear guidance on when to invoke this tool. It does not explicitly name alternatives or exclusion conditions, but the context is strong enough for selection among the sibling tools.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv1.0.0
    • First observeddownload_file
    • First observedget_announcements
    • First observedget_assignment_files
    • First observedget_assignments
    • First observedget_classlist_emails
    • First observedget_course_content
    • First observedget_discussions
    • First observedget_my_courses
    • First observedget_my_grades
    • First observedget_roster
    • First observedget_syllabus
    • First observedget_todo
    • First observedget_upcoming_due_dates

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation3/5

Most tools target distinct resources, but get_todo, get_upcoming_due_dates, and get_assignments all overlap around due dates and assignments. get_classlist_emails and get_roster also overlap on contact info, though descriptions do help clarify the intended use case.

Naming Consistency5/5

Tool names follow a consistent get_<resource> pattern, with download_file as the only exception and it is a clear, appropriate verb. Naming is predictable and makes the tool surface easy to scan.

Tool Count5/5

With 13 tools, the server is well-scoped for a Brightspace query/read assistant. Each tool covers a meaningful area of the LMS without feeling bloated or redundant.

Completeness4/5

The tool set covers the major read-only Brightspace workflows: courses, assignments, grades, content, announcements, discussions, roster, syllabus, and files. Minor gaps exist around more granular submission data or write actions, but these are outside the apparent read-focused purpose.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that connects AI assistants to university D2L Brightspace and Piazza, enabling query of courses, grades, assignments, deadlines, files, and Piazza posts.
    7
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    A Model Context Protocol (MCP) server that connects AI coding agents to your Moodle LMS. Fetch assignments, grades, deadlines, and sync everything to Obsidian automatically.
    -