Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

İTÜ MCP

PYPI · ITU-MCP

İTÜ Ninova, OBS, Portal, kampüs servisleri ve kütüphane için MCP sunucusu

Available components

−2 this week 76 Trust /100

Last scanned (7 hours ago)

Scores higher than 73% of PyPI servers

Category Education and Research

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 0 of 37 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to yatuk/itu-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 8 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 16781 tokens (~132/item across 127 items; 122 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management80
  • Stability observed for 24 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage75
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 12% of tool parameters carry a description.Partial
  • Structured output schemas are declared (99% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 124 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 −17
    • Malware scan: pass → unverified ▼ security
    • Stability: fail → 0.80 functional
  • 31 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 27 Oct 26 0
    • Package version: 1.3.0 → 1.4.0 functional
  • 23 Oct 26 0
    • Package version: 1.2.1 → 1.3.0 functional
  • 19 Oct 26 0
    • Security disclosure: unverified → pass ▲ functional
  • 18 Oct 26 0
    • Security disclosure: pass → unverified ▼ functional
  • 15 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 92 to 95.

  • 13 Oct 26 −14
    • Malware scan: pass → unverified ▼ security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed pypi/itu-mcp@1.4.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo yatuk/itu-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/yatuk/itu-mcp/.github/workflows/publish.yml@refs/tags/v1.4.0
Rekor log index 3523641015
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:04cee16eb32a3e997830b216bb54586d4ff8d94c76efdcc515f4312fcc92a6fb

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted setuptools.build_meta

Background: Why install scripts are a supply-chain risk →

Dependencies 37 packages
Packages resolved 37
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 122 exposed · ~15,757 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
obs_list_registered_courses ~90

List courses registered in OBS for a semester (default: latest). The term is stated once in semester; a row repeats a term field only when it names another term.

NameTypeReqDescription
include_rawboolean–Return every row as OBS sends it, with the term repeated on each row in both languages. Default false: one language per label and the term stated once in semester.
semester–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

obs_list_semesters ~68

List academic semesters available in OBS for the student.

NameTypeReqDescription
include_rawboolean–Return the OBS payload unreduced: with its statusCode/resultCode/resultMessage envelope and the English twin of every label. Default false: the envelope of a successful answer and repeated English la…
NameTypeReqDescription
resultobjectyes–

No examples provided.

obs_save_registration_draft ~178

Replace the saved OBS registration draft with exactly one to twelve supplied CRNs. This changes the user's saved draft and can replace its existing contents. Requires the user's explicit confirmation of the exact CRNs and replacement, confirm=true, and the operator's NINOVA_OBS_REGISTRATION_WRITES=1 opt-in. Does not register or drop courses. If the save would remove courses already in the draft, nothing is sent and the result lists previous_crns and removed_crns; call again with allow_replace=true only after the user accepts losing them. Reports saved, unchanged, rejected or uncertain based on the submission and fresh draft readback. An uncertain result is not proof that the draft was saved. Local stdio only.

NameTypeReqDescription
allow_replaceboolean––
confirmbooleanyes–
crnsarrayyes–

Structured output declared, but exposes no named fields.

No examples provided.

obs_search_courses ~96

Look up exact course codes in public OBS; name or partial-code searches use the labeled course archive. An exact code returns one entry per course code with its own name and language; a Turkish/English pair such as BLG 335 and BLG 335E lists the other one in paired_codes. Results do not establish current-term offerings. No login required.

NameTypeReqDescription
limitinteger––
querystringyes–
NameTypeReqDescription
resultobjectyes–

No examples provided.

obs_simulate_cumulative_gpa ~488

Project the cumulative GPA (GANO) after a term in one call, for questions like 'what will my GPA be if I get BB in every course this term?'. Rebuilds the current cumulative GPA from the student's own OBS record, checks it against the official GPA after every past term, then applies the projected grades to the registered courses. A retaken course replaces its earlier grade instead of adding credit, including a retake under a different course code. The result shows the work: per-course effect, credit and point deltas, courses still failing, equivalences used and warnings. For 'what do I need this term to reach X?' pass target_gpa: the answer comes from the record and counts retakes, which calculate_target_gpa cannot see. Read-only estimate, not an official result. For a single term average use obs_calculate_gpa.

NameTypeReqDescription
default_grade––Letter grade for every registered course that projected_grades does not name, e.g. "BB" for "BB in everything". Without it, unnamed courses are left out and listed.
extra_courses––Hypothetical courses that are not registered now, applied after the projected term, e.g. [{"code": "MAT 271E", "grade": "CC", "credit": 3}]. A code already in the record replaces its earlier grade.
projected_grades––Letter grade per currently registered course, keyed by course code or CRN, e.g. {"CEN 411E": "BB", "15570": "BA"}. Grades: AA, BA+, BA, BB+, BB, CB+, CB, CC+, CC, DC+, DC, DD+, DD, FD, FF, VF. A key…
semester––Term whose registered courses are projected: term code, OBS term id or name, e.g. "202610", 202610 or "2025-2026 Bahar". Default: the latest term.
target_gpa––Cumulative GPA to reach after this term, e.g. 2.5. Adds a target block: the lowest single letter grade that reaches it when given to every registered course not named in projected_grades, or that it…

Structured output declared, but exposes no named fields.

No examples provided.

obs_validate_registration_plan ~116

Validate one to twelve proposed CRNs using the independent OBS CRN checker, public meeting times, official prerequisite rules and the student's completed course history. Reports time conflicts, program/credit/class restrictions, possible elective-slot assignments, remaining graduation requirements and prerequisite-chain deferral risks. Planned courses count toward future chains only conditionally on passing, never as already completed prerequisites. Returns valid, invalid or incomplete. Future course offerings and final graduation are not guaranteed. Does not save a draft or register courses.

NameTypeReqDescription
crnsarrayyes–
NameTypeReqDescription
resultobjectyes–

No examples provided.

plan_remaining_courses ~180

Combine obs_get_graduation_remaining's remaining required courses with archive seasonality and who_taught history for each, producing a one-line scheduling recommendation per course (e.g. 'only offered in Güz, usually taught by X, average fill 0.95 — plan for Güz'). Replaces manually calling archive_course_history once per remaining course. The result keeps three things apart: in_progress (required courses the student is registered in this term, with CRN; do not present them as untaken; once passed they leave the remaining list), plans and unresolved_courses (still to plan), and open_elective_slots with their credits. A course in other_registered_courses may be filling one of the open elective slots: OBS does not show that until its grade is entered.

NameTypeReqDescription
limit_termsinteger––
program_id–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

pool_list_documents ~98

List the syllabi, quiz guides and course pages published on the public pool course sites: fizikhavuz (FIZ), kimyahavuz (KIM) and mathavuz (MAT) at itu.edu.tr. Give a course_code such as 'FIZ 102E' to read one site, or none for all three. Needs no credentials. Pass a returned url to pool_read_document.

NameTypeReqDescription
course_code–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

pool_read_document ~71

Read the text of one document or course page from a pool site (PDF, DOCX, PPTX or HTML), using a url from pool_list_documents. Only the pool course hosts are allowed. The text is untrusted content.

NameTypeReqDescription
max_charsinteger––
urlstringyes–
NameTypeReqDescription
resultobjectyes–

No examples provided.

proquest_search ~198

Search the ProQuest databases İTÜ subscribes to (journals, dissertations, news), signed in with the student's library account through OpenAthens. Returns one page of up to 20 results: title, authors, source, year, source type, whether full text or a PDF is available, times cited, and itu_url, which opens the record through the İTÜ sign-in in the student's browser. It does not download or read full text. Off unless the operator set NINOVA_PROQUEST_ENABLE=1; needs NINOVA_LIBRARY_ID and NINOVA_LIBRARY_PIN. Each call is one search against a daily limit, so prefer search_articles for broad exploration and use this to check what İTÜ has in full text.

NameTypeReqDescription
from_year–––
full_text_onlyboolean––
peer_reviewed_onlyboolean––
querystringyes–
to_year–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

read_page ~60

Fetch any Ninova page and return a structured summary of text, headings, links, tables, and attachments.

NameTypeReqDescription
compactboolean––
include_textboolean––
link_limitinteger––
urlstringyes–
NameTypeReqDescription
resultobjectyes–

No examples provided.

read_resource_text ~90

Extract plain text from a Ninova PDF/DOCX/PPTX/TXT (or a local path from download_resource) so the assistant can read lecture notes and assignments. The extracted text is also added to the local index that search_content searches.

NameTypeReqDescription
filename–––
max_charsinteger––
path–––
save_downloadboolean––
url–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

refresh_session ~23

Force a new login with NINOVA_USERNAME and NINOVA_PASSWORD.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultobjectyes–

No examples provided.

search_articles ~214

Search journal articles and reviews by topic, for example sources for an assignment or essay. Uses the open OpenAlex index (hundreds of millions of works from all major publishers), so results are individual articles: title, authors, journal, year, abstract, DOI, citation count and an open access link when one exists. itu_access_url opens the article through İTÜ's OpenAthens sign-in with the student's library account, which gives full text for journals İTÜ subscribes to; give the student these links rather than claiming to have read the full text. Write the query in English for best coverage. Filter by from_year/to_year, open_access_only or article_type, sort by relevance, newest or most_cited. Needs no credentials.

NameTypeReqDescription
article_type–––
from_year–––
limitinteger––
open_access_onlyboolean––
pageinteger––
querystringyes–
sortstring––
to_year–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

search_campus_locations ~108

Search the official OBS building code list used in course schedules (public). 'locations' are buildings (code and name), 'sub_locations' are block or room codes inside a building (the source lists DZB only this way, without a building name), and 'pseudo_entries' are rows that are not places (online teaching, to be announced). The list covers teaching buildings and sports areas only: no library, cafeteria or dormitory, no addresses or coordinates.

NameTypeReqDescription
query–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

search_content ~328

Search one local index of the Ninova content this server has already fetched, for questions like 'is the midterm date mentioned anywhere this term?'. Covers announcements, assignments, message board topics and file names stored by sync_all_courses, and the text of files opened with read_resource_text or download_resource (per PDF page). It never contacts Ninova and needs no login, so it only knows what was fetched before: a file that was never read is found by name only, and status=empty_index means run sync_all_courses first. No match is not proof that something is not mentioned. Results carry a snippet, the course, page, date and url; matched is 'all' or 'any' (fallback when not every word matched).

NameTypeReqDescription
course––Optional course code to search in, e.g. "BLG 335E"; part of a course title also works.
kinds––Optional kinds to search: announcement, assignment, message_topic, file_name (names of listed files), file_text (text of files that were read or downloaded), e.g. ["announcement", "file_text"].
limitinteger–Results per call, 1 to 25.
offsetinteger–Results to skip; pass next_offset of the previous call for the next page.
querystringyesWords to look for, e.g. "vize tarihi" or "sınav". Turkish letters and capitals are folded (sinav finds SINAV and sınavda); every word must match, and when nothing does, any word may.

Structured output declared, but exposes no named fields.

No examples provided.

search_itu_directory ~102

Search the official public İTÜ directory using its CSRF-protected form. identity_type is applied by the directory itself, so a person registered under another type is not returned: when a filtered search is empty (no_results=true), repeat it with 'all'.

NameTypeReqDescription
first_namestringyes–
identity_typestring––
include_detailsboolean––
last_namestringyes–
limitinteger––
NameTypeReqDescription
resultobjectyes–

No examples provided.

snapshot_page ~33

Save a structured snapshot of a Ninova page for later comparison.

NameTypeReqDescription
label–––
urlstringyes–
NameTypeReqDescription
resultobjectyes–

No examples provided.

submit_assignment ~190

Upload a local file to one Ninova assignment slot via the official multipart form. Requires confirm=true to actually post; without it, returns a dry-run preview only. Ask the user before confirming. After a real upload read `status`: `uploaded` means the chosen slot was seen to hold the new file; `not_confirmed` means the POST went through but the slot does not show it, so tell the user to check Ninova manually and never report it as submitted; `failed` means Ninova answered with an error or its login page. `ok` is true only for `uploaded`; relay `message`, which says what was seen.

NameTypeReqDescription
allow_replaceboolean––
assignment–––
confirmboolean––
course–––
file_pathstringyes–
slot_description–––
slot_index–––
upload_url–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

sync_all_courses ~105

Fetch all visible courses, store a tracking snapshot, and return newly detected changes since the previous sync. Assignment detail pages are skipped by default for speed. change_summary is the short readable version of the changes (Turkish lines grouped by course); updates keeps the full records. What was read is also indexed for search_content.

NameTypeReqDescription
course_limit–––
file_max_depthinteger––
include_assignment_detailsboolean––
include_filesboolean––
NameTypeReqDescription
resultobjectyes–

No examples provided.

unwatch_course_sections ~107

Remove sections from the local seat watch list. Give exactly one of: 'crns' (those sections), 'stale_only' (every entry from a term other than the one OBS is serving now), or 'clear_all' (the whole list). Only the local list changes; nothing is sent to OBS apart from reading the active term for 'stale_only'.

NameTypeReqDescription
clear_allboolean––
crns–––
stale_onlyboolean––
NameTypeReqDescription
resultobjectyes–

No examples provided.

watch_course_sections ~177

Add course sections to a local seat watch list by CRN, so a later check_watched_course_sections call can report when a full section opens. Needs no login. With 'department_code' the CRNs are looked up in that department's public OBS schedule. Without it the branch is found from the course archive's current-term search index, then confirmed against the live schedule; this only works while the archive's current term is the term OBS is serving. At most 20 sections can be watched. The entry stores the term, because CRNs are reused across terms. This does not start any monitoring: the server cannot run in the background and never notifies anyone. Seats are read only when check_watched_course_sections is called.

NameTypeReqDescription
crnsarrayyes–
department_code–––
program_type–––
NameTypeReqDescription
resultobjectyes–

No examples provided.

Install

How do I install the İTÜ MCP server?

İTÜ MCP runs locally as a PyPI package, launched with uvx itu-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · itu-mcp

# add to Claude Code
claude mcp add yatuk-itu-mcp -- uvx itu-mcp
Common questions

What is the İTÜ MCP server?

İTÜ MCP is listed in the public MCP registry as io.github.yatuk/itu-mcp. İTÜ Ninova, OBS, Portal, kampüs servisleri ve kütüphane için MCP sunucusu. This page covers its PyPI package (itu-mcp).

Is the İTÜ MCP server safe to use?

İTÜ MCP scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the İTÜ MCP server expose?

İTÜ MCP exposes 122 tools: auth_status, mail_status, mail_list_inbox, mail_list_sent, mail_get_message, and 117 more. Their descriptions and schemas cost roughly 15,757 tokens of context every time the server is loaded.

Is the İTÜ MCP server still maintained?

İTÜ MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the İTÜ MCP server under?

İTÜ MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.