Open-source FastAPI backend for KLAS with built-in MCP support. Provides REST API endpoints for KLAS integration (Korean university learning management system) and exposes tools via MCP (Model Context Protocol) for Claude integration.
OpenKLAS exposes 14 well-intentioned tools via fastapi-mcp with HTTP transport. Tool names follow verb_noun patterns consistently (login, logout, get_me, list_eclass_lectures, etc.), which is a strength. Descriptions are present for all tools and range 80 - 280 characters, meeting the 10 - 1024 character baseline. However, several critical gaps reduce quality: (1) Input schemas are visible and properly typed for most tools, but lack enum constraints on enums (semester accepts '1' or '2', should be declared as enum, not free-form string). (2) Descriptions lack LLM-optimized guidance: they do not state WHEN to use each tool vs. alternatives, dependency hints ('call X first to get Y'), or recovery paths for errors. (3) Output schemas are entirely undocumented, the server returns responses but provides no description of the return structure, forcing LLMs to infer fields. (4) Error handling is minimal, no tool documents what error conditions are possible, what they mean, or how to recover. (5) Parameter descriptions are present but terse and sometimes ambiguous (e.g., 'year' param lacks default behavior if omitted, despite description saying 'Defaults to current'). (6) No tool declares permissions (read:email, write:calendar) or audit scope. (7) Composition is reasonable (14 focused tools), but some miss natural chaining IDs (e.g., summarize_eclass_lecture returns nothing immediately, status must be polled separately, should return a job_id for follow-up).
Ask a question about a homework PDF using Claude AI. Downloads the PDF from KLAS, extracts text, and answers your question. Uses prompt caching so repeated questions on the same PDF are fast and cheap. Requires Bearer token in Authorization header.
Download a file attached to a homework task. Use attach_id (atch_file_id) from the detail endpoint and file_sn from the files endpoint. Requires Bearer token in Authorization header.
Get the current status of the background eclass summarize pipeline. step values: downloading | transcribing | summarizing | saving | done | error. Requires Bearer token in Authorization header.
Get homework for all enrolled subjects in one call. Fetches the timetable to discover subject codes, then retrieves homework for each subject. Results are sorted most-recent-first per subject. Requires Bearer token in Authorization header.
Get homework list for a subject, sorted by most recent first (highest taskNo). Requires Bearer token in Authorization header.
Output schemas entirely undocumented. No tool documents the structure of its response (field names, types, required vs optional). LLMs cannot plan multi-step workflows or extract the right data for downstream tools without guessing.
Enum parameters accept free-form strings. Semester ('1' or '2') and year accept integers without declared enum/constraint. LLMs will hallucinate invalid values like '3' or 'spring' instead of picking from declared options.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | <=2025-11-25 | v2 |
Get full detail for a specific homework task, including description (HTML) and atchFileId. Use ordseq, weeklyseq, weeklysubseq from the homework list response. Requires Bearer token in Authorization header.
Get list of files attached to a homework task. Use atch_file_id from the homework detail response. Requires Bearer token in Authorization header.
Get current user information from KLAS session. Requires Bearer token (KLAS session token) in Authorization header.
Get team project list for a subject, sorted most-recent first. Requires Bearer token in Authorization header.
Get eclass lecture list for all enrolled subjects in one call. Fetches the timetable to discover subject codes, then retrieves eclass lectures for each subject. Requires Bearer token in Authorization header.
Get eclass lecture list for a subject. Returns all lectures sorted by serial descending (most recent first). Each item includes a video_url pointing directly to the MP4. Requires Bearer token in Authorization header.
Login to KLAS and get a session token. Takes student_id (학번) and password, returns a session token valid for 24 hours. Automatically creates or updates user in database.
Logout and invalidate session token. Requires Bearer token in Authorization header.
Summarize a single eclass lecture video in the background. Pipeline: download MP4 → transcribe (Groq Whisper) → summarize (Claude) → save to Obsidian. Returns immediately. Check progress at GET /api/eclass-lectures/summarize/status. Get subject_code and content_id from GET /api/eclass-lectures/all. Requires Bearer token in Authorization header.
No error handling documentation. Tools do not describe error conditions (auth failure, not found, API timeout, transcription failure for summarize_eclass_lecture) or recovery paths. LLMs cannot plan retry logic or inform users of actionable next steps.
Parameter naming inconsistencies. 'atch_file_id' vs 'attach_id', 'weekly_seq' vs 'weeklyseq' vs 'weeklysubseq' create confusion. LLMs must reason about field mappings instead of direct copy-paste from responses.
Asynchronous operations (summarize_eclass_lecture) lack job ID pattern. Tool returns immediately but provides no documented way to correlate status updates to the specific job. Polling endpoint (eclass_summarize_status) has no job_id parameter, implies only one job can be tracked, failing under concurrent requests.
No tool annotations. Tools do not declare readOnlyHint (login, logout are WRITE; get_* are READ_ONLY). Without annotations, LLMs cannot determine whether a tool is safe to call speculatively or requires confirmation.
Credential handling ambiguity. 'logout' tool takes a 'credentials' parameter of type string described as 'Bearer token in Authorization header'. It is unclear whether the tool expects the full 'Bearer <token>' string or just the token value. Description should clarify.