Skip to main content
Glama

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)

  1. Download your platform's file from the latest release:

    • macOS (Apple Silicon / M1–M4): ninova-mcp-*-darwin-arm64.mcpb

    • Windows: ninova-mcp-*-windows-amd64.mcpb

  2. Double-click the file. Claude Desktop opens an install dialog.

  3. 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-mcp

Other 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 tools
auth_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

    C2.9/5.0

    Scored across 63 tools

    Disambiguation2/5

    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.

    Naming Consistency3/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP 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
    • A
      license
      Not graded
      quality
      D
      maintenance
      A 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 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      An MCP server that connects AI assistants to university D2L Brightspace and Piazza, enabling query of courses, grades, assignments, deadlines, files, and Piazza posts.
      7
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Unofficial 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.
      108
      68 PyPI
      17
      MIT