Skip to main content
Glama

Blackboard MCP

Ask an AI assistant about your own Blackboard and get real answers: what's due, what your grades are, what your professors posted, and the files for any assignment. It works with your own logged-in Blackboard session, so it can only see what you can already see. It is read-only: it can never submit, post, message, or change anything.

Setup takes about ten minutes and you only do it once. If you have never used a terminal, just copy and paste each command exactly as written.

Asking about course readings and getting a summary pulled straight from Blackboard

What you need

  1. A Mac, or a Windows 10 / 11 PC

  2. Google Chrome

  3. Node.js version 20 or newer (get the LTS installer)

  4. An AI app that supports MCP, such as Claude Desktop which is free for all Syracuse Students!

Opening a terminal. On a Mac, press Cmd + Space, type "Terminal", press Enter. On Windows, press the Windows key, type "PowerShell", press Enter.

Not sure if you have Node.js? Type node -v and press Enter. If you see v20 or higher you are set.

Related MCP server: canvas-scholar-mcp

Setup (do once)

Run these commands, one at a time.

macOS

mkdir -p ~/Documents/GitHub
cd ~/Documents/GitHub
git clone https://github.com/alanwtom/blackboard-mcp.git
cd blackboard-mcp
npm run setup

Windows (PowerShell)

mkdir ~\Documents\GitHub -Force
cd ~\Documents\GitHub
git clone https://github.com/alanwtom/blackboard-mcp.git
cd blackboard-mcp
npm run setup

The first line creates the folder if you do not already have one. Do not skip it: if that folder is missing, the cd fails, and the next command quietly downloads the project into your home folder instead — everything still works, but none of the paths further down this page will match what you have.

(npm run setup shows scrolling text for a minute or two while it downloads what it needs; that is normal. If your Mac says git is not installed, agree to install it, then run the commands again. On Windows, install Git for Windows first if git is not recognized, then open a new PowerShell window.)

npm run setup is a friendly wizard that:

  1. Checks you have everything (Node.js, Chrome, the project build)

  2. Connects Claude Desktop (and Claude Code) for you, with your permission

  3. Checks your Blackboard session and opens a Chrome window to log in if needed

  4. Confirms everything works

For the login step, use the Chrome window with the red banner (not your usual Chrome browser). Sign in with your NetID and approve Duo exactly like usual. Your password and Duo codes are never seen or saved by this project: that part is always you typing in a real browser.

When the wizard says everything is ready, quit and reopen your AI app, and you are done. Prefer doing these steps by hand? The manual way is described at the bottom of this page.

Use it

Talk to your AI like a person:

  • "What's due in the next 7 days?"

  • "Any new announcements this week?"

  • "What are my grades in Calculus?"

  • "Pull up the Essay assignment: instructions and attached files."

  • "Download the lecture slides from Week 3."

The first question takes a few seconds, because it has to start a browser and re-check your session; after that it is quicker still. Downloaded files are saved in ~/.blackboard-mcp/downloads on a Mac, or C:\Users\yourname\.blackboard-mcp\downloads on Windows.

If something goes wrong

What you see

What to do

"Blackboard session expired"

Run npm run login and sign in again. This is normal after a while.

A question fails

Run npm run status, then try again. Blackboard has brief hiccups sometimes.

"browser profile is already in use"

Something else already has the session open. Close the other terminal, and quit your AI app, before running npm run login.

Login window confusion

Type your NetID in the window with the red banner. It is a separate private browser, not your usual Chrome.

AI shows no Blackboard tools

Quit the AI app completely and reopen it. On Windows, closing the window is not enough: right-click the icon in the system tray and choose Quit. Then re-check the path in the manual steps.

A course looks empty

Archived courses are locked by the university. New courses may have nothing posted yet.

macOS: still no tools after restarting

Claude Desktop is launched by Finder, which does not always know where node lives — most often when Node came from nvm or Homebrew rather than the installer from nodejs.org. Run which node, then put that full path in place of "node" in the config block in the manual steps below.

Windows: npm is not recognized

Close PowerShell, open it again, and retry. The Node.js installer only reaches new windows.

Windows: "running scripts is disabled"

Windows is blocking npm's launcher. Open PowerShell as Administrator once and run: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

Safety and privacy

  • Read-only by design: this project contains no code that could submit work, post messages, or change anything.

  • It only sees what you can see, because it uses your own session.

  • Your password and Duo codes are never requested, read, or stored.

  • Everything stays on your own computer. To erase it all, run npm run logout, or delete the .blackboard-mcp folder in your home folder (~/.blackboard-mcp on a Mac, C:\Users\yourname\.blackboard-mcp on Windows). Never share that folder; it keeps you signed in.

Being a good citizen

Use it for yourself at a human pace, and check your university's acceptable-use policy before using any automation with your student account. Not affiliated with or endorsed by Syracuse University or Anthology/Blackboard.

Manual setup (if you prefer doing it by hand)

  1. Build the project

npm install
npm run build
  1. Log in to Blackboard

npm run login

A Chrome window opens with a red banner. Sign in with your NetID and approve Duo there. When you land back on Blackboard, the window closes by itself.

  1. Check that it worked

npm run courses
  1. Connect your AI app

For Claude Desktop: open Settings, then Developer, then Edit Config, and add this block inside the outer braces.

On macOS the config lives at ~/Library/Application Support/Claude/claude_desktop_config.json:

"mcpServers": {
  "blackboard": {
    "command": "node",
    "args": ["/Users/yourname/Documents/GitHub/blackboard-mcp/dist/index.js"]
  }
}

On Windows it lives at %APPDATA%\Claude\claude_desktop_config.json:

"mcpServers": {
  "blackboard": {
    "command": "C:\\Program Files\\nodejs\\node.exe",
    "args": ["C:\\Users\\yourname\\Documents\\GitHub\\blackboard-mcp\\dist\\index.js"]
  }
}

Two Windows details matter: every backslash has to be doubled (that is how JSON works; a single backslash makes the file invalid), and giving the full path to node.exe avoids the common case where an app launched from the Start menu cannot find node by itself. To print the two paths you need, run this from the project folder:

(Get-Command node).Source; "$PWD\dist\index.js"

On macOS, to print both paths, run this from the project folder:

which node; echo "$PWD/dist/index.js"

If Claude Desktop shows no tools even after a full restart, put the which node output in place of "node" above: an app opened from Finder does not always inherit the PATH your Terminal has, which is most likely when Node came from nvm or Homebrew.

Save the file, quit Claude Desktop completely (Cmd + Q on a Mac; on Windows right-click the tray icon and choose Quit), and reopen it.

For Claude Code on macOS, run:

claude mcp add blackboard -- node /path/to/blackboard-mcp/dist/index.js

For Claude Code on Windows, run this from the project folder:

claude mcp add blackboard -- "$((Get-Command node).Source)" "$PWD\dist\index.js"

For the technically curious

  • Stack: TypeScript (ESM), Node 20+, Playwright (Chrome channel, dedicated profile), MCP TypeScript SDK over stdio, Zod, Vitest.

  • Data access: Blackboard Learn REST API, called as same-origin requests from a page on the Blackboard host, so requests match what the Ultra web app itself sends. Both blackboard.syr.edu and blackboard.syracuse.edu (separate cookie domains) are supported.

  • Session resilience: Learn's session cookie does not survive a browser restart, so the authenticated cookie set is snapshotted to ~/.blackboard-mcp/browser-state.json (mode 0600 where the OS honours POSIX modes; on Windows the per-user ACL on C:\Users\<name> does that job) and restored on launch. While the institution SSO session lasts, the SAML entry is followed silently to re-authenticate with no interaction.

  • Endpoints (verified against Syracuse, Aug 2026): users/me, users/{id}/courses?expand=course, course contents (flat listings with parentId; file data on contentHandler.file), course announcements, calendars/items, and the v2 gradebook (columns, columns/{id}/users/me; due dates at grading.due, points at score.possible). Paging caps at 100. Attachment downloads follow the item's rel=alternate /ultra/redirect link.

  • Tools: list_courses, get_course_content, get_announcements, get_assignments, get_grades, get_attachment, get_upcoming_work, get_recent_updates, get_assignment_context. All read-only. Errors are short coded messages with sensitive values masked.

  • Low volume: TTL caching, a 200 ms delay between pages of the same listing, hard request caps, and the shared browser closes after 5 idle minutes. Independent work (one course versus another, one gradebook column versus another) runs at most four requests deep via mapWithConcurrency, so the request count is unchanged — they are simply no longer queued behind each other. Courses that answer PERMISSION_DENIED are remembered for 15 minutes, which removes them from later sweeps entirely: past-term enrolments are reported as available and only refuse when their contents are asked for, and Blackboard publishes no end date to tell them apart beforehand.

  • Configuration: BB_BROWSER_CHANNEL, BB_HEADLESS=0, BLACKBOARD_MCP_HOME, BB_BASE_URL, BB_SSO_ENTRY_URL, and BLACKBOARD_HOSTS in src/blackboard/hosts.ts for other institutions.

  • Development: npm run typecheck, npm test (100 tests, fully mocked), npm run build, npm start, and npm run discover (records real Blackboard traffic while you browse, to verify endpoints).

  • Platforms: macOS and Windows 10/11 are both supported; Linux should work but is untested. Everything OS-specific lives in src/platform.ts (Chrome and Claude Desktop locations, PATH lookup, spawning .cmd shims). Three Windows behaviours the code handles explicitly:

    • Downloaded file names are sanitized to Windows rules on every platform. A Blackboard file called Week 3: Notes.pdf would otherwise land in an NTFS alternate data stream on a file named Week 3 — reported as a successful download the student can never open.

    • A locked browser profile announces itself differently: Windows Chrome exits with code 21 and Playwright only sees the control pipe close, so that signature maps to BROWSER_PROFILE_BUSY alongside the POSIX SingletonLock message.

    • where lists the extensionless npm shim ahead of the runnable .cmd, so PATH lookups prefer a PATHEXT match, and .cmd shims are spawned through cmd.exe with quoted arguments (project paths often contain spaces).

  • Compatibility: built for Syracuse University Blackboard Ultra, Aug 2026. Other schools need the configuration above plus small parser checks.

License

MIT. Made for students, by a student.

Available Tools

9 tools
get_announcementsGet Blackboard course announcementsA
Read-only

List announcements for one Blackboard course, newest first. Optionally filter to items created or modified after a date. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoISO date (e.g. "2026-08-01") — only announcements created/modified on or after this instant.
course_idYesBlackboard course id from list_courses, e.g. "_26184_1" (course code also accepted).

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description adds the 'newest first' ordering and the created-or-modified filter semantics. It does not mention pagination, limits, or return format, so it adds context but not a rich behavioral profile.

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-load the action and scope, then state the optional filter and read-only nature. There is no fluff or repetition; every clause 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 list, the description plus fully documented schema provide enough to select and invoke the tool correctly. Sorting and filtering behavior are stated; return shape is not, but 'list announcements' makes the expected output reasonably inferable.

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 both parameters already well documented via examples and accepted formats. The description adds no additional parameter meaning beyond what is already in the schema, so it stays at the baseline of 3.

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 ('List'), resource ('announcements for one Blackboard course'), and ordering ('newest first'). This clearly distinguishes the tool from siblings like get_recent_updates and list_courses by resource type and scope.

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 gives useful scope context ('one Blackboard course') and the optional 'since' filter, but it does not explicitly say when to choose this tool over siblings like get_recent_updates, nor does it name alternatives or exclusions. Usage is implied rather than spelled out.

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

get_assignment_contextGet full assignment contextA
Read-only

One package describing a Blackboard assignment: instructions, due date, points, rubric (when available), attachments with local file paths, the student’s grade/status for it, and related course announcements. Use this instead of many low-level calls. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNoRequired only when assignment_id is a bare content id.
assignment_idYesAssignment reference "ref" from get_assignments (format "<course_id>:<content_id>"), or a bare Blackboard content id.

TDQS

A4/5.0
Behavior3/5

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

The description repeats 'Read-only', which is already declared in annotations, and adds a few useful behaviors: attachments return local file paths (not files) and rubric inclusion is conditional ('when available'). However, it does not disclose other behavioral aspects like performance cost or external dependencies, and openWorldHint remains unexplained. The added value beyond annotations is modest.

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 first sentence front-loads the full scope of returned data; the second provides immediate usage guidance. Every word contributes value, and the description is appropriately sized for a read-only aggregate tool.

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

Completeness4/5

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

Given no output schema, the description adequately enumerates the return contents, covering all major elements an agent would need to expect. It does not mention error conditions or edge cases, but for a read-only package tool, this is near-complete. The parameters are fully covered by the schema, so the description alone is sufficient to call the tool 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 coverage is 100%, and the schema already documents both parameters, including nuances like course_id being required only for bare content ids. The description adds no additional meaning to the parameters, so scoring at the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool returns a unified package of assignment data, enumerating specific elements: instructions, due date, points, rubric, attachments with local paths, grade/status, and announcements. It distinguishes itself from low-level calls by framing it as an aggregate, making its purpose unmistakable.

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

Usage Guidelines4/5

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

Explicitly instructs to 'use this instead of many low-level calls', providing clear guidance on when to prefer this tool over alternatives. However, it does not specify scenarios where a low-level tool (e.g., get_grades for just a grade) would be more appropriate, so it lacks exclusion conditions.

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

get_assignmentsGet Blackboard assignmentsA
Read-only

List assignments and assessments with due dates, combined and deduplicated from Blackboard course content, the gradebook, and the calendar. Optionally scope to one course and/or a due-date window. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNoBlackboard course id from list_courses. Omit to include all courses.
due_afterNoISO date — only items due on/after this instant.
due_beforeNoISO date — only items due on/before this instant.
include_statusNoAlso resolve submitted/graded status (slower: one extra Blackboard request per item).

TDQS

A4/5.0
Behavior4/5

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

The description adds behavior beyond the readOnlyHint annotation: results are combined and deduplicated from course content, the gradebook, and the calendar. It also explicitly restates the read-only nature. It does not cover pagination or rate limits, but with readOnlyHint=true the safety profile is already established.

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 fluff. The core behavior and data sources are front-loaded, and the optional scoping is stated compactly. 'Read-only.' is redundant with the annotation but harmless.

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 list tool with fully documented optional parameters and no required arguments, the description is mostly complete: it names the resource, the sources, deduplication, and optional filters. A small gap is the absence of any return-shape hint or ordering behavior, but this is not critical given the tool's simple listing purpose.

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 all four parameters. The description adds a helpful grouping ('scope to one course and/or a due-date window') but does not deepen the meaning of include_status or the ISO date format beyond what the schema provides. This meets the baseline for fully documented schemas.

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 ('List') and resource ('assignments and assessments with due dates'), and adds how it behaves: combined and deduplicated across three Blackboard sources. This clearly distinguishes it from siblings like get_grades, get_course_content, and 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 Guidelines3/5

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

The description implies the tool is the unified assignment-list entry point and mentions optional course/date scoping, but it does not explicitly say when to prefer get_assignments over similar siblings like get_upcoming_work or get_assignment_context. The usage context is clear but exclusions and alternatives are not stated.

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

get_attachmentGet Blackboard course attachmentA
Read-only

Download a course file (PDF, DOCX, PPTX, images, ...) from Blackboard to this machine and return its local path. Files are saved under ~/.blackboard-mcp/downloads only when you call this tool; nothing is sent anywhere. Small text files also include a text excerpt. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idNoSpecific file id when a content item has several attachments (see available_files in the result).
course_idYesBlackboard course id from list_courses, e.g. "_26184_1" (course code also accepted).
content_idYesBlackboard content id from get_course_content or get_assignments, e.g. "_3001_1".

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses where files are saved (~/.blackboard-mcp/downloads), emphasizes that nothing is sent anywhere, and notes that small text files include a text excerpt. It also states the side effect happens only when this tool is called. This is strong behavioral transparency for a download tool.

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

Conciseness5/5

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

The description is three sentences with no filler. The main action and return value are front-loaded, followed by useful side-effect and privacy details. The final 'Read-only.' is redundant with the annotation but does not harm clarity.

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 correctly explains the primary return value (local path) and the exception for small text files (text excerpt). It also covers the download location and privacy behavior. It does not describe error cases or exact output structure, but this is sufficient for an agent to select and invoke the tool 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 documents each parameter with source and example. The tool description adds little parameter-specific meaning beyond the return behavior. Baseline 3 is appropriate when the schema carries the parameter documentation burden.

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 ('Download'), a specific resource ('a course file from Blackboard'), and the key outcome ('return its local path'). This clearly distinguishes it from sibling tools that list courses or content but do not download files.

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 and schema provide clear context for when to use this tool: after obtaining course_id from list_courses and content_id from get_course_content or get_assignments. It explains the optional file_id for multi-attachment content items. It does not explicitly say when not to use it, but the file-download purpose is distinct enough among siblings.

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

get_course_contentGet Blackboard course contentA
Read-only

List a course’s content items (folders, documents, files, assignments, tests, links) from Blackboard. Hierarchy is expanded a couple of folder levels; pass folder_id to go deeper into one folder. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYesBlackboard course id from list_courses, e.g. "_26184_1" (course code also accepted).
folder_idNoContent id of a folder to list instead of the course root.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description reinforces the read-only nature. It adds meaningful behavioral detail beyond annotations by disclosing that hierarchy is only expanded 'a couple of folder levels' and that folder_id allows deeper navigation. It does not mention pagination or result size limits, but with annotations covering the safety profile this is sufficient.

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 concise sentences with no filler. It front-loads the primary purpose, then adds the key behavior and a read-only note. 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 is complete enough for correct invocation: it identifies the required course_id, the optional folder_id, the expected content types, and the hierarchy expansion behavior. With no output schema, it could have briefly described the returned item shape, but the openWorldHint and the tool's name cover enough ground.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both course_id and folder_id clearly. The description adds the phrase 'go deeper into one folder' for folder_id, which slightly clarifies its purpose, but this is largely redundant with the schema's 'list instead of the course root.' The baseline of 3 is appropriate.

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

Purpose5/5

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

The description begins with a specific verb and object: 'List a course’s content items' and enumerates the item types (folders, documents, files, assignments, tests, links). This makes the tool's purpose immediately clear and helps distinguish it from sibling tools like get_grades 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 context for when to use this tool: to browse a course's content hierarchy. It also explains how to navigate deeper with folder_id. It does not explicitly mention exclusions or alternatives such as 'for assignment details, use get_assignments,' so it falls short of a 5.

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

get_gradesGet Blackboard gradesA
Read-only

List the student’s own grades for one Blackboard course: assignment, score, points possible, percentage, feedback, and grading status. Only grades visible to the signed-in student are returned. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYesBlackboard course id from list_courses, e.g. "_26184_1" (course code also accepted).

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already declare readOnlyHint and openWorldHint, and the description adds meaningful behavioral context: results are scoped to grades visible to the signed-in student and include feedback and grading status. This goes beyond the annotation by clarifying the visibility/auth boundary, though it omits details like pagination or possible empty results.

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 core purpose and returned fields are front-loaded, and the visibility note is placed second. Every clause 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 simple read-only tool with one parameter and no output schema, the description adequately covers what the agent needs to know: what is returned, whose grades, and the visibility constraint. No critical information is missing for correct invocation.

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

Parameters3/5

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

The schema provides 100% coverage for course_id, including format and an example. The description adds only minor context by framing the course as the grade source, so it meets the baseline but does not significantly enrich parameter understanding.

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

Purpose5/5

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

The description names a specific verb ('List'), a specific resource ('the student's own grades for one Blackboard course'), and enumerates the returned fields. This clearly distinguishes it from siblings like get_assignments or get_course_content, which cover different course data.

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 makes it clear the tool is for retrieving a single student's own grades for a specific course, which implies when to use it. It does not explicitly name alternatives or state when not to use it, but the context is strong enough for an agent to select it appropriately.

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

get_recent_updatesGet recent Blackboard updatesA
Read-only

Recent Blackboard activity across all courses since a point in time (default: last 7 days): announcements, new/changed content items, changed assignments, and newly posted grades. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoISO date (e.g. "2026-08-21"). Defaults to 7 days ago.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only.' It adds the default time window (last 7 days) and the exact activity types covered, which is useful context beyond the structured data. No contradictions with annotations.

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 front-load the primary scope ('Recent Blackboard activity across all courses') and immediately enumerate content types, ending with a short read-only note. Every word earns its place with no redundancy.

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

Completeness4/5

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

The description fully covers what the tool returns (activity types), the default behavior, and the safety profile. It omits response structure (e.g., grouping, ordering) and doesn't discuss pagination, but with a single optional parameter and no output schema, this is largely sufficient for an agent to call 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?

The schema covers the single 'since' parameter fully (ISO date, default), and the description repeats the default. With 100% schema coverage, the description adds no additional parameter semantics beyond what the schema already provides, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource ('Get recent...') and defines the scope precisely: activity across all courses since a time point, enumerating the four types of updates included. This clearly distinguishes it from sibling tools like get_announcements or get_grades, which focus on single types.

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 a broad-overview use case (recent activity across all courses) but does not explicitly contrast with sibling tools or state when to prefer this over specialized ones. No exclusion or alternative routing is provided, leaving the agent to infer.

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

get_upcoming_workGet upcoming Blackboard workA
Read-only

Upcoming assignments and assessments across ALL Blackboard courses, sorted by due date. This is the one call to answer “what do I have due?”. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoHow many days ahead to look (default 7).

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the added 'Read-only' is redundant rather than informative. The description does add useful behavioral context: results are cross-course, limited to upcoming items, and sorted by due date. It stops short of describing pagination, response format, or whether assignment details are included.

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 scope and ordering, then a purpose statement. The only redundancy is 'Read-only', which duplicates annotations, but the overall length is appropriate and 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 simple read-only tool with one optional parameter, the description fully conveys the resource, the scope, the ordering, and the intended use case. The schema covers the parameter, and annotations cover safety. Nothing critical is missing.

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

Parameters3/5

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

The sole parameter is fully documented in the schema with type, bounds, description, and default behavior. The description adds no extra meaning around 'days', but with 100% schema coverage the parameter semantics are already sufficient.

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 names a specific action (get) on a specific resource (upcoming assignments and assessments), narrows scope to ALL Blackboard courses, and adds organization by due date. It clearly answers what the tool does and is easily distinguishable from siblings like list_courses or get_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?

It explicitly frames this as the one call for 'what do I have due?', giving clear context for when to use it. However, it doesn't name alternatives or state when NOT to use it, such as when results for a single course are needed.

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

list_coursesList Blackboard coursesA
Read-only

List the student’s currently visible Blackboard (Syracuse University) courses. Returns course ids needed by every other blackboard tool. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the 'Read-only' sentence adds little beyond the annotation. The description does add value by specifying that only 'currently visible' courses are returned, and that the output consists of course ids used by other tools. This goes beyond the structured annotations, though it does not clarify open-world semantics explicitly.

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 the primary action and scope front-loaded, followed by purpose and read-only status. Every sentence earns its place with no redundant or filler wording.

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 list tool, the description is complete: it names the resource, institutional context, output type (course ids), and why that output matters. The absence of an output schema is mitigated by the explicit statement that it returns course ids. Minor ambiguity around 'currently visible' is acceptable given the tool's simplicity.

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 has no properties, so the baseline is 4. The description does not need to explain parameter meanings because there are none; it appropriately focuses on output and purpose instead.

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 ('List'), resource ('courses'), and scope ('student’s currently visible Blackboard (Syracuse University)'). It also says the output is course ids needed by every other blackboard tool, which distinguishes it as the foundational listing tool among the get_* siblings.

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 clearly implies usage context: call this first to obtain course ids needed by other tools. However, it does not explicitly name sibling alternatives or state when not to use it, so it falls just short of a 5.

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

Tool Schema Changelog

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

  1. 9 tool updatesv0.1.0
    • First observedget_announcements
    • First observedget_assignment_context
    • First observedget_assignments
    • First observedget_attachment
    • First observedget_course_content
    • First observedget_grades
    • First observedget_recent_updates
    • First observedget_upcoming_work
    • First observedlist_courses

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

Each tool has a clear target resource or aggregate view, and the descriptions explicitly separate broad queries like get_recent_updates and get_upcoming_work from per-course listers. There is minor overlap between get_assignments, get_upcoming_work, and get_assignment_context, but the descriptions resolve the intended use cases well.

Naming Consistency5/5

Tool names uniformly follow a snake_case verb_noun pattern using get_ or list_ for read-only operations. The one list_courses versus get_* variation is not confusing because both verbs signal retrieval and the resource nouns are consistent.

Tool Count5/5

Nine tools is a well-scoped size for a Blackboard student read-only server. Each tool covers a meaningful piece of the domain without redundancy or unnecessary bloat.

Completeness5/5

The toolset covers the full read-only student workflow: courses, content, announcements, assignments, grades, attachments, recent activity, and upcoming work. No obvious missing read operations are apparent for the stated purpose, and the lack of write tools appears intentional.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers