blackboard-mcp
This server provides read-only access to a student's Blackboard (Syracuse University) data, letting an AI assistant retrieve courses, assignments, grades, content, announcements, files, and activity summaries.
List currently visible Blackboard courses (returns course IDs needed by other tools).
Get course content: folders, documents, files, assignments, tests, and links; optionally drill into a folder.
Get course announcements, optionally filtered by a date.
Get assignments and assessments across all courses or a specific course, with due-date filtering and optional submission/grading status.
Get the student's own grades for a course: scores, points possible, percentages, feedback, and visibility.
Download course attachments (PDFs, DOCX, PPTX, images, etc.) to local disk and return the local path; includes text excerpts for small text files.
Get upcoming work across all courses, sorted by due date, with a configurable look-ahead window.
Get recent updates across all courses since a given time (announcements, new/changed content, changed assignments, newly posted grades).
Get a full assignment context package: instructions, due date, points, rubric, attachments with local paths, the student's grade/status, and related announcements.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@blackboard-mcpWhat do I have due this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.

What you need
A Mac, or a Windows 10 / 11 PC
Node.js version 20 or newer (get the LTS installer)
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 setupWindows (PowerShell)
mkdir ~\Documents\GitHub -Force
cd ~\Documents\GitHub
git clone https://github.com/alanwtom/blackboard-mcp.git
cd blackboard-mcp
npm run setupThe 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:
Checks you have everything (Node.js, Chrome, the project build)
Connects Claude Desktop (and Claude Code) for you, with your permission
Checks your Blackboard session and opens a Chrome window to log in if needed
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 |
A question fails | Run |
"browser profile is already in use" | Something else already has the session open. Close the other terminal, and quit your AI app, before running |
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 |
Windows: | 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: |
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-mcpfolder in your home folder (~/.blackboard-mcpon a Mac,C:\Users\yourname\.blackboard-mcpon 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)
Build the project
npm install
npm run buildLog in to Blackboard
npm run loginA 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.
Check that it worked
npm run coursesConnect 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.jsFor 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.eduandblackboard.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 onC:\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 withparentId; file data oncontentHandler.file), course announcements,calendars/items, and the v2 gradebook (columns,columns/{id}/users/me; due dates atgrading.due, points atscore.possible). Paging caps at 100. Attachment downloads follow the item'srel=alternate/ultra/redirectlink.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 answerPERMISSION_DENIEDare 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, andBLACKBOARD_HOSTSinsrc/blackboard/hosts.tsfor other institutions.Development:
npm run typecheck,npm test(100 tests, fully mocked),npm run build,npm start, andnpm 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.cmdshims). 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.pdfwould otherwise land in an NTFS alternate data stream on a file namedWeek 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_BUSYalongside the POSIXSingletonLockmessage.wherelists the extensionless npm shim ahead of the runnable.cmd, so PATH lookups prefer a PATHEXT match, and.cmdshims are spawned throughcmd.exewith 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 toolsget_announcementsGet Blackboard course announcementsARead-only
List announcements for one Blackboard course, newest first. Optionally filter to items created or modified after a date. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO date (e.g. "2026-08-01") — only announcements created/modified on or after this instant. | |
| course_id | Yes | Blackboard course id from list_courses, e.g. "_26184_1" (course code also accepted). |
TDQS
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.
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.
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.
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.
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.
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 contextARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | Required only when assignment_id is a bare content id. | |
| assignment_id | Yes | Assignment reference "ref" from get_assignments (format "<course_id>:<content_id>"), or a bare Blackboard content id. |
TDQS
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.
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.
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.
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.
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.
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 assignmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | Blackboard course id from list_courses. Omit to include all courses. | |
| due_after | No | ISO date — only items due on/after this instant. | |
| due_before | No | ISO date — only items due on/before this instant. | |
| include_status | No | Also resolve submitted/graded status (slower: one extra Blackboard request per item). |
TDQS
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.
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.
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.
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.
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.
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 attachmentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | No | Specific file id when a content item has several attachments (see available_files in the result). | |
| course_id | Yes | Blackboard course id from list_courses, e.g. "_26184_1" (course code also accepted). | |
| content_id | Yes | Blackboard content id from get_course_content or get_assignments, e.g. "_3001_1". |
TDQS
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.
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.
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.
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.
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.
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 contentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Blackboard course id from list_courses, e.g. "_26184_1" (course code also accepted). | |
| folder_id | No | Content id of a folder to list instead of the course root. |
TDQS
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.
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.
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.
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.
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.
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 gradesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Blackboard course id from list_courses, e.g. "_26184_1" (course code also accepted). |
TDQS
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.
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.
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.
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.
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.
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 updatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO date (e.g. "2026-08-21"). Defaults to 7 days ago. |
TDQS
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.
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.
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.
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.
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.
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 workARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days ahead to look (default 7). |
TDQS
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.
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.
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.
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.
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.
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 coursesARead-only
List the student’s currently visible Blackboard (Syracuse University) courses. Returns course ids needed by every other blackboard tool. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v0.1.0- First observed
get_announcements - First observed
get_assignment_context - First observed
get_assignments - First observed
get_attachment - First observed
get_course_content - First observed
get_grades - First observed
get_recent_updates - First observed
get_upcoming_work - First observed
list_courses
TDQS
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
Your personal data for AI — Telegram, bank, courses, Zoom & more, scoped to you.
Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.
- OpenOakOAuthorg.openoak
Secure AI access to OpenOak tasks, notes, and Kanban boards.
- OsboonOAuthcom.osboon
Read-only AI access to Osboon business card analytics, viewers, links, connections and contacts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access Canvas LMS course content, including assignments, modules, announcements, and files, to help students manage their coursework.3 npmISC
- AlicenseAqualityAmaintenanceEnables students to ask an AI assistant about their Canvas LMS data, including assignments, grades, missing submissions, discussions, and upcoming items, while keeping access read-only and private.43MIT
- AlicenseBqualityBmaintenanceEnables AI assistants to access IE Connects community and Blackboard coursework through guided local sign-in, with tools for classes, events, deadlines, grades, and more.34MIT
- FlicenseBqualityBmaintenanceEnables local, read-only access to IE Blackboard, IE Connects, and IE Careers within AI assistants, with 49 tools for deadlines, readings, events, grades, internships, and more.49-