MCP server for D2L Brightspace API with automated authentication
This server has 12 tools with complete descriptions and basic schema definitions. However, there are significant gaps in schema completeness, parameter documentation, output schema documentation, and error handling guidance. Most tools lack explicit output schema declarations, making it difficult for LLMs to understand return structure. Parameter descriptions are present but generic, they lack format constraints, ranges, validation rules, and dependency documentation. Error handling is minimal; tools appear to return raw API responses without recovery guidance. The server follows verb_noun naming conventions well, but descriptions, while present, are verbose and could be more concise for LLM optimization (many exceed 200 chars, the upper baseline). No tool demonstrates idempotency guarantees, confirmation patterns for destructive operations, or structured error categories. The download_file tool accepts URLs directly, a potential security concern without sanitization documentation.
Download a file from D2L Brightspace. Provide a D2L content URL (e.g., https://learn.ul.ie/content/enforced/68929-CS4444.../file.docx or /content/enforced/...). The file will be saved to your Downloads folder by default, or to a custom path if specified. Returns the local file path, filename, size, and content type. Use this to download lecture slides, assignment files, course materials, or any file linked in course content.
Get course announcements/news items from instructors. Returns: title, body (text and HTML), created date, author, attachments, whether it's pinned. Use to answer: "Any new announcements?", "What did the professor post?", "Are there any updates?", "What's the latest news?"
Get full details about a specific assignment including complete instructions, due date, point value, allowed file types, and grading rubrics. Use after get_assignments when you need more detail about one assignment.
Get the user's submissions for an assignment. Shows submitted files, submission timestamps, feedback comments, and grades received. Use to answer: "Did I submit this assignment?", "What grade did I get?", "When did I submit?", "What feedback did I receive?"
No output schemas documented for any tool. LLMs cannot determine what fields to expect, forcing them to parse unstructured text responses. This violates the pattern:tool and pattern:response-shaper requirements.
Input parameter schemas are incomplete. Most tools define orgUnitId as {type: 'number', description: '...', optional: true} but lack validation constraints (min/max values, enum ranges, or format patterns). No examples of range constraints like 'orgUnitId must be positive' or 'topicId example: 968299'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
List all assignments for a course with their due dates and instructions. Returns: Name, DueDate (ISO 8601 format - compare with current date to find upcoming/overdue), instructions (in CustomInstructions.Text), point value (Assessment.ScoreDenominator), and Id (needed for get_assignment_submissions). Use this to answer: "What assignments do I have?", "What's due this week?", "What are my upcoming deadlines?", "Show me assignment instructions", "What homework is due soon?"
Get the complete course syllabus/structure including all modules, topics, lectures, and learning materials. Returns module titles, descriptions, topic names with URLs, and linked assignments. Use to answer: "What's in this course?", "Show me the syllabus", "What topics are covered?", "What lectures are available?", "What reading materials do I have?"
Get all contents within a specific course module/section including child topics, sub-modules, and materials. Use to explore one section of the course in detail.
Get the main sections/modules of a course. Returns module names, descriptions, and ModuleIds. Use for a high-level overview of course organization.
Get details about a specific course topic/lecture/reading including title, description, URL, and linked assignments. Use after get_course_content to get more info about a specific item.
List all courses you're enrolled in. Returns: course name, course code, org unit ID (needed for other tools), access status, start/end dates. Use to answer: "What courses am I in?", "Show my classes", "What's the course ID for X?", "List my enrollments"
Get your grades for a course. Returns all grade items with your scores, including: grade item name, points earned, points possible, percentage (DisplayedGrade), and any feedback comments. Use to answer: "What are my grades?", "What's my score on the quiz?", "How did I do on the assignment?", "What grade did I get?"
Get calendar events and due dates for a course within a time range. Returns: event title, start/end date, associated entity (assignment, quiz, etc.), course name. By default returns events from 7 days ago to 30 days ahead. Use to answer: "What's due this week?", "When is the assignment due?", "What are my upcoming deadlines?", "What do I need to submit?"
Descriptions are verbose (many exceed 200 chars, the upper baseline). Example: get_assignments description is ~280 chars. Baseline for optimal LLM selection is 10-200 chars. Excessive length wastes tokens and buries key details.
No error handling guidance. Tools return text responses without recovery hints, error categorization (retryable vs user-fixable vs fatal), or actionable next steps. E.g., if orgUnitId is invalid, the response should suggest 'Try get_my_courses() to find your course ID'.
No pagination support documented. Tools like get_assignments, get_announcements, and get_my_courses likely return lists but lack limit, offset/cursor, and total_count in either the description or output schema. Large result sets risk context window exhaustion.
download_file tool accepts URLs as free-form strings without sanitization documentation. Risk of path traversal or command injection if URLs are not properly validated. No mention of allowed domains or format constraints (must start with https://learn.ul.ie or /content/enforced/).
orgUnitId parameter marked optional with env var fallback (D2L_COURSE_ID), but no documentation of this fallback behavior in most parameter descriptions. LLMs may not realize the parameter can be omitted, leading to unnecessary lookups or failures when the env var is not set.
No output field naming consistency verified. If a tool returns 'DueDate' (camelCase from API), but another tool expects 'due_date' (snake_case), LLMs must manually map field names, increasing errors. Output schemas should declare canonical field names.
No idempotency guarantees documented. All tools appear read-only (marked READ_ONLY risk), so they should be inherently idempotent, but this is not explicitly stated. LLMs need to know retry-safe operations to handle transient failures.
download_file (WRITE risk) lacks confirmation or dry-run pattern. Agents should have an opportunity to review the file path and size before writing to disk. Current design allows accidental overwrites.