list_courses
Retrieve your enrolled courses from Canvas LMS with filtering options for active, completed, or all courses to organize your academic workflow.
Instructions
Lists all courses you are enrolled in, with options to filter by active, completed, or all courses.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Filter courses by state: active, completed, or all | active |
Implementation Reference
- src/tools/list-courses.ts:14-47 (handler)The handler function executes the tool logic: fetches courses from Canvas API filtered by state (active, completed, all), formats a list with IDs, names, and terms, or returns an error message.async ({ state }) => { try { const courses = await canvasApiRequest<CanvasCourse[]>(`/courses?enrollment_state=${state}&include[]=term`); if (courses.length === 0) { return { content: [{ type: "text", text: `No ${state} courses found.` }] }; } const courseList = courses.map((course) => { const termName = course.term ? `(${course.term.name})` : ''; return `- ID: ${course.id} | ${course.name} ${termName}`; }).join('\n'); return { content: [{ type: "text", text: `Your ${state} courses:\n\n${courseList}` }] }; } catch (error) { return { content: [{ type: "text", text: `Failed to fetch courses: ${(error as Error).message}` }], isError: true }; } }
- src/tools/list-courses.ts:10-13 (schema)Input schema using Zod: 'state' parameter as enum ['active', 'completed', 'all'] with default 'active'.{ state: z.enum(['active', 'completed', 'all']).default('active') .describe("Filter courses by state: active, completed, or all"), },
- src/tools/list-courses.ts:6-49 (registration)The registerListCoursesTool function registers the 'list_courses' tool on the MCP server, specifying name, description, input schema, and handler.export function registerListCoursesTool(server: McpServer) { server.tool( "list_courses", "Lists all courses you are enrolled in, with options to filter by active, completed, or all courses.", { state: z.enum(['active', 'completed', 'all']).default('active') .describe("Filter courses by state: active, completed, or all"), }, async ({ state }) => { try { const courses = await canvasApiRequest<CanvasCourse[]>(`/courses?enrollment_state=${state}&include[]=term`); if (courses.length === 0) { return { content: [{ type: "text", text: `No ${state} courses found.` }] }; } const courseList = courses.map((course) => { const termName = course.term ? `(${course.term.name})` : ''; return `- ID: ${course.id} | ${course.name} ${termName}`; }).join('\n'); return { content: [{ type: "text", text: `Your ${state} courses:\n\n${courseList}` }] }; } catch (error) { return { content: [{ type: "text", text: `Failed to fetch courses: ${(error as Error).message}` }], isError: true }; } } ); }
- src/index.ts:24-24 (registration)Main server initialization calls registerListCoursesTool to add the tool to the MCP server.registerListCoursesTool(server);