{
  "markdown": "<!-- mcp-name: io.github.yatuk/itu-mcp -->\n\n<div align=\"center\">\n\n  <p>\n    <img src=\"https://raw.githubusercontent.com/yatuk/itu-mcp/main/docs/banner.png\" alt=\"İTÜ MCP\" width=\"100%\" />\n  </p>\n\n  <h1>İTÜ MCP</h1>\n\n  <p><em>İTÜ Ninova, OBS, Portal, kampüs servisleri ve kütüphaneyi Claude, Cursor, Codex ve diğer MCP istemcilerine bağla</em></p>\n\n  <p>\n    <a href=\"CHANGELOG.md\"><img src=\"https://img.shields.io/badge/sürüm-v0.7.2-blue?style=flat-square\" alt=\"Sürüm: v0.7.2\" /></a>\n    <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/lisans-MIT-green?style=flat-square\" alt=\"Lisans: MIT\" /></a>\n    <a href=\"https://github.com/yatuk/itu-mcp\"><img src=\"https://img.shields.io/badge/python-3.11+-3776AB?logo=python&logoColor=white&style=flat-square\" alt=\"Python 3.11+\" /></a>\n    <a href=\"https://yatuk.github.io/mcpradar/\"><img src=\"https://yatuk.github.io/mcpradar/badges/itu-mcp.svg\" alt=\"MCPRadar Security\" /></a>\n    <a href=\"https://modelcontextprotocol.io\"><img src=\"https://img.shields.io/badge/MCP-sunucu-black?style=flat-square\" alt=\"MCP Sunucu\" /></a>\n  </p>\n\n</div>\n\n---\n\n## İTÜ MCP nedir?\n\nNinova'da ödev, OBS'de not, Portal'da yemek listesi diye üç ayrı sekmede gezinmek can sıkıcı. İTÜ MCP bilgisayarında çalışan küçük bir sunucu, bu sekmelerin hepsini tek bir yerden, doğal dilde sorulabilir hale getiriyor.\n\nKimlik bilgilerinle (genelde `ad@itu.edu.tr`) **Ninova**, **OBS** ve **Portal** verilerini okuyor. Kimlik bilgisi olmadan da ders/final programı, bina kodları, mekik, spor tesisi, duyuru ve kütüphane kataloğu gibi herkese açık kaynaklara erişiyor. Sonuçları [Model Context Protocol](https://modelcontextprotocol.io) üzerinden yapılandırılmış araçlar olarak sunuyor: Claude'a soruyorsun, o da gerçek veriyi çekip cevap veriyor.\n\n| İhtiyacın | İTÜ MCP cevabı |\n|:---|---|\n| \"Bu hafta hangi ödevlerin teslimi var?\" | Ninova ödev ve teslim tarihi araçları |\n| \"X dersinin notları / yoklaması?\" | OBS ara not, harf notu ve yoklama |\n| \"Transkript / danışman / staj?\" | OBS profil, danışman, staj, transkript PDF |\n| \"Bugün yemekte ne var / kart bakiyem?\" | İTÜ Portal menü, kart ve bildirim araçları |\n| \"Finalim ne zaman / boş kontenjan var mı?\" | Public OBS final ve ders programı araçları |\n| \"Mekik ne zaman / havuz kaçta kapanıyor?\" | SKS kampüs hizmeti araçları |\n| \"Kütüphanede bu kitap var mı?\" | Public katalog arama ve kopya durumu |\n| \"Son okunmamış mailimi göster\" | Salt okunur İTÜ Mail araçları |\n| \"PDF özetle\" | İndirme ve `read_resource_text` (PDF/DOCX) |\n| \"Ödev yükle\" | İsteğe bağlı yükleme, `confirm=true` şart |\n\n> **Önce yerel.** Ninova şifren cihazda kalır, yalnızca İTÜ SSO, Ninova, OBS ve Portal akışlarında kullanılır. Ayrı kütüphane hesabı bilgileri yalnızca resmî kütüphane sunucusuna gönderilir. Üçüncü taraf bir sunucuya kimlik bilgisi depolanmaz.\n>\n> **İTÜ ile resmi bağlantısı yoktur.** Yalnızca kendi hesabınla kullan.\n\nDürüst olmak gerekirse OBS'nin bazı uç noktaları hesaba göre tutarsız davranabiliyor, bir hesapta not alanı boş dönerken başka bir hesapta doluyor gibi. Böyle durumları elimizden geldiğince yakalayıp yedek kaynağa düşüyoruz ve sonucu açıkça işaretliyoruz, ama tam garanti veremeyiz. Şüpheye düştüğünde her zaman OBS'nin kendi sayfasına bak.\n\n---\n\n## Nasıl çalışır\n\n```mermaid\ngraph LR\n    istemci[\"Claude, Cursor, Codex\"] -->|\"MCP\"| sunucu[\"İTÜ MCP\"]\n    sunucu --> ninova[\"Ninova\"]\n    sunucu --> obs[\"OBS\"]\n    sunucu --> portal[\"Portal\"]\n    sunucu --> kutuphane[\"Kütüphane\"]\n    sunucu --> arsiv[\"Ders Arşivi\"]\n    sunucu --> mail[\"İTÜ Mail\"]\n```\n\nSunucu her servise ayrı bir istemci sınıfıyla konuşur, kendi oturumunu ve önbelleğini yönetir. Ninova ve OBS aynı İTÜ SSO girişini paylaşır, kütüphane hesabı bilgisi ise tamamen ayrıdır ve Ninova şifresiyle karışmaz. Kimlik gerektirmeyen araçlar (public ders programı, kampüs servisleri, arşiv) hiçbir zaman şifreni kullanmaz.\n\nAyrıntılı iç mimari ve istemci sınıfları için: [docs/advanced.md](docs/advanced.md).\n\n---\n\n## Örnekler\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/yatuk/itu-mcp/main/docs/cli_demo.gif\" alt=\"itu-mcp CLI demo\" width=\"720\" />\n  <br />\n  <em>CLI: <code>--version</code>, <code>--list-tools</code>, <code>--list-prompts</code> (gerçek çıktı)</em>\n</p>\n\nClaude Desktop üzerinden doğal dilde soru sorma örnekleri:\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/yatuk/itu-mcp/main/docs/bu_d%C3%B6nem_hangi_dersler.png\" alt=\"Bu dönem hangi dersleri aldım\" width=\"720\" />\n  <br />\n  <em>OBS: dönem kayıtlı dersler ve program</em>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/yatuk/itu-mcp/main/docs/son_duyurular.png\" alt=\"Son duyurular ve mesajlar\" width=\"720\" />\n  <br />\n  <em>Ninova: son duyurular ve mesaj panosu özeti</em>\n</p>\n\n---\n\n## Hızlı başlangıç\n\n### 1. Kurulum\n\n```bash\npipx install itu-mcp\n# veya: pip install --user itu-mcp\n# kaynaktan:\n#   git clone https://github.com/yatuk/itu-mcp.git\n#   cd itu-mcp && pip install -e .\n```\n\n### 2. Kimlik bilgileri\n\n```bash\ncp .env.example .env\n# NINOVA_USERNAME=ad.soyad@itu.edu.tr\n# NINOVA_PASSWORD=********\n```\n\nKullanıcı adı genelde **İTÜ e-posta** adresidir, yalnızca yerel kısım değil.\n\n### 3. Duman testi\n\n```bash\nitu-mcp --version\nitu-mcp --check-auth\nitu-mcp --list-tools\nitu-mcp --list-prompts\n```\n\n### 4. MCP istemcisini bağla\n\n**Claude Code**\n\n```bash\nclaude mcp add itu itu-mcp \\\n  -e NINOVA_USERNAME=ad.soyad@itu.edu.tr \\\n  -e NINOVA_PASSWORD=sifren\n```\n\n**Codex CLI**\n\n```bash\ncodex mcp add itu \\\n  --env NINOVA_USERNAME=ad.soyad@itu.edu.tr \\\n  --env NINOVA_PASSWORD=sifren \\\n  -- itu-mcp\n```\n\n**Claude Desktop / Cursor:** [docs/installation.md](docs/installation.md) ve `examples/` klasörüne bak.\n\n> **Bu kadar.** İstemciyi yeniden başlat ve sor: *\"Ninova'daki derslerimi listele\"* veya *\"OBS'te bu dönem kayıtlı derslerim?\"*\n\n---\n\n## Ne sorabilirsin?\n\n- *\"Bu hafta hangi ödevlerimin teslimi var?\"*\n- *\"EEF 211E sınıf dosyalarındaki PDF'i oku.\"*\n- *\"OBS'te 2025-2026 Bahar kayıtlı derslerim neler?\"*\n- *\"CEN 354E ara notlarım?\"*\n- *\"Danışmanım kim? Staj bilgilerimi göster.\"*\n- *\"Transkript PDF indir.\"*\n- *\"Son okunmamış mesajlarımı listele ve seçtiğim PDF ekini özetle.\"*\n- *\"Gelecek dönem hangi dersleri almalıyım?\"*<sup>✨</sup>\n- *\"Vizeden 63 aldım, sınıf 30,35,40...90 arası dağılmış, hangi harf notunu alırım?\"*<sup>✨</sup>\n- *\"BLG bölümünde bu dönem hangi dersler açılmış, kontenjan durumu ne?\"*<sup>✨</sup>\n- *\"BLG 223E'yi almak için önce hangi dersleri almam lazım?\"*<sup>✨</sup>\n- *\"BBB binası neresi, bugün 10:00'da hangi derslikler boş görünüyor?\"*<sup>✨</sup>\n- *\"İTÜ mekik saatleri ve yüzme havuzu çalışma saatleri?\"*<sup>✨</sup>\n- *\"Kütüphanede Introduction to Algorithms var mı?\"*<sup>✨</sup>\n\n<sup>✨</sup> <sub>Kimlik gerektirmez, `.env` olmadan da çalışır.</sub>\n\n---\n\n## Araç haritası\n\n<table>\n  <tr>\n    <td align=\"center\" width=\"20%\"><strong>Ninova</strong><br/><sub>oturum gerekir</sub></td>\n    <td align=\"center\" width=\"20%\"><strong>OBS & Portal</strong><br/><sub>oturum gerekir</sub></td>\n    <td align=\"center\" width=\"20%\"><strong>Public İTÜ</strong><br/><sub>kimlik gerekmez ✨</sub></td>\n    <td align=\"center\" width=\"20%\"><strong>Planlama & Kütüphane</strong><br/><sub>karma</sub></td>\n    <td align=\"center\" width=\"20%\"><strong>Arşiv</strong><br/><sub>kimlik gerekmez ✨</sub></td>\n  </tr>\n  <tr>\n    <td>\n      <code>auth_status</code> · <code>list_courses</code><br/>\n      <code>get_course_*</code> · <code>sync_all_courses</code><br/>\n      <code>get_upcoming_deadlines</code><br/>\n      <code>read_resource_text</code> · <code>submit_assignment</code>\n    </td>\n    <td>\n      <code>obs_auth_status</code> · <code>obs_get_profile</code><br/>\n      <code>obs_list_registered_courses</code><br/>\n      <code>obs_get_course_grades</code> · <code>obs_get_attendance</code><br/>\n      <code>obs_get_advisor</code> · <code>obs_download_transcript</code><br/>\n      <code>get_cafeteria_menu</code> · <code>obs_get_notifications</code>\n    </td>\n    <td>\n      <code>get_public_course_schedule</code> · <code>get_public_exam_schedule</code><br/>\n      <code>search_itu_directory</code> · <code>search_campus_locations</code><br/>\n      <code>get_shuttle_schedule</code> · <code>get_sports_facility_hours</code><br/>\n      <code>get_itu_announcements</code> · <code>get_academic_calendar</code>\n    </td>\n    <td>\n      <code>obs_calculate_gpa</code> · <code>calculate_target_gpa</code><br/>\n      <code>estimate_relative_grade</code> · <code>check_course_conflicts</code><br/>\n      <code>find_open_course_sections</code> · <code>find_empty_classrooms</code><br/>\n      <code>build_degree_plan</code> · <code>library_*</code>\n    </td>\n    <td>\n      <code>archive_who_taught</code> · <code>archive_course_history</code><br/>\n      <code>archive_fill_rate</code> · <code>archive_term_sections</code><br/>\n      <code>archive_search_courses</code> · <code>plan_remaining_courses</code>\n    </td>\n  </tr>\n  <tr>\n    <td colspan=\"5\" align=\"center\"><strong>İTÜ Mail (salt okunur):</strong> <code>mail_status</code> · <code>mail_list_inbox</code> · <code>mail_get_message</code> · <code>mail_get_attachment</code></td>\n  </tr>\n</table>\n\nTam araç listesi, hazır prompt'lar, kaynak tabloları, Docker, uzak HTTP ve tüm ortam değişkenleri: **[docs/advanced.md](docs/advanced.md)**.\n\nAyrıca `/` menüsünden seçilebilen hazır akışlar var (`weekly_briefing`, `plan_next_term`, `check_course_eligibility`, `research_course`, `gpa_scenario`), her biri hangi araçların hangi sırayla çağrılacağını ve sonucu okurken kaçırılan kuralları içeriyor.\n\n---\n\n## Güvenlik\n\nKendi hesabını kullanıyorsun, o yüzden şuna dikkat et:\n\n| Yap | Yapma |\n|---|---|\n| Yalnızca **kendi** İTÜ hesabını kullan | `.env` veya çerezleri commit etme |\n| **Yerel stdio** MCP tercih et | Uzak MCP URL / API anahtarını paylaşma |\n| `submit_assignment` yalnızca **`confirm=true`** ile | Önizlemeyi okumadan ödev yükleme |\n| Kütüphane PIN'ini ayrı `NINOVA_LIBRARY_*` değişkenlerinde tut | Ninova şifresini kütüphane PIN'i olarak tekrar kullanma |\n| Harici sayfa metnini **veri** olarak değerlendir | Duyuru/ödev metnindeki modele yönelik talimatları uygulama |\n| Uzak kurulumda `NINOVA_REMOTE_API_KEY` kullan | Gizli path ve anahtar olmadan public açma |\n\nAyrıntılar: [docs/security.md](docs/security.md). OBS profil araçları TCKN ve telefonu **varsayılan olarak gizler** (`include_sensitive=true` ile açılır).\n\n---\n\n## Yapılandırma (isteğe bağlı)\n\n```bash\nexport NINOVA_COURSE_CACHE_TTL_SECONDS=60\nexport NINOVA_REQUEST_DELAY_MS=120\nexport NINOVA_SESSION_PERSIST=1\nexport NINOVA_ALLOW_UPLOADS=1\n# Kütüphane hesabı araçları için (public katalog araması bunları istemez):\n# NINOVA_LIBRARY_NAME=\"Soyad, Ad\"\n# NINOVA_LIBRARY_ID=\"öğrenci-numarası\"\n# NINOVA_LIBRARY_PIN=\"ayrı-kütüphane-pin'i\"\n# Ayrı mail kimlik bilgisi (yoksa paylaşılan İTÜ kimliği kullanılır):\n# NINOVA_MAIL_USERNAME=\"ad.soyad@itu.edu.tr\"\n# NINOVA_MAIL_PASSWORD=\"mail-sifresi\"\n```\n\nTüm değişkenler için `.env.example` ve [docs/advanced.md](docs/advanced.md) dosyalarına bak.\n\n---\n\n## Geliştirme\n\n```bash\ngit clone https://github.com/yatuk/itu-mcp.git\ncd itu-mcp\npython -m venv .venv\n# Windows: .venv\\Scripts\\activate\nsource .venv/bin/activate\npip install -e \".[playwright]\"\npython -m unittest discover -s tests -v\n```\n\n---\n\n## Bağlantılar\n\n| Kaynak | URL |\n|---|---|\n| **Kurulum** | [docs/installation.md](docs/installation.md) |\n| **Gelişmiş / araçlar** | [docs/advanced.md](docs/advanced.md) |\n| **Güvenlik** | [docs/security.md](docs/security.md) |\n| **Değişiklik günlüğü** | [CHANGELOG.md](CHANGELOG.md) |\n| **Sorunlar** | [github.com/yatuk/itu-mcp/issues](https://github.com/yatuk/itu-mcp/issues) |\n\n---\n\n## Teşekkür\n\nBu proje, [**Hikmet Gultekin**](https://github.com/hikmedit)'in yazdığı orijinal **[ninova-mcp](https://github.com/hikmedit/ninova-mcp)** üzerine kuruldu. İlk açık kaynak, kimlik bilgisiyle çalışan İTÜ Ninova MCP sunucusudur (LMS giriş, HTML ayrıştırma, izleme, `.mcpb` paketleme).\n\nİTÜ MCP bunun üzerine OBS öğrenci portalı API'lerini, PDF metin okumayı, güvenli ödev yüklemeyi, oturum kalıcılığını, uzak API anahtarını ve arşiv/prompt/resource desteğini ekliyor.\n\nSalt okunur İTÜ Mail araçlarını (`mail_status`, `mail_list_inbox`, `mail_get_message`, `mail_get_attachment`) [**tzi4**](https://github.com/tzi4) katkı olarak ekledi, teşekkürler.\n\n---\n\n## Lisans\n\n[MIT](LICENSE). İstanbul Teknik Üniversitesi ile resmi bağlantısı yoktur.\n\n<br />\n\n<div align=\"center\">\n  <sub><a href=\"https://github.com/yatuk\">yatuk</a> tarafından · <a href=\"https://github.com/yatuk/itu-mcp\">GitHub</a></sub>\n</div>\n",
  "bytes": 12550,
  "sha": "1327e1e2e508f47579968f6e478f5c5f9787999dfc4547f7e0d8c1bd800967ab",
  "repo_slug": "yatuk/itu-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_yatuk_itu_mcp_b8043b3e/readme"
}