MCP server integrating Canvas course management and Todoist task management with homework tracking
This server has fundamental definition quality issues. Tool names lack action verbs (e.g., 'random', 'getCourses' vs 'get_courses'). Most tools have zero input parameters, making them non-composable. Input schemas are either missing or empty. Parameter descriptions are entirely absent. Output schemas are undocumented, LLMs cannot understand what these tools return. One tool (add_task) has a schema, but parameter descriptions are minimal. The descriptions themselves are brief and lack guidance on when to use each tool or what data is returned. This violates multiple core patterns from the 54 Agentic Tool Patterns.
Adds a task to the school project in todoist. Do not include the due date in the description.
Returns the active courses of the user.
Lists all tasks in todoist school project
returns a random number between 1 and 100.
Returns the homework assignments due today.
Returns the homework assignments due this week.
Returns the homework assignments due this week that have not yet been submitted.
6 of 7 tools have zero input schema. No parameter types or constraints are defined. Parametrized tools like add_task have minimal parameter descriptions (title, due_date, description lack guidance on format, constraints, or use cases).
Output schemas are completely undocumented. LLMs cannot infer what fields are returned by getCourses(), todayHomework(), list_todo_tasks(), etc. This prevents downstream tool composition and forces LLMs to guess at response structure.
Tool names do not follow verb_noun convention. 'random', 'getCourses', 'todayHomework' use camelCase and lack clear action verbs. Best practice: get_random, get_courses, get_today_homework. Tool names must signal intent to LLMs before they read descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 6 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 25 | - | v1 |
Descriptions are too brief and lack actionable guidance. 'returns a random number between 1 and 100' (41 chars) does not explain why an LLM would call this. 'Returns the homework assignments due today' (45 chars) lacks information about output format, filtering behavior, or dependencies on prerequisites. Average description length in A+ tools: 194 chars. These average 45-55 chars.
add_task's 'description' parameter description says 'Task description (optional)' but does not explain format constraints, maximum length, allowed characters, or whether it is markdown or plain text. 'due_date' parameter lacks guidance on format (should specify ISO 8601 date, not 'due_date (optional)' alone).
No error handling or recovery guidance. If Canvas API calls fail (network error, invalid token, rate limit), the tool returns nothing useful to the LLM. canvas.py has exception handling that breaks silently (e.g., 'if resp.status_code != 200: break'), leaving agents to infer failure. No error messages guide the LLM to retry, ask the user, or use a fallback.
No pagination support. weekHomework() calls Canvas with per_page=100 but does not accept limit or offset parameters. If a user has 200+ assignments, results are truncated silently. Tools returning lists must support pagination (limit, offset/cursor) and return total_count or next_cursor.
API credentials (CANVAS_API_KEY, TODOIST_API) are loaded from environment variables in the module scope, which is correct. However, there is no documentation warning about secret exposure in tool parameters or responses. If an LLM were accidentally given a credential parameter, it could leak into traces.
No input validation or constraint documentation for add_task. The tool accepts title (string), due_date (datetime.date), description (string, optional). No docs specify: max title length, allowed characters, date range (can due_date be in the past?), or what the Todoist API expects. LLMs may pass invalid dates or excessively long titles.
Tools do not document their dependencies. getCourses() must be called before todayHomework() can filter assignments, but there is no hint in the description. add_task requires a valid due_date format, but no guidance on whether dates in the past are rejected.