Ninova MCP
1 line summary
...
...
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Ninova MCP show my upcoming deadlines"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ninova MCP
Connect your İTÜ Ninova and OBS accounts to AI assistants like Claude. Ask about your courses, announcements, assignments, grades, files, attendance, and upcoming deadlines — and about your transcript, GPA, what is left until graduation, and which courses you can register for next term — in plain language. The assistant reads Ninova and OBS for you.
It logs in with your own İTÜ username and password, opens its own temporary sessions, and never touches your browser or sends your password anywhere except İTÜ's own login (ninova.itu.edu.tr and obs.itu.edu.tr through girisv3.itu.edu.tr).
What you can ask
"Bu hafta hangi ödevlerimin teslimi var?"
"X dersinde yeni duyuru veya ders dosyası var mı?"
"Notlarımı ve ağırlıklı ortalamamı göster."
"Tüm derslerimdeki son değişiklikleri özetle."
"Mezuniyete kaç kredim kaldı, hangi dersler eksik?"
"Gelecek dönem hangi dersleri alabilirim? Önşartlarım tutuyor mu?"
"Şu CRN'lerle çakışmasız bir program çıkar."
"Veritabanı dersinin şubelerini hocametre puanlarına göre karşılaştır."
"Bu dönem hepsinden BB alırsam ortalamam ne olur?"
Related MCP server: Moodle MCP Server
Install — pick one
1. Easiest: Claude Desktop, one click (no Python, no terminal)
Download your platform's file from the latest release:
macOS (Apple Silicon / M1–M4):
ninova-mcp-*-darwin-arm64.mcpbWindows:
ninova-mcp-*-windows-amd64.mcpb
Double-click the file. Claude Desktop opens an install dialog.
Enter your İTÜ username and password, click Install. Done.
The bundle ships its own Python runtime, so there is nothing else to install. Your password is stored in your operating system's secure keychain.
2. Let your AI set it up (Claude Code, Cursor, Codex, and others)
Paste this to your AI assistant — it installs the server and configures your client end-to-end:
Install the ninova-mcp MCP server (PyPI: ninova-mcp, https://github.com/hikmedit/ninova-mcp).
1. Install it: `pipx install ninova-mcp` (or `pip install --user ninova-mcp`) — both put a
`ninova-mcp` command on my PATH.
2. Register a `ninova` MCP server (command `ninova-mcp`, env NINOVA_USERNAME and
NINOVA_PASSWORD) in whichever MCP client I use — detect it and edit the right config,
merging into any existing servers without overwriting them. Leave the credentials as
placeholders unless I already pasted them here.
3. Tell me to fill in my İTÜ credentials, restart the client, and call the `auth_status`
tool to verify.3. One command (if you prefer the terminal)
After pipx install ninova-mcp:
# Claude Code
claude mcp add ninova ninova-mcp -e NINOVA_USERNAME=itu_username -e NINOVA_PASSWORD=itu_password
# Codex CLI
codex mcp add ninova --env NINOVA_USERNAME=itu_username --env NINOVA_PASSWORD=itu_password -- ninova-mcpOther clients (Claude Desktop config file, Cursor, manual TOML) are in the installation guide.
To confirm it works, ask the assistant to run the auth_status tool.
Is it safe?
Yes — it runs entirely on your machine. Your İTÜ password stays local (in your OS keychain when installed as the extension) and is only ever sent to İTÜ's own single sign-on for ninova.itu.edu.tr and obs.itu.edu.tr. Nothing is uploaded to any third-party server, and it never reads your browser cookies. Everything is read-only: it cannot register you for a course, drop one, or change anything in OBS. The instructor ratings come from notkutusu.com's public "hocametre" pages, which need no login, so nothing about you is sent there either. Details: docs/security.md.
What it can do
Ninova. Reads your dashboard and course list, announcements, class and lesson files, assignments (with detail pages and deadlines), grades, message boards, attendance, and remote-learning sessions — plus a combined per-course overview. It can also sync all courses, track what changed since last time, and list upcoming deadlines.
OBS. Reads your profile, semester history and GPA, final and in-term grades, the full course history, registered courses, weekly and exam schedules, internships, announcements, "Mezuniyetime Ne Kaldı" (graduation progress), and the official transcript PDF.
Course-registration planning. Reads the public OBS course schedule of the upcoming term (every section with CRN, day/time, instructor, room, quota, and remaining seats — no login needed), evaluates each course's published prerequisites against your passed courses through your cohort's course-plan equivalences (so renamed course codes are matched correctly), lists which required and elective courses you can actually take this term, checks a candidate CRN set for time clashes, and projects your GPA under hypothetical grades.
Hocametre. Looks up instructors on notkutusu.com's anonymous student ratings (note sharing, helpfulness, homework load, attendance strictness, teaching) and attaches them to the sections of a course so you can compare instructors before picking a CRN. Duplicate profiles of the same instructor are merged with vote-weighted averages.
Full tool reference and self-hosting (remote HTTP server for ChatGPT / Claude.ai connectors, Docker, environment variables, running from source): docs/advanced.md.
License
MIT. Not affiliated with İTÜ; use with your own account.
Available Tools
63 toolsauth_statusAuthentication StatusA
Check whether Ninova credentials are configured and whether a fresh session can be created.
Inputs: no named parameters. Returns: object
crawl_courseCrawl CourseB
Inventory pages and downloadable resources inside a Ninova course tree.
Inputs: course_url (required), max_depth, max_pages, include_downloads. Returns: object
diff_snapshotDiff SnapshotC
Compare the current state of a Ninova page against a previously stored snapshot.
Inputs: url (required), label, snapshot_path. Returns: object
download_resourceDownload ResourceB
Download a Ninova file or other authenticated resource to disk.
Inputs: url (required), filename, output_dir. Returns: object
get_course_announcementsGet Course AnnouncementsC
Return announcements for a specific Ninova course.
Inputs: course (required), limit, include_full_text. Returns: object
get_course_assignmentsGet Course AssignmentsC
Return a course's assignment list together with each assignment's full detail page.
Inputs: course (required), limit. Returns: object
get_course_attendanceGet Course AttendanceC
Read the Ninova 'Yoklama' page for a course.
Inputs: course (required). Returns: object
get_course_class_filesGet Course Class FilesC
List files and folders under the Ninova 'Sınıf Dosyaları' section for a course.
Inputs: course (required), max_depth, recursive. Returns: object
get_course_gradesGet Course GradesB
Read the Ninova 'Notlar' page for a course.
Inputs: course (required). Returns: object
get_course_infoGet Course InfoC
Return structured information from a course's 'Sınıf Bilgileri' page.
Inputs: course (required). Returns: object
get_course_lesson_filesGet Course Lesson FilesB
List files and folders under the Ninova 'Ders Dosyaları' section for a course.
Inputs: course (required), max_depth, recursive. Returns: object
get_course_message_boardGet Course Message BoardC
Read the Ninova 'Mesaj Panosu' page for a course.
Inputs: course (required), limit, include_thread_details. Returns: object
get_course_overviewGet Course OverviewB
Return a combined view of a course's sections, announcements, assignments, files, grades, message board, attendance, and remote learning routes.
Inputs: course (required), refresh, file_max_depth. Returns: object
get_course_remote_learningGet Course Remote LearningC
Read the Ninova 'Uzaktan Eğitim' page for a course.
Inputs: course (required). Returns: object
get_coursesGet CoursesA
Return all courses visible in the Ninova dashboard.
Inputs: no named parameters. Returns: object
get_course_sectionsGet Course SectionsC
List the direct course routes exposed on the Ninova course home page.
Inputs: course (required). Returns: object
get_dashboardGet DashboardA
Read the Ninova dashboard and summarize courses, recent announcements, assignments, and messages.
Inputs: no named parameters. Returns: object
get_dashboard_announcementsGet Dashboard AnnouncementsC
Return the announcements listed under the Ninova dashboard's aggregated announcements page.
Inputs: limit, include_full_text. Returns: object
get_dashboard_assignmentsGet Dashboard AssignmentsC
Return the assignments listed under the Ninova dashboard's aggregated assignments page, including full details.
Inputs: limit. Returns: object
get_upcoming_deadlinesGet Upcoming DeadlinesC
Return assignments whose submission deadline is approaching based on the stored tracking snapshot.
Inputs: days, refresh. Returns: object
get_updatesGet Tracked UpdatesC
Read the stored Ninova tracking history and return recent detected changes.
Inputs: limit, course, entity_type. Returns: object
hocametre_get_instructorGet Hocametre Instructor RatingsA
Return one instructor profile's anonymous student ratings (note sharing, helpfulness, homework load, attendance strictness, teaching skills; each 1-5 with vote counts) and, optionally, the newest student comments. No login required.
Inputs: slug (required), comment_limit, include_comments. Returns: object
hocametre_lookup_instructorsLook Up Instructor RatingsA
Resolve several instructor names (as printed in the OBS schedule) to their hocametre ratings. Returns every matching profile, most-voted first, plus a vote-weighted 'combined' score because the same instructor is often split across duplicate profiles. No login required.
Inputs: names (required), comment_limit, include_comments. Returns: object
hocametre_rate_course_sectionsRate Course Sections by InstructorA
For each given course code, list every section published in the public OBS schedule for the upcoming term (CRN, times, room, quota, remaining seats) together with its instructor's hocametre ratings, so sections of the same course can be compared by instructor. No login required.
Inputs: codes (required), level, comment_limit, only_available, +1 more. Returns: object
hocametre_search_instructorsSearch Hocametre InstructorsA
Search notkutusu.com's public 'hocametre' instructor ratings by (partial) instructor name and return matching profiles with their slugs. No login required; the same person may appear as several duplicate profiles.
Inputs: query (required), limit. Returns: object
list_coursesList CoursesA
List all discovered Ninova courses from the dashboard.
Inputs: no named parameters. Returns: object
obs_api_getRead OBS API EndpointA
Read any /api/ogrenci/... OBS endpoint directly and return the raw JSON. Read-only escape hatch.
Inputs: path (required). Returns: object
obs_auth_statusOBS Authentication StatusA
Check whether the ITU account can sign in to OBS (obs.itu.edu.tr) via girisv3 single sign-on.
Inputs: no named parameters. Returns: object
obs_check_prerequisitesCheck Course PrerequisitesB
Decide which courses the student may register for, by evaluating each course's published prerequisite expression against their own passed courses, expanded through the course-plan equivalences that cover renamed course codes. Prerequisites reflect the programme's current definitions even for an older plan. Defaults to every course still required for graduation.
Inputs: codes, program, assume_passed. Returns: object
obs_get_academic_standingAcademic StandingB
Return the semester-by-semester GPA, semester GPA, credit, and class-level history.
Inputs: no named parameters. Returns: object
obs_get_announcementsGet OBS AnnouncementsC
Return announcements published in OBS.
Inputs: page, limit. Returns: object
obs_get_attendanceGet Course AttendanceA
Return the attendance record for one registered class, identified by its OBS class id.
Inputs: class_id (required). Returns: object
obs_get_course_historyFull Course HistoryC
Return every graded course across every semester, plus pass/fail counts and the list of failed courses.
Inputs: include_empty. Returns: object
obs_get_elective_optionsElective Options This TermA
For every elective slot the student has not yet filled: the pool of eligible courses, which of them run this term with CRNs and times, and whether the prerequisites are met.
Inputs: level, only_offered, program_code, assume_passed, +1 more. Returns: object
obs_get_elective_poolElective PoolB
Return every course that can fill one elective slot of the student's course plan, by group id.
Inputs: group_id (required). Returns: object
obs_get_exam_scheduleGet Final Exam ScheduleC
Return the final exam dates, times, and rooms for one semester.
Inputs: semester. Returns: object
obs_get_gradesGet Semester GradesA
Return the final letter grades for one semester, with grade points and pass/fail flags.
Inputs: semester. Returns: object
obs_get_graduation_progressGraduation ProgressB
Return 'Mezuniyetime Ne Kaldı': the course plan requirements, credits earned vs. required, GPA and internship requirements, every completed course, and every course still missing.
Inputs: program, include_raw, include_courses. Returns: object
obs_get_interim_gradesGet In-Term GradesB
Return published in-term grades (midterm, quizzes, final) for a semester's courses, each with the class mean, standard deviation, the student's rank, and the component weight — enough to estimate a letter grade before it is posted.
Inputs: course, semester. Returns: object
obs_get_internshipsGet Internship RecordsA
Return the student's recorded internships.
Inputs: no named parameters. Returns: object
obs_get_profileGet OBS ProfileB
Return the student's personal details, student number, faculty, department, advisors, and academic programs.
Inputs: no named parameters. Returns: object
obs_get_registered_coursesGet Registered CoursesB
Return the courses the student is registered to for one semester, with CRN, place, and time.
Inputs: semester. Returns: object
obs_get_registration_optionsRegistration OptionsB
For every course still required for graduation: which codes satisfy it (including renamed equivalents), whether any of them is offered this term with CRNs and meeting times, and whether the prerequisites are met. The single call to drive course-registration planning.
Inputs: level, program_code, assume_passed, only_eligible. Returns: object
obs_get_registration_statusCourse Registration StatusA
Return whether course registration is currently open for the student, per semester.
Inputs: no named parameters. Returns: object
obs_get_scheduleGet Weekly ScheduleB
Return the weekly class schedule for one semester, sorted by day and start time.
Inputs: semester. Returns: object
obs_get_semester_statusSemester Academic StatusB
Return the academic status snapshot (class level, credits, GPA) for one semester.
Inputs: semester. Returns: object
obs_get_transcriptDownload TranscriptB
Download the official transcript preview PDF from OBS and save it to disk.
Inputs: filename, language, output_dir. Returns: object
obs_list_semestersList OBS SemestersA
List every academic semester available for this student, with the internal semester id and term code.
Inputs: no named parameters. Returns: object
obs_project_gpaProject GPAA
Project the cumulative GPA under hypothetical grades, e.g. ["YZV 201E:CC", "ING 201A:BB"]. Models ITU's rule that only the last attempt of a course counts and that equivalent course codes are the same course. Reports whether the reconstruction still matches the GPA OBS itself reports, so a silent model drift is visible.
Inputs: assume_grades. Returns: object
obs_public_active_termPublic Active TermA
Return the term whose course schedule is currently published on the public OBS pages, with its term code. This is usually the upcoming term, not the one registration still calls current. No login required.
Inputs: level. Returns: object
obs_public_check_conflictsCheck Schedule ConflictsA
Check a candidate set of sections for time clashes and return the resulting weekly timetable. Each selection is {code, crn}; the CRN can be omitted when a course has only one section.
Inputs: selections (required), level. Returns: object
obs_public_find_coursesFind Public Course SectionsB
Look up several courses at once by code and return their published sections. No login required.
Inputs: codes (required), level, only_available. Returns: object
obs_public_get_equivalencesPublic Course EquivalencesA
Return which courses count in place of a plan course, for one course plan and branch. This is how renamed course codes are reconciled across cohorts. No login required.
Inputs: branch (required), plan_id (required), program (required), plan_type_id. Returns: object
obs_public_get_prerequisitesPublic Course PrerequisitesA
Return the published prerequisite expression and minimum completed credits for every course in a branch. These reflect the programme's current definitions, not any one course plan. No login required.
Inputs: branch (required). Returns: object
obs_public_get_schedulePublic Course ScheduleA
Return every published section for a course branch: CRN, meeting days and times, instructor, room, quota, and remaining seats. No login required.
Inputs: branch (required), day, level, instructor, +2 more. Returns: object
obs_public_list_branchesList Course Branch CodesA
List every course branch code (BLG, YZV, MAT, ...) published for a program level. No login required.
Inputs: level. Returns: object
obs_public_list_plansList Course PlansA
List the course plans published for a programme, with their plan ids. No login required.
Inputs: program (required), plan_type_id. Returns: object
obs_public_registration_termPublic Registration TermB
Return the term the registration system reports as current, which lags the published schedule. No login required.
Inputs: level. Returns: object
obs_refresh_sessionRefresh OBS SessionB
Force a new OBS login and issue a fresh API token.
Inputs: no named parameters. Returns: object
read_pageRead Ninova PageC
Fetch any Ninova page and return a structured summary of text, headings, links, tables, and attachments.
Inputs: url (required), link_limit, include_text. Returns: object
refresh_sessionRefresh Ninova SessionA
Force a new login with NINOVA_USERNAME and NINOVA_PASSWORD.
Inputs: no named parameters. Returns: object
snapshot_pageSnapshot PageB
Save a structured snapshot of a Ninova page for later comparison.
Inputs: url (required), label. Returns: object
sync_all_coursesSync All CoursesA
Fetch all visible courses, store a tracking snapshot, and return newly detected changes since the previous sync.
Inputs: course_limit, include_files, file_max_depth. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 63 tools
The server mixes three domains (Ninova LMS, OBS student records, and public hocametre ratings) with many overlapping tools: obs_get_registered_courses vs obs_get_schedule vs obs_get_registration_options, get_course_* vs crawl_course vs read_page, and auth_status vs obs_auth_status vs refresh_session vs obs_refresh_session. Several tools have similar purposes (e.g., get_dashboard_announcements vs get_course_announcements, obs_get_elective_pool vs obs_get_elective_options) and the distinction between Ninova and OBS is not obvious from names alone.
There is a consistent verb_noun pattern within each domain (list_courses, crawl_course, download_resource; obs_get_*, obs_public_*; get_course_*), but the three domains use different prefixes and styles: bare verbs (crawl_course, download_resource), obs_* and obs_public_* with get_/list_/check_/find_ verbs, and get_* for Ninova. The naming is readable but the mixed prefixes and inconsistent verb choices (list vs get vs crawl vs read) create moderate inconsistency.
63 tools is far beyond the typical well-scoped MCP server. While the server covers three distinct domains (Ninova LMS, OBS student portal, public hocametre), the count is excessive and many tools are narrow page-readers (get_course_announcements, get_course_class_files, get_course_lesson_files, get_course_info, get_course_sections, get_course_grades, get_course_message_board, get_course_attendance, get_course_remote_learning) that could be consolidated.
For the apparent domains, the coverage is quite thorough: Ninova has course listing, file download, announcements, assignments, grades, attendance, and change tracking; OBS has profile, grades, schedule, registration, prerequisites, electives, GPA projection, and an API escape hatch; public data has schedules, prerequisites, equivalences, and instructor ratings. Minor gaps exist (e.g., no OBS course registration action, no hocametre comment posting) but the read-only/planning focus is well covered.
Maintenance
Related MCP Connectors
One MCP server for the services your AI needs: memory, files, Microsoft 365, kanban and more.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that turns UPB Virtual (Moodle) into a structured knowledge source, enabling AI assistants to query courses, assignments, deadlines, announcements, and sync materials via REST API.MIT
- AlicenseNot gradedqualityDmaintenanceA powerful Model Context Protocol (MCP) server that seamlessly integrates AI assistants with Moodle Learning Management System. Enable your AI assistant to access courses, retrieve educational content, download resources, and search through your learning materials.30 npm1MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that connects AI assistants to university D2L Brightspace and Piazza, enabling query of courses, grades, assignments, deadlines, files, and Piazza posts.7MIT
- AlicenseBqualityBmaintenanceUnofficial local MCP server for Istanbul Technical University (İTÜ) students. Reads your own Ninova LMS, OBS and Portal data with your own account: assignments and deadlines, grades and cumulative GPA simulation, schedule and exams, registration, course archive, library and campus services. Read-only by default; the two write tools ask for confirmation.10868 PyPI17MIT