İTÜ MCP
PYPI · ITU-MCP
İTÜ Ninova, OBS, Portal, kampüs servisleri ve kütüphane için MCP sunucusu
Available components
Last scanned (7 hours ago)
Scores higher than 73% of PyPI servers
Category Education and Research
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
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
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 →
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 →
obs_list_registered_courses OBS 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.
| Name | Type | Req | Description |
|---|---|---|---|
| include_raw | boolean | – | 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 | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
obs_list_semesters OBS Semesters ~68
List academic semesters available in OBS for the student.
| Name | Type | Req | Description |
|---|---|---|---|
| include_raw | boolean | – | 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… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
obs_save_registration_draft 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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_replace | boolean | – | – |
| confirm | boolean | yes | – |
| crns | array | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
obs_search_courses 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
obs_simulate_cumulative_gpa 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| crns | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
plan_remaining_courses 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit_terms | integer | – | – |
| program_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
pool_list_documents Pool Sites: 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.
| Name | Type | Req | Description |
|---|---|---|---|
| course_code | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
pool_read_document Pool Sites: 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.
| Name | Type | Req | Description |
|---|---|---|---|
| max_chars | integer | – | – |
| url | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
proquest_search Search ProQuest (İTÜ) ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| from_year | – | – | – |
| full_text_only | boolean | – | – |
| peer_reviewed_only | boolean | – | – |
| query | string | yes | – |
| to_year | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
read_page Read Ninova Page ~60
Fetch any Ninova page and return a structured summary of text, headings, links, tables, and attachments.
| Name | Type | Req | Description |
|---|---|---|---|
| compact | boolean | – | – |
| include_text | boolean | – | – |
| link_limit | integer | – | – |
| url | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
read_resource_text 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.
| Name | Type | Req | Description |
|---|---|---|---|
| filename | – | – | – |
| max_chars | integer | – | – |
| path | – | – | – |
| save_download | boolean | – | – |
| url | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
refresh_session Refresh Ninova Session ~23
Force a new login with NINOVA_USERNAME and NINOVA_PASSWORD.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
search_articles Search Academic 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.
| Name | Type | Req | Description |
|---|---|---|---|
| article_type | – | – | – |
| from_year | – | – | – |
| limit | integer | – | – |
| open_access_only | boolean | – | – |
| page | integer | – | – |
| query | string | yes | – |
| sort | string | – | – |
| to_year | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
search_campus_locations Search Campus Buildings ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| query | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
search_content Search Fetched Course 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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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"]. |
| limit | integer | – | Results per call, 1 to 25. |
| offset | integer | – | Results to skip; pass next_offset of the previous call for the next page. |
| query | string | yes | Words 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 Search İTÜ 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'.
| Name | Type | Req | Description |
|---|---|---|---|
| first_name | string | yes | – |
| identity_type | string | – | – |
| include_details | boolean | – | – |
| last_name | string | yes | – |
| limit | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
snapshot_page Snapshot Page ~33
Save a structured snapshot of a Ninova page for later comparison.
| Name | Type | Req | Description |
|---|---|---|---|
| label | – | – | – |
| url | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
submit_assignment Submit Assignment File ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_replace | boolean | – | – |
| assignment | – | – | – |
| confirm | boolean | – | – |
| course | – | – | – |
| file_path | string | yes | – |
| slot_description | – | – | – |
| slot_index | – | – | – |
| upload_url | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
sync_all_courses 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.
| Name | Type | Req | Description |
|---|---|---|---|
| course_limit | – | – | – |
| file_max_depth | integer | – | – |
| include_assignment_details | boolean | – | – |
| include_files | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
unwatch_course_sections 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'.
| Name | Type | Req | Description |
|---|---|---|---|
| clear_all | boolean | – | – |
| crns | – | – | – |
| stale_only | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
watch_course_sections 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.
| Name | Type | Req | Description |
|---|---|---|---|
| crns | array | yes | – |
| department_code | – | – | – |
| program_type | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
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
claude mcp add yatuk-itu-mcp -- uvx itu-mcp
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.