ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที รีวิวและบัญชีผู้ใช้จะมาในขั้นถัดไป
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · อธิบายเป็นภาษาคน

İTÜ MCP

โดย yatukรุ่น 1.4.0i★ –iรันบนเครื่อง
ชื่อใน registryio.github.yatuk/itu-mcp

ติดตั้ง

ภาพรวม

คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)

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

สามเสาของ PopNx MCP

สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน

ใช้ทำอะไรได้

ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry

  • การเชื่อมต่อ: รันบนเครื่อง
  • ช่องทาง (transport): stdio
  • หมวด: อื่น ๆ
  • ต้องใส่ค่าเหล่านี้: NINOVA_PASSWORD, NINOVA_MAIL_PASSWORD, NINOVA_LIBRARY_ID, NINOVA_LIBRARY_PIN

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ก่อนติดตั้ง

  • ผลตรวจเบื้องต้น: ผ่าน 1 จาก 1 ข้อ
  • รันในเครื่องคุณด้วยสิทธิ์ของผู้ใช้คุณ (ไฟล์ อินเทอร์เน็ต แอปต่าง ๆ)
  • ค่าที่คุณต้องใส่เอง: NINOVA_USERNAME, NINOVA_PASSWORD, NINOVA_MAIL_USERNAME, NINOVA_MAIL_PASSWORD, NINOVA_LIBRARY_NAME, NINOVA_LIBRARY_ID, NINOVA_LIBRARY_PIN

ค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต

ต้องเตรียมก่อน

  • PyPIติดตั้ง uv ของ Python (มีคำสั่ง uvx) ในเครื่อง

คุณใช้แอปไหน

เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”

เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json

{
  "mcpServers": {
    "itu": {
      "command": "uvx",
      "args": [
        "itu-mcp"
      ],
      "env": {
        "NINOVA_USERNAME": "ใส่ค่าของคุณ",
        "NINOVA_PASSWORD": "ใส่ค่าของคุณ",
        "NINOVA_MAIL_USERNAME": "ใส่ค่าของคุณ",
        "NINOVA_MAIL_PASSWORD": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_NAME": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_ID": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_PIN": "ใส่ค่าของคุณ"
      }
    }
  }
}

พิมพ์คำสั่งนี้ใน Terminal

claude mcp add itu --env NINOVA_USERNAME='ใส่ค่าของคุณ' --env NINOVA_PASSWORD='ใส่ค่าของคุณ' --env NINOVA_MAIL_USERNAME='ใส่ค่าของคุณ' --env NINOVA_MAIL_PASSWORD='ใส่ค่าของคุณ' --env NINOVA_LIBRARY_NAME='ใส่ค่าของคุณ' --env NINOVA_LIBRARY_ID='ใส่ค่าของคุณ' --env NINOVA_LIBRARY_PIN='ใส่ค่าของคุณ' -- uvx itu-mcp

เติมค่าที่เว้นว่างไว้ก่อนรัน

เปิดใน Cursor

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json

{
  "mcpServers": {
    "itu": {
      "command": "uvx",
      "args": [
        "itu-mcp"
      ],
      "env": {
        "NINOVA_USERNAME": "ใส่ค่าของคุณ",
        "NINOVA_PASSWORD": "ใส่ค่าของคุณ",
        "NINOVA_MAIL_USERNAME": "ใส่ค่าของคุณ",
        "NINOVA_MAIL_PASSWORD": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_NAME": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_ID": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_PIN": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

เปิดใน VS Code

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .vscode/mcp.json ของโปรเจกต์

{
  "servers": {
    "itu": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "itu-mcp"
      ],
      "env": {
        "NINOVA_USERNAME": "ใส่ค่าของคุณ",
        "NINOVA_PASSWORD": "ใส่ค่าของคุณ",
        "NINOVA_MAIL_USERNAME": "ใส่ค่าของคุณ",
        "NINOVA_MAIL_PASSWORD": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_NAME": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_ID": "ใส่ค่าของคุณ",
        "NINOVA_LIBRARY_PIN": "ใส่ค่าของคุณ"
      }
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น

ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี

ค่าที่ต้องใส่เอง

  • NINOVA_USERNAME env
    İTÜ e-posta adresi (ad.soyad@itu.edu.tr)
  • NINOVA_PASSWORD ความลับ env
    İTÜ şifresi
  • NINOVA_MAIL_USERNAME env
    Optional separate ITU Mail username
  • NINOVA_MAIL_PASSWORD ความลับ env
    Optional separate ITU Mail password
  • NINOVA_LIBRARY_NAME env
    Kütüphane hesabındaki ad (hesap araçları için isteğe bağlı)
  • NINOVA_LIBRARY_ID ความลับ env
    Kütüphane üniversite numarası (hesap araçları için isteğe bağlı)
  • NINOVA_LIBRARY_PIN ความลับ env
    Ayrı kütüphane PIN'i (hesap araçları için isteğe bağlı)

ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README

ทำอะไรได้บ้าง

รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub yatuk ซึ่งเป็นเจ้าของ repo

  • … ยังไม่ตรวจ

    ยังมีคนดูแล

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • … ยังไม่ตรวจ

    มีสัญญาอนุญาต (license)

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • – ไม่เกี่ยว

    endpoint ตอบ

    ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน

  • … ยังไม่ตรวจ

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต

เทียบกับตัวอื่นในหมวด อื่น ๆi

  • ดาวมากกว่า 0% ของอีก 18436 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 78% ของอีก 18436 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 18436 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

İTÜ MCP ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

ต้องใส่ค่าเหล่านี้: NINOVA_PASSWORD, NINOVA_MAIL_PASSWORD, NINOVA_LIBRARY_ID, NINOVA_LIBRARY_PIN

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (1.4.0) เข้า registry 11 วันที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Tethered Trust

ตัวที่ใช้แทนได้

server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว

อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

Spec Driven Development

โดย formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

รันบนเครื่อง★ 440MITอัปเดต 14 เดือนที่ผ่านมา
ติดตั้ง

Remote Desktop Commander

โดย desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

รันบนคลาวด์★ 211อัปเดต 3 วันที่ผ่านมา
ติดตั้ง

Tethered Trust

โดย tetheredtrust.com

Fit, compatibility and recall checks for AI agents before they buy: verdicts, evidence, receipts.

รันบนคลาวด์อัปเดต วันนี้
ติดตั้ง

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

İTÜ MCP

Ninova, OBS, Portal, kütüphane ve ders arşivini yapay zeka asistanına bağla. Sonra sadece sor.

Kur · Örnekler · Sık sorulanlar · Tüm araçlar

Sesli ve tam çözünürlüklü hali: docs/demo.mp4


In English

İTÜ MCP is an unofficial, open source Model Context Protocol server for students of Istanbul Technical University (İTÜ). It runs on your own computer and lets an AI assistant such as Claude, ChatGPT, Cursor or Codex read İTÜ's systems for you: the Ninova LMS (courses, assignments, files, announcements), İTÜ Moodle and the physics, chemistry and math pool course sites (syllabi, guides, announcements), OBS (grades, schedule, registration status, transcript, graduation progress), the student Portal, the library catalog and a public archive of past course offerings.

  • Ask in plain language: "what is due this week", "what will my GPA be if I get BB in everything", "which sections of MAT 210E still have seats".
  • Read-only by default. The two actions that change something (uploading an assignment, saving a registration draft) ask you for confirmation first.
  • Your İTÜ password stays on your machine and is sent only to İTÜ's own login page.
  • Install with pipx install itu-mcp, or add it to Claude Code as a plugin: claude plugin marketplace add yatuk/itu-mcp.

The rest of this page is in Turkish. Setup: 3 adımda kur. Full tool list: docs/advanced.md. Security model: docs/security.md. This project is not affiliated with İTÜ.


Bu ne işe yarıyor?

Ödev için Ninova'ya, not için OBS'ye, yemek için Portal'a girmek yerine asistanına yazıyorsun, o da gerçek veriyi çekip cevaplıyor.

İTÜ MCP bilgisayarında çalışan küçük bir programdır. Claude, Cursor veya Codex gibi bir asistana İTÜ sistemlerini okuma yeteneği kazandırır. Kod yazmayı bilmen gerekmez, kurup soru sorman yeterli.

Sen yazarsınO bakar
"Bu hafta hangi ödevlerim var?"Ninova
"Vize notlarım açıklandı mı?"OBS
"Bugün yemekte ne var?"Portal
"Bu dersi geçen yıl kim verdi, kaç kişi AA aldı?"Ders arşivi
"Kütüphanede bu kitap var mı?"Kütüphane kataloğu
"Ödevim için uyku ve akademik başarı üzerine makale bul"Makale indeksi, kütüphane veritabanları
"Okunmamış maillerimi özetle"İTÜ Mail
"FIZ 102E izlencesini ve duyurularını oku"Moodle ve havuz siteleri
"Bu şubede yer açılınca haberim olsun"Kontenjan takibi
"Ders programımı telefonumun takvimine ekle"Takvim dosyası (.ics)

Şifren bilgisayarından çıkmaz. Program yalnızca İTÜ'nün kendi sunucularıyla konuşur.

İstanbul Teknik Üniversitesi ile resmi bir bağlantısı yoktur.


3 adımda kur

Python 3.11 veya üstü gerekir. Yüklü değilse python.org adresinden kurabilirsin.

1. Programı kur

pipx install "itu-mcp[keyring]"

pipx yoksa pip install --user "itu-mcp[keyring]" da olur.

2. Giriş bilgilerini kaydet ve asistanına bağla

itu-mcp setup
itu-mcp connect

itu-mcp setup İTÜ e-postanı ve şifreni sorar. Şifre yazarken ekranda görünmez ve hiçbir dosyaya yazılmaz, işletim sisteminin anahtar zincirine kaydedilir (Windows Kimlik Bilgileri Yöneticisi, macOS Anahtar Zinciri, Linux'ta GNOME Keyring ya da KWallet).

itu-mcp connect sunucuyu Claude Desktop, Claude Code ve Cursor ayarlarına şifresiz olarak ekler. Diğer ayarlarına dokunmaz, dosyanın yedeğini alır. Ne yapacağını önce görmek istersen itu-mcp connect --dry-run yaz. Tek bir asistan için: itu-mcp connect claude-desktop (ya da claude-code, cursor).

Anahtar zinciri istemiyorum ya da Codex kullanıyorum

Şifreyi asistanın ayarına elle de yazabilirsin.

Claude Code

claude mcp add itu itu-mcp -e NINOVA_USERNAME=ad.soyad@itu.edu.tr -e NINOVA_PASSWORD=sifren

Codex CLI

codex mcp add itu --env NINOVA_USERNAME=ad.soyad@itu.edu.tr --env NINOVA_PASSWORD=sifren -- itu-mcp

Claude Desktop ve Cursor için hazır ayar dosyaları examples/ klasöründe. Adım adım anlatım: docs/installation.md.

3. Sor

Asistanı yeniden başlat ve yaz:

Ninova'daki derslerimi listele

Bir liste geldiyse kurulum tamam.

Çalışmadı, ne yapmalıyım?

Önce şunu çalıştır:

itu-mcp doctor

Her satır OK, UYARI ya da HATA ile başlar ve OK olmayan satırın altında çözümü yazar. Girişi de denemesi için itu-mcp doctor --online yaz.

  • Giriş hata veriyorsa kullanıcı adını tam e-posta olarak yazdığından emin ol (ad.soyad@itu.edu.tr, yalnızca ad.soyad değil).
  • Komut bulunamıyorsa terminali kapatıp yeniden aç. pipx kurulumdan sonra yeni bir terminal ister.
  • Asistan aracı görmüyorsa asistanı tamamen kapatıp açmayı dene.
  • Hâlâ olmuyorsa bir sorun kaydı aç, ekran çıktısını ekle. Şifreni yazma.

Şifre vermek istemiyor musun? Ders programı, final tarihleri, not dağılımları, ders arşivi, mekik saatleri ve kütüphane kataloğu gibi herkese açık bilgiler şifresiz de çalışır. itu-mcp setup adımını atlayıp yalnızca itu-mcp connect çalıştırman yeterli.


Neler sorabilirsin?

Aşağıdakiler Claude Code'a yazılmış örnek sorular. Sen kendi cümlelerinle sorabilirsin, hangi aracın çağrılacağını asistan seçer. Çıktılar örnektir, sende kendi verin görünür.

Ödev takibi

> Bu hafta hangi ödevlerimin teslimi var?

● itu · get_upcoming_deadlines

Bu hafta 2 teslimin var:

BLG 223E Ödev 3 Perşembe 23:59, 2 gün kaldı Henüz yüklenmemiş

MAT 210E Proje raporu Pazar 23:59, 5 gün kaldı Yüklendi

Dersi kim verdi, nasıl geçti?

> BLG 223E geçen güz nasıl geçmiş?

● itu · archive_grade_distribution

2025-2026 Güz, 176 öğrenci:

AA 9 CC+ 19 BA+ 12 CC 21 BB+ 18 FF 38

En kalabalık not FF (38 kişi). AA alan 9 kişi var.

Kayıt haftası

> 12469, 12554 ve 12583 CRN'leri

çakışıyor mu?

● itu · check_course_conflicts

1 çakışma buldum:

Salı 08:30-10:29 BLG 223E ile BLG 345E üst üste

12583 (BLG 422E) sorunsuz. BLG 345E için başka şube arayayım mı?

Ön şart kontrolü

> BLG 335E'yi bu dönem alabilir miyim?

● itu · explain_course_eligibility

Henüz alamazsın.

Gereken: BLG 223E (en az DD) Durumun: BLG 223E bu dönem kayıtlı, notu açıklanmamış

BLG 223E'yi geçersen gelecek dönem açılıyor.

Günlük işler

> Bugün yemekte ne var, mekik kaçta?

● itu · get_cafeteria_menu ● itu · get_shuttle_schedule

Öğle yemeği: Mercimek çorbası, tavuk sote, pirinç pilavı, sütlaç

Ayazağa'dan sonraki mekik 13:30.

Not ve ortalama

> Bu dönem hepsinden BB alırsam

ortalamam kaç olur?

● itu · obs_simulate_cumulative_gpa

Şu anki GANO: 2.08 Dönem tahmini: 3.00 Dönem sonu GANO: 2.74

Tekrar aldığın 2 ders eski notun yerine sayıldı, 1 ders yeni eklendi.

Bu bir tahmin, resmi ortalama OBS'de açıklanır.

Daha fazla fikir:

  • "EEF 211E sınıf dosyalarındaki son PDF'i özetle."
  • "Danışmanım kim, staj durumum ne?"
  • "Transkriptimi indir."
  • "BBB binasında şu an boş derslik var mı?"
  • "BLG 223E'yi geçersem hangi dersler açılır?"
  • "Mezuniyetime kaç ders kaldı, gelecek dönem hangilerini almalıyım?"
  • "Kütüphanede Introduction to Algorithms var mı?"
  • "Son okunmamış maillerimi listele, ekindeki PDF'i özetle."

Asistanın / menüsünde hazır akışlar da var: weekly_briefing (haftalık özet), plan_next_term (gelecek dönem planı), registration_week (kayıt haftası kontrolü), check_course_eligibility, research_course ve gpa_scenario.


Sık sorulanlar

Şifrem nereye gidiyor?

Hiçbir yere. Program senin bilgisayarında çalışır ve şifreni yalnızca İTÜ'nün kendi giriş sayfasına gönderir, tıpkı tarayıcının yaptığı gibi. Arada bizim ya da başkasının bir sunucusu yoktur. Kod açık, istersen kendin bakabilirsin.

Bu resmi bir İTÜ uygulaması mı?

Hayır. Öğrenciler tarafından yazılmış açık kaynak bir projedir, İTÜ ile resmi bağlantısı yoktur. Yalnızca kendi hesabınla kullan.

Hesabımda bir şeyi değiştirebilir mi?

Neredeyse her şey yalnızca okur. İki istisna var ve ikisi de senin açık onayın olmadan çalışmaz:

  • Ödev yükleme. Önce neyi nereye yükleyeceğini gösterir, sen onaylayınca yükler.
  • Kayıt taslağı kaydetme. Varsayılan olarak kapalıdır. Açsan bile taslaktan ders silinecekse durur ve sana sorar.

İkisinde de, asistanın destekliyorsa, program göndermeden hemen önce sana doğrudan bir onay penceresi açar: hangi dosya, hangi ödev, hangi CRN'ler yazılacak, hangileri taslaktan çıkacak. Asistanın kendi kendine "onaylıyorum" demesi bu pencereyi atlatamaz. Onaylamazsan hiçbir şey gönderilmez.

Ders kaydı yapmaz, ders bırakmaz, mail göndermez.

Verdiği cevaba güvenebilir miyim?

Veriyi doğrudan İTÜ sistemlerinden çeker, uydurmaz. Yine de OBS bazı bilgileri hesaba göre farklı döndürebiliyor. Bir veri eksikse araç bunu açıkça söyler. Kayıt, mezuniyet ve not gibi önemli kararlarda son sözü her zaman OBS'nin kendi sayfası söyler.

Hangi asistanlarla çalışıyor?

MCP destekleyen her istemciyle: Claude Code, Claude Desktop, Cursor, Codex ve benzerleri. ChatGPT ya da Claude.ai gibi web arayüzleri için uzak sunucu kurulumu gerekir, anlatımı docs/advanced.md içinde.

Yer açılınca haber verebilir mi?

Kısmen. Dolu bir şubenin CRN'ini izleme listesine ekleyebilirsin (watch_course_sections), sonra "izlediğim şubelerde yer açıldı mı" diye sorduğunda son kontrolden bu yana ne değiştiğini söyler. Giriş gerektirmez.

Ama program arka planda çalışmaz ve kendiliğinden bildirim göndermez. Kontenjan yalnızca sen sorduğunda okunur. Düzenli takip istiyorsan asistanında birkaç dakikada bir bu soruyu soran zamanlanmış bir görev kurman gerekir.

Araç sayısı çok fazla, azaltabilir miyim?

Evet. Araçlar gruplara ayrılmış durumda

ตัดมาแค่ช่วงต้น อ่านต่อใน repo

ถาม PopNx