Skip to main content
Glama
wynn-dev

brightspace-mcp-server

by wynn-dev

Brightspace MCP Server

Originally created by Rohan Muppa (ECE @ Purdue) as RohanMuppa/brightspace-mcp-server. This repository is an independently maintained continuation that adds TU Delft SSO, a Streamable HTTP transport, and a clone-based workflow.

An MCP server for D2L Brightspace. Connect it to Claude, ChatGPT, Cursor, Windsurf, or any MCP client and ask about your grades, due dates, assignments, announcements, course content, rosters, and discussions in plain language.

Works with any school on D2L Brightspace. Login is automated for Purdue (Duo MFA) and TU Delft (no MFA); other schools use the generic SSO flow or a manual browser login.

Install

Requires Node.js 22+, git, and pnpm (corepack enable installs the pinned version). The project runs from a clone; everything is a pnpm run script.

git clone https://github.com/wynn-dev/brightspace-mcp-server.git
cd brightspace-mcp-server
pnpm install          # installs dependencies, downloads Chromium, builds
pnpm run setup       # add --tudelft or --purdue to skip the URL prompt

Always use pnpm run setup and pnpm run update with the explicit run — bare pnpm setup and pnpm update are pnpm's own built-in commands.

The wizard stores your credentials in ~/.brightspace-mcp/config.json, logs in once, and registers the server in Claude Desktop and Cursor if they're installed. Restart your AI client afterwards.

Register a stdio MCP server whose command is your node binary and whose only argument is the absolute path to build/index.js in this clone. The wizard prints the exact JSON at the end:

{ "command": "/usr/local/bin/node", "args": ["/home/you/brightspace-mcp-server/build/index.js"] }

Paste into Claude Code, Cursor, Windsurf, Copilot, or Codex:

Install brightspace-mcp-server for me by following LLMs.md in this repo
(use --tudelft if I'm at TU Delft, --purdue if I'm at Purdue).

Related MCP server: D2L Brightspace MCP Server

Remote access

To reach Brightspace from an MCP client on another machine, serve MCP over Streamable HTTP instead of stdio:

MCP_AUTH_TOKEN="$(openssl rand -hex 32)" MCP_HTTP_HOST=0.0.0.0 pnpm run start:http

Or put those settings in .env / .env.local (see .env.example) and just run pnpm run start:http.

This exposes the 11 read-only tools at http://<host>:8787/mcp (download_file is left out because it would write to the server's disk). Clients send Authorization: Bearer <MCP_AUTH_TOKEN>:

claude mcp add --transport http brightspace http://your-host:8787/mcp --header "Authorization: Bearer <token>"

Variable

Default

Notes

MCP_HTTP_HOST

127.0.0.1

Any non-loopback address requires MCP_AUTH_TOKEN.

MCP_HTTP_PORT

8787

MCP_AUTH_TOKEN

Static bearer token; the server holds your whole Brightspace session.

MCP_ALLOWED_HOSTS

loopback names

host:port values accepted in the Host header (DNS-rebinding protection), e.g. myserver.lan:8787.

MCP_ALLOWED_ORIGINS

Browser origins to accept, if any.

On a headless host, set "headless": true in ~/.brightspace-mcp/config.json so re-login runs without a display (unattended re-login needs a school without an MFA prompt), install Chromium's system libraries on Linux with pnpm run playwright:deps, and keep the port behind a VPN or TLS-terminating proxy — the server itself speaks plain HTTP.

Commands

Command

What it does

pnpm run setup

Setup wizard (-- --purdue, -- --tudelft)

pnpm run auth

Log in again if automatic re-auth fails

pnpm run start

Stdio MCP server (what your AI client runs)

pnpm run start:http

Streamable HTTP MCP server

pnpm run update

Pull the latest code, reinstall, rebuild

pnpm run build / pnpm run dev

Compile once / watch

pnpm test

Run the test suite

pnpm run playwright:deps

Install Chromium system libraries (Linux)

Sessions re-authenticate automatically. If that fails (missed Duo push, expired cookies), run pnpm run auth.

Configuration

Set in ~/.brightspace-mcp/config.json (written by the wizard), or as environment variables — either in your shell or in a .env / .env.local file in the project root (copy .env.example). Precedence is shell > .env.local > .env > config.json.

Variable

Default

Purpose

D2L_BASE_URL

Your Brightspace URL; also selects the login flow

D2L_USERNAME / D2L_PASSWORD

Credentials for automated login; omit for a manual browser login

D2L_HEADLESS

false

Hide the browser during login

D2L_SESSION_DIR

~/.d2l-session

Where the encrypted token and cookies live

D2L_TOKEN_TTL

3600

Seconds before a saved session is considered stale

D2L_INCLUDE_COURSES / D2L_EXCLUDE_COURSES

Comma-separated course IDs to filter

D2L_ACTIVE_ONLY

true

Hide inactive courses

D2L_LOG_LEVEL

INFO

Log verbosity on stderr: DEBUG, INFO, WARN, ERROR

Security

  • Credentials stay on your machine in ~/.brightspace-mcp/config.json (mode 0600)

  • Session tokens are encrypted at rest (AES-256-GCM)

  • All traffic to Brightspace is HTTPS; nothing is sent anywhere except your school's login page

  • The HTTP server refuses to bind a non-loopback address without a bearer token

Contributing

Add your school: add a preset to SCHOOL_PRESETS in src/setup.ts. If its login flow differs, add an SSOFlow in src/auth/ (see tudelft-sso.ts) and select it in BrowserAuth.

Add a tool: create a file in src/tools/, add its schema to schemas.ts, export it from src/tools/index.ts, and register it in createMcpServer() in src/server.ts. Mark read-only tools with annotations: { readOnlyHint: true }.

LLMs.md has a codebase map for contributors and AI assistants.

License

MIT License · Copyright 2026 Rohan Muppa and contributors · Report a bug

Available Tools

12 tools
check_authCheck Authentication StatusA
Read-only

Check if you are authenticated with Brightspace. Run pnpm run auth first to authenticate. Use this when the user asks if they're logged in, if authentication is working, or when other tools return auth errors.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already mark this as read-only. The description adds useful behavioral context: the tool checks authentication status and requires prior authentication via a separate command. It doesn't describe what happens when unauthenticated, but the readOnlyHint covers the safety profile and the trigger conditions are clear.

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 short sentences with no wasted words. The purpose is stated first, then the prerequisite, then concrete trigger scenarios. Every sentence earns its place.

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

Completeness5/5

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

For a zero-parameter, read-only auth check with no output schema, the description covers everything an agent needs: what it does, how to prepare, and when to invoke it. No meaningful gaps remain.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing for the description to explain about parameters. The baseline of 4 for no parameters is appropriate, and the description appropriately focuses on purpose and usage rather than parameter details.

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

Purpose5/5

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

States a specific action ('Check if you are authenticated') and a specific resource ('Brightspace'). The sibling tools are all data-retrieval tools for courses, grades, etc., so this auth-check tool is clearly distinguishable.

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

Usage Guidelines5/5

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

Explicitly lists when to use the tool: when the user asks if they're logged in, if authentication is working, or when other tools return auth errors. Also provides the prerequisite action ('Run `pnpm run auth` first'). This is exemplary usage guidance.

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

download_fileDownload FileA

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

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.6/5.0
Behavior4/5

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

Annotations already indicate this is not read-only and not destructive. The description adds valuable behavioral context beyond annotations: the tool writes to a local directory, the agent must ask for a download path, and the agent should suggest a readable filename. It doesn't mention overwrite behavior, but the provided guidance is meaningful.

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

Conciseness5/5

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

The description is well-structured and front-loaded: it states the action, the usage context, and critical instructions. The included example filename is concrete and useful, not filler. 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?

The description covers the main workflow well: purpose, when to use, required user interaction, and filename handling. A minor gap is that it doesn't explicitly explain the relationship between topicId/folderId/fileId or state that a source identifier is needed to actually download. Still, for the complexity level, it is largely 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?

Input schema covers 100% of parameters, so the baseline is 3. The description adds extra semantics for downloadPath by emphasizing the user must choose it, and for customFilename by explaining how to suggest and apply a renamed file. This goes beyond the schema's basic parameter 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 uses a specific verb and resource: 'Download a file from course content or assignment submissions to a local directory.' It clearly states the tool's scope and differentiates it from the sibling tools, which are all read/retrieval operations rather than file downloads.

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 when to use this tool: 'Use this when the user wants to download, save, or get a file from Brightspace course content or dropbox submissions.' It also provides a mandatory prerequisite—asking the user where to save the file—and explains the filename renaming workflow, leaving little to inference.

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

get_announcementsGet AnnouncementsA
Read-only

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

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?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the scoping behavior (specific course vs all courses) but does not disclose output shape, ordering, 'recent' window, or pagination traits.

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

Conciseness5/5

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

Two short sentences front-load the core action and then give concrete trigger phrases for when to call the tool. There is no filler or redundant detail.

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

Completeness4/5

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

For a read-only tool with two optional parameters and high schema coverage, the description adequately covers purpose, filtering options, and usage context. The only notable omission is a description of the return payload, but that is not critical given the simple resource type and no output schema.

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

Parameters3/5

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

Schema coverage is 100%, so parameter behavior is already documented. The description's mention of filtering by course mirrors the schema's courseId explanation rather than adding new meaning, and count is fully specified in 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?

The description opens with a specific verb and resource: 'Fetch recent announcements from your courses.' It also distinguishes the tool from siblings by naming exact user intents like announcements, news, updates from instructors, recent posts, and what professors said. An agent can confidently select this over get_assignments, get_discussions, or get_syllabus.

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 lists when to use the tool: whenever the user asks about announcements, news, updates from instructors, recent posts, or what professors said. It does not explicitly state when not to use it or name alternatives, but the sibling list makes the separation clear enough.

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

get_assignmentsGet AssignmentsA
Read-only

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

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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already set readOnlyHint=true, and the description reinforces a no-mutation read operation. It adds useful behavioral detail about returned data (dropbox submissions, quizzes with due dates, status, rubric info) and the optionality of course scope. It doesn't describe pagination or ordering, but that is minor for a simple read-only lookup.

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, front-loaded with the operation and scope, followed by a concrete use trigger. No redundancy with the title or schema.

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 one-parameter read-only tool with high schema coverage, the description sufficiently explains what it returns and when to invoke it. It could be strengthened by explicitly contrasting with get_upcoming_due_dates, which also involves due dates, but the stated trigger conditions mostly cover the disambiguation.

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

Parameters3/5

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

Schema coverage is 100%, and the schema already explains that courseId is optional and means 'Course ID to get assignments for' and that omission returns assignments for all enrolled courses. The description corroborates this ('specific course or all enrolled courses') but does not add new semantics beyond the schema; baseline 3 applies.

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

Purpose5/5

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

Description states a specific verb ('Fetch') and resource ('assignments and quizzes'), defines the scope ('specific course or all enrolled courses'), and lists concrete included data (dropbox submissions, quizzes with due dates/status/rubric info). This allows an agent to distinguish it from siblings like get_course_content or get_my_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?

Explicit trigger phrase 'Use this when...' enumerates user intents: assignments, homework, what to submit, quizzes, or assignment details and rubrics. It does not state when NOT to use it or name alternatives such as get_upcoming_due_dates for due-date-only queries, so it misses explicit exclusion guidance.

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
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesCourse ID to get emails for.

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already covers the safety profile, so the description only needs to add behavioral context. It does so by clarifying scope (all roles in the course). However, it does not disclose output format or uniqueness guarantees, though these are minor for this 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?

Two sentences with no filler. The main action is front-loaded, and the usage guidance is compactly integrated. Every sentence contributes useful information.

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

Completeness4/5

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

For a single-parameter, read-only tool with a fully documented schema, the description covers the essential context: what it fetches, who it includes, and when to use it. No output schema is present, but the return type is easily inferable from the description. A brief note on output format would make it fully complete.

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

Parameters3/5

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

The input schema has 100% description coverage for courseId. The tool description only refers to 'a course' and does not add details beyond the schema, which is acceptable because the schema already defines the parameter clearly.

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 action and resource: fetching all email addresses for a course. It explicitly enumerates the included roles (instructors, TAs, students), making the tool's purpose unmistakable and clearly distinct from sibling tools like get_roster 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.

Usage Guidelines4/5

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

The description gives clear trigger conditions: the user wants a class email list, needs to email the whole class, or wants contact info for everyone enrolled. It does not explicitly name alternatives to avoid, but the use-case framing is sufficiently directive.

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
Read-only

Fetch the content tree for a course showing modules, topics, files, and links. Use this when the user asks about course materials, lecture slides, uploaded files, content structure, or what's in a course module. Use moduleTitle to filter to a specific module (e.g. 'Labs', 'Staff', 'Homeworks') instead of fetching the entire tree. Use maxDepth to limit recursion depth for a table-of-contents view.

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.5/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation, and the description adds meaningful behavior beyond that: the content tree structure, case-insensitive moduleTitle substring matching, and maxDepth recursion limiting. It doesn't mention pagination or rate limits, but these are less critical given the read-only annotation.

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

Conciseness5/5

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

Four sentences, no filler, with the core purpose front-loaded and optional parameter behavior explained in the later sentences. Every sentence earns its place.

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

Completeness5/5

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

For a read-only content retrieval tool with four parameters and no output schema, the description covers what the tool returns (modules, topics, files, links), when to use it, and how to use the key filtering parameters. The schema covers typeFilter and the remaining details, so nothing critical is missing for an agent to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all parameters well. The description adds value by framing moduleTitle as a way to fetch a specific module 'instead of fetching the entire tree' and maxDepth as enabling a 'table-of-contents view.' This helps the agent choose parameters purposively, though typeFilter is not mentioned in the description.

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 specific verb and resource: 'Fetch the content tree for a course showing modules, topics, files, and links.' This clearly distinguishes the tool from siblings like get_assignments, get_syllabus, or get_discussions, which serve different content domains.

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 triggers: 'when the user asks about course materials, lecture slides, uploaded files, content structure, or what's in a course module.' It also provides practical guidance on using moduleTitle and maxDepth for specific needs. It doesn't explicitly state when not to use 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_discussionsGet DiscussionsA
Read-only

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

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.5/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes the tool as a safe read operation. The description adds meaningful behavioral detail beyond that: it explains the hierarchical scoping behavior for courseId, forumId, and topicId, telling the agent exactly what each level of input returns.

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 focused sentences: the first states the purpose, the second gives user-intent triggers, and the third explains parameter usage. No filler or redundant content, and the most important scoping guidance is front-loaded.

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

Completeness5/5

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

For a read-only retrieval tool with 3 well-documented parameters and no output schema, the description adequately covers invocation, parameter combinations, and expected results at each level. 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.

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. The description goes beyond the schema by explaining parameter combination semantics, such as 'Provide just courseId to list all forums and their topics' and 'Add both forumId and topicId to get all posts in a specific discussion topic,' which adds real value.

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 uses a specific verb and resource ('Fetch discussion board content for a course including forums, topics, and posts') and clearly differentiates this tool from siblings like announcements and assignments. It also identifies the exact user intents it serves, so an agent can select it accurately.

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 states when to use the tool ('when the user asks about discussion boards, forum posts, class discussions, or wants to see what's been posted') and explains how parameter combinations change the scope. It does not mention when not to use it or name 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_my_coursesGet My CoursesA
Read-only

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

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

TDQS

A4.1/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, and the description does not contradict that. The description adds minimal behavioral context beyond listing returned data; it does not discuss pagination, filtering, or response shape, but the read-only nature is well covered by the annotation.

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

Conciseness5/5

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

The description is concise and well-structured, with the core function stated first, followed by practical invocation scenarios. Each sentence contributes useful information without unnecessary repetition or 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?

For a simple read-only tool with no required parameters and no output schema, the description is sufficiently complete. It tells the agent what the tool returns and when to use it, and the optional parameter is already documented in the schema.

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 only parameter, activeOnly, is fully described in the schema with a clear explanation and default behavior. The tool description does not add additional parameter context, but with 100% schema description coverage, a baseline score 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 clearly identifies the tool's function: fetching the user's enrolled Brightspace courses. It specifies the exact resource (courses) and the data returned (names, codes, and IDs), making it easily distinguishable from sibling tools like get_my_grades or 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 provides explicit use cases: when the user asks about their courses, enrolled classes, current semester, or needs a course ID for other queries. It lacks explicit when-not-to-use guidance or alternative tool suggestions, but the context is clear enough for an agent to select this tool appropriately.

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
Read-only

Fetch your grade breakdown for a specific course or all enrolled courses. Shows grade items with points, percentages, and comments. Use this when the user asks about grades, scores, marks, GPA, academic performance, or how they're doing in a class.

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral detail: it returns grade items with points, percentages, and comments, and it explains the optional course-scoping behavior. This goes beyond what annotations provide.

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

Conciseness5/5

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

Two concise sentences with no filler. The core purpose is front-loaded, the return contents are summarized, and the usage guidance is delivered in a compact list of natural user expressions.

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

Completeness5/5

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

For a simple tool with one optional parameter, no output schema, and a read-only annotation, the description covers the necessary bases: what it fetches, what it shows, and when to use it. Nothing critical is missing for an agent to select and invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already fully documents the optional courseId parameter and its omission behavior. The description reinforces this ('specific course or all enrolled courses') but adds no new parameter-level meaning beyond what the schema provides.

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

Purpose5/5

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

The description states a specific verb ('Fetch'), a clear resource ('your grade breakdown'), and an explicit scope ('for a specific course or all enrolled courses'). It clearly distinguishes itself from siblings like get_assignments by focusing on grades, points, percentages, and comments.

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 trigger conditions ('when the user asks about grades, scores, marks, GPA, academic performance, or how they're doing in a class'). It does not explicitly name alternative tools to avoid, but the when-to-use guidance is clear and contextually 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
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
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.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, but the description adds valuable behavioral context beyond that: it reveals the default privacy behavior of returning only instructors and TAs, and that students require an explicit opt-in via includeStudents. This is meaningful additional transparency for an agent handling user requests.

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 with no filler. It front-loads the core function, then gives user-intent triggers, then states default behavior and the parameter needed to change it. Every sentence contributes useful guidance.

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

Completeness5/5

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

For a low-complexity read-only tool with only one required parameter and complete schema descriptions, the description covers selection triggers, default behavior, and parameter usage. No output schema or nested objects exist, so return-value documentation is not needed. The description is sufficient for an agent to invoke the tool correctly.

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

Parameters4/5

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

The input schema covers all parameters with descriptions at 100% coverage, so the baseline is 3. The description adds further meaning by explicitly stating 'Use includeStudents to get full class list,' reinforcing the parameter's effect and the privacy default. It doesn't elaborate on searchTerm, but the schema already documents that adequately.

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 identifies a specific verb and resource ('Fetch the roster for a course') and specifies that it includes instructors, TAs, and optionally students with names, emails, and roles. It also gives concrete user-intent examples. However, it does not explicitly distinguish itself from the sibling get_classlist_emails, which could overlap, so it falls short of full sibling differentiation.

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 usage context: 'Use this when the user asks about classmates, instructor contact info, TA emails, professor names, or who's in a class.' It also explains the default behavior and how to include students. It does not mention when not to use the tool or alternatives, but the stated context is clear enough for an agent to decide.

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
Read-only

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

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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description is consistent with that. It adds valuable behavioral detail beyond the annotation by disclosing the optional attachment download side effect, the markdown return format, and the mandatory user-consent precondition for downloadPath.

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 concise and well-structured: purpose, return format, conditional download behavior, and a critical usage warning. Every sentence adds value, and the important user-consent instruction is prominently highlighted without unnecessary padding.

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

Completeness5/5

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

For a simple two-parameter read operation, the description covers the return format, the optional download behavior, and the key precondition for using downloadPath. Given the low complexity and full schema coverage, no critical information is missing.

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

Parameters4/5

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

The schema already fully describes both parameters, giving a baseline of 3. The description adds extra meaning by clarifying that providing downloadPath triggers an attachment download and by requiring user confirmation before calling with that parameter, which goes beyond the raw schema.

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 the action ('Fetch') and the resource ('syllabus/overview text and optional attachment'), and it clarifies that the overview is returned as markdown. However, it does not explicitly differentiate itself from sibling tools like get_course_content, so the distinction is clear but not directly stated.

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 clear context for when to call the tool and provides an explicit conditional guideline: if downloadPath is provided, the user must first be asked where to save the file. It does not mention alternative tools or when to avoid this tool, but the usage context is reasonably complete.

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
Read-only

Fetch upcoming due dates across all your courses. Shows assignments, quizzes, and other items due within the specified time window. Use this when the user asks about deadlines, what's due, upcoming work, or what they need to do this week.

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

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description adds that it aggregates across all courses and covers assignments, quizzes, and other items. It doesn't disclose return format, pagination, or how the 'specified time window' is exactly applied, but the read-only safety profile is already covered.

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: the first states the operation and scope, the second gives concrete user-facing trigger phrases. It is front-loaded and efficient.

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

Completeness4/5

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

For a read-only tool with two optional, fully documented parameters, the description covers scope, item types, and typical use cases. It doesn't describe the exact return shape or disambiguate from get_assignments, but it is largely complete for a simple fetch 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 courseId as an optional filter and daysAhead with default and bounds. The description only refers generically to a 'specified time window' and adds no semantic value beyond the schema.

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 uses a specific verb ('Fetch') and names the resource ('upcoming due dates across all your courses'), and it identifies what items are included and the time-window scope. It doesn't explicitly distinguish from the sibling get_assignments, but its cross-course aggregate purpose is clear.

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 trigger scenarios: when the user asks about deadlines, what's due, upcoming work, or what to do this week. It doesn't provide exclusions or name alternatives like get_assignments, so some overlap ambiguity remains.

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

TDQS

A4.3/5.0
Disambiguation4/5

Most tools target clearly distinct resources, but get_classlist_emails and get_roster overlap significantly since both return course participant contact info. get_assignments and get_upcoming_due_dates also both surface due dates, though their descriptions help differentiate them.

Naming Consistency5/5

Tool names consistently follow a snake_case verb_noun pattern, with get_ prefixed retrieval tools covering most of the surface. check_auth and download_file deviate from get_ but still use clear action_noun naming, so the overall pattern remains predictable.

Tool Count5/5

Twelve tools is well within the ideal range for an LMS integration server. Each tool covers a meaningful student-facing Brightspace capability, from auth and courses to grades, content, files, roster, syllabus, and discussions.

Completeness5/5

The tool surface is comprehensive for a read-only Brightspace assistant: it covers courses, due dates, grades, announcements, assignments, content, file downloads, rosters, syllabus, and discussions. No critical dead ends are apparent, and agents can chain these tools to answer a wide range of student queries.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wynn-dev/brightspace-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server