get_courses
Retrieve course records with pagination and optional filtering by published status.
Instructions
Get all course records
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Cursor for fetching the next page of results | |
| per_page | No | Number of results per page (default: 25) | |
| published | No | Show only published courses |
Implementation Reference
- src/tools/courses.ts:21-34 (handler)The async handler function for the 'get_courses' tool. Calls apiList('/courses') to fetch paginated course records, logs the response, formats the result as a list using formatList, and appends a next page cursor if present.
async ({ cursor, per_page, published }) => { try { const result = await apiList<EduframeRecord>("/courses", { cursor, per_page, published }); void logResponse("get_courses", { cursor, per_page, published }, result); const toolResult = formatList(result.records, "courses"); if (result.nextCursor) { toolResult.content.push({ type: "text", text: `\nNext page cursor: ${result.nextCursor}` }); } return toolResult; } catch (error) { return formatError(error); } }, ); - src/tools/courses.ts:15-19 (schema)Input schema definition for the 'get_courses' tool: optional cursor (string), per_page (positive int), and published (enum with 'published').
inputSchema: { cursor: z.string().optional().describe("Cursor for fetching the next page of results"), per_page: z.number().int().positive().optional().describe("Number of results per page (default: 25)"), published: z.enum(["published"]).optional().describe("Show only published courses"), }, - src/tools/courses.ts:10-34 (registration)Registration of the 'get_courses' tool on the MCP server via server.registerTool() with description, annotations (readOnlyHint: true), inputSchema, and handler.
server.registerTool( "get_courses", { description: "Get all course records", annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true }, inputSchema: { cursor: z.string().optional().describe("Cursor for fetching the next page of results"), per_page: z.number().int().positive().optional().describe("Number of results per page (default: 25)"), published: z.enum(["published"]).optional().describe("Show only published courses"), }, }, async ({ cursor, per_page, published }) => { try { const result = await apiList<EduframeRecord>("/courses", { cursor, per_page, published }); void logResponse("get_courses", { cursor, per_page, published }, result); const toolResult = formatList(result.records, "courses"); if (result.nextCursor) { toolResult.content.push({ type: "text", text: `\nNext page cursor: ${result.nextCursor}` }); } return toolResult; } catch (error) { return formatError(error); } }, ); - src/tools/index.ts:77-132 (registration)Registration of the registerCourseTools function in the tools array, which is called by registerAllTools.
registerCourseTools, registerCreditCategorieTools, registerCreditTools, registerCustomAssociationTools, registerCustomFieldOptionTools, registerCustomObjectTools, registerCustomRecordTools, registerDiscountCodeTools, registerEditionDescriptionSectionTools, registerEducatorTools, registerEmailTools, registerEnrollmentTools, registerGradeTools, registerInvoiceVatTools, registerInvoiceTools, registerLabelTools, registerLeadTools, registerMaterialGroupTools, registerMaterialTools, registerMeetingLocationTools, registerMeetingTools, registerOrderTools, registerOrganizationTools, registerPaymentMethodTools, registerPaymentOptionTools, registerPaymentTools, registerPlannedCourseTools, registerPlanningAttendeeTools, registerPlanningConflictTools, registerPlanningEventTools, registerPlanningLocationTools, registerPlanningMaterialTools, registerPlanningRequiredTeacherGroupAttendeeTools, registerPlanningTeacherTools, registerProgramEditionTools, registerProgramElementTools, registerProgramEnrollmentTools, registerProgramPersonalProgramElementTools, registerProgramProgramTools, registerReferralTools, registerSignupQuestionTools, registerTaskTools, registerTeacherEnrollmentTools, registerTeacherRoleTools, registerTeacherTools, registerTheseTools, registerUserTools, registerWebhookNotificationTools, registerWebhookTools, ]; export function registerAllTools(server: McpServer): void { for (const register of tools) { register(server); } } - src/api.ts:122-137 (helper)The apiList helper function that performs the actual GET request to a paginated list endpoint (e.g., /courses). Returns records and nextCursor parsed from the Link header.
export async function apiList<T>(path: string, query?: Record<string, QueryValue>): Promise<ListResult<T>> { const { token } = getConfig(); const url = buildUrl(path, query); const response = await fetch(url.toString(), { method: "GET", headers: buildHeaders(token), }); await checkResponse(response); const records = (await response.json()) as T[]; const nextCursor = parseNextCursor(response.headers.get("Link")); return { records, nextCursor }; }