EL-KITE MCP
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@EL-KITE MCPTampilkan draf usulan JAD saya dan jelaskan angka kredit yang masih kurang."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
EL-KITE MCP
Aplikasi untuk membaca dan merapikan usulan jabatan akademik dosen (JAD) di EL-KITE LLDIKTI III (https://elkite-lldikti3.kemdiktisaintek.go.id) dari asisten AI, terminal, atau program lain.
Paket ini membaca profil dosen beserta riwayat jabatan fungsionalnya, daftar usulan JAD (Draft, Proses, Selesai), kedelapan tab draf usulan, dan AK Penyetaraan. Untuk merapikan draf, ia bisa mengubah empat isian (jenjang pendidikan pada jabatan sebelumnya, JAD usulan, bidang ilmu, dan tanggal penerbitan ijazah), mengunggah dokumen persyaratan, mengisi kegiatan IKD, dan menambah entri Bidang B. Semua alat yang menulis bawaannya uji coba dan membaca ulang EL-KITE sesudah mengirim; rinciannya di Mengubah draf usulan. Mengajukan usulan, mengubah status usulan, dan menghapus apa pun tidak bisa dilakukan lewat paket ini.
Tersedia dalam tiga bentuk, semuanya dari paket yang sama:
Mode | Untuk siapa | Referensi |
MCP | asisten AI (Claude Code, dsb.) | |
REST API | aplikasi apa pun lewat HTTP | |
Pustaka | program Python Anda sendiri |
Ada juga CLI (./elkite draf, ./elkite ubah, dan seterusnya) untuk pemakaian
langsung dari terminal; lihat docs/CLI.md.
Memakainya lewat asisten AI
Server MCP-nya bisa didaftarkan ke Claude Code, Codex, dan Antigravity. Yang tercepat, untuk Claude Code dari klona repositori ini:
claude mcp add elkite-mcp -s user -- /path/ke/elkite-mcp/elkite mcpLangkah untuk ketiga klien dan pengaturan izin pemanggilan tool ada di docs/MCP.md.
Related MCP server: SIAKAD MCP
Prasyarat
Python 3.10 atau lebih baru
Akun EL-KITE LLDIKTI III yang aktif (username berupa NIDN, dan password)
Pasang
Ada dua cara, pilih salah satu.
A. Berdiri sendiri. Klona lalu jalankan; cocok kalau Anda hanya mau memakai aplikasinya:
git clone https://github.com/alfa-yohannis/elkite-mcp.git
cd elkite-mcp
./elkite uji # jalankan pertama menyiapkan .venv + dependensi sendiriPeluncur membuat virtualenv dengan python3.14. Kalau versi itu tidak ada di
mesin Anda, pilih interpreter lain: ELKITE_PYTHON=python3.12 ./elkite uji.
Letak virtualenv bisa dipindah lewat ELKITE_VENV. Setiap kali
pyproject.toml berubah, peluncur memasang ulang paketnya sendiri.
B. Sebagai paket, kalau aplikasi Anda sendiri yang akan memakainya. Paketnya belum ada di PyPI, jadi pasang dari repositorinya:
pip install "elkite-mcp[api,mcp] @ git+https://github.com/alfa-yohannis/elkite-mcp.git"
pip install "git+https://github.com/alfa-yohannis/elkite-mcp.git" # pustaka sajaKredensial
Salin contohnya lalu isi sendiri:
cp .env.contoh .env # ELKITE_USERNAME (NIDN), ELKITE_PASSWORD.env tidak ikut ter-commit. Kredensial hanya dibaca dari .env, environment,
atau atur_setelan() di kode, tidak pernah dari elkite.yaml, dan tidak pernah
dicetak. Tool MCP sengaja tidak menerima kata sandi lewat parameter, jadi
asisten AI tidak pernah memegangnya. REST API boleh menerimanya per permintaan
supaya satu server bisa melayani beberapa dosen.
Login baru berjalan saat sebuah perintah atau tool membutuhkan halaman, dan soal captcha hitungan di halaman login dijawab sendiri. Kalau sesi EL-KITE habis di tengah jalan, permintaan yang membaca memicu login ulang sekali secara otomatis. Kiriman yang menulis tidak pernah diulang.
Menjalankan
1. MCP
claude mcp add elkite-mcp -- /path/ke/elkite-mcp/elkite mcp # dari klona
claude mcp add elkite-mcp -- elkite-mcp # setelah pip installCek servernya hidup tanpa mendaftarkannya dulu:
./elkite mcp # bicara JSON-RPC lewat stdio; Ctrl-C untuk berhentiLalu minta asisten Anda, misalnya: "Tampilkan draf usulan JAD saya dan jelaskan
berapa angka kredit yang masih kurang." Ada 16 tool. Delapan hanya membaca:
cek_login, profil_dosen, daftar_usulan, baca_draf,
baca_ak_penyetaraan, daftar_persyaratan, daftar_ikd, dan
daftar_bidang_b. Delapan lainnya menulis ke draf dan bawaannya uji coba:
ubah_jenjang_lama, ubah_jad_usulan, ubah_bidang_ilmu,
ubah_tanggal_ijazah, unggah_persyaratan, tambah_ikd, ubah_ikd, dan
tambah_bidang_b. Rinciannya di docs/MCP.md.
2. REST API
./elkite api # http://localhost:8000
PORT=9001 ./elkite api # ganti port
uvicorn elkite_mcp.api:app --port 8000 # kalau terpasang sebagai paketDokumentasi interaktif ada di /docs. Semua endpoint memakai POST dengan badan
JSON. Coba:
curl -X POST localhost:8000/usulan -H 'Content-Type: application/json' -d '{}'
curl -X POST localhost:8000/draf -H 'Content-Type: application/json' \
-d '{"tab": "resume"}'Untuk menempelkannya ke aplikasi FastAPI Anda sendiri:
from elkite_mcp.api import router
app.include_router(router, prefix="/elkite")Endpoint selengkapnya di docs/API.md.
3. Pustaka
from elkite_mcp import KlienElkite, daftar_usulan, draf_usulan
klien = KlienElkite() # kredensial dari .env; belum login
for baris in daftar_usulan(klien, "draft"): # login berjalan di sini
print(baris.no_usulan, baris.status, baris.jad_usulan)
draf = draf_usulan(klien, tab="resume") # nomor kosong: satu-satunya draf
print(draf["resume"]["total_ak"], draf["resume"]["rekomendasi"])Kredensial dan alamat EL-KITE boleh diberikan dari kode tanpa berkas apa pun:
from elkite_mcp import KlienElkite, atur_setelan
atur_setelan(ELKITE_USERNAME="0000000000", ELKITE_PASSWORD="...")
klien = KlienElkite()
klien_lain = KlienElkite("0000000000", "...", base_url="https://elkite.contoh-karangan.ac.id")Fungsi yang menulis bawaannya uji coba. Dengan uji_coba=False, form dikirim
sekali, lalu tab-nya dibaca ulang untuk verifikasi:
from elkite_mcp import KlienElkite, ubah_tanggal_ijazah
klien = KlienElkite()
rencana = ubah_tanggal_ijazah(klien, "2004-07-18", jenjang="S-2")
print(rencana.sebelum, rencana.sesudah, rencana.isian, rencana.hambatan)
hasil = ubah_tanggal_ijazah(klien, "2004-07-18", jenjang="S-2", uji_coba=False)
print(hasil.berubah, hasil.sesudah, hasil.flash)Fungsi baca lainnya profil_dosen, baca_ak_penyetaraan, daftar_persyaratan,
daftar_ikd, dan daftar_bidang_b; fungsi tulis lainnya ubah_jenjang_lama,
ubah_jad_usulan, ubah_bidang_ilmu, unggah_persyaratan, tambah_ikd,
ubah_ikd, dan tambah_bidang_b. Semuanya menerima KlienElkite sebagai
argumen pertama. Pembaca HTML (baca_profil, baca_data_dasar,
baca_pendidikan, baca_ikd, baca_bidang_b, baca_persyaratan, baca_ak,
baca_resume, baca_log, baca_data_dasar_pak, baca_resume_pak) menerima
HTML beserta alamatnya dan tidak menyentuh jaringan.
Semua kegagalan berupa exception biasa: ElkiteError beserta turunannya
(LoginDitolak, AlamatDitolak, PengubahanDitolak, HasilTidakPasti), dan
KonfigurasiError untuk setelan yang tidak bisa dipakai. Pustaka tidak pernah
memanggil sys.exit.
CLI
./elkite cek-login # kredensial di .env bisa dipakai?
./elkite profil # profil dosen dan riwayat jabatan fungsional
./elkite usulan --status proses # daftar usulan JAD: draft, proses, selesai
./elkite draf --tab resume # isi tab draf usulan JAD
./elkite ak-penyetaraan <nomor> # data dasar, pendidikan, dan resume AK Penyetaraan
./elkite ubah jenjang S-2 # uji coba; --kirim untuk mengirim
./elkite persyaratan # dokumen persyaratan; `unggah` mengunggah satu
./elkite ikd # butir IKD; `tambah` dan `ubah` mengisi kegiatan
./elkite bidang-b --butir B0006 # butir Bidang B dan form TAMBAH butir itu
./elkite petakan <path> # form, tabel, tautan, endpoint skripTerpasang sebagai paket, perintahnya elkite-cek-login, elkite-profil,
elkite-usulan, elkite-draf, elkite-ak-penyetaraan, elkite-ubah,
elkite-persyaratan, elkite-ikd, elkite-bidang-b, elkite-petakan, dan
elkite-mcp, dengan argumen yang sama. Argumen selengkapnya di
docs/CLI.md.
Mengubah draf usulan
Yang dikerjakan | CLI | Tool MCP | Tujuan POST di EL-KITE |
ubah jenjang pendidikan pada jabatan sebelumnya |
|
|
|
ubah JAD usulan |
|
|
|
ubah bidang ilmu |
|
|
|
ubah tanggal ijazah di draf JAD |
|
|
|
ubah tanggal ijazah di AK Penyetaraan |
|
|
|
unggah dokumen persyaratan |
|
|
|
tambah kegiatan IKD |
|
|
|
ubah kegiatan IKD |
|
|
|
tambah entri butir Bidang B |
|
|
|
Semuanya mengikuti alur yang sama:
Tab yang memuat form-nya dibaca lebih dulu. Form dicari menurut action-nya, dan form yang memuat isian tak dikenal ditolak sebelum apa pun dikirim. Kode yang dibutuhkan form (jenis dokumen,
id_detail_dharma, id kegiatan, AK) diambil dari tombol dan isian di halaman; kalau tombolnya tidak ada, kiriman sungguhan ditolak.Nilai baru diperiksa terhadap pilihan sah di form itu, dan nilai yang sudah sama tidak dikirim ulang. Berkas harus PDF (berakhiran
.pdfdan berawalan%PDF) dan tidak melebihi batas yang tertulis di form: 10 MB untuk Persyaratan dan IKD, 5 MB untuk Bidang B.Tanpa
--kirimdi CLI, atau selamauji_cobadibiarkan pada bawaannya di pustaka, MCP, dan REST API, hasilnya rencana kiriman: tujuan form, isian yang akan dikirim, nilai sebelum dan sesudah, catatan, danhambatan. Rencana yang membawahambatanditolak kalau dikirim sungguhan.Berkas atau entri yang sudah ada tidak ditimpa kecuali dengan
--paksadi CLI ataupaksabernilai true.tambah_ikdtetap menolak butir yang sudah berisi kegiatan, karena EL-KITE hanya menerima satu kegiatan per butir dan satu kegiatan per dharma; untuk mengganti kegiatan yang ada pakaiubah_ikd.Kiriman sungguhan berangkat tepat sekali sebagai multipart/form-data, sama seperti tombol di browser, lalu tab-nya dibaca ulang. Berkas yang diunggah diunduh ulang dari tautannya di halaman dan md5-nya dicocokkan dengan berkas lokal. Kalau tautan itu membalas halaman kecil berisi
<iframe>(tombol "Lihat Bukti" IKD begitu), berkas yang disematkannya yang diunduh.berubahbernilai true hanya kalau semuanya cocok; kalau tidak, kode keluar CLI bernilai 1 danokdi MCP serta REST API bernilai false.Kalau kiriman sudah berangkat tetapi hasilnya tidak bisa dipastikan (EL-KITE membalas galat, sesinya ternyata habis, atau pengalihannya mengarah ke alamat yang tidak dibuka klien), yang muncul
HasilTidakPasti. Kiriman tidak pernah diulang otomatis; baca ulang tab-nya sebelum mencoba lagi.
Unggahan dan entri yang sudah terkirim tidak bisa dihapus lewat paket ini; yang
keliru harus dihapus sendiri di browser. Tanggal ijazah draf JAD dan AK
Penyetaraan dikirim ke endpoint yang berbeda. Pada akun yang diamati keduanya
menunjuk baris riwayat pendidikan yang sama, jadi tanggal yang diubah lewat draf
JAD langsung terbaca juga di AK Penyetaraan; tetap baca ulang keduanya sesudah
mengubah. Pada draf yang diamati per Oktober 2026, kolom Aksi tab Persyaratan
kosong untuk semua dokumen, sehingga unggah_persyaratan menolak mengirim
sampai EL-KITE menampilkan tombol unggahnya.
Setelan
Semua setelan opsional. Yang menang, dari yang paling khusus:
argumen pemanggil -> atur_setelan() -> environment -> .env -> elkite.yaml -> nilai bawaanDi environment dan .env namanya berawalan ELKITE_ dan huruf besar
(ELKITE_BASE_URL); di elkite.yaml tanpa awalan dan huruf kecil (base_url).
Salin elkite.yaml.contoh menjadi elkite.yaml kalau perlu mengubah sesuatu.
elkite.yaml dibaca sekali per proses, jadi jalankan ulang server MCP atau REST
API sesudah mengubahnya.
| Bawaan | Keterangan |
|
| halaman login; alamat EL-KITE diturunkan darinya |
|
| alamat EL-KITE, kalau perlu disebut terpisah |
| dikenali dari form | nama isian username; per Oktober 2026 |
| kosong | nomor draf JAD kalau tidak disebut; kosong berarti satu-satunya draf |
| kosong | nomor AK Penyetaraan kalau tidak disebut |
|
| GET dan POST login |
|
| permintaan lainnya |
|
| pengalihan yang diikuti per permintaan |
|
| lama klien per kredensial disimpan REST API |
| Chrome 126 di X11 | User-Agent permintaan HTTP |
ELKITE_USERNAME dan ELKITE_PASSWORD hanya dibaca dari atur_setelan(),
environment, dan .env. Alamat EL-KITE dan halaman login harus https dan berada
di host yang sama, karena ke sanalah kata sandi dikirim. Nomor usulan milik satu
akun, jadi kalau elkite.yaml dibagikan, simpan nomornya di .env
(ELKITE_NO_USULAN, ELKITE_NO_AK_PENYETARAAN).
Peluncur ./elkite membaca tiga variabel lain dari environment: ELKITE_PYTHON
(interpreter pembuat virtualenv, bawaan python3.14), ELKITE_VENV (letak
virtualenv, bawaan .venv di repositori), dan PORT (port ./elkite api,
bawaan 8000).
Akar proyek
Akar proyek menentukan letak .env, elkite.yaml, dan data/, serta titik
hitung path relatif, termasuk path berkas PDF yang akan diunggah:
dijalankan dari klona repositori ini: direktori repositori itu sendiri; peluncur
./elkitemenyetelnya lewatELKITE_AKAR_PROYEKdipasang sebagai paket: direktori kerja proyek pemakai
Direktori di atasnya tidak pernah ikut ditelusuri, jadi hasilnya tidak berubah
hanya karena aplikasi dipindah. Untuk menentukan sendiri, setel
ELKITE_AKAR_PROYEK di environment atau panggil atur_akar_proyek().
Rancangan
pyproject.toml metadata paket, dependensi, dan perintah terpasang
elkite peluncur untuk pemakaian berdiri sendiri
.env.contoh contoh kredensial
elkite.yaml.contoh contoh setelan non-rahasia
elkite_mcp/__init__.py API publik paket ini
elkite_mcp/konfigurasi.py akar proyek, setelan, kredensial, sesi HTTP
elkite_mcp/elkite_client.py KlienElkite: login bercaptcha, login ulang, pagar GET dan POST, kiriman tepat sekali
elkite_mcp/halaman.py pembaca HTML umum: teks, pasangan label-nilai, tabel, form, pesan flash (tanpa jaringan)
elkite_mcp/privasi.py penyaring data pribadi sebelum keluar lewat CLI, REST API, atau MCP
elkite_mcp/profil.py profil dosen dan riwayat jabatan fungsional
elkite_mcp/usulan.py daftar usulan JAD dan pembaca kedelapan tab draf
elkite_mcp/ak_penyetaraan.py data dasar, riwayat pendidikan, dan resume AK Penyetaraan
elkite_mcp/ubah.py pengubah isian draf beserta bantuan bersama alat penulis
elkite_mcp/unggah.py unggahan Persyaratan, IKD, dan Bidang B
elkite_mcp/cli.py CLI (elkite-cek-login, elkite-draf, elkite-ubah, dan seterusnya)
elkite_mcp/api.py REST API: router yang bisa ditempel + app siap pakai
elkite_mcp/mcp_server.py MCP server (perintah elkite-mcp)
elkite_mcp/petakan_form.py alat bantu memetakan halaman saat menambah kemampuan
tests/ unit test dengan EL-KITE tiruan, tanpa jaringan
docs/ referensi CLI, REST API, dan MCPCatatan perilaku EL-KITE
Diamati pada EL-KITE asli pada Oktober 2026. Nama isian, soal captcha, kode
tombol, dan pilihan <select> dibaca ulang dari halaman setiap kali dipakai;
yang tertulis di kode hanya path halaman dan tujuan POST yang diizinkan.
EL-KITE adalah aplikasi CodeIgniter. Alamatnya dipetakan langsung ke method controller, jadi membuka sebuah alamat dengan GET sudah bisa menjalankan aksinya. Karena itu klien menolak GET ke alamat yang tampak seperti aksi.
GET /loginberisi form POST ke/login/logindengan isianusername,password, dancaptcha_answer. Soal captcha-nya hitungan di label, misalnya "Berapa hasil dari 8 + 7 ?", dan tidak ada token CSRF. Login yang berhasil dibalas 303 ke/usulan/usulan, lalu beranda. Klien menjawab soal penjumlahan, pengurangan, dan perkalian; soal lain membuat login dibatalkan sebelum kredensial dikirim.Beranda juga memuat form berisian password, yaitu modal Ganti Password, tetapi tanpa captcha. Sebuah halaman dianggap halaman login hanya kalau isian password dan captcha ada di form yang sama.
Rantai sertifikat TLS-nya dikirim lengkap: Sectigo Public Server Authentication CA DV R36, lalu Root R46 yang ditandatangani silang USERTrust RSA. Bundel CA bawaan requests sudah cukup.
Templatnya admin Bootstrap. Isi halaman ada di
.page-wrapperdan menu diaside.left-sidebar. Halaman detail menampilkan data sebagai barisform-groupberisian readonly atau sebagai tabel "label : nilai", kadang dua pasangan per baris.Form ubah data ada di modal Bootstrap yang dibuka tombol bertanda
data-target="#id-modal", dan dikirim sebagai multipart/form-data. Form tanggal ijazah dan unggah persyaratan justru membungkus modalnya.Pesan sesudah kiriman form dititipkan di atribut
data-flashdata,data-flasherror, dandata-flashwarning, lalu ditampilkan skrip halaman. Pembacanya mencatat ketiganya sebagaiberhasil,galat, danperingatan.Daftar usulan JAD dimuat DataTables lewat
POST /usulan/usulan/usulan/<kode>, dengan kode 1 untuk Draft, 99 untuk Proses, dan 9 untuk Selesai. Kolom pertamanya memuat tombol Detail Ajuan dan Hapus; hanya tautan Detail Ajuan yang dipakai. Klien meminta 100 baris pertama per status.Nomor usulan JAD terdiri atas 14 digit waktu pembuatan diikuti
dosen_no. Nomor AK Penyetaraan sebaliknya:dosen_nodiikuti enam digit jam pembuatan.Draf usulan JAD punya delapan tab di
/usulan/usulan/<tab>/<no_usulan>:usulans(Data Dasar),show_pendidikan(Riwayat Pendidikan),ikd,bidangB,persyaratan,show_skp(AK Integrasi/Penyetaraan, Konversi & Prestasi),show_resume, danshow_log.Tab Data Dasar memuat form
update_jenjang(no_usulan,jenjang_id_lama),update_jad(no_usulan,jabatan_usulan_no), danupdate_bid_ilmu(dosen_no,no_usulan,sta,bid_ilmu). Pada draf yang diamati, pilihan jenjangnya 30 S-1, 32 Sp-1, 35 S-2, 36 S-2 Terapan, 37 Sp-2, 40 S-3, dan 41 S-3 Terapan, sedangkan pilihan JAD-nya 4 Lektor (200), 5 Lektor (300), 8 Lektor Kepala (400), 9 Lektor Kepala (550), dan 10 Lektor Kepala (700). Label opsinya diawali ikon, yang dibuang saat dibaca.Di tab Riwayat Pendidikan, tanggal penerbitan ijazah tampil di isian readonly, dan tombol "Ubah data" membuka modal
#edit_tgl<id_rwy_didik_formal>. Form draf JAD menuju/usulan/usulan/update_tgl_ijazah/<dosen_no>(isianid_rwy_didik_formal,no_usulan,tgl_ijazah), sedangkan AK Penyetaraan memakai/usulan/pak/update_tgl_ijazahdengan tambahanid_sdm. Keduanya endpoint terpisah, tetapiid_rwy_didik_formal-nya sama, dan tanggal yang diubah lewat salah satunya terbaca di keduanya.Menu AK Penyetaraan dibuka lewat
/usulan/pak/pak_baru, dan halaman itu membuat Draft AK Penyetaraan baru. Klien tidak pernah membukanya, jadi nomor AK Penyetaraan harus disebut sendiri (salin dari alamat/usulan/pak/detail/<nomor>di browser) atau disimpan diELKITE_NO_AK_PENYETARAAN. Tab yang dibaca adalahdetail,show_pendidikan, danshow_resumedi bawah/usulan/pak/. Tombol "Buat Usulan Baru" menuju/usulan/usulan/tambah, yang juga tidak pernah dibuka.Tab Persyaratan punya form unggah
POST /usulan/usulan/tambah_syaratberisijenis,no_usulan, danberkas(PDF, maks. 10 MB). Kodejenisdikirim tombol unggah lewat atributdata-nama. Pada draf yang diamati, kolom Aksi kosong untuk semua dokumen, jadi tombol dan kodenya belum ada, dan alat unggah menolak menebak.Di tab IKD, tombol Tambah tiap butir membawa
data-id(id_detail_dharma) dandata-sudah-ada="1"kalau butir itu, atau butir lain di dharma yang sama, sudah terisi: EL-KITE hanya menerima satu kegiatan per dharma ("pilih salah satu dari setiap Dharma"). Tombol "Lihat Bukti" membalas halaman kecil berisi<iframe>ke/assets/download_file_ikd/<berkas>. Form tambahnyaPOST /usulan/usulan/simpan_ikd(usulan_no,id_detail_dharma,ket_ikd,file_bukti_ikdPDF maks. 10 MB). Ubahnya lewat/usulan/usulan/update_ikd(id_ikd,usulan_no,file_lama_ikd,ket_ikd, danfile_bukti_ikdyang opsional).Halaman butir Bidang B ada di
/usulan/usulan_dupak_b/dupak/<kode>/<no_usulan>. Form TAMBAH-nyaPOST /usulan/usulan_dupak_b/tambah_B0004/<kode>/<kum>dengan isiansemester,thn_akademik,jp,pk,tgl,satuan_hasil,syarat,uraian,url_web,url,keterangan, danberkas(PDF maks. 5 MB), ditambah isian tersembunyino_usulan,kum(AK), danvolum. Butir B0004 juga punyakdankategori_jurnal. Untuk usulan Lektor, satu poin hanya berisi satu data. Paket ini tidak bisa menghapus entri.Halaman Profil (
/usulan/profil) memuat identitas dalam tabel "label : nilai" dua pasangan per baris, kartu "Perhatian !" tentang kelayakan mengajukan JAD berikutnya, kartu Sinta Score dan H Index, jabatan fungsional dan pangkat saat ini beserta riwayatnya, dan riwayat pendidikan.Aksi yang tidak pernah dipanggil paket ini:
proses_usulanbaru(mengajukan usulan,usulan_status10),update_statusjad,ganti_password, apa pun yang memuathapusataudelete,logout,pak_baru, serta tombol sinkron SISTER/PDDIKTI dan ubah foto di Profil. Pagar klien menolak semuanya sebelum dikirim.
Keamanan dan batasan
Verifikasi sertifikat TLS selalu aktif dan tidak ada setelan untuk mematikannya. Uji memastikan
verify=Falsetidak muncul di kode paket.Setiap permintaan dibatasi ke host EL-KITE lewat https. Alamat lain, alamat
http://, dan pengalihan ke host lain ditolak sebelum dikirim.GET hanya membaca. Alamat yang path atau query-nya memuat potongan kata aksi ditolak, juga pada setiap langkah pengalihan. Daftarnya
POTONGAN_GET_DILARANGdielkite_client.py, antara lainhapus,delete,logout,pak_baru,tambah,update,upload,unggah,simpan,sinkron,kirim,ajukan,batal, dansubmit.POST hanya ke path terdaftar tanpa query: tiga tabel DataTables yang hanya membaca (
PATH_POST_BACA) dan form ubah data yang masing-masing punya alat beruji coba (PATH_POST_TULIS,POLA_POST_TULIS). Path yang memuatproses_usulan,usulanbaru,statusjad,ganti_password,hapus,delete,logout, ataupak_baruselalu ditolak, juga kalau kelak ada yang menambahkannya ke daftar.Kiriman ubah data berangkat tepat sekali dan tidak diulang, juga saat sesinya ternyata habis. Pengalihan sesudahnya diikuti sebagai GET selama masih di EL-KITE; pengalihan 307/308 yang meminta POST diulang tidak diikuti.
Tidak ada alat untuk mengajukan usulan, mengubah status, menghapus, mengganti password, logout, atau membuka menu AK Penyetaraan. Unggahan dan entri yang sudah terkirim tidak bisa dihapus lewat paket ini.
Kredensial tidak muncul di
repr(), pesan galat, maupun keluaran CLI. Pesan dari EL-KITE disamarkan kalau kebetulan menggemakan username atau kata sandi.Nilai berlabel data pribadi (tempat dan tanggal lahir, NIK, NPWP, nomor HP, alamat, rekening) ditulis
(disembunyikan)saat halaman dibaca, sebelum keluar lewat CLI, REST API, atau MCP. Penyaringnya mencocokkan kata pada label (KATA_PRIBADIdiprivasi.py).REST API tidak punya autentikasi sendiri, dan badan tanpa kredensial memakai kredensial di setelan server. uvicorn bawaannya hanya mendengarkan
127.0.0.1; jangan membukanya ke jaringan lain tanpa pelindung di depannya.Berkas biner seperti PDF ditolak pembaca halaman. Unduhan hanya dipakai untuk mencocokkan md5 berkas yang baru diunggah.
data/sudah masuk.gitignore, karena./elkite petakan --htmlmenyimpan HTML mentah yang memuat data pribadi di sana.
Menambah kemampuan baru
./elkite cek-login # 1. pastikan kredensial di .env benar
./elkite petakan <path> # 2. petakan halamannya ke data/form_<path>.json
./elkite petakan <path> --html # simpan juga HTML mentahnya untuk dibaca
# 3. tulis pembaca HTML tanpa jaringan (baca_*) beserta dataclass hasilnya
# 4. tiru struktur halamannya di tests/halaman_tiruan.py dengan data karangan,
# lalu tulis ujinya
# 5. daftarkan di cli.py, api.py, dan mcp_server.pyPath halaman diambil dari alamat di browser. ./elkite petakan hanya melakukan
GET lewat pagar yang sama dengan alat lain, jadi alamat yang memuat kata aksi
ditolak. Nilai isian password dan isian berlabel data pribadi ditulis
<disamarkan>, tetapi HTML mentah dari --html tidak disaring. Keduanya
tersimpan di data/.
Alat yang menulis mengikuti pola ubah.py. Ia menerima uji_coba yang
bawaannya True dan mengembalikan HasilUbah berisi rencana kiriman. Form-nya
dibaca dari halaman pada sesi yang sama, dan isian yang tidak dikenal ditolak.
Tujuan POST-nya ditambahkan ke PATH_POST_TULIS atau POLA_POST_TULIS di
elkite_client.py, kirimannya lewat kirim_sekali(), lalu tab-nya dibaca ulang
untuk verifikasi. Di CLI, kiriman sungguhan butuh --kirim, dan instruksi
MCP-nya meminta asisten menjalankan uji coba lebih dulu lalu meminta
persetujuan pemakai. Path yang memuat potongan di POTONGAN_POST_DILARANG tetap
ditolak walau sudah didaftarkan.
Konvensi penulisan skrip
Satu modul untuk satu menu EL-KITE (
profil.py,usulan.py,ak_penyetaraan.py); pengubah dan pengunggah dipisah diubah.pydanunggah.py.Pembaca HTML (
baca_*) tidak menyentuh jaringan dan menghasilkan dataclass; fungsi yang mengambil halaman memanggil pembaca itu. CLI, REST API, dan MCP memakai bentuk dict dari dataclass yang sama.Setiap kelas, method, dan fungsi punya docstring.
Fungsi ditulis datar, tanpa fungsi bersarang di dalam fungsi.
Nama variabel dan fungsi ditulis utuh dan deskriptif (
sesi_http,alamat_kirim), tanpa singkatan satu-dua huruf.Komentar hanya untuk hal yang tidak terbaca dari kodenya.
Nilai rahasia dan data pribadi tidak pernah dicetak.
Pengujian
./elkite uji186 unit test, semuanya berjalan tanpa jaringan dan tanpa kredensial. EL-KITE
digantikan SitusTiruan di tests/conftest.py, yang menjawab seperti aplikasi
CodeIgniter aslinya: login bercaptcha, pengalihan ke /login saat sesi habis,
DataTables lewat POST, form ubah data di modal, dan berkas unggahan yang bisa
diunduh ulang untuk dicocokkan md5-nya. Halaman tiruannya ada di
tests/halaman_tiruan.py. Selama uji, akar proyek dipindah ke direktori
sementara supaya .env asli tidak terbaca, variabel ELKITE_* di environment
dibuang, dan sesi HTTP sungguhan diblokir. Uji REST API dan MCP dilewati kalau
FastAPI, httpx2, atau paket mcp belum terpasang. Nama dosen, NIDN, nomor
usulan, perguruan tinggi, tanggal, dan kata sandi di berkas uji dan
dokumentasi seluruhnya dikarang.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read and write KukGit repositories, files, issues and pull requests from an AI assistant.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Enable Large Language Model clients to interact seamlessly with any MediaWiki wiki. Perform action…
Read-only approved AI tools, public stacks, guides, and evidence-aware comparisons.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search and retrieve data from Indonesia's higher education database (PDDIKTI), including universities, lecturers, study programs, and students.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to pull teaching evidence from SIAKAD Pradita, such as class lists, lecture minutes, and signed student attendance, ready to be attached as BKD proof.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to automate filling BKD data into SISTER, handling SSO login, CSRF tokens, label-to-code translation, and file uploads, with tools for checking login, listing menus and schemas, looking up references and lecturers, managing activity documents, and submitting activities in a dry-run mode by default.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables reading and editing Google Docs via the Docs API, including structure/outline retrieval, text export, section/range/table editing, text replacement, document creation, and raw batch updates, with dry-run previews before destructive changes.MIT