Skip to main content
Glama

Blackboard for Claude

Ask Claude about your own Blackboard and get real answers: what's due, your grades, what your professors posted, and what's inside the files and links they share (PDFs, slides, Google Docs and Sheets, Colab notebooks, SU videos, and more).

It only sees what you can already see, and it can never submit, post, or change anything.

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

Install (about 5 minutes, one time)

Works on a Mac or a Windows PC. Four steps:

  1. Get Claude Desktop. Download it from claude.ai/download, install it, open it, and sign in. (It's free for Syracuse students.)

  2. Download this file: blackboard-mcp.mcpb It goes into your Downloads folder.

  3. Open your Downloads folder and double-click blackboard-mcp.mcpb. Claude opens a screen called Blackboard (Syracuse).

  4. Click the black Install button. You will see a red box saying the extension "has not been verified by Anthropic" and can access your computer. That is normal for any tool not made by Anthropic itself; this one is a student project. It only reads your Blackboard and the links your professors post, and it never submits or changes anything.

That's it. The tool also needs Google Chrome or Microsoft Edge on your computer. Windows already has Edge, and most Macs already have Chrome. If yours doesn't, Claude will tell you and link you to the free Chrome download.

Double-click didn't open Claude? In Claude, open Settings, click Extensions, and drag blackboard-mcp.mcpb from your Downloads folder into that window.

Related MCP server: canvas-scholar-mcp

The first time you use it

  1. In Claude, ask: "What do I have due this week?"

  2. A new browser window opens with a red banner across the top. It may open behind Claude: if you don't see it, look for a new browser icon in your Dock (Mac) or taskbar (Windows) and click it.

  3. Sign in there with your NetID and approve Duo, like you always do. The window closes by itself when you're done.

  4. Ask your question again.

You're done. You only sign in again when Blackboard logs you out, and when that happens the same red-banner window pops up by itself.

Your password and Duo codes go only into that browser window. Claude never sees them, and this tool never saves them.

Things you can ask

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

  • "Anything new in my classes this week?"

  • "What are my grades in Oceanography?"

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

  • "Summarize the Week 3 lecture slides."

  • "What's in the Google Sheet my professor linked in the last announcement?"

  • "Read the Colab notebook for Lab 0 and explain the first exercise."

Some links need you to be signed in to that site (for example a private Google file or a Zoom recording). When that happens, a red-banner window opens on the link. Sign in there, close that tab, and ask again.

What it can't see

If an answer is missing something, Claude will tell you in that answer, and tell you what to do instead. The known gaps:

  • Discussion boards, course messages, quiz and test questions, journals, groups, attendance. Not read at all. Open Blackboard for these.

  • Outside tools launched from Blackboard (McGraw Hill Connect, Gradescope, and similar). Their work and deadlines live in that tool, not in Blackboard.

  • Deadlines that exist only in class or in a syllabus file. "What's due" only knows what is posted in Blackboard. Ask it to read the syllabus file if you want those too.

  • YouTube transcripts. YouTube refuses to give transcripts to automated tools, so you get the video's title, channel, length and description. To get the transcript yourself: open the video, click "...more" under it, click "Show transcript", and paste it into the chat.

  • Live Zoom meetings. A class or office-hours link is recognised but never opened.

  • Some grades. Only grades your instructor has released are visible. "What's new" can miss a grade entered on an older assignment; ask for a course's grades to be sure.

  • Google sign-in may be refused. Google sometimes blocks sign-in from automated browser windows. If that happens, ask the professor to share the file as "anyone with the link".

  • Links from outside your courses. It only opens links a professor posted in one of your courses (see Safety below).

If something goes wrong

What you see

What to do

Claude doesn't seem to know about Blackboard

Quit Claude completely and open it again (Mac: Cmd + Q. Windows: right-click the Claude icon near the clock and choose Quit). Then check Settings → Extensions shows Blackboard turned on.

"Sign in in the window with the red banner"

Find that window (it may be behind Claude), sign in with your NetID and Duo, and ask again.

"This computer has neither Google Chrome nor Microsoft Edge"

Install Google Chrome (free), then ask again.

"Blackboard is already open in another app"

Another app (like Claude Code) is using Blackboard. Wait a few minutes, or quit that app.

A course looks empty

Courses from past terms are locked by the university. New courses may have nothing posted yet.

Something else

Ask again. Blackboard has short hiccups sometimes.

Update, remove, and privacy

  • Update: download the file again and double-click it.

  • Remove: in Claude, open Settings → Extensions, find Blackboard, and remove it.

  • Erase your login: delete the .blackboard-mcp folder in your home folder. It holds your sign-in and any course files it downloaded, and nothing else. Never share that folder.

  • Everything stays on your computer. Nothing is sent anywhere except to Blackboard and the sites your professors link to.

  • Only your courses' links. It only opens links a professor posted in one of your courses. A web page can hide instructions aimed at the AI; this rule means such a page can never send the AI, or your data, somewhere else. Links to your own computer or home network are refused.

Being a good citizen

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

Using Claude Code, or setting it up by hand

You need Node.js 22 or newer and git. Then:

Mac

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

Windows (PowerShell)

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

npm run setup checks for a browser (and offers to download one), connects Claude Desktop and Claude Code, and opens the sign-in window. To update later: git pull, then npm run setup.

If you already installed the one-click extension, don't also connect Claude Desktop here, or Blackboard will show up twice.

Other commands: npm run login (sign in again), npm run status, npm run courses, npm run connect -- google (sign in to a site for links), and npm run logout.

Doing every step by hand instead:

  1. Install what it needs (the project comes ready-built, so there is nothing to compile)

npm install --omit=dev
  1. Log in to Blackboard

npm run login

A browser 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/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\\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 --scope user blackboard -- "$(which node)" /path/to/blackboard-mcp/dist/index.js

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

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

For the technically curious

  • Stack: TypeScript (ESM), Node 22+, Playwright driving Chrome, else Edge, else a downloaded Chromium (remembered per machine, one dedicated profile folder per browser), 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, read_link. All read-only. Errors are short coded messages with sensitive values masked. Long texts come back in pages (offset / next_offset).

  • Links: every content item, announcement and assignment carries a links list (anchors, iframes and plain-text URLs in its HTML, classified by service). read_link opens one through the same dedicated browser: Google exports (docx/xlsx/pptx), Drive downloads and folder listings, Colab via Drive, Kaltura captions captured from the player, Zoom recording transcripts from the player's info API (not yet verified against a real recording), Panopto SRT, SharePoint download=1, GitHub raw/README, and rendered text for everything else. Only links seen in the student's own Blackboard data (plus same-site links on an opened page) are allowed; private and loopback addresses are refused on every redirect hop.

  • File text: PDF (pdf.js via unpdf), DOCX, PPTX with notes, XLSX with dates (via fflate), notebooks, and plain text formats, all extracted locally.

  • 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.

  • One-click extension: npm run bundle builds release/blackboard-mcp.mcpb (about 7 MB): the built code, runtime packages only, and extension/manifest.json. Claude Desktop runs it with its own built-in Node (24 as of Sep 2026; the manifest requires 22+). Attach it to a GitHub release under exactly that file name so the "latest" download link keeps working. With no sign-in, the server itself opens the NetID window. With no Chrome or Edge, a terminal install downloads Playwright's Chromium in the background; inside Claude Desktop (which runs extensions in its own Electron process, where spawning "node" would start the Claude app itself) the student is asked to install Chrome instead. BB_PRETEND_NO_BROWSERS=1 simulates a machine with neither.

  • Shipped build: dist/ is committed so terminal installs get only runtime packages (about 44 MB) and never compile anything. After changing src/, run npm run build and commit dist/ too; a test fails if it is out of date. npm run setup removes dev tools from node_modules, so run npm install again before developing.

  • Development: npm run typecheck, npm test (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

10 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. Links inside an announcement are listed under "links"; open one with read_link. 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

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces read-only. The description adds useful structure context about the 'links' field and newest-first ordering. It doesn't disclose pagination behavior or result limits, so it's adequate but not rich.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core purpose, followed by the optional filter then the link-handling note. Zero waste.

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?

Covers purpose, ordering, filtering, and link navigation for a read-only list tool with full schema coverage and no output schema. Pagination/limits are unaddressed but are minor gaps for a read operation.

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 both course_id and since are fully documented in the schema. The description reiterates the date-filtering semantics but adds no syntax or format detail beyond the schema. 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 (list announcements) scoped to one Blackboard course, with ordering (newest first) and an explicit filtering option. An agent can distinguish it from siblings like get_course_content or get_assignments immediately.

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

Usage Guidelines4/5

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

Provides clear context: filter to items created/modified after a date, and routes to read_link for opening links inside an announcement. It doesn't explicitly state when NOT to use it (e.g., across multiple courses, for content types other than announcements), so it's not a 5.

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), attached files, links in the instructions (open them with read_link), the student’s grade and submission status, and related course announcements. Use this instead of many low-level calls. status: graded, submitted, in_progress (started or saved as a draft, NOT handed in), not_submitted, or unknown (Blackboard did not say — never treat unknown as missing work). 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.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so 'Read-only' is redundant. What the description genuinely adds is the status vocabulary: in_progress means started or saved as a draft and NOT handed in, and unknown must never be treated as missing work. That prevents a costly misinterpretation. It does not cover auth requirements, rate limits, or response size.

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

Conciseness4/5

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

Content enumeration is front-loaded in the first sentence, then the status glossary, then the read-only note. Dense with no filler, though the single long opening sentence packs a lot before the agent reaches the operational status guidance.

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

Completeness5/5

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

For an aggregation tool with no output schema, the description compensates by itemizing exactly what comes back (instructions, rubric, attachments, links, grade, status, announcements) and disambiguating the status enum values. An agent needs nothing further to call it and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (course_id, assignment_id) are documented there, including the <course_id>:<content_id> format. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose5/5

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

Names a specific verb+resource ('one package describing a Blackboard assignment') and enumerates its contents: instructions, due date, points, rubric, attachments, links, grade, submission status, announcements. An agent can immediately distinguish it from get_assignments (a list) or get_attachment (a single file).

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 tells the agent to prefer it over 'many low-level calls' and routes link handling to the sibling read_link by name. It gives clear usage context but stops short of stating when not to use it (e.g. when only the due date is needed, get_upcoming_work may suffice).

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 or date-time. A bare date ("2026-09-30") means the start of that day, Syracuse time.
due_beforeNoISO date or date-time. A bare date ("2026-09-30") includes that whole day, Syracuse time.
include_statusNoAlso resolve submitted/graded status (slower: 1-2 extra Blackboard requests per item). Status is "in_progress" for a started or saved draft that was NOT handed in, and "unknown" when Blackboard does not report an attempt either way — treat unknown as undetermined, never as missing work.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the "Read-only" sentence is largely redundant. The description does add genuine behavioral context beyond annotations: the result is merged and deduplicated across three upstream sources, which tells the agent to expect canonicalized output rather than raw per-source records.

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 tight sentences: what it returns and from where, then the optional scoping, then the safety profile. Nothing is repeated and the most distinctive information (deduplication across sources) leads.

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 should ideally hint at the shape of returned items (fields, ordering, status presence), which it does not. Everything needed to invoke the tool correctly is present, though, so the gap is modest.

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 all four parameters are already fully documented, including the Syracuse-timezone semantics and the include_status cost/"unknown" caveat. The description only restates course and due-date scoping at a high level, adding no syntax the schema lacks, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("List assignments and assessments with due dates") and adds a distinctive mechanism (combined and deduplicated from course content, gradebook, and calendar) that separates it from get_course_content or get_grades. It stops short of naming the closest siblings, get_upcoming_work and get_assignment_context, so an agent must still infer the boundary.

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

Usage Guidelines3/5

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

"Optionally scope to one course and/or a due-date window" implies when the filters matter, but there is no explicit guidance on when to prefer this tool over get_upcoming_work or get_assignment_context, which appear to overlap. Usage is implied rather than 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, Word, PowerPoint, Excel, notebooks, text, images, ...) from Blackboard and return its contents as text, plus the local path where it was saved (~/.blackboard-mcp/downloads). PDFs come back page by page, slides with speaker notes, spreadsheets as CSV per sheet. Long files come in pages: pass next_offset back as offset to keep reading. Nothing is sent anywhere. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNoCharacter offset to continue a long file (from next_offset).
file_idNoWhich file, when a content item has several (a file_id or file_name from available_files).
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
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, yet the description still adds real value: the save location (~/.blackboard-mcp/downloads), per-format extraction semantics (pages, speaker notes, CSV per sheet), pagination via next_offset, and the privacy note that nothing is sent anywhere. Only 'Read-only' is redundant with the annotations.

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

Conciseness4/5

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

Front-loaded with the core action and return shape, then format specifics and pagination. Four sentences, all relevant, with no filler; slightly dense but nothing that should be cut.

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?

With no output schema, the description carries the return-value burden and does so: it describes the text payload, the saved path, per-format structure, and how to continue long files. An agent can call this correctly and interpret the result without further documentation.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are already documented; the description goes further by explaining the offset/next_offset continuation loop and the multi-file case (file_id/file_name from available_files). It adds semantics the schema cannot, though it references a 'next_offset' field not present in the input schema.

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

Purpose5/5

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

States a specific verb ('Download') and resource ('a course file ... from Blackboard') plus the return form (text contents + local save path). This is clearly distinguishable from siblings like read_link or get_course_content, which fetch pages/links rather than file bodies.

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?

Gives clear operating context: the supported file types, the local path where files land, and the pagination contract ('pass next_offset back as offset to keep reading'). It never names when to prefer this over a sibling such as read_link, so it stops short of explicit alternatives/exclusions.

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

get_course_contentGet 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. Each item lists its "links" (Google Docs/Sheets, Zoom, YouTube, readings...): open one with read_link. Files open with get_attachment. 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.4/5.0
Behavior4/5

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

The readOnlyHint annotation covers safety, and the description goes beyond it by disclosing the lazy-expansion behavior (only a couple folder levels returned, folder_id required for deeper traversal) plus the structure of each item's 'links' array. This is real behavioral context not present in the annotations, though it doesn't discuss result size, limits, or error cases.

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 tight sentences, front-loaded with what is returned, then traversal mechanics, then next-step tools. Every sentence 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?

With no output schema, the description still conveys the shape of returned items and their links, and points to read_link/get_attachment for consuming them. It is nearly complete for an agent's needs, though it does not mention pagination, item counts, or ordering.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema doesn't: folder_id is framed as a way to 'go deeper into one folder' relative to the auto-expanded root, which clarifies the traversal semantics rather than just restating the param.

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 (List) and resource (a course's content items) and enumerates the item types returned (folders, documents, files, assignments, tests, links), which distinguishes it from siblings like get_assignments and get_announcements. An agent can tell what this returns without opening a schema.

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?

Clearly explains the traversal model — hierarchy is auto-expanded a couple levels and folder_id drills deeper — and routes to the right siblings for continuation (read_link for links, get_attachment for files). No explicit 'when not to use' or coverage of how it relates to get_assignments/get_grades, but the context is strong.

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 current courses since a point in time (default: the last 7 days): announcements (with their links), new or changed content items, changed assignments, and grades on gradebook items that changed. 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 and openWorldHint, so the 'Read-only' clause is largely redundant, but the description adds real behavioral value by disclosing that it reports only *changed* items and grades on *changed* gradebook items, plus announcement links. It omits any note on result volume, ordering, or pagination.

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?

One dense sentence with the aggregation scope front-loaded, followed by a short qualifier. Every clause contributes (scope, time window, contents), and there is no filler.

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

Completeness4/5

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

For a one-optional-parameter read tool with no output schema, the description adequately covers what is returned and the default time window. Minor gaps are the treatment of 'current courses' (enrollment scope) and result ordering or size limits.

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 single 'since' parameter is fully documented with format and default in the schema. The description restates the default but adds no syntax or edge-case detail beyond it, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (gets/aggregates) and resource (recent Blackboard activity across current courses), then enumerates exactly which activity types are captured: announcements, content changes, assignment changes, and gradebook changes. This aggregate scope cleanly distinguishes it from the single-resource siblings get_announcements, get_grades, and get_assignments.

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

Usage Guidelines3/5

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

The time window is explained ('since a point in time, default last 7 days'), which implies the tool is for a recent-activity sweep, but no alternative or exclusion is named. It never says when to prefer this over get_announcements/get_grades or how to follow up after receiving results, leaving routing to inference.

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, with submission status. Also lists anything due in the last few days that has not been handed in. This is the one call to answer “what do I have due?”. The window runs to the end of the last day, Syracuse time. status: graded, submitted, in_progress (started or saved as a draft, NOT handed in), not_submitted, or unknown (Blackboard did not say — never treat unknown as missing work). Read-only.

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

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint annotation: it discloses sort order, the window boundary ('end of the last day, Syracuse time'), inclusion of recently overdue unhanded-in work, and an interpretation rule for the 'unknown' status ('never treat unknown as missing work'). That last point materially changes how an agent should reason about the results.

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

Conciseness4/5

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

Front-loaded with the core purpose, and the routing statement follows immediately. The trailing 'Read-only' repeats the readOnlyHint annotation and is the one sentence that does not fully earn 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?

With no output schema, the description carries the burden of explaining returns, and it does: due-date ordering, submission status, and the full status vocabulary with edge-case handling. Minor omissions remain (result size limits or pagination), but an agent has what it needs to call and interpret this correctly.

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

Parameters4/5

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

The single 'days' parameter is fully described in the schema, so the baseline is 3. The description adds genuine meaning by specifying that the window terminates at the end of the last day in Syracuse time, which clarifies how the integer is actually interpreted.

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 and resource plus scope: 'Upcoming assignments and assessments across ALL Blackboard courses, sorted by due date, with submission status.' The ALL-courses scope and the 'what do I have due?' framing distinguish it from course-scoped siblings like get_assignments and get_course_content.

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

Usage Guidelines4/5

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

Explicitly positions itself as 'the one call to answer "what do I have due?"', which is clear routing guidance. It also notes it recovers recent unsubmitted items from the past few days. It does not name an alternative tool or state when NOT to use it, 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.

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. 3 tool updatesv0.2.0
    • Changedget_assignments3 fields changed
      • changedInput schema / properties / due_after / description
        Previous value: -"ISO date — only items due on/after this instant."New value: +"ISO date or date-time. A bare date (\"2026-09-30\") means the start of that day, Syracuse time."
      • changedInput schema / properties / due_before / description
        Previous value: -"ISO date — only items due on/before this instant."New value: +"ISO date or date-time. A bare date (\"2026-09-30\") includes that whole day, Syracuse time."
      • changedInput schema / properties / include_status / description
        Previous value: -"Also resolve submitted/graded status (slower: one extra Blackboard request per item)."New value: +"Also resolve submitted/graded status (slower: 1-2 extra Blackboard requests per item). Status is \"in_progress\" for a started or saved draft that was NOT handed in, and \"unknown\" when Blackboard does not report an attempt either way — treat unknown as undetermined, never as missing work."
    • Changedget_attachment2 fields changed
      • changedInput schema / properties / file_id / description
        Previous value: -"Specific file id when a content item has several attachments (see available_files in the result)."New value: +"Which file, when a content item has several (a file_id or file_name from available_files)."
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Character offset to continue a long file (from next_offset).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Addedread_link
  2. 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 10 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but there is some overlap: get_assignments, get_upcoming_work, get_course_content, and get_assignment_context all surface assignment-related data with different scopes. The descriptions do a good job clarifying when to use each, but an agent could still hesitate between them for certain queries.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: get_course_content, get_announcements, get_assignments, get_attachment, get_upcoming_work, get_recent_updates, get_assignment_context, get_grades, list_courses, read_link. The verbs get_, list_, and read_ are standard and predictable.

Tool Count5/5

Ten tools is well-scoped for a read-only Blackboard student access server. Each tool earns its place by covering a distinct resource or view (courses, content, announcements, assignments, attachments, links, grades, upcoming work, recent updates, assignment context).

Completeness4/5

The read-only surface covers the core student workflows: listing courses, browsing content, reading announcements and assignments, opening files and links, checking grades, and tracking due work. A notable gap is discussion/forum reading, and there is no cross-course grade summary, but agents can work around these limitations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers