Di akhir panduan ini, Claude Code menulis tool internal kecil di mesinmu (di sini, timer standup: daftar nama, 90 detik per orang, dan tombol Next) lalu mengusulkannya ke sebuah Room cloud di osFoundry. Belum ada apa pun yang muncul di Room. Kamu membuka usulan itu, membaca kedua file sumbernya, lalu mengklik Approve and create. Setelah itu timer muncul di tab bar aplikasi Room sebagai tab baru yang bisa dibuka semua orang di Room tersebut. Claude Code mengecek hasilnya lewat pembacaan status, bukan menebak.
Siapa mengerjakan apa
| Claude Code | osFoundry | |
|---|---|---|
| Login | Login miliknya sendiri di mesinmu | Koneksi yang sekali kamu setujui untuk satu workspace, dengan scope osfoundry:read dan osfoundry:write
|
| Room yang mana | Memilih satu dari daftar yang diberikan server | Hanya menampilkan Room cloud yang masuk ke project tempat koneksi itu berada |
| Kodenya | Menulis file lengkap secara lokal dan mengirimnya sebagai satu map files
|
Menyimpan usulan dan menampilkan setiap file, utuh, ke pemiliknya |
| Persetujuan | Prompt izin tool miliknya sendiri, karena tool propose ditandai destruktif | Kamu mengklik Approve and create di bawah "Needs your approval" (menunggu persetujuanmu). Sampai saat itu, tab bar Room tidak berubah |
| Menjalankan aplikasi | Tidak menjalankannya | Room menjalankannya sebagai tab: iframe ber-sandbox di aplikasi desktop, sandbox di browser untuk versi web |
| Yang bisa dibaca balik |
list_room_apps dan read_room_app_status
|
Nama, identitas, launcher, dan status build terakhir. Tanpa config aplikasi, secret, file, log, atau isi database |
Persiapan
1. Tambahkan osFoundry ke Claude Code
Kalau kamu menambahkan --print, CLI osFoundry mencetak perintah yang akan dijalankannya:
$ osfoundry agent connect claude --print
$ claude mcp add --transport http -s user osfoundry https://api.osfoundry.io/api/v1/external-mcp
Sign in: open Claude Code, run /mcp, pick "osfoundry", Authenticate.
Jalankan tanpa --print, atau tempel sendiri baris claude mcp add. Di Claude Code, jalankan /mcp, pilih osfoundry, lalu pilih Authenticate. Browser akan membuka osFoundry, dan di sana kamu memilih satu workspace. Setelah itu tool-nya muncul sebagai mcp__osfoundry__….
2. Masukkan Room ke sebuah project
Koneksi tidak pernah bisa melihat Room dengan sendirinya. Room itu harus Room cloud (dibuat di workspace, bukan disimpan di perangkat ini), dan harus masuk ke sebuah project.
Buka Room dan klik ikon roda gigi di header-nya (pengaturan Room). Field Project menampilkan "Add to project" kalau Room belum punya project. Teks bantuannya berbunyi "Project-owned content is accessible to members of this project and its ancestors." (konten milik project bisa diakses anggota project ini dan project induknya). Pilih project-nya.
3. Tambahkan koneksi ke project itu
Buka ikon kunci → Connected, pilih koneksi Claude Code, lalu di bagian Projects pilih project yang sama dan klik Add to project. Room di project itu ikut masuk, bersama Notes, knowledge base, dan konten tersinkron lainnya.
Contoh: Menambahkan koneksi ke project tempat Room berada
Buka Tools di panel yang sama. "All supported tools are on by default." (semua tool yang didukung aktif secara default). Tool untuk Room ditulis dengan spasi, bukan garis bawah:
read room propose room snippet app
list room apps propose room repo app
read room app status
Supaya Claude Code hanya bisa membaca Room, hapus centang dua tool propose lalu klik Save tools.
4. Minta tool-nya ke Claude Code
Jelaskan tool yang kamu mau dan sebutkan ke mana harus ditaruh. Claude Code menulis file di folder kerjanya seperti kode lain, lalu mengusulkannya. Tab Room berjalan dengan React 18 dan TypeScript. Entry-nya adalah src/App.tsx dengan default export. Paket npm yang tersedia hanya dayjs, marked, clsx, lucide-react, dan recharts. Data disimpan lewat SDK aplikasi (docs, kv, db), bukan localStorage dan bukan fetch ke situs luar. Tulis ini di prompt atau di CLAUDE.md, karena kalau tidak, Claude Code tidak akan tahu.
Contoh run sungguhan
Nama tool dan nama argumen adalah yang dikembalikan server osFoundry dari tools/list. Project, Room, ID, dan balasannya adalah konten contoh. Kedua file adalah file asli dari panduan ini (63 dan 14 baris).
Example
You: Build a small standup timer for the Launch room in osFoundry. Names list,
90 seconds each, a Next button, roster saved. Propose it as a Room app.
Claude Code → mcp__osfoundry__list_granted_resources {}
← project "Launch plan"
Claude Code → mcp__osfoundry__list_project_resources {"project_id": "…", "resource_type": "room"}
← Room "Launch room" (room_7f3c)
Claude Code → mcp__osfoundry__read_room {"room_id": "room_7f3c"}
← cloud Room "Launch room"
Claude Code → mcp__osfoundry__list_room_apps {"room_id": "room_7f3c"}
← 2 apps, no standup timer
Claude Code → Write src/App.tsx (63 lines: roster in kv, 90 s countdown, Next/Finish)
Claude Code → Write src/styles.css (14 lines)
Claude Code → mcp__osfoundry__propose_room_snippet_app
{"room_id": "room_7f3c", "name": "Standup timer",
"files": {"src/App.tsx": "import { useEffect, useState } from 'react'\n…",
"src/styles.css": ":root { --bg: #fff; …"},
"idempotency_key": "snip-1c9e…"}
← proposal waiting for the owner
Claude Code: I proposed "Standup timer" to Launch room. It shows up in the Room
once you approve it under Connected → Needs your approval.
(you approve in osFoundry)
You: Approved. Is it there?
Claude Code → mcp__osfoundry__list_room_apps {"room_id": "room_7f3c"}
← 3 apps, including "Standup timer"
Claude Code → mcp__osfoundry__read_room_app_status {"room_id": "room_7f3c", "instance_id": "…"}
← on the Room launcher
Claude Code: It's in Launch room's tab bar as "Standup timer".
Bagian tengahnya adalah tugasmu. Ikon lonceng menampilkan " proposes a Room app". Di ikon kunci → Connected, panel koneksi punya bagian "Needs your approval". Isi kartunya:
Create Room snippet app in Launch room
Standup timer
▸ Review all proposed files (2)
Approval makes this code available in the Room app launcher. Review the files before approving.
Expires …
[ Approve and create ] [ Decline ]
Contoh: Usulan snippet app Room di Needs your approval, dengan kedua file terbuka
Buka "Review all proposed files". Setiap file ditampilkan utuh, dengan path di bagian atas. Itulah seluruh review-nya, karena snippet tidak punya langkah build atau manifest yang perlu dicek. Approve and create menambahkan tab-nya. Decline membuang usulan itu.
Contoh: Standup timer yang sudah disetujui sebagai tab baru di Room
Di mana batasnya
Room lokal tidak bisa dijangkau, dan read_room menyebutkannya di deskripsinya sendiri: "Local Rooms are unavailable." Room lokal hanyalah satu baris di database aplikasi desktop di satu komputer, dan tidak pernah disinkronkan. Server MCP yang diajak bicara Claude Code berjalan di cloud osFoundry, jadi satu-satunya cara ia bisa melihat Room itu adalah lewat relay melalui desktop-mu, yang terikat ke perangkat dan project tersebut. Balasan initialize dari server menyatakan aturan umumnya: "Local-only data is unavailable to cloud clients." Kalau tool-nya memang untuk Room lokal, taruh dulu di Room cloud. Menu ⋯ pada tab lokal juga punya opsi "Move to cloud room…".
Usulan bukanlah instalasi. Claude Code bisa membuat usulan sebanyak yang kamu izinkan, dan masing-masing menunggu keputusan manusia. Kartunya masuk ke panel milik koneksi itu sendiri, berisi nama Room, nama aplikasi, dan setiap file, serta punya batas waktu. Setiap panggilan juga membawa idempotency_key (8 sampai 128 karakter), jadi panggilan yang diulang Claude Code setelah respons hilang dikenali sebagai usulan yang sama, bukan kartu baru.
propose_room_repo_app adalah jalur lainnya. Tool ini menunjuk ke versi yang di-pin dari repository GitNest di project yang sama dengan Room, bukan ke file di dalam panggilan. Aplikasi yang meminta data, secret, database, connector, atau compute ditolak oleh tool ini dan harus disiapkan oleh manusia di osFoundry. Kartu persetujuannya berbunyi "This path does not build or deploy a bundle." dan bahwa persetujuan itu "may incur normal app-serving usage".
Yang bisa dibaca balik oleh Claude Code sengaja dibuat tipis. list_room_apps tidak menyertakan config aplikasi, secret, file, dan isi database, dan read_room_app_status tidak mengembalikan config, file, log, atau secret. Jadi ia bisa memastikan timer ada di launcher, tetapi tidak bisa membaca nama-nama yang diketik timmu di dalamnya.
Nama-nama itu tetap berada di tempat diketiknya. Tab snippet menyimpan datanya di perangkat orang yang memakainya. Di aplikasi desktop, tab menampilkan ikon drive, "On this device — data is saved on this computer only", jadi daftar setiap rekan tim adalah milik mereka sendiri. Untuk membawa data itu ke workspace, tab harus disimpan sebagai aplikasi lalu di-deploy dari Room. Itu dilakukan manusia di osFoundry, dan Claude Code tidak punya tool untuk itu.
Hal berikutnya yang layak dicoba adalah jalur repository: minta Claude Code mem-push timer ke repository GitNest di project yang sama, lalu panggil propose_room_repo_app dengan versi itu, sehingga Room menjalankan versi yang di-pin dan bisa direview, bukan salinan yang ditempel. Halaman Room menunjukkan tab bar dan pengaturannya, dan aplikasi internal menjelaskan untuk apa aplikasi Room dibuat.



Top comments (0)