Reality check / Local lab

Filesystem MCP: batas folder bukan read-only.

Memberi agent satu folder lebih sempit daripada memberi seluruh mesin. Tetapi file di dalam folder itu masih bisa berubah.

Lihat bukti / 8 + 6 pemeriksaan ↓
Ilustrasi sampul artikel ini. Konseptual, bukan hasil pengujian.

Apa yang sedang kita coba?

Filesystem MCP Server menyediakan operasi file bagi client MCP. Kami menjalankan paket @modelcontextprotocol/server-filesystem@2.0.0 sebagai proses lokal dan mengizinkan tepat satu direktori lab.

Pertanyaannya sempit: apakah konfigurasi folder tersebut juga mencegah perubahan file? Ini uji tool langsung lewat protokol, bukan benchmark kemampuan agent atau review kualitas model.

Di dalam allowlistallowed/

Baca berhasil.
Timpa draft juga berhasil.

Di luar allowlistoutside/

Baca dan tulis ditolak.
Symlink keluar ditolak.

Ringkasan hasil pada fixture fiktif. Kedua folder dibuat khusus untuk lab ini; tidak ada data pribadi.

Setup dan akses yang diuji

Lingkungan pengujian: Linux x64, Node v26.7.0, transport stdio, protokol yang dinegosiasikan 2025-11-25. Client lab tidak menawarkan capability Roots. Server dijalankan dengan satu argumen folder; environment aplikasi dan credential workstation tidak diteruskan.

Lab tidak memakai model, API key, atau langganan. Unduhan paket memerlukan koneksi npm; proses pengujiannya memanggil server lokal. Ini bukan klaim bahwa semua client, model, atau hosting untuk pemakaian sehari-hari gratis.

Apa yang benar-benar terjadi?

Sesi 1 — hasil pada konfigurasi lab ini, bukan skor keamanan umum
PemeriksaanHasil teramati
Daftar tool dan anotasiTool baca dan tulis tersedia
Lihat folder yang diizinkanSatu folder lab tercantum
Baca file di dalam folderBerhasil; isi sesuai fixture
Timpa draft fiktif di dalam folderBerhasil; isi file berubah
Baca file di folder sebelahDitolak
Tulis file di folder sebelahDitolak; file tidak dibuat
Baca keluar lewat ../Ditolak
Baca lewat symlink ke luar folderDitolak

Untuk overwrite, script membaca kembali file lewat filesystem lokal dan memeriksa isi barunya. Untuk penolakan tulis di luar folder, script juga memastikan file tujuan tidak ada. Jadi hasilnya tidak hanya mengikuti pesan sukses atau gagal dari server.

Unduh hasil JSON lengkap. Path lokal dinormalisasi menjadi <LAB>; respons tool, versi, anotasi, timestamp, integrity paket, dan hash lockfile tetap dicatat.

Sesi kedua: batasnya bisa dipindah saat berjalan

Sesi pertama memakai client yang tidak menawarkan Roots. Karena itu ia hanya menguji direktori yang diberikan lewat argumen server, dan satu klaim README upstream tidak tersentuh: Roots notified by Client to Server, completely replace any server-side Allowed directories when provided.

Kami menjalankan sesi kedua dengan paket yang sama dan client yang mengiklankan capability roots. Direktori argumen dan direktori Roots sengaja dibuat berbeda, supaya terlihat mana yang menang.

Sesi 2 — klaim README diuji, bukan dikutip
PemeriksaanHasil teramati
Server meminta daftar RootsSatu permintaan; client mengembalikan satu direktori
Direktori Roots muncul di daftar izinDaftar hanya berisi direktori Roots, bukan direktori argumen
Baca di dalam direktori RootsBerhasil; isi sesuai fixture
Baca di direktori argumenDitolak; pesan menyebut direktori Roots
Baca di luar kedua direktoriDitolak
Roots dikosongkan, lalu baca lagiDitolak; daftar izin kosong tanpa restart

Begitu client mendeklarasikan Roots, direktori argumen hilang dari daftar izin dan permintaan baca ke sana ditolak dengan pesan yang menyebut direktori Roots. Saat client mengosongkan daftar Roots, akses dicabut tanpa menjalankan ulang server. Log server mencatat keduanya: Updated allowed directories from MCP roots: 1 valid directories, lalu No valid root directories provided by client; access revoked until it exposes a root again.

Pada sesi protokol 2025-11-25 dengan client lab yang mengiklankan Roots, direktori dari client menggantikan direktori argumen. Pada koneksi seperti itu, “folder yang diizinkan” bukan properti statis dari konfigurasi server: batasnya bisa melebar atau hilang tanpa menyentuh argumen server. Kalau kamu menilai keamanan hanya dari file konfigurasi, kamu menilai separuh sistem.

Batasan yang menempel pada kalimat itu: hasil ini hanya menjelaskan koneksi berprotokol 2025-era. README upstream menyebut Roots sebagai mekanisme 2025-era yang ditandai usang pada protokol 2026-07-28, dan menyatakan koneksi 2026-07-28 tidak bisa memakainya sama sekali — di sana direktori argumen adalah seluruh allow-list. Kami tidak menguji koneksi 2026-07-28, tidak menguji client lain, dan tidak menyimpulkan apa pun tentang keduanya.

Unduh hasil JSON sesi kedua · Script lab Roots (.mjs). Sesi pertama tidak diubah; keduanya disimpan sebagai rekaman terpisah dengan tanggalnya sendiri.

Reproduksi tanpa memberi akses ke proyek asli

Di checkout NoHalu, jalankan dari apps/web. Gunakan Node 24 atau lebih baru sesuai kebutuhan paket; versi yang kami uji tercantum di atas. Dependency hanya masuk ke direktori lab, bukan dependency aplikasi web.

mkdir -p .publication-preview/filesystem-lab
cp public/resources/filesystem-mcp-lab/package*.json .publication-preview/filesystem-lab/
npm ci --prefix .publication-preview/filesystem-lab --ignore-scripts --no-audit --no-fund
node public/resources/filesystem-mcp-lab.mjs

Script membuat fixture baru, memberi server akses hanya ke subfolder allowed, menjalankan pemeriksaan, lalu menghentikan server. Folder uji dan hasil disimpan untuk diperiksa; tidak ada penghapusan otomatis.

Jika mengunduh terpisah, simpan manifest dan lockfile di .publication-preview/filesystem-lab/, jalankan perintah npm ci di atas, lalu jalankan script yang diunduh dengan Node. Gunakan direktori kerja kosong untuk percobaan pertama.

Yang belum dibuktikan

Delapan pemeriksaan sesi pertama dan enam pemeriksaan sesi kedua bukan audit keamanan lengkap. Kedua sesi menegosiasikan protokol 2025-11-25; kami tidak menguji koneksi 2026-07-28, tempat README upstream menyatakan Roots tidak dapat dipakai. Kami juga tidak menguji race condition, semua operasi file, seluruh versi protokol, client desktop seperti Codex atau Claude Code, sandbox OS, maupun Windows/macOS. Roots diuji dengan satu implementasi client buatan kami sendiri, bukan dengan client yang kamu pakai sehari-hari. Tidak ada pengukuran biaya model atau kualitas hasil kerja agent.

Keputusan untuk builder

Server ini layak dieksplorasi jika tugasmu memang memerlukan operasi file dan direktori uji dapat dipisahkan. Jika kebutuhanmu hanya membaca, jangan menyimpulkan “sudah aman” dari folder allowlist. Periksa kontrol client dan pembatasan filesystem yang benar-benar menolak tulis, lalu uji penolakannya.

Sesi kedua menambah satu alasan untuk memeriksa client lebih dulu, dengan batas yang sama seperti di atas: pada koneksi berprotokol 2025-era, batas folder tidak ditentukan sekali di konfigurasi server, tetapi dinegosiasikan setiap sesi. Client yang mendeklarasikan Roots bisa memindahkan batas itu, dan client yang mengosongkan Roots bisa mencabutnya — tanpa menyentuh argumen server. Pada protokol 2026-07-28, Roots tidak tersedia dan direktori argumen adalah seluruh allow-list.

Untuk membaca beberapa file sekali saja, input manual atau script lokal yang sudah dipahami bisa lebih sederhana daripada menambah integrasi MCP. Untuk percobaan agent berikutnya, mulai dari salinan data non-sensitif dan catat tool serta tindakan yang dibutuhkan.

Catat keputusan setup di agent worksheet →