한 문장으로 이 프로젝트가 뭘 하는지부터.
DevSpace = "ChatGPT에게 내 컴퓨터의 특정 폴더만 안전하게 빌려주는 원격 작업실." 보통 ChatGPT에게 코드를 봐 달라고 하려면 파일을 복사해 붙여넣어야 한다. 길고 번거롭고, 실제로 실행해 볼 수도 없다. DevSpace를 켜면 ChatGPT가 내 진짜 프로젝트 폴더를 직접 열어 파일을 읽고, 코드를 고치고, 검색하고, 테스트·빌드 명령까지 돌린 뒤 "무엇이 바뀌었는지" 보여 준다. 단, 아무 폴더나 되는 게 아니라 내가 허락한 폴더(allowlist)만, 내 비밀번호로 승인한 연결에서만 가능하다.
실력 좋은 기사(ChatGPT)에게 일을 맡기고 싶은데, 집 전체 열쇠를 줄 순 없다. 그렇다고 부품을 일일이 택배로 보냈다 받았다(복붙) 하면 너무 느리다.
DevSpace는 작업실의 특정 칸만 열리는 열쇠를 만들어, 내가 통제하는 출입구(터널)를 통해 기사에게 건넨다. 출입할 땐 내 비밀번호로 직접 승인해야 하고, 기사는 그 칸 안에서만 도구(읽기·수정·검색·명령 실행)를 쓸 수 있다. 일을 끝내면 "이 부분을 이렇게 바꿨습니다"라고 변경 내역까지 보여 준다. 열쇠 범위·출입구·승인을 전부 내가 쥔다는 게 핵심.
정리하면 DevSpace의 핵심 약속은 세 가지다. ① ChatGPT/Claude가 실제 로컬 코드를 읽고 고치고 실행한다(복붙 불필요). ② 코드는 클라우드로 안 올라간다(셀프호스팅). ③ 접근 범위·출입구·승인을 전부 사용자가 통제한다(allowlist + 터널 + Owner 비밀번호). AGENTS.md가 직접 못 박는다 — "보안은 나중에 붙이는 게 아니라 핵심 설계의 일부다."
"ChatGPT를 진짜 코드에 연결"하려는 수요 + "보안을 기본값으로" 설계.
2025~2026년은 AI 코딩 에이전트가 폭발한 시기다. 하지만 대부분은 "복사-붙여넣기" 또는 "코드를 클라우드에 올리기"에 머물렀다. DevSpace가 주목받는 이유는, 그 사이의 빈칸 — "내 코드는 내 컴퓨터에 두되, ChatGPT가 직접 만지게" — 를 보안 우선으로 채웠기 때문이다. 다섯 가지로 본다.
ChatGPT가 앱/MCP를 통해 외부 도구를 쓰는 흐름이 커지면서, "그럼 내 로컬 코드도 직접 다루게 하면?"이라는 자연스러운 수요가 생겼다. DevSpace는 바로 그 다리를 놓는다 — 별도 IDE 플러그인 없이, MCP를 지원하는 호스트라면 어디서든.
원격에서 내 컴퓨터에 명령을 실행한다는 건 무서운 일이다. DevSpace는 이를 정면으로 다룬다 — 좁은 파일 allowlist(roots)로 접근 범위를 묶고, Owner 비밀번호 승인 페이지로 연결을 검문하며, 내가 통제하는 터널로만 노출한다. "신뢰하는 코딩 파트너에게 기계 접근권을 주는 것과 같다"고 솔직하게 경고하는 태도도 신뢰를 준다.
파일 읽기·수정·grep·find·ls·bash 같은 까다로운 코딩 원시기능을 직접 다시 짜지 않고, 성숙한 Pi 코딩 에이전트 SDK(@earendil-works/pi-coding-agent)를 백엔드 어댑터로 쓴다. DevSpace는 그 위에 "원격 MCP 인터페이스 + 보안 + 워크스페이스 관리"라는 자기 가치를 얹는다. 영리한 레버리지다.
폴더마다 open_workspace를 한 번 호출해 workspaceId를 받고 이후 재사용하는 깔끔한 모델을 쓴다. 게다가 격리된 Git 워크트리로 "병렬 코딩 세션"을 지원해, 여러 작업을 서로 간섭 없이 돌릴 수 있다. AGENTS.md/CLAUDE.md 지침도 자동으로 모델에 전달한다.
단순 텍스트 응답을 넘어, ChatGPT Apps 호환 호스트에서 툴 카드·변경 요약 UI를 보여 준다(React로 작성된 src/ui/). "무엇을 바꿨는지" диff를 사람이 검토(review)할 수 있는 체크포인트도 있어, 자율 실행의 불안을 줄인다.
| 방식 | ChatGPT가 내 코드를 다루는 법 | DevSpace와의 차이 |
|---|---|---|
| 복사-붙여넣기 | 코드를 채팅창에 직접 붙임 | 느리고 실행 불가·맥락 제한. DevSpace는 실제 파일을 직접 읽고 실행. |
| 클라우드 코딩 서비스 | 코드를 업체 서버에 올림 | 코드가 외부로 나감. DevSpace는 셀프호스팅(내 컴퓨터에 유지). |
| IDE 확장(예: 코파일럿) | 특정 에디터 안에서만 | 에디터에 종속. DevSpace는 MCP 표준이라 ChatGPT·Claude 등 호스트 무관. |
| DevSpace | MCP 서버로 로컬 폴더를 안전하게 노출 | 로컬 유지 + 보안 통제 + 워크트리 + UI 카드. "ChatGPT를 Codex처럼". |
편의(ChatGPT가 직접 코드 작업)와 안전(코드는 로컬, 접근은 내가 통제)을 동시에 노린다. allowlist·비밀번호·터널이라는 세 겹의 통제로 "강력하지만 무섭지 않은" 원격 코딩을 만든다. 성숙한 Pi SDK를 빌려 도구 품질도 확보.
아무리 통제를 둬도, 본질은 원격 클라이언트가 내 컴퓨터에서 셸 명령을 실행한다는 것이다 — README도 "연결된 클라이언트를 내 기계에 접근하는 신뢰하는 파트너처럼 대하라"고 경고한다. allowlist를 넓게 잡거나 비밀번호가 새면 위험이 커진다. 또 터널·MCP 클라이언트 설정은 초보자에게 진입장벽이 있고(Windows는 PowerShell/cmd 단독 미지원, Git Bash/WSL 필요), 아직 v1.0대 초기라 빠르게 바뀔 수 있다. "자율 실행"은 편하지만, 그래서 변경 검토 습관이 중요하다.
package.json · src/ 소스 트리에서 실제로 확인한 구성.
DevSpace는 전부 TypeScript로 짜인 Node 서버다. 역할별로 ⓐ MCP 서버 본체, ⓑ 코딩 도구(Pi SDK), ⓒ 저장소, ⓓ ChatGPT용 UI, ⓔ CLI·보안으로 나뉜다. 핵심은 "직접 만든 부분(보안·워크스페이스·원격 인터페이스)"과 "빌려 온 부분(코딩 원시기능)"의 조합이다.
| 구성요소 | 무엇 | 역할 |
|---|---|---|
| @modelcontextprotocol/sdk | MCP 공식 SDK | StreamableHTTPServerTransport로 HTTP 기반 MCP 서버 구현. 도구 등록·호출 처리. |
| express 5 | 웹 서버 프레임워크 | /mcp 엔드포인트와 승인 페이지를 띄우는 HTTP 레이어. |
| zod 4 | 스키마 검증 | 각 도구의 입력 인자(workspaceId·경로 등)를 타입·형식 검증. |
| @modelcontextprotocol/ext-apps | MCP Apps 확장 | ChatGPT Apps 호환 호스트에 UI 카드를 띄우기 위한 연동. |
| 구성요소 | 무엇 | 역할 |
|---|---|---|
| @earendil-works/pi-coding-agent | Pi 코딩 에이전트 SDK | read·edit·write·grep·find·ls·bash 같은 성숙한 파일 원시기능. DevSpace의 도구 실체. |
| src/pi-tools.ts | Pi 도구 래퍼 | Pi의 결과를 MCP 응답 형식으로 변환하고 허용 경로로 한정(resolveAllowedPath). |
| src/roots.ts | allowlist 해석 | 요청 경로가 허용된 루트 안인지 검사. 보안의 1차 관문. |
| 구성요소 | 무엇 | 역할 |
|---|---|---|
| better-sqlite3 | 임베디드 SQLite | 워크스페이스·체크포인트 상태를 로컬 DB에 저장(외부 DB 불필요). |
| drizzle-orm | TypeScript ORM | src/db/schema.ts로 테이블 정의, 타입 안전하게 조회. |
| review-checkpoints.ts | 변경 스냅샷 | 작업 전/후 상태를 찍어 "무엇이 바뀌었나" diff를 만들 근거. |
ChatGPT Apps 호환 호스트에서 보일 툴 카드·변경 요약 UI는 React 19로 작성돼 src/ui/에 있고(workspace-app.tsx·review-payload.tsx), vite로 빌드된다. diff 렌더는 @pierre/diffs를 쓴다. 사용자 진입점인 CLI(src/cli.ts)는 @clack/prompts로 init 마법사(루트·포트·터널 URL 입력, Owner 비밀번호 생성)와 serve·doctor를 제공한다. 보안은 src/oauth-provider.ts(OAuth 승인 흐름)와 ~/.devspace/auth.json(Owner 자격) 중심이다.
먼저 전체 그림을 한 장으로 본 뒤, "ChatGPT가 파일을 하나 수정하기까지"를 끝까지 따라간다.
DevSpace의 일은 "원격 AI 클라이언트의 도구 호출을, 허용된 로컬 폴더 안의 실제 파일 작업으로 안전하게 중계하는 것"이다. 큰 그림은 이렇다. (1) 클라우드의 ChatGPT가 (2) 내가 통제하는 터널을 거쳐 (3) 내 컴퓨터의 DevSpace 서버에 닿고, (4) Owner 비밀번호로 승인되면, (5) open_workspace로 허용된 폴더를 열어 workspaceId를 받고, (6) 그 ID로 read/edit/shell 도구를 호출하면 (7) 서버가 allowlist를 검사한 뒤 Pi SDK로 실제 작업을 수행한다. 부품 이름보다 숲을 먼저 보자.
init 때 정한 "ChatGPT가 열 수 있는 폴더 목록"이다 — 그 밖의 경로는 거부된다(보안 울타리). workspaceId는 open_workspace로 폴더를 한 번 열면 받는 핸들로, 이후 모든 도구 호출에 이 ID를 붙인다. "폴더당 한 번 열고, 그 ID를 재사용"하는 규칙 덕에 매 호출마다 경로를 다시 검증·해석하는 비용과 실수를 줄인다.사용자가 "이 프로젝트의 버그를 고쳐 줘"라고 했을 때, 막 뒤에서 벌어지는 일을 순서대로 풀면(실제 server.ts의 도구 흐름):
// 사전: devspace init(루트·비번 설정) → 터널 켜기 → devspace serve
1. 연결·승인 ChatGPT가 공개 /mcp 에 접속 → Owner 비밀번호 승인 페이지 통과
2. 워크스페이스 열기 open_workspace("~/myproj") → roots 검사 OK → workspaceId 발급
3. 맥락 로드 AGENTS.md/CLAUDE.md·사용 가능한 skills 를 함께 반환(모델이 먼저 읽음)
4. 탐색 search/grep(workspaceId, "buggyFn") → 의심 파일 위치 찾기
5. 읽기 read_file(workspaceId, "src/x.ts") → 내용 확인
6. 수정 edit_file(workspaceId, oldText→newText) → resolveAllowedPath 검사 후 적용
7. 검증 shell(workspaceId, "npm test") → 테스트 실행
8. 변경 요약 show changes → 작업 전 체크포인트와 diff 비교해 "무엇이 바뀌었나" 카드
핵심 관례 둘. 첫째, 경로는 매번 다시 검문한다 — workspaceId가 있어도 resolveAllowedPath가 "이 경로가 허용 루트 안인가"를 한 번 더 확인한다(이중 잠금). 둘째, 서버 프롬프트가 모델에게 "파일 생성·수정은 shell로 하지 말고 edit/write 도구로 하라"고 명시한다(셸 리다이렉트·sed -i 등 금지). 도구마다 책임을 못 박아, 변경이 추적 가능하고 안전하게 흐르도록 설계했다.
open_workspace에 mode:"worktree"를 주면, DevSpace가 격리된 Git 워크트리를 만들어(git-worktrees.ts) 그 안에서 작업한다. 같은 저장소를 두고 여러 작업을 서로 간섭 없이 동시에 돌릴 수 있다(예: 한쪽은 기능 개발, 한쪽은 리뷰). 기본은 실제 체크아웃(checkout)이고, 사용자가 "분리된 세션"을 원할 때만 워크트리를 쓴다 — 안전한 기본값 + 필요 시 확장이라는 좋은 패턴이다.
도구를 쓸 때마다 open_workspace를 다시 부르고 싶어지지만, 그건 비효율이고 설계 의도에 어긋난다. 폴더당 한 번만 열어 workspaceId를 받고, 이후엔 그 ID를 재사용한다. 다시 여는 건 폴더를 바꾸거나, checkout↔worktree 모드를 바꾸거나, ID가 거부될 때뿐 — 서버 설명도 이 점을 반복해 강조한다.
복잡성의 대부분은 src/server.ts(1,453줄)에 모여 있다. 큰 것만 본다.
모든 게 src/ 안에 있고, 그중 server.ts가 MCP 서버 + 도구 등록의 심장이다. 나머지는 server가 부르는 부품들 — 보안(roots·oauth), 워크스페이스(workspaces·store·worktrees), 도구(pi-tools), UI(ui/), 저장(db/)로 묶어 보면 길이 보인다.
| 위치 | 한 줄 역할 |
|---|---|
| src/server.ts | 모든 것의 중심. MCP 전송·도구 등록(open_workspace·read·edit·shell…)·요청 라우팅. |
| src/cli.ts | 사용자 진입점. init(설정 마법사)·serve(서버 실행)·doctor(환경 점검). |
| src/roots.ts | 보안의 1차 관문. 요청 경로가 허용 루트 안인지 검사. |
| src/pi-tools.ts | 실제 파일 작업의 다리. Pi SDK 도구를 MCP 응답으로 변환. |
| src/git-worktrees.ts | 격리 Git 워크트리 생성 — 병렬 코딩 세션의 토대. |
| src/review-checkpoints.ts | 변경 전/후 스냅샷으로 "무엇이 바뀌었나" diff를 만든다. |
| src/ui/workspace-app.tsx | ChatGPT Apps 호스트에 뜨는 React 툴 카드. |
| AGENTS.md | 모델용 지침 + "보안은 핵심 설계"라는 프로젝트 철학. |
이 레포 한 채로 "MCP 서버 + 원격 보안 + ChatGPT Apps UI"를 한 번에 본다.
DevSpace는 "AI에게 시스템 접근권을 안전하게 주는 법"이라는, 요즘 가장 뜨거운 주제의 살아 있는 예제다. 기술별로 무엇을 건질지 짚는다.
@modelcontextprotocol/sdk로 HTTP 기반 MCP 서버를 세우고, open_workspace·read_file 같은 도구를 zod 스키마와 함께 등록하는 전 과정을 server.ts에서 볼 수 있다. "MCP 서버를 어떻게 짜나"의 모범 답안.
실습: server.ts의 도구 등록부를 읽고, 새 읽기 전용 도구(예: file_stat)를 하나 추가해 보기.
"내 기계에 원격 접근"이라는 위험을 어떻게 다루는지가 핵심 교훈이다. roots.ts의 경로 검문, Owner 비밀번호 승인, "셸로 파일 쓰지 말라"는 도구 책임 분리 — 실전 위협 모델링을 코드로 배운다.
실습: resolveAllowedPath를 읽고, 허용 루트 밖 경로(../ 탈출 시도)가 어떻게 막히는지 추적.
"폴더당 한 번 열어 ID 재사용"이라는 상태 관리와, 격리 워크트리로 병렬 작업을 지원하는 설계(git-worktrees.ts)를 본다. 동시성·격리를 실제 Git 기능으로 푸는 실용적 패턴.
실습: mode:"checkout"과 mode:"worktree"의 차이를 코드로 비교하고, 워크트리가 어디에 생기는지 확인.
까다로운 코딩 원시기능을 직접 짜는 대신 @earendil-works/pi-coding-agent를 어댑터로 감싸는 방식(pi-tools.ts)을 본다. "외부 엔진을 내 인터페이스로 변환"하는 어댑터 패턴의 좋은 예.
실습: toMcpContent가 Pi 결과(텍스트·이미지)를 MCP 형식으로 바꾸는 부분을 읽기.
React로 만든 툴 카드(src/ui/)와 변경 diff(review-checkpoints + @pierre/diffs)가 자율 실행의 불안을 어떻게 줄이는지 본다. "AI 작업 결과를 사람이 승인"하는 UX의 실전 예.
실습: review-payload.tsx를 읽고 변경 요약이 어떤 데이터로 렌더되는지 파악.
GPU 불필요. "Node + Git + Bash"와 "내가 통제하는 터널"이면 충분하다.
DevSpace는 추론 모델이 아니라 중계 서버라 고사양·GPU가 필요 없다. 대신 Node 런타임, Git, Bash 호환 셸, 그리고 외부에서 내 서버에 닿게 할 터널이 필요하다. Windows는 PowerShell/cmd 단독으론 안 되고 Git Bash나 WSL이 있어야 한다.
| 항목 | 요구사항 |
|---|---|
| Node.js | ≥20.12 <27 (Node 22 LTS 권장). npm install -g @waishnav/devspace. |
| Git | 필수(워크트리·변경 추적). 프로젝트가 Git 저장소면 기능을 100% 활용. |
| 셸 | Bash 호환 셸 필요. Win은 Git Bash/WSL/MSYS2/Cygwin(PowerShell·cmd 단독 미지원). |
| 터널 | 공개 HTTPS 노출용 — Cloudflare Tunnel·ngrok·Pinggy·Tailscale Funnel 등(내가 통제). |
| 포트 | 로컬 기본 7676 (엔드포인트 http://127.0.0.1:7676/mcp). |
| MCP 클라이언트 | ChatGPT(MCP/Apps 지원) 또는 Claude 등 MCP 호환 호스트. |
| 자격 저장 | Owner 비밀번호는 ~/.devspace/auth.json에 저장(외부 노출 금지). |
| GPU | 불필요. |
가장 빠른 점검은 devspace doctor다 — Node·Git·Bash 등 로컬 환경이 준비됐는지 한 번에 확인해 준다. 그다음 devspace init으로 허용 폴더·포트·터널 URL을 정하고 비밀번호를 받은 뒤, 터널을 켜고 devspace serve로 서버를 띄우면 된다.
"doctor·init"은 10분, "터널 연결·워크트리"는 한나절. 난이도 순으로.
npm install -g @waishnav/devspace 후 devspace doctor로 환경을 점검하고, devspace init으로 허용 폴더 1개·포트·(임시) 터널 URL을 설정한다. 생성된 Owner 비밀번호와 ~/.devspace/auth.json을 확인.
devspace serve로 서버를 켜고 http://127.0.0.1:7676/mcp가 응답하는지 확인한다. 로그에 어떤 도구가 등록됐는지(open_workspace·read_file·shell …) 관찰.
Cloudflare Tunnel이나 ngrok으로 localhost:7676을 공개 HTTPS로 노출하고, ChatGPT MCP 클라이언트에 https://<터널>/mcp를 등록한다. Owner 비밀번호로 승인한 뒤 "내 프로젝트 열어 줘"를 시켜 본다.
허용 루트 밖의 경로(예: 홈 디렉터리 다른 폴더, ../ 탈출)를 읽으라고 요청해 본다. 거부되는 동작과, roots.ts/resolveAllowedPath가 그것을 어떻게 막는지 코드로 대조한다.
open_workspace를 mode:"worktree"로 호출해 격리 세션을 만들고, 같은 저장소에서 두 작업을 동시에 진행해 본다. 워크트리가 어디 생기고, 메인 체크아웃과 어떻게 분리되는지 git worktree list로 확인.
server.ts의 도구 등록 패턴을 따라, 읽기 전용 도구(예: "프로젝트 트리 요약")를 zod 스키마와 함께 추가하고 Pi/직접 구현으로 결과를 만든다. 빌드 후 클라이언트에서 호출해 본다.
DevSpace를 100% 소화하기 위한 6주 코스(주당 5~7시간 가정).
| 주차 | 주제 | 학습 자료 / 할 일 |
|---|---|---|
| 1주차 | MCP 기초 | MCP가 무엇이고 도구/리소스가 어떻게 노출되는지. 공식 문서 + DevSpace 설치·doctor. 실습 1·2. |
| 2주차 | 터널 · 원격 연결 | Cloudflare Tunnel/ngrok 개념, HTTPS 노출. ChatGPT에 실제 연결. 실습 3. |
| 3주차 | 원격 접근 보안 | roots.ts·oauth-provider.ts 정독. 위협 모델·경로 검문 이해. 실습 4. |
| 4주차 | MCP 서버 내부 | server.ts의 도구 등록·요청 처리 흐름 추적. zod 스키마 패턴. |
| 5주차 | 워크스페이스 · Git 워크트리 | workspaces.ts·git-worktrees.ts 읽기. 병렬 세션 실습. 실습 5. |
| 6주차 | 도구 확장 · UI 카드 | 새 도구 추가(실습 6) + src/ui/ React 카드·diff 구조 이해. |
이 문서와 레포에 등장한 용어를 한자리에.
| 용어 | 의미 |
|---|---|
| DevSpace | ChatGPT/Claude가 내 로컬 코드를 안전하게 다루게 하는 셀프호스팅 MCP 서버. |
| MCP | Model Context Protocol. AI가 외부 도구·데이터에 접속하는 표준 규약("AI용 USB 포트"). |
| Streamable HTTP | MCP의 HTTP 기반 전송 방식. DevSpace 서버가 /mcp로 이를 노출. |
| 셀프호스팅 | 남의 클라우드가 아닌 내 컴퓨터에서 직접 실행. 코드가 외부로 안 나감. |
| 터널(tunnel) | 로컬 서버를 공개 HTTPS로 잇는 통로(Cloudflare·ngrok 등). 사용자가 통제. |
| Codex | OpenAI의 코딩 에이전트. DevSpace의 목표는 "ChatGPT를 Codex처럼". |
| roots(allowlist) | ChatGPT가 열 수 있는 폴더 목록. 그 밖 경로는 거부 — 보안 울타리. |
| workspaceId | open_workspace로 폴더를 열면 받는 핸들. 이후 도구 호출에 재사용. |
| open_workspace | 폴더를 작업공간으로 여는 도구. AGENTS.md·skills도 함께 로드. |
| Owner 비밀번호 | 연결 승인용 자격. init이 생성, ~/.devspace/auth.json에 저장. |
| Pi SDK | @earendil-works/pi-coding-agent. read·edit·grep·bash 등 파일 원시기능 제공. |
| resolveAllowedPath | 요청 경로가 허용 루트 안인지 매 호출 재검문하는 함수(이중 잠금). |
| Git 워크트리 | 같은 저장소의 격리 작업 디렉터리. 병렬 코딩 세션을 충돌 없이 지원. |
| review checkpoint | 작업 전/후 상태 스냅샷. "무엇이 바뀌었나" diff의 근거. |
| ChatGPT Apps | ChatGPT 안에서 앱 UI(툴 카드 등)를 띄우는 체계. DevSpace는 React로 카드 제공. |
| AGENTS.md / CLAUDE.md | 프로젝트별 모델 지침 파일. open_workspace가 자동 로드해 모델에 전달. |
| doctor / init / serve | DevSpace CLI 명령: 환경점검 / 초기설정 / 서버실행. |
원문·문서·관련 기술 더 파기.