MCP server for managing university schedules, including student groups, teachers, lessons, free hours, and schedule exports for calendar integration
26 tools with mostly complete descriptions (194-char baseline met for most). All tools have input schemas with type definitions. However, critical gaps: (1) No tool annotations (readOnlyHint/destructiveHint) despite 22 READ_ONLY and 4 WRITE tools, LLM cannot distinguish safe from destructive calls. (2) Output schemas undocumented, LLM must infer response structure. (3) Parameter descriptions vary widely; some are excellent (CreateGroup, UpdateGroup), others minimal (GetAllFreeHours, GetAllGroups). (4) No error recovery guidance, tools return success/failure flags but don't guide next steps. (5) Enum constraints missing for specialty, position, week, type parameters, free-form strings invite hallucination. (6) No pagination on list tools (GetAllLessons, GetAllTeachers, GetAllGroups), could return unbounded results.
Determines whether the current calendar week is even or odd, based on the institution's alternating-week academic schedule. Use this tool when you need to display or make decisions according to the parity of the current week (e.g., selecting which set of lessons to show). No input parameters are required. Returns: - A human-readable message: 'It is an even week.' or 'It is an odd week.'
Determines whether the week containing a specified date is even or odd, according to the alternating-week academic schedule. Use this tool when you need to check week parity for planning or querying in advance (for example, when displaying a schedule for a future date). Validation: • The input must be a non-empty string in ISO format (YYYY-MM-DD). • If the date cannot be parsed, an error message is returned. Parameters: - date (string): The date to check, in 'YYYY-MM-DD' format. Returns: - On success: 'The week containing {date} is even.' or 'The week containing {date} is odd.' - On error: descriptive message about the invalid or missing date.
Creates a new student group with specified parameters: 'name', 'course', 'specialty'. Validates: • name uniqueness within the database, • course range (1-4), • specialty from the allowed list: Прикладна математика, Системний аналіз, Інформатика, Програмна інженерія. Returns detailed error messages with guidance in case of validation failures; on success returns the created Group object. Context for LLM: - This tool creates university student groups that will be used in schedule management - Proper validation is critical to maintain data consistency
Creates a new teacher with the provided full name, position, and optionally their available time slots. This tool performs strict validation: • Ensures the full name is in format 'Surname I. O.' and unique across the database. • Validates the position against the allowed values: 'Асистент', 'Доцент', 'Професор'. • Accepts an optional list of available hours. If not provided, assumes the teacher is available for all pairs on all days. • Automatically associates generated FreeHour entries with the teacher, all marked as available (IsFree = true). Parameters: - fullName: string, required, format 'Surname I. O.' - position: string, must be one of the accepted types. - optionalFreeHours: list of tuples (Day, NumberOfPair), optional. - if the user has not specified it explicitly, pass an empty list: `[]`. Do not omit the parameter or pass null in this case. Returns success message and created Teacher object if successful; otherwise returns descriptive validation errors.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). 22 READ_ONLY tools and 4 WRITE tools exist but LLM cannot distinguish safe from destructive calls without explicit hints.
Output schemas undocumented. Tools return complex objects (Group, Lesson, Teacher, GroupResult) but LLM must infer field names and types. No response schema in tool definitions.
Enum constraints missing for constrained parameters. 'specialty' accepts free-form strings (should be enum: [Прикладна математика, Системний аналіз, Інформатика, Програмна інженерія]). 'position' in CreateTeacher should be enum. 'week' and 'type' parameters lack enum constraints.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | <=2025-11-25 | v2 |
Returns a complete list of all free-hour records in the system. Use this tool when you need to retrieve every time slot marked as free (regardless of teacher or day). No input parameters are required. Each FreeHour entity includes: • Day (1 = Monday … 5 = Friday) • NumberOfPair (1…4) • IsFree flag (true if available) • TeacherId (the owner of this free slot) • LessonId (the lesson associated with this free slot, if any)
Fetches all groups in the database.No input parameters required.Returns an IEnumerable<Group> with every registered group.
Returns a complete, sorted list of all lessons in the system, including associated groups and teachers. Use this tool when you need an overview of the entire timetable. No input parameters are required. Lessons are ordered first by day of week (1 = Monday … 5 = Friday), then by pair number (1…4). Each Lesson entity includes its GroupLessons→Group and TeacherLessons→Teacher collections.
Returns a full list of all teachers in the system. Use this tool when you need to fetch the complete set of registered teachers.No input parameters are required. Returns a list of Teacher objects.
Finds teachers who are available (i.e., have free time slots) based on optional filtering parameters. Use this tool when the user wants to know which teachers are free, free during a specific day of the week (1 = Monday … 5 = Friday) and/or a specific pair (lesson period). Parameters:- day (int): Day of the week. Use 0 to ignore the day filter.- pair (int): Lesson number (e.g., 1st pair, 2nd pair). Use 0 to ignore the pair filter.The tool returns teachers who have at least one matching free hour. Internally, it performs a filtered query over teacher free hour slots.
Retrieves all groups for a specific course number. Parameters: - course (int): the course number (1–4). Returns GroupResult.Success=false if the course is invalid or no groups found; otherwise returns Success=true and Groups list.
Searches for groups by exact or partial name match. Parameters: - name (string): substring of the group name to search for. Returns GroupResult with Groups list if found; otherwise Success=false with a message.
Retrieves all groups for a given specialty. Parameters: - specialty (string): exact specialty name (e.g. 'Інформатика'). Returns GroupResult.Success=false if input is empty or no matches; otherwise returns Success=true and Groups list.
Filters lessons by student course year. Use this tool when you need the timetable for a particular course (1…4). Parameters: - course (int): The course number (1–4). Pass a non-positive value to include all courses. Returns lessons where at least one associated group has the given course.
Filters lessons by both course year and week parity. Use this tool when you need, for example, the even-week schedule for a given course. Parameters: - course (int): Course year (1–4). - week (string): 'парний' or 'непарний'. Returns lessons matching both criteria, sorted by day and pair.
Filters lessons by a specific student group name. Use this tool when you need the timetable for one group. Parameters: - groupName (string): Exact name of the group (case-sensitive). Pass an empty string to include all groups. Returns lessons where at least one GroupLesson matches the given name.
Filters lessons by both group name and week parity. Use this tool when you need, for example, the odd-week schedule for a given group. Parameters: - groupName (string): Exact group name. - week (string): 'парний' or 'непарний'. Returns lessons matching both criteria, sorted by day and pair.
Filters lessons by teacher name. Use this tool when you need the schedule for a particular instructor. Parameters: - teacherName (string): Full or partial teacher full name. Empty or whitespace input returns an empty result. Returns lessons taught by any matching teacher.
Filters lessons by teacher name and week parity. Use this tool when you need, for example, the even-week timetable for a given instructor. Parameters: - teacherName (string): Full or partial teacher name. - week (string): 'парний' or 'непарний'. Returns lessons matching both criteria, sorted by day and pair.
Filters lessons by their type: lecture or practice. Use this tool when you need only 'лекція' (lectures) or 'практика' (practicals). Parameters: - type (string): 'лекція' to return only lectures; 'практика' to return only practical sessions. Any other value returns all lessons. Results are sorted by day and pair.
Filters lessons by week parity. Use this tool when you need lessons on even or odd weeks. Parameters: - week (string): 'парний' for even weeks (or unspecified), 'непарний' for odd weeks (or unspecified). Any other value returns all lessons. Results are sorted by day and pair.
Filters lessons by optional day-of-week and pair number. Use this tool when you need lessons on a specific day or at a specific lesson period. Parameters: - day (int): Day of week (1 = Monday … 5 = Friday). Pass 0 to include all days. - pair (int): Lesson number (1…4). Pass 0 to include all pairs. Returns a sorted list of lessons matching both filters (if specified).
Exports a student group's weekly schedule as a CSV string ready for Google Calendar import. Simply supply: - groupName (string): the exact name of the group - startDate (string, optional): any date (YYYY-MM-DD) within the desired week (defaults to today) Returns either: • A CSV-formatted string of all lessons that week, or • An error message (e.g. 'Group not found' or 'Invalid date format').
Exports a teacher's weekly timetable as a CSV string, ready for import into Google Calendar. Simply provide: - teacherName (string): the exact full name of the instructor - startDate (string, optional): any date in 'YYYY-MM-DD' format within the target week (defaults to today) Returns: - A CSV-formatted string of all lessons for that week, or - An error message if the teacher is not found, the date is invalid, or no lessons exist.
Searches for teachers by full name or surname. Use this when a user provides a name fragment and wants to determine all teacher information or select relevant teachers. Parameter:- teacherName (string): Part or full teacher name.Returns a list of all teachers whose name contains the entered value, case insensitive. Does not filter based on availability. This tool is useful for name recognition or pre-screening.
Finds all available (free) time slots for a specific teacher, based on their full name or surname. Use this tool when a user asks something like 'When is Professor Shevchenko free?' or 'Show free hours for teacher Ivanenko'. Parameter:- teacherName (string): The full name or part of the name/surname of the teacher.If no teachers are found, or multiple teachers match the name, the tool returns a message with suggestions. If exactly one teacher is found, their free hours are returned grouped by day of the week, including day names and lesson numbers. Handles edge cases: empty input, no match, or multiple matches.
Updates a group's information. IMPORTANT: Does not require prior GetGroupsByName call by the client. • The tool finds the target group using the provided 'currentName'. • Validates each optional field (newName, course, specialty) with clear, contextual error messages. • If 'specialty' is invalid, returns the complete list of allowed specialties to guide the user. Context for LLM: - Part of the group management workflow: find → validate → save. - Ensures name uniqueness (no duplicates), course within range [1-4], and specialty from the approved set. - All changes are optional - only provided fields will be updated. - Returns detailed feedback on the success or failure of the operation.
No pagination on list tools. GetAllGroups, GetAllLessons, GetAllTeachers, GetAllFreeHours return unbounded results. No limit, offset, or cursor parameters. Large datasets will blow context window.
Error handling lacks recovery guidance. Tools return success/failure flags (GroupResult.Success) but do not guide LLM on next steps. E.g., 'Group not found' should suggest 'Try GetGroupsByName() with a partial name.'