Claude Code로 만든 사내 툴을 osFoundry Room에 승인 받고 올리는 법
다 끝나면 이렇게 된다. Claude Code가 내 머신에서 작은 사내 툴을 짠다(여기서는 스탠드업 타이머다. 이름 목록, 한 사람당 90초, Next 버튼). 그리고 osFoundry의 클라우드 Room에 "제안"으로 보낸다. 이 시점엔 Room에 아무것도 안 생긴다. 제안을 열어 소스 두 개를 읽고 Approve and create를 누르면, Room의 앱 탭 바에 새 탭으로 들어가고 R
다 끝나면 이렇게 된다. Claude Code가 내 머신에서 작은 사내 툴을 짠다(여기서는 스탠드업 타이머다. 이름 목록, 한 사람당 90초, Next 버튼). 그리고 osFoundry의 클라우드 Room에 "제안"으로 보낸다. 이 시점엔 Room에 아무것도 안 생긴다. 제안을 열어 소스 두 개를 읽고 Approve and create를 누르면, Room의 앱 탭 바에 새 탭으로 들어가고 Room 멤버 누구나 열 수 있게 된다. 잘 들어갔는지는 Claude Code가 짐작하지 않고 상태를 읽어서 확인한다.
누가 뭘 하나
| Claude Code | osFoundry | |
|---|---|---|
| 로그인 | 내 머신의 Claude Code 자체 로그인 | 워크스페이스 하나에 한 번 승인한 연결(osfoundry:read / osfoundry:write) |
| 어느 Room | 서버가 주는 목록에서 고른다 | 연결이 들어간 프로젝트에 속한 클라우드 Room만 준다 |
| 코드 | 로컬에서 완전한 파일을 쓰고 files 맵 하나로 보낸다 |
제안으로 저장하고 모든 파일을 생략 없이 오너에게 보여 준다 |
| 승인 | 제안 도구는 destructive라서 Claude Code 쪽에서도 허락을 묻는다 | "Needs your approval"에서 Approve and create를 누르기 전까지 탭 바는 그대로다 |
| 실행 | 돌리지 않는다 | Room이 탭으로 돌린다. 데스크톱 앱은 샌드박스 iframe, 웹은 브라우저 안 샌드박스 |
| 되읽을 수 있는 것 |
list_room_apps, read_room_app_status
|
이름, 식별자, 런처와 최신 빌드 상태만. 설정, 시크릿, 파일, 로그, DB 내용은 안 준다 |
설정
1. Claude Code에 osFoundry 붙이기
osFoundry CLI에 --print를 주면 실행할 명령만 보여 주고 끝난다.
$ 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.
--print 없이 돌리거나 claude mcp add 줄을 직접 치면 된다. Claude Code에서 /mcp를 열고 osfoundry를 골라 Authenticate. 브라우저에서 osFoundry가 열리면 워크스페이스 하나를 고른다. 그 뒤로 도구는 mcp__osfoundry__… 이름으로 보인다.
2. Room을 프로젝트에 넣기
연결이 Room을 알아서 보는 일은 없다. 대상은 클라우드 Room(이 기기에만 둔 게 아니라 워크스페이스에 만든 Room)이어야 하고, 프로젝트에 속해 있어야 한다.
Room을 열고 헤더의 톱니바퀴(Room 설정)를 누른다. "프로젝트" 칸이 비어 있으면 "프로젝트에 추가"가 보이니 프로젝트를 고른다.
3. 연결을 같은 프로젝트에 추가하기
열쇠 아이콘 → Connected에서 Claude Code 연결을 고르고, Projects에서 같은 프로젝트를 골라 Add to project. 그 프로젝트의 Room이 노트, 지식 베이스 같은 다른 동기화 콘텐츠와 함께 연결에 보이게 된다.
표시 예: Room이 속한 프로젝트에 연결을 추가하는 화면
같은 패널의 Tools를 열면 "All supported tools are on by default."라고 나오고, Room 도구는 밑줄 대신 공백으로 이렇게 보인다.
read room propose room snippet app
list room apps propose room repo app
read room app status
Room은 읽기만 시키고 싶으면 propose 두 개를 끄고 Save tools를 누른다.
4. Claude Code에 시키기
만들 것과 둘 곳을 말하면 된다. Claude Code는 평소처럼 작업 폴더에 파일을 쓰고, 그걸 제안한다. 다만 Room 탭에서 돌아가는 조건은 Claude Code가 모른다. React 18 + TypeScript, 엔트리는 src/App.tsx의 default export, npm 패키지는 dayjs, marked, clsx, lucide-react, recharts뿐이다. 데이터는 앱 SDK(docs, kv, db)로 저장하고, localStorage나 외부 사이트 fetch는 못 쓴다. 이건 프롬프트나 CLAUDE.md에 적어 두자. 안 그러면 여기서 삽질한다.
실제로 돌려 보면
도구 이름과 인자 이름은 osFoundry 서버가 tools/list로 주는 그대로다. 프로젝트, Room, ID, 답변은 표시 예다. 파일 두 개는 이 글에서 실제로 쓴 것(63줄, 14줄)이다.
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".
가운데 승인이 내 차례다. 알림 벨에 "<연결 이름> proposes a Room app"이 뜬다. 열쇠 아이콘 → Connected에서 연결을 열면 "Needs your approval"이 있고, 카드는 이렇게 생겼다(이 화면은 영어로 나온다).
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 ]
표시 예: Needs your approval에 도착한 Room 스니펫 앱 제안, 파일 두 개를 펼친 상태
"Review all proposed files"를 펼치면 파일마다 경로와 함께 전문이 나온다. 스니펫엔 빌드도 매니페스트도 없으니 리뷰는 이게 전부다. Approve and create면 탭이 추가되고, Decline이면 제안이 사라진다.
표시 예: 승인한 Standup timer가 Room의 새 탭으로 들어간 화면
어디까지 닿나
로컬 Room에는 안 닿는다. read_room 설명에 아예 "Local Rooms are unavailable."이라고 써 있다. 로컬 Room은 데스크톱 앱이 컴퓨터 한 대 안에 갖고 있는 데이터고, 동기화되지 않는다. Claude Code가 말을 거는 MCP 서버는 osFoundry 클라우드에 있으니, 거기서 그 Room을 보려면 기기와 프로젝트에 묶인 데스크톱 경유 중계가 있어야 한다. initialize 응답에도 일반 규칙으로 "Local-only data is unavailable to cloud clients."가 있다. 툴을 둘 Room이 로컬이면 먼저 클라우드 Room에 둔다. 로컬 탭이라면 ⋯ 메뉴에 "클라우드 Room으로 이동…"이 있다.
제안은 설치가 아니다. Claude Code가 몇 건을 내든 하나하나 사람을 기다린다. 카드는 연결 자체의 패널에 오고, Room 이름, 앱 이름, 모든 파일이 나오며, 만료 시각도 붙는다. 호출마다 idempotency_key(8~128자)가 필수라서, 응답을 놓친 Claude Code가 다시 보내도 같은 제안으로 취급되고 카드가 두 장이 되지 않는다.
다른 입구는 propose_room_repo_app이다. 이건 호출에 파일을 싣지 않고, Room과 같은 프로젝트에 있는 GitNest 리포지토리의 고정된 버전을 가리킨다. 데이터, 시크릿, 데이터베이스, 커넥터, 컴퓨트를 요구하는 앱은 이 도구에서 거절되고, osFoundry에서 사람이 설정해야 한다. 승인 카드에는 "This path does not build or deploy a bundle."이라고 나오고, 일반적인 앱 서빙 사용료가 들 수 있다는 말도 있다.
Claude Code가 되읽는 정보는 일부러 얇다. list_room_apps는 앱 설정, 시크릿, 파일, DB 내용을 빼고, read_room_app_status도 설정, 파일, 로그, 시크릿을 주지 않는다. 타이머가 런처에 있는 건 확인해도, 팀이 입력한 이름은 못 읽는다.
그 이름은 입력한 사람 쪽에 남는다. 스니펫 탭은 데이터를 쓰는 사람의 기기에 저장한다. 데스크톱 앱에서는 탭에 드라이브 아이콘이 붙고 "On this device — data is saved on this computer only"라고 나온다. 명단은 사람마다 따로다. 워크스페이스로 옮기려면 탭을 앱으로 저장하고 Room에서 배포해야 한다. 이건 osFoundry에서 사람이 하는 일이고, Claude Code에는 그걸 할 도구가 없다.
다음엔 리포지토리 경로를 해 보자. Claude Code한테 타이머를 같은 프로젝트의 GitNest 리포지토리에 넣게 하고, 그 버전으로 propose_room_repo_app을 부르게 한다. 그러면 붙여 넣은 복사본이 아니라 리뷰한 고정 버전이 Room에서 돈다. 탭 바와 설정 위치는 Room 페이지에, Room 앱을 어디에 쓰는지는 사내 앱 페이지에 있다.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.

