Skip to main content
Glama

Personal Brightspace MCP

A local, read-only TypeScript MCP server that gives a school tutor access to your Brightspace courses, structured deadlines, announcements, assignment instructions, course outline, quiz metadata and your own released grades. It can also search explicitly imported school notes and compare course metadata with a previous successful check.

Connect locally with Claude Desktop, Claude Code or Codex. Install · Claude setup · Codex setup.

Use your institution's Brightspace URL during setup. The server supports a configurable Brightspace tenant; available APIs and permissions depend on your institution.

Quick start on your Mac

You need Node.js 22.16+ (an LTS version includes npm). Google Chrome is needed only for optional browser sign-in. No build step is required: dist/ is included.

  1. Download the source ZIP and unzip it.

  2. Open Terminal in the extracted folder and run:

bash setup.sh

The setup installs locked dependencies with lifecycle scripts disabled, runs an offline smoke check, and prints the exact connection settings for your computer. It does not sign in, read school data, start a background service or change your MCP host settings. If Node or npm is missing, it explains what to install.

Alternatively, with Git installed:

git clone https://github.com/Proscled/personal-brightspace-mcp.git
cd personal-brightspace-mcp
bash setup.sh

Next, follow Connect to Claude or Connect to Codex below, then reload the host. Keep the extracted folder in a permanent location: the host runs the server from that path. A working offline check does not verify access to your school. For development, run npm run build after editing src/.

On Windows, use PowerShell in the extracted folder: run npm ci --ignore-scripts, then node scripts/smoke.mjs, and follow the Claude Desktop instructions below. Document rendering/OCR support varies by operating system; see Local readers.

Optional school sign-in

Replace https://brightspace.example.edu with your institution's Brightspace URL. Use a normal local terminal, not an AI tool call:

node dist/index.js init --url https://brightspace.example.edu
node dist/index.js login
node dist/index.js doctor

login opens a separate, temporary Chrome session. Sign into your institution normally and complete MFA yourself. Open a course, return to the terminal and press Enter. The program collects only school-origin session cookies and any authentication headers the school page itself uses with its own API. It then checks the Brightspace identity endpoint before saving a session. It does not ask for your password, handle MFA codes, scrape your other browser tabs, or save identity-provider cookies.

To remember browser sign-in between login runs, use node dist/index.js login --remember-browser. This opts into a dedicated local Chrome profile, including school and SSO browser state; it never uses your ordinary Chrome profile. The profile is sensitive, stays outside the repository in the private state directory, and is removed by logout. School expiry and MFA policies still apply. Successful API reads now save replacement school cookies, when supplied by the server. There is no background refresh or automatic browser launch.

Browser-session API access is tenant-dependent. A successful browser login does not prove the student API is allowed. If verification returns 401/403, check docs/AUTHENTICATION.md; do not bypass school policy. An officially issued OAuth access token is the supported alternative.

The archive includes prebuilt dist/ files. You can run the protocol smoke test without installing dependencies:

node scripts/smoke.mjs

Browser login uses the optional playwright-core package installed by npm ci and your existing Google Chrome installation. Set BRIGHTSPACE_BROWSER_PATH to a Chrome/Chromium executable to use another installation.

Related MCP server: mun-d2l-mcp

Connect to Claude

Claude Desktop

  1. From the installed project folder, print your exact JSON configuration:

    node dist/index.js config-client --client claude-desktop
  2. In the Claude Desktop app, open Settings → Developer → Edit Config. Merge the printed brightspace entry into the existing mcpServers object. If the file is empty, use the complete printed JSON. Keep any other servers.

  3. Save the file, fully quit Claude, and reopen it. Find brightspace in the local MCP server settings or the chat's connector menu.

  4. First ask: “Call brightspace_status with verifyConnection false.” This checks local setup without contacting your school. Course tools require separately authorized sign-in.

This uses local stdio; there is no hosted URL to paste into Claude's web connector form. The generated configuration uses absolute paths, including the Node executable, so it also works when the desktop app has a different PATH. See Claude setup and troubleshooting for Windows, config file locations and connection errors.

Claude Code

Print and run the generated command in Bash/zsh:

node dist/index.js config-client --client claude-code

It registers a stdio server in your user scope (available across your projects). Then run claude mcp get brightspace and use /mcp in Claude Code to inspect the connection. The generator only prints a command; it does not change Claude settings itself. Official Claude Code MCP reference.

Connect to Codex

From the project directory:

codex mcp add brightspace -- "$(command -v node)" "$PWD/dist/index.js" serve

Restart/reload the MCP host as needed. The server starts without a network call; authentication is checked when a live school tool is used. For larger multi-course requests, add tool_timeout_sec = 300 to this server's entry in your Codex configuration.

To print exact configuration paths for your machine:

node dist/index.js config-client --client codex

The output is a Codex TOML entry. Merge it into your existing configuration; do not replace the entire file. Without --client, the command prints both generic JSON and Codex TOML; use only the format your host accepts. Examples are also in examples/.

This command connects Codex to your local stdio server. For optional hosted HTTP setup, see web deployment.

Try it

In an MCP-connected host:

What is due in the next 14 days? Separate submission due dates from closing dates, and tell me which sources could not be checked.

Read the latest announcements for my mathematics course and find the preparation for the next exam.

Search my imported school snapshot for the assessment matrix, then give me one practice question at a time.

Check what changed since the last successful update check.

Or call a tool from your terminal:

node dist/index.js call brightspace_list_courses '{}'
node dist/index.js call brightspace_get_deadlines '{"daysAhead":14}'
node dist/index.js call brightspace_get_announcements '{"courseId":"100"}'

Course IDs in examples are placeholders. list_courses is the source of truth for your account. A response with isError or an incomplete coverage entry must not be interpreted as “nothing due.”

To check for a submission receipt, pass both a course ID and a folder ID from the assignment list to brightspace_get_assignments. The ordinary course-wide list makes no receipt requests. A receipt confirms a submission. An empty result leaves completion unknown, particularly for group and on-paper work.

Search your existing School snapshot

Use the Markdown context file you already have; it is intentionally not bundled into this source repository.

node dist/index.js import-notes "/path/to/School_Context_2026-11-03.md" \
  --title "School Brightspace snapshot" --as-of 2026-11-03

node dist/index.js call brightspace_search_notes '{"query":"toetsmatrijs"}'

Search returns note IDs, line numbers, snippets and the snapshot date. brightspace_read_note expands an exact line range. Only files you explicitly import via the local CLI are searchable; the model cannot supply arbitrary filesystem paths. Notes remain snapshots, not live facts. Import a new version when you refresh your school export. Identical content is deduplicated; different versions remain separate and retain their dates.

Available tools

Tool

What it does

brightspace_status

Local setup status; optional live identity check. Never returns tokens or cookies.

brightspace_list_courses

Accessible course enrollments with configurable course filtering.

brightspace_get_assignments

Instructions, dates, attachments and rubric metadata. An optional folderId checks your receipt for one visible assignment.

brightspace_get_announcements

Course news text with published/modified dates and source links.

brightspace_get_grades

Only your own released Brightspace grade values. Missing grades stay null.

brightspace_get_quizzes

Quiz metadata and dates, never attempts or questions.

brightspace_get_calendar

Your course calendar events within a bounded time window.

brightspace_get_content

Nested modules/topics flattened into a searchable course outline.

brightspace_read_topic

Read a visible topic as text, including PDF, PPTX, DOCX, XLSX, HTML and notebook source. Select a section or page and page through long text.

brightspace_read_attachment

Read a native file attached to a visible assignment or announcement, using its parent ID and FileId.

brightspace_view_page

Return one PDF page or PowerPoint slide as an MCP image. Select a numbered picture to retrieve an embedded PNG or JPEG.

brightspace_get_assignment_rubrics

Look up the visible rubrics for a specific assignment and read their criteria, levels and available points.

brightspace_get_deadlines

Structured dates from assignments, quizzes, calendar and content, with per-source coverage.

brightspace_search_course

Search course metadata and a batch of native files. File matches identify the slide, page, paragraph or spreadsheet row.

brightspace_check_updates

Compare current metadata with private local baselines. For one course, optionally hash file bytes to catch edits without metadata changes.

brightspace_list_notes

List explicitly imported Markdown/text snapshots.

brightspace_search_notes

Search imported text with line-numbered snippets.

brightspace_read_note

Read bounded line ranges by note ID.

Two optional prompts are exposed: school_weekly_plan and school_exam_tutor. A brightspace://guide resource documents source handling and limitations for the host. docs/TUTOR_PROMPT.md provides project instructions to adapt.

Presentations, documents and rubrics

Ask “Laat dia 9 zien en leg de formule uit” or “Zoek de toetsmatrijs en noem het werkblad en de rij.” Codex can call brightspace_view_page for an actual slide image and brightspace_read_topic for text, speaker notes and embedded-picture numbers. For a scanned or partly scanned document, request ocrPage with the one-based printed page number. For ordinary text use section to select a slide, PDF page, Word section or worksheet row. Each response identifies its source. The CLI prints image metadata; MCP clients receive the image itself.

Native assignment and announcement files come with a numeric FileId. Pass it with folderId or newsItemId respectively. Assignment instructionLinks also preserve the instructor’s link label and destination. Browser QuickLinks and external URLs can be opened manually. The reader does not follow them with your credentials. The rubric lookup checks the selected folder and reports any endpoint error alongside usable embedded definitions and document links. A denied lookup or a document linked as a marking guide should be reviewed separately.

File search scans three files per call by default. Look in fileSearch.matches for citations. Use nextMatchOffset for additional hits in the current batch, then advance nextFileOffset and reset the match offset. Set filename to narrow to a topic title or attachment name. includeFiles: false selects faster metadata-only search. A skipped or unreadable file appears in coverage. Images and diagrams inside mixed documents may need a visual read or page-specific OCR.

To detect changed bytes, call brightspace_check_updates with includeFiles: true and one entry in courseIds. Follow fileCoverage.nextFileOffset with the same course and options. A successful first read establishes each file’s SHA-256 baseline. Later reads identify changed content even when titles and dates match. An unreadable file keeps its previous baseline.

Local readers

Office XML extraction uses Python 3. On macOS, PDF reading and OCR use PDFKit and on-device Vision. Office page rendering uses a local LibreOffice installation in Applications or the bundled Codex desktop runtime. Conversion runs in a disposable local directory with restricted filesystem access, disabled macros and blocked network access. The reader accepts PDF and Office files up to 32 MiB by default. Set maxFileBytes to lower the limit. An existing explicit maxResponseBytes also applies to files unless overridden.

OCR can misread formulas and handwriting. Bulk PDF text extraction processes up to 100 pages and up to 12 OCR pages per request. Request a later page individually. LibreOffice layout depends on locally available fonts. The Excel text reader returns cell addresses, stored values and formula text. The visual reader returns one image per call.

What “read-only” means

The school client has a hardcoded GET-only API allowlist. It exposes no generic URL fetch, arbitrary API request, shell command, submission, edit, deletion, quiz-start, timed-review, or progress-write tool. Authenticated redirects are blocked rather than followed with your credentials. Normal school sign-in in the browser may of course use POST requests as part of SSO; these are user-driven login actions, not course-editing tools.

check_updates changes private local baseline files, so its MCP readOnlyHint is correctly false. All other tools advertise read-only access. The first check establishes baselines; it does not pretend that existing items are newly posted. A failed or incomplete read preserves the previous successful baseline. A disappeared item is “no longer visible,” not “deleted” or “completed.” Baselines are namespaced by school, account, course and resource.

No scheduler is running. The server checks when a host calls it. Reminders, regular checks and notifications require separately configured host automation. A normal local stdio connection does not itself create background monitoring.

Honest coverage limits

  • Structured dates do not capture every instruction in announcement text, slide decks or external systems. Use announcements/materials alongside the deadline tool. “Complete” means the selected API sources answered, not that every school obligation is known.

  • A due date is distinct from availability ending. A date-only value is not assigned a fictional time. Dates are rendered in Europe/Amsterdam, including daylight-saving changes.

  • Course-wide results leave submission status unknown. The optional single-folder receipt check distinguishes personal and group receipts. A passed date or absent receipt does not establish missed work. Special access, extensions, exemptions and group-specific dates may need checking in the student UI.

  • Legacy binary Office formats, audio and video are outside the document reader. Notebook cells are read as source. OCR, visual rendering and text search each report their own coverage.

  • External links and interactive/LTI topics are returned as references, never followed automatically. Osiris and Remindo are not connected. Recurring calendar rules are not expanded into every occurrence.

  • File search covers readable course topics and native attachments to visible assignments and announcements. Instruction links contribute their labels and URLs to metadata search. Their destinations are outside the file search.

Configuration and local data

Default state location:

~/.local/share/personal-brightspace-mcp/
├── config.json
├── session.json       # SENSITIVE: never share or commit
├── notes/             # Private imported school content
└── snapshots/         # Private metadata baselines

config.json supports:

{
  "baseUrl": "https://brightspace.example.edu",
  "timezone": "Europe/Amsterdam",
  "activeOnly": true,
  "includeCourseIds": [],
  "maxCourses": 30,
  "maxPages": 30,
  "requestTimeoutMs": 20000,
  "requestSpacingMs": 200,
  "retries": 2
}

An empty course list means all accessible courses within the configured limits. Set activeOnly to false to include accessible inactive courses. Older materials offered inside an active course are not excluded based on their file name or year. API versions are discovered from the school; lpVersion and leVersion are optional overrides for supported versions.

Environment overrides: BRIGHTSPACE_URL, BRIGHTSPACE_MCP_HOME, BRIGHTSPACE_LP_VERSION, BRIGHTSPACE_LE_VERSION. BRIGHTSPACE_ACCESS_TOKEN selects official access-token authentication; it is not written by the program. BRIGHTSPACE_BROWSER_PATH affects only interactive browser login.

Sessions are not encrypted at rest. State directories use 0700 and files 0600 on macOS/Linux. Anyone controlling your OS account can read them; use device encryption and keep your account secure. On Windows, configure restrictive filesystem ACLs. Never upload state files to a model, GitHub, issue tracker or shared drive. The MCP host can receive the course data you ask it to retrieve, so review that host's data handling policy.

node dist/index.js logout

This deletes the locally saved session and optional remembered browser profile. It does not revoke the school's session or an environment token. Revoke official OAuth access through the school when applicable. Notes and snapshots are retained; remove their directories manually when you want to erase local course history.

Development and tests

npm run typecheck
npm test
npm run smoke

The core uses Node's standard library and a small, explicitly implemented stdio MCP protocol subset, rather than a third-party MCP SDK. This keeps the prebuilt server runnable without npm runtime dependencies. playwright-core is optional and loaded only for interactive login. The supported protocol revisions and limitations are documented in docs/ARCHITECTURE.md. Migrating the transport to the official SDK is a reasonable future enhancement.

Tests use synthetic fixtures. The included package-lock.json pins the versions used by npm ci. The test report distinguishes offline checks from historical authenticated checks against a specific institution; those checks do not establish compatibility with every institution.

Sources and licensing

See docs/SOURCES.md for the D2L endpoint documentation, MCP specification, Playwright API and host configuration references. This is an independent implementation, not an official D2L product or an institution's official integration. MIT licensed; see LICENSE. Third-party packages retain their own licenses.

Available Tools

18 tools
brightspace_check_updatesA

Compare metadata with local baselines. To detect changed file bytes despite identical metadata, pass includeFiles=true with one course ID and follow fileCoverage.nextFileOffset.

NameRequiredDescriptionDefault
courseIdsNoOptional subset of your accessible courses.
fileLimitNoNumber of files to process per call; start with a small batch.
fileOffsetNoSkip this many files in the ordered inventory. Use the previous nextFileOffset.
includeFilesNoHash visible file bytes in one course; default false.

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=false and idempotentHint=false; the description adds the reason — the tool writes a snapshot file and later calls compare against it, so repeat runs are stateful and non-idempotent by design. That is genuine context beyond the annotations, though the state location and whether a snapshot can be reset or inspected remain unstated.

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 with no filler, front-loaded with the primary action, and the supporting detail trails it.

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 four-parameter, stateless-looking tool with no output schema, the description explains the stateful baseline concept and the comparison result well enough to call it correctly. It could say more about where the snapshot lives or what happens on the first run, but the core mechanics are covered.

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 every parameter is already documented in the schema; the description only adds why includeFiles exists (hashing bytes). The baseline 3 applies because the schema does the heavy lifting and the description adds marginal meaning.

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 concrete verb pair (compare / create baseline) and a concrete resource pair (course content metadata vs. the tool's own snapshot), which is enough to distinguish it from the listing and reading siblings. It stops short of naming the alternative (e.g. fetch content directly) an agent should pick when it does not want drift detection, so it is clear but not fully differentiated.

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?

It gives a clear triggering condition — run this to detect changes since your last baseline — and a specific follow-up pattern (repeat calls share a snapshot). It does not state when a caller should prefer the read/list siblings, nor whether a first run must precede the comparison, which keeps it below a 5.

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

brightspace_get_announcementsA
Read-onlyIdempotent

Read course announcements with publication/modification dates. Some copied announcements may concern older academic years or another class.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description still adds real context beyond that: a data-quality warning that copied announcements may refer to older academic years or another class, which the agent would otherwise misattribute to the current term.

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 with the core operation front-loaded and the caveat second; nothing is redundant and no sentence could be dropped without losing information.

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

Completeness3/5

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

For a read-only paginated list tool this is close, but with no output schema the description only hints at return contents via the date mention, leaving the agent to guess whether titles, bodies, or author fields come back. Pagination behavior is also unaddressed beyond the schema defaults.

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 each parameter (courseId pattern, limit max 100/default 50, offset default 0) is documented inline. The description adds no paging or ID formatting guidance, so the baseline 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 states a specific verb and resource ('Read course announcements') plus what the payload carries (publication/modification dates), which separates it cleanly from siblings like brightspace_get_assignments or brightspace_get_content. It stops short of explicitly naming alternatives, but the resource is unambiguous.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the tool for pulling announcements for a courseId. There is no statement of when to prefer it over searching or checking updates (brightspace_check_updates), and no prerequisites such as needing enrollment or a valid course/org unit ID.

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

brightspace_get_assignment_rubricsA
Read-onlyIdempotent

Read rubrics associated with a visible assignment, including available criteria, achievement levels and points. Check completeness and warnings.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID
folderIdYesParent assignment folder ID.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuine context beyond them: it enumerates the returned sub-resources (criteria, levels, points), scopes results to 'visible' assignments (an access constraint), and warns that responses may need completeness/warning checks. The only notable omission is pagination behavior, despite limit/offset parameters.

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

Conciseness4/5

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

Two tight sentences with the object of the call front-loaded, no restatement of the tool name. The closing clause 'Check completeness and warnings' is a slightly awkward directive and would read better as a description of response fields, but nothing is truly wasted.

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?

With no output schema, the description usefully sketches what comes back (criteria, achievement levels, points) and warns about warnings/partial data. Combined with 100% schema coverage and read-only annotations, an agent has enough to invoke it correctly. The missing pieces are pagination semantics and the dependency on an assignment-listing call to obtain folderId.

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 courseId, folderId, limit and offset are already fully documented with patterns and defaults. The description contributes only the qualifier that the assignment must be 'visible', a mild semantic constraint on folderId, and says nothing about pagination or ID formats. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource ('Read rubrics') plus the scope ('associated with a visible assignment') and names the payload ('criteria, achievement levels and points'). An agent can tell this is rubric retrieval distinct from siblings like brightspace_get_assignments or brightspace_get_grades, though it never explicitly says how it relates to those tools.

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

Usage Guidelines3/5

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

Usage is only implied: the agent must infer that this is the tool to call when it needs rubric detail for a specific assignment. There is no explicit when-to-use/when-not-to-use guidance, and nothing tells the agent that folderId must come from brightspace_get_assignments first, which is the main prerequisite for success.

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

brightspace_get_assignmentsA
Read-onlyIdempotent

Read assignment instructions, dates and available rubric metadata. Supply a folderId to return one visible assignment and check your own submission receipts. A missing receipt leaves completion unknown.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID
folderIdNoOptional assignment ID from this course’s folder listing.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. Beyond that, the description discloses a visibility filter on results and a meaningful caveat that a missing submission receipt leaves completion status unknown — behavior not encoded in any structured field.

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

Conciseness4/5

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

Two sentences, front-loaded with what is returned, then the folderId behavior and the receipt caveat. Dense but slightly elliptical — 'check your own submission receipts' is not explained in terms of a parameter or field.

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

Completeness3/5

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

With no output schema, the description must carry the return-value burden, and it only loosely enumerates fields (instructions, dates, rubric metadata, receipts) without structure. The submission-receipt/completion sentence is ambiguous about where that data comes from, leaving a gap for a read tool with four parameters.

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 the schema already documents courseId, folderId, limit and offset including defaults and constraints. The description adds only that folderId returns a single *visible* assignment, which is a modest semantic addition over the schema's 'Optional assignment ID' text.

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 names a specific verb and resource ('Read assignment instructions, dates and available rubric metadata') and explains the folderId branch that returns a single assignment. It does not distinguish itself from the sibling brightspace_get_assignment_rubrics, which overlaps with the 'rubric metadata' claim, so an agent cannot fully rule out the alternative.

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

Usage Guidelines3/5

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

There is an implied usage rule: omit folderId to list, supply it to fetch one visible assignment. However, no explicit when-to-use versus brightspace_get_assignment_rubrics or brightspace_get_deadlines is given, and no exclusions or prerequisites are stated.

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

brightspace_get_calendarA
Read-onlyIdempotent

Read your calendar events for one course. Recurrence rules are not expanded. Calendar events are not automatically deadlines.

NameRequiredDescriptionDefault
endNoOptional full ISO end timestamp, with timezone.
limitNoPage size; defaults to 50.
startNoOptional full ISO start timestamp, with timezone.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID
daysAheadNoDefault window length in 24-hour periods; default 14.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: recurrence rules are not expanded (so recurring events appear as unexpanded entries) and calendar items are not deadlines — both are data-shape caveats an agent cannot get from structured fields.

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

Conciseness5/5

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

Three short sentences, front-loaded with the purpose and followed by the two caveats that most affect interpretation. Nothing is wasted or repeated from the 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 read-only listing tool with fully described parameters and annotations covering safety, the description supplies the two interpretive caveats that matter most. It does not describe the returned event shape or pagination behavior, but with no output schema that is a minor remaining gap rather than a blocking one.

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%, with limit, offset, start, end, and daysAhead all documented in the schema itself. The description adds no meaning about how start/end interact with daysAhead or the default window, so it sits at the baseline for a fully documented 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?

States a specific verb and resource ('Read your calendar events') scoped to one course, and the closing line implicitly separates it from the deadline-oriented sibling tool. It stops short of naming an alternative tool outright, but the scope is unambiguous.

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

Usage Guidelines3/5

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

Usage is only implied: 'Calendar events are not automatically deadlines' hints that brightspace_get_deadlines is the right tool when the user wants due dates, but there is no explicit when-to-use/when-not-to-use statement or named alternative.

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

brightspace_get_contentA
Read-onlyIdempotent

List nested course modules and topics, flattened with paths. Date-restriction bypass flags are never sent.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive). The description adds genuinely new behavioral context: date-restriction bypass flags are never sent, implying content hidden by date restrictions may be omitted or restricted and cannot be overridden. It does not mention pagination behavior beyond what the schema states.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and no redundant wording. Every sentence carries information.

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

Completeness3/5

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

For a read-only list tool with full annotation and schema coverage, the essentials are present. However, there is no output schema, and 'flattened with paths' is the only hint at the return shape; it does not clarify whether the call recurses through all modules or whether limit/offset page over modules, topics or both.

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 courseId, limit and offset are fully documented in the schema. The description adds no parameter-level detail such as whether limit/offset apply to flattened results, so this sits at the baseline.

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?

States a clear verb and resource: 'List nested course modules and topics'. The 'flattened with paths' clause describes the output shape, which helps distinguish it from a plain course listing, though it never explicitly contrasts with siblings like brightspace_read_topic.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance. The agent is not told how this differs from reading a single topic via brightspace_read_topic, nor what a typical caller would use the flattened tree for. Usage is only inferred from 'List'.

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

brightspace_get_deadlinesB
Read-onlyIdempotent

Aggregate structured dates from assignments, quizzes, calendar and content. Due dates and availability end dates stay distinct. Always report coverage and limitations.

NameRequiredDescriptionDefault
endNoOptional full ISO end timestamp, with timezone.
limitNoPage size; defaults to 50.
startNoOptional full ISO start timestamp, with timezone.
offsetNoResult offset; defaults to 0.
courseIdsNoOptional subset of your accessible courses.
daysAheadNoDefault window length in 24-hour periods; default 14.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already establish readOnly, idempotent, non-destructive, open-world behavior. The description adds two genuinely useful behavioral facts: due dates and availability end dates are kept distinct (a real semantic trap for an agent summarizing deadlines), and results may have coverage gaps that must be reported. It does not describe what the merged result looks like (fields per item, source labeling) or how pagination interacts with the aggregation.

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

Conciseness4/5

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

Three short sentences, front-loaded with the aggregation scope and then the two most consequential caveats. No filler. The final sentence is an output instruction to the agent rather than a description of the tool, but it earns its place by warning that coverage may be partial.

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

Completeness3/5

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

For a six-parameter, no-output-schema aggregator the description is lean but not complete: it never explains the shape of the returned records (source, title, type, date kind) or the default 14-day window, which matter for calling it correctly. Given no output schema exists, the return-format burden falls on the description and is left unaddressed.

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 every parameter — start, end, daysAhead, limit, offset, courseIds — is fully documented in the schema itself. The description adds no parameter-level meaning beyond that, such as how daysAhead interacts with an explicit start/end or what happens when courseIds is omitted. Baseline 3 applies when the schema carries the load.

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?

Names a specific action (aggregate structured dates) and explicitly lists the four sources it pulls from — assignments, quizzes, calendar, content — which distinguishes it from the per-source siblings like brightspace_get_assignments and brightspace_get_calendar. It never names a sibling directly, so differentiation is implied by scope rather than stated.

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

Usage Guidelines3/5

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

Aggregation across sources implies the use case: a consolidated deadline view rather than a single-source listing. There is no explicit when-to-use versus when to call the narrower siblings, and no stated prerequisites (e.g., whether course IDs must be accessible or what happens when courseIds is omitted).

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

brightspace_get_gradesA
Read-onlyIdempotent

Read only the signed-in user's released Brightspace grade values. Missing values are not zero; this does not read Osiris.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: results are limited to the signed-in user's own released grades, and 'missing values are not zero' warns against misinterpreting absent data. It says nothing about return format or pagination, but limit/offset are schema-documented.

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-loaded with the core action and scope, with zero redundant wording. Every clause carries distinct 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 simple three-parameter read tool with full schema coverage and clear annotations, this is nearly complete. The remaining gap is the absence of an output schema combined with no description of what a grade record contains, which an agent might want before consuming results.

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 limit, offset and courseId are already fully documented in the schema. The description adds only the indirect constraint that values are scoped to the signed-in user's own released grades. Baseline 3 is appropriate.

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?

It gives a specific verb ('Read') and resource ('released Brightspace grade values') plus a tight scope ('signed-in user's'), so an agent can distinguish it from siblings like brightspace_get_assignments or brightspace_get_assignment_rubrics. It stops short of naming an alternative tool, so it is clear but not sibling-routing.

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

Usage Guidelines3/5

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

The single exclusion 'this does not read Osiris' is a useful when-not signal, and 'released' implies unreleased grades will not appear. However, no alternative tool or explicit when-to-use condition is offered, so usage is only implied.

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

brightspace_get_quizzesA
Read-onlyIdempotent

Read quiz metadata and availability only. Does not open attempts, questions, review windows, or Remindo.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.
courseIdYesBrightspace course/org unit ID

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, openWorld, so the safety profile needs no restating. The description adds real value by disclosing what the call will not surface (attempts, questions, review windows, Remindo), preventing false expectations about depth. It stops short of describing what 'metadata and availability' actually contains or how results are ordered.

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 with zero filler; the positive scope leads and the exclusion list follows. Every clause carries information an agent needs.

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 paginated read tool with full schema coverage and complete annotations, the description covers the one thing structured fields can't: the depth ceiling of the call. A brief note on what metadata fields are returned would close the remaining gap.

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 courseId, limit, and offset are all documented in the schema with defaults and bounds. The description adds no meaning beyond that, which is acceptable given the coverage but earns only the baseline.

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?

States a specific verb ('Read') and resource ('quiz metadata and availability'), plus an explicit scope boundary. It doesn't name a sibling alternative, but no sibling is a competing quiz tool either, so the only missing piece is which quiz-related task maps here.

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

Usage Guidelines3/5

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

The negative scoping ('Does not open attempts, questions, review windows, or Remindo') implicitly tells the agent when to look elsewhere, which is useful routing guidance. However, no positive when-to-use condition is given and no alternative tool is named for attempts or questions, so the agent must infer the fallback.

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

brightspace_list_coursesC
Read-onlyIdempotent

List accessible course enrollments, respecting activeOnly and includeCourseIds. Check sourceComplete and nextOffset.

NameRequiredDescriptionDefault
limitNoPage size; defaults to 50.
offsetNoResult offset; defaults to 0.

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful pagination behavior by telling the agent to check 'sourceComplete' and 'nextOffset'. However, it never explains what those fields mean or what happens when sourceComplete is false, and it names two flags that are not in the schema.

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

Conciseness3/5

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

Two short sentences with no filler, and the core purpose is front-loaded. The second sentence is cryptic shorthand ('Check sourceComplete and nextOffset') that does not earn its place without explaining what to do with those values.

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

Completeness2/5

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

There is no output schema, so the description carries the burden of explaining return values. It gestures at sourceComplete and nextOffset but never defines them, and it omits what a course enrollment contains. The stray parameter names also create real ambiguity about how to call the tool.

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

Parameters2/5

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

Schema coverage is 100%, so limit and offset are already documented with defaults and bounds. The description adds nothing about those two parameters and instead references 'activeOnly' and 'includeCourseIds', which do not exist in the schema, risking an agent attempting to pass unsupported arguments.

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?

States a specific verb and resource: 'List accessible course enrollments'. That is clearly distinguishable from the get_* siblings, which fetch single resource types. The second clause muddies it by citing 'activeOnly and includeCourseIds', which are not parameters of this tool.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no reference to alternatives such as brightspace_search_course or brightspace_check_updates. An agent must infer that this is the enumeration entry point for a user's courses.

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

brightspace_list_notesA
Read-onlyIdempotent

List local Markdown/text snapshots explicitly imported through the CLI. Does not read arbitrary local files.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds one genuinely new behavioral fact — that the listing is limited to CLI-imported snapshots rather than the filesystem — but says nothing about ordering, emptiness when no imports exist, or what an entry contains.

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, no redundancy, with the positive definition front-loaded and the scope exclusion second. Every clause earns its place.

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

Completeness3/5

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

With no output schema and no parameters, the description is the only source of information about the result set, and it never indicates what a listed snapshot looks like (name, path, import date) or whether results are ordered. For a simple enumeration tool that is an acceptable minimum, but not 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies a fully unscoped, return-everything listing, consistent with the empty 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?

Names a specific verb+resource: lists local Markdown/text snapshots, with the qualifier that they were 'explicitly imported through the CLI'. That qualifier implicitly separates it from the Brightspace API siblings (get_content, search_notes), but no sibling is named explicitly, so an agent must infer the boundary.

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

Usage Guidelines3/5

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

The second sentence gives a clear negative scope ('Does not read arbitrary local files'), which usefully rules out a plausible misuse. However, there is no positive when-to-use guidance and no reference to search_notes or read_note, which are the obvious alternatives for finding note content — the agent is left to work out that this tool enumerates and those retrieve.

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

brightspace_read_attachmentA
Read-onlyIdempotent

Read a file that belongs to a visible assignment or announcement. Supply exactly one parent and its attachment FileId.

NameRequiredDescriptionDefault
fileIdYesFileId from that parent’s attachment list.
offsetNoCharacter offset within the selected text.
ocrPageNoOptional printed page or slide to recognize visually using OCR. Use this instead of section for scans.
sectionNoOptional one-based page, slide or extracted section index. Start offset at zero when selecting a section.
courseIdYesBrightspace course/org unit ID
folderIdNoParent assignment folder ID.
maxCharsNoMaximum returned characters, default 16000.
newsItemIdNoParent announcement ID.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, covering the safety profile. The description adds the 'visible' scoping constraint (only readable through a visible parent), but says nothing about extraction behavior, truncation notices when maxChars is hit, or OCR cost/latency for scans, which are the real unknowns for this 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, zero filler, with the resource scope front-loaded ahead of the selection constraint. Every clause carries information an agent needs before calling.

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

Completeness3/5

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

For an 8-parameter read tool with no output schema, the description never says what comes back (extracted plain text? binary?), how truncation is signalled, or how OCR and section pagination differ in use. The rich schema compensates for parameter detail, but the return-shape gap leaves it merely adequate.

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 baseline is 3; the description earns a point by stating that exactly one parent must be supplied, making the folderId vs newsItemId mutual exclusivity explicit where the schema only lists both as optional properties. It adds no guidance on offset/maxChars paging semantics beyond the schema text.

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 ('Read a file') and bounds it to attachments of a visible assignment or announcement, which distinguishes it from siblings like brightspace_read_topic and brightspace_view_page. It does not explicitly name those alternatives, so it stops 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?

'Supply exactly one parent and its attachment FileId' gives a hard precondition, and 'visible assignment or announcement' establishes the context in which the tool applies. No explicit exclusion or alternative route is named for cases where the file is not an attachment, so it lacks the routing guidance of a 5.

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

brightspace_read_noteA
Read-onlyIdempotent

Read a bounded line range of an imported note using its ID, not a filesystem path. Preserve the snapshot date when citing it.

NameRequiredDescriptionDefault
noteIdYesID returned by list_notes/search_notes.
lineCountNoNumber of lines to read, default 80.
startLineNoFirst 1-based line.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuinely new context beyond that: the note is an imported snapshot (not live content) and the snapshot date should be preserved when citing. It does not cover what happens when the requested range exceeds the note length or how truncated results surface.

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

Conciseness4/5

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

Two compact sentences with the primary action front-loaded and the ID-vs-path disambiguation immediately following. The snapshot-citation advice is a second concern but is short enough not to dilute the lead.

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?

With full annotation coverage, a 100%-documented schema, and no output schema, the description only needs to fill interpretive gaps. It does so for identifier semantics and snapshot provenance, though it leaves return/truncation behavior unstated.

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 noteId, lineCount, and startLine are already documented with defaults and bounds. The description reinforces that noteId is an opaque ID rather than a path and that reads are line-bounded, but adds no format or edge-case detail 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?

States a specific verb ('read') and resource ('note') with the scope of the operation ('bounded line range') and clarifies the identifier type ('using its ID, not a filesystem path'). It partially differentiates from siblings like read_topic/read_attachment by calling the resource an 'imported note', though it does not name those alternatives explicitly.

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

Usage Guidelines3/5

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

The description implies usage (you must have a note ID, not a path) but never states when to choose this over read_topic, read_attachment, or view_page, nor when not to use it. The retrieval routing is only discoverable through the schema note that noteId comes from list_notes/search_notes.

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

brightspace_read_topicA
Read-onlyIdempotent

Read text from a visible file topic, including PDF pages, PowerPoint slides and speaker notes, Word paragraphs and Excel rows.

NameRequiredDescriptionDefault
offsetNoCharacter offset within the selected text.
ocrPageNoOptional printed page or slide to recognize visually using OCR. Use this instead of section for scans.
sectionNoOptional one-based page, slide or extracted section index. Start offset at zero when selecting a section.
topicIdYesNumeric itemId of a visible file topic.
courseIdYesBrightspace course/org unit ID
maxCharsNoMaximum returned characters, default 16000.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the meaningful access precondition that the topic must be visible, but says nothing about pagination behavior, how OCR is triggered or costed, or what happens when a document is a scan rather than extractable text.

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?

A single front-loaded sentence with the core action first and the supported formats as a compact qualifier. No filler, no repetition of the tool name, and nothing that could be cut without losing information.

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

Completeness3/5

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

With six parameters and no output schema, the definition should explain at least the shape of the returned text and how offset/maxChars chunk it, plus when a scan requires OCR instead of direct extraction. Those gaps remain, though the annotations and full schema coverage keep the tool callable without them.

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 every parameter including offset, section, ocrPage and maxChars is already documented in the schema. The description contributes no additional meaning about how these parameters interact or which to prefer, which is the expected baseline when the schema does the work.

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

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 ("Read text from a visible file topic") and enumerates the supported formats (PDF pages, PowerPoint slides and speaker notes, Word paragraphs, Excel rows). It is clearly distinguishable in intent, though it never names or contrasts itself with close siblings such as brightspace_read_attachment or brightspace_view_page.

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

Usage Guidelines3/5

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

Usage is implied by the "visible file topic" scoping and the format list, which tells an agent this is for extracting text out of file content items rather than notes, pages, or attachments. There is no explicit when-to-use/when-not statement and no pointer to the alternative tools for non-file content.

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

brightspace_search_courseA
Read-onlyIdempotent

Search the course outline, announcements and assignments, plus a batch of visible files by default. File matches include slide, page or section references. Follow fileSearch.nextFileOffset.

NameRequiredDescriptionDefault
limitNoMaximum metadata hits and file hits, separately.
queryYesLiteral case-insensitive words to find.
courseIdYesBrightspace course/org unit ID
filenameNoOptional substring of the topic title or attachment name.
fileLimitNoNumber of files to process per call; start with a small batch.
fileOffsetNoSkip this many files in the ordered inventory. Use the previous nextFileOffset.
matchOffsetNoContinue matching sections within the same file batch. Reset when changing fileOffset.
includeFilesNoAlso search inside files, default true.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's job is to add operational context, which it does: files are searched by default, file matches carry slide/page/section references, and pagination continues via fileSearch.nextFileOffset. It stops short of disclosing cost/latency of file processing or the shape of metadata hits, which would complete the picture.

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

Conciseness4/5

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

Three short sentences, front-loaded with the search scope before defaults and pagination. The trailing fragment 'Follow fileSearch.nextFileOffset.' is terse to the point of being cryptic, and 'a batch of visible files by default' is loosely worded, but nothing is padded.

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

Completeness3/5

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

For an 8-parameter search tool with no output schema, the description covers scope, the file default, and a pagination pointer. It does not describe the result structure for outline/announcement/assignment hits, how limit interacts with fileLimit, or what 'visible files' excludes, so an agent must discover returns empirically.

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 baseline is 3, and the description does add one genuinely new fact not in the schema: includeFiles defaults to true. The reference to 'fileSearch.nextFileOffset' also hints at the pagination loop, but it uses an output-field name that does not map cleanly onto the fileOffset parameter, so an agent still has to infer how to resume.

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?

States a specific verb (Search) and enumerates the resources covered: course outline, announcements, assignments, and visible files. The scope is clear enough to distinguish it from single-resource getters like brightspace_get_assignments or brightspace_get_announcements, but it never names or contrasts those siblings explicitly.

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

Usage Guidelines3/5

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

Implies usage through the default-includes-files framing and the instruction to follow fileSearch.nextFileOffset, which tells an agent how to iterate. However, there is no explicit when-to-use versus brightspace_search_notes or the targeted getter tools, and no when-not guidance (e.g., disabling file search for cheap metadata-only queries).

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

brightspace_search_notesA
Read-onlyIdempotent

Search manually imported local school snapshots with line-numbered snippets. These are not live Brightspace checks.

NameRequiredDescriptionDefault
limitNoMaximum snippets.
queryYesLiteral case-insensitive text to find.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world, and non-destructive behavior, so the safety profile is covered. The description adds valuable context beyond that: results are line-numbered snippets and the data source is locally imported static snapshots rather than live data, which warns the agent that results may be stale.

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, zero waste, with the core capability front-loaded and the non-live caveat immediately following. 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?

For a simple two-parameter read-only search tool with rich annotations, the description covers purpose, data source, and result format. Return-value detail is not needed beyond the mention of line-numbered snippets, so it is essentially 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?

Schema coverage is 100%, with both 'query' (literal case-insensitive text) and 'limit' fully documented in the schema. The description adds only the notion of 'snippets' and does not elaborate on query syntax or limit behavior, 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.

Purpose4/5

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

The description states a specific verb ('Search') and resource ('manually imported local school snapshots'), and adds that results come as line-numbered snippets. It implicitly distinguishes itself from live checks ('These are not live Brightspace checks') but never names the live sibling like brightspace_search_course, so the differentiation is not fully explicit.

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

Usage Guidelines3/5

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

The line 'These are not live Brightspace checks' signals the appropriate context (searching imported snapshots rather than live data), which is useful implied guidance. However, it never states when to prefer this over brightspace_search_course or brightspace_read_note, leaving the agent to infer the routing.

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

brightspace_statusA
Read-onlyIdempotent

Check local configuration without exposing secrets. Set verifyConnection=true to verify the school API identity.

NameRequiredDescriptionDefault
verifyConnectionNoMake an authenticated API call rather than only inspect local setup.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered; the description adds genuinely new behavior — that the default path touches only local setup while verifyConnection triggers an authenticated network call. The secrecy guarantee ("without exposing secrets") is a useful, non-obvious disclosure, though nothing is said about what the check reports back.

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 compact sentences with the default behavior and the secrecy guarantee front-loaded, followed by the opt-in mode. No filler or 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?

For a zero-required-parameter, single-boolean tool with no output schema, this covers the essential behavior and the safety profile. The main omission is whether the local inspection surfaces configuration values or just a health verdict, which would help an agent interpret the result.

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 text already explains that the flag makes an authenticated API call rather than only inspecting local setup. The description's framing ("verify the school API identity") adds a small amount of meaning — what is being verified — but largely restates the parameter.

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 names a concrete verb and resource: checking local configuration, with an explicit safety framing ("without exposing secrets"). It is unambiguously a diagnostic/status tool, distinct from every sibling (which all read course content, notes, or grades), though it never states that differentiation explicitly.

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

Usage Guidelines3/5

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

It gives a clear trigger for the non-default mode ("Set verifyConnection=true to verify the school API identity"), which is real when-to-use guidance for the parameter. But there is no guidance on when to call the tool at all versus just calling an authenticated sibling, and no statement of what the local-only check is useful for.

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

brightspace_view_pageA
Read-onlyIdempotent

Return a rendered PDF page or PowerPoint slide as an MCP image. Optionally supply image to get one embedded slide picture. Choose a topic OR an assignment/news attachment.

NameRequiredDescriptionDefault
pageYesOne-based slide or PDF page.
imageNoOptional embedded PowerPoint picture number from the slide metadata.
fileIdNoFileId from that parent’s attachment list.
topicIdNoNumeric itemId of a visible file topic.
courseIdYesBrightspace course/org unit ID
folderIdNoParent assignment folder ID.
newsItemIdNoParent announcement ID.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real value by stating the return is an MCP image rather than text and by explaining that `image` selects one embedded slide picture. It doesn't say what happens when the item is not a PDF or PowerPoint, or what errors occur for invalid page numbers.

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

Conciseness4/5

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

Three short sentences, front-loaded with the return behavior and with no filler. Minor ambiguity remains because "Optionally supply image" doesn't spell out that the parameter applies only to slides.

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

Completeness3/5

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

There is no output schema, and the tool has 7 parameters with multiple mutually exclusive ID sets, so the description should carry more weight. It covers the core read behavior and the selection rule but omits how to obtain the IDs, the supported file types, and error behavior.

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 baseline is 3, and the description earns extra credit by stating the topic-vs-attachment selection rule, which the schema does not encode (there is no oneOf, and additionalProperties is false). The rule remains vague about which IDs pair with which path, keeping it below a 5.

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 and resource: it returns a rendered PDF page or PowerPoint slide as an MCP image, and the optional `image` parameter targets one embedded picture. It implicitly distinguishes itself from text-oriented siblings such as brightspace_read_topic and brightspace_read_attachment, but it never names them, so the differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

"Choose a topic OR an assignment/news attachment" signals mutual exclusivity between input paths, which is useful guidance. However, it doesn't say which parameters realize each path (topicId vs. fileId plus folderId or newsItemId), and it doesn't say when to use this instead of brightspace_read_topic or brightspace_read_attachment.

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. 18 tool updatesv0.1.0
    • First observedbrightspace_check_updates
    • First observedbrightspace_get_announcements
    • First observedbrightspace_get_assignment_rubrics
    • First observedbrightspace_get_assignments
    • First observedbrightspace_get_calendar
    • First observedbrightspace_get_content
    • First observedbrightspace_get_deadlines
    • First observedbrightspace_get_grades
    • First observedbrightspace_get_quizzes
    • First observedbrightspace_list_courses
    • First observedbrightspace_list_notes
    • First observedbrightspace_read_attachment
    • First observedbrightspace_read_note
    • First observedbrightspace_read_topic
    • First observedbrightspace_search_course
    • First observedbrightspace_search_notes
    • First observedbrightspace_status
    • First observedbrightspace_view_page

TDQS

A3.5/5.0

Scored across 18 tools

Disambiguation4/5

Most tools target a clearly distinct resource (grades, quizzes, calendar, rubrics, announcements), and descriptions do real work separating near-neighbors like get_deadlines (aggregator) from the individual getters. The only soft spots are the three file readers (read_topic vs read_attachment vs view_page) and the three local-note tools (list/search/read), which an agent could confuse without reading carefully.

Naming Consistency4/5

Strong, uniform `brightspace_` prefix with a consistent verb_noun shape: list_*, get_*, read_*, search_*, check_*. The lone deviation is the bare noun `brightspace_status`, and the verb set is wider (list/get/read/view/search/check) than a pure CRUD scheme, but overall very readable and predictable.

Tool Count4/5

18 tools is at the upper end but each maps to a real Brightspace surface (courses, assignments, rubrics, content, calendar, deadlines, notes). The local-snapshot trio and the file-reading trio are somewhat granular, pushing the set slightly into the heavy range, but nothing looks like filler.

Completeness4/5

The read-only surface is broad: enrollments, assignments with rubrics and submission receipts, announcements, grades, quizzes, nested content, calendar, aggregated deadlines, search, update diffing, and offline note snapshots. Obvious absences are any write path (submitting assignments, marking complete) and discussions/messages, so it is a solid reader but not a full lifecycle surface.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables AI clients to read a student's own UGent Ufora (D2L Brightspace) data, including courses, announcements, deadlines, grades, course materials, and PDF text, over stdio or local Streamable HTTP. All operations are read-only and run locally against the student's authenticated session.
    19
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides local, read-only access to Memorial University's Brightspace D2L courses, enabling students to view content, grades, assignments, quizzes, announcements, and deadlines through natural language.
    Apache 2.0
  • A
    license
    B
    quality
    C
    maintenance
    Enables natural-language, read-only access to a user's own learning-management account for courses, assignments and deadlines, lecture attendance, notices, grades, and syllabus evidence, including reading page/slide/cell locations inside PDF, Office, HWP/HWPX, HTML, and ZIP attachments. Runs locally over stdio or remotely over OAuth-protected Streamable HTTP for desktop and mobile clients, and can compare changes against a locally encrypted baseline.
    19
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    Provides read-only access to Indus LMS academic data, letting agents browse courses, announcements, assignments, shared resources, notifications, attendance records, and school email inboxes. It exposes these capabilities as MCP tools over stdio, with no login, mark-read, or submission operations.
    22
    23 PyPI
    GPL 3.0