Superserve Sandbox MCP
공식Superserve가 호스팅하는 에이전트용 보안 가상 머신
Superserve Sandbox MCP(으)로 무엇을 할 수 있나요?
- 샌드박스 생성 및 실행 — 어시스턴트에게
sandbox_create로 샌드박스를 생성하고sandbox_exec를 통해python --version같은 명령어를 실행하도록 요청하세요. - 샌드박스에서 파일 관리 —
sandbox_files_write,sandbox_files_read,sandbox_files_list를 사용하여 샌드박스 내부에서 파일을 생성, 조회 또는 정리하세요. - 샌드박스 수명 주기 제어 —
sandbox_pause,sandbox_resume,sandbox_kill로 샌드박스를 일시 중지, 재개 또는 영구 삭제하여 리소스를 관리하세요. - 미리보기 URL 게시 —
sandbox_preview_url을 호출하여 실행 중인 서비스를 공개하거나 만료되는 비공개 링크를 얻으세요. - 비밀 정보를 안전하게 바인딩 —
sandbox_attach_secret및sandbox_detach_secret을 통해 저장된 팀 비밀 정보를 샌드박스에 첨부하거나 분리하되, 원시 값을 노출하지 마세요. - 사용자 정의 템플릿 구축 —
sandbox_template_create로 특정 CPU/메모리/디스크 구성을 가진 재사용 가능한 샌드박스 템플릿을 만들고sandbox_template_list로 목록을 확인하세요.
문서
MCP 서버
모든 MCP 클라이언트에서 Superserve 샌드박스를 생성, 실행, 관리하세요.
에이전트가 스스로 샌드박스를 만들게 하시겠습니까? 이 MCP 서버가 그 역할을 합니다.
Superserve MCP 서버 (@superserve/mcp)는 샌드박스 기본 요소를 Model Context Protocol 도구로 노출하므로, MCP를 지원하는 모든 클라이언트 — Claude, Cursor, VS Code, Windsurf, Codex — 에서 격리된 Firecracker 마이크로VM에서 샌드박스를 생성하고, 명령을 실행하고, 파일을 읽고 쓰고, 템플릿을 빌드하고, 비밀번호를 중개하고, 네트워크 액세스를 제어할 수 있습니다.
두 가지 방법으로 실행할 수 있습니다: npx을 통한 로컬 stdio 실행, 또는 로컬 설치 없이 https://mcp.superserve.ai의 호스팅 엔드포인트 사용. 둘 다 SUPERSERVE_API_KEY으로 인증하고 호출별로 ID로 샌드박스를 대상으로 합니다. TypeScript SDK 위의 얇은 래퍼이므로 샌드박스별 데이터 플레인 토큰이 모델에 도달하지 않습니다.
빠른 시작
클라이언트에 서버를 추가한 다음(설치 참조), 에이전트에게 *"샌드박스를 만들고 그 안에서 python --version를 실행하세요"*라고 요청하세요. 에이전트가 sandbox_create을 호출한 다음 sandbox_exec을 호출하고 결과를 보고합니다 — 코드는 필요 없습니다.
Superserve API 키가 필요합니다 — API 키 페이지에서 만드세요. 전역 설치가 없습니다. npx이 첫 사용 시 서버를 가져옵니다.
설치
```bash theme={"theme":{"light":"github-light","dark":"vitesse-dark"}} claude mcp add superserve \ --env SUPERSERVE_API_KEY=ss_live_xxxxxxxxxxxxxxxx \ -- npx -y @superserve/mcp ``` `claude_desktop_config.json`에 추가하세요 (macOS: `~/Library/Application Support/Claude/`):참고
서버의
env에SUPERSERVE_API_KEY을 설정하세요 — MCP 클라이언트는 셸에서 이를 상속하지 않습니다. 클라이언트가 지원하는 경우 원시 키를 붙여넣는 대신 비밀 입력 프롬프트를 선호하세요(아래 VS Code 참조).
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"mcpServers": {
"superserve": {
"command": "npx",
"args": ["-y", "@superserve/mcp"],
"env": { "SUPERSERVE_API_KEY": "ss_live_xxxxxxxxxxxxxxxx" }
}
}
}
```
`.cursor/mcp.json`(프로젝트) 또는 `~/.cursor/mcp.json`(전역)에 추가하세요:
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"mcpServers": {
"superserve": {
"command": "npx",
"args": ["-y", "@superserve/mcp"],
"env": { "SUPERSERVE_API_KEY": "ss_live_xxxxxxxxxxxxxxxx" }
}
}
}
```
`.vscode/mcp.json`에 추가하세요. `inputs` 블록은 평문으로 저장하는 대신 키를 프롬프트로 요청합니다:
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"inputs": [
{
"id": "superserve-key",
"type": "promptString",
"description": "Superserve API key",
"password": true
}
],
"servers": {
"superserve": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@superserve/mcp"],
"env": { "SUPERSERVE_API_KEY": "${input:superserve-key}" }
}
}
}
```
`~/.codeium/windsurf/mcp_config.json`에 추가하세요:
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"mcpServers": {
"superserve": {
"command": "npx",
"args": ["-y", "@superserve/mcp"],
"env": { "SUPERSERVE_API_KEY": "ss_live_xxxxxxxxxxxxxxxx" }
}
}
}
```
`~/.codex/config.toml`에 추가하세요. `env_vars`은 환경에서 `SUPERSERVE_API_KEY`을 전달하므로 원시 키가 구성 파일에 저장되지 않습니다(먼저 셸에서 내보내세요). Codex는 또한 크로스 도구 워크플로 지침을 위해 서버의 `instructions`을 읽습니다.
```toml theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
[mcp_servers.superserve]
command = "npx"
args = ["-y", "@superserve/mcp"]
env_vars = ["SUPERSERVE_API_KEY"]
```
[호스팅](#hosted-remote) 엔드포인트의 경우 `bearer_token_env_var = "SUPERSERVE_API_KEY"`과 함께 `url = "https://mcp.superserve.ai"`을 사용하세요.
호스팅(원격)
로컬에서 아무것도 실행하고 싶지 않으신가요? https://mcp.superserve.ai의 호스팅 엔드포인트는 Streamable HTTP를 사용합니다 — npx도 Node도 필요 없습니다. Superserve API 키를 베어러 토큰으로 보내세요. 엔드포인트는 상태 비저장이며 계정 범위입니다(키는 이미 팀에 매핑됨). 샌드박스별 데이터 플레인 토큰은 서버를 떠나지 않습니다.
```bash theme={"theme":{"light":"github-light","dark":"vitesse-dark"}} claude mcp add --transport http superserve https://mcp.superserve.ai \ --header "Authorization: Bearer ss_live_xxxxxxxxxxxxxxxx" ``` `.cursor/mcp.json`(프로젝트) 또는 `~/.cursor/mcp.json`(전역)에 추가하세요:참고
베어러 인증은 요청 헤더를 설정할 수 있는 모든 클라이언트에서 작동합니다 — Claude Code, Cursor, VS Code, Anthropic Messages API 커넥터. Claude.ai, Claude Desktop의 Custom Connector UI, ChatGPT 개발자 모드는 정적 베어러 / 사용자 정의 헤더 필드를 제공하지 않습니다(OAuth를 기대함). 호스팅 엔드포인트는 아직 이를 지원하지 않습니다 — 해당 환경에서는 로컬 설치를 사용하세요.
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"mcpServers": {
"superserve": {
"url": "https://mcp.superserve.ai",
"headers": { "Authorization": "Bearer ss_live_xxxxxxxxxxxxxxxx" }
}
}
}
```
`.vscode/mcp.json`에 추가하세요. `inputs` 블록은 평문으로 저장하는 대신 키를 프롬프트로 요청합니다:
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"inputs": [
{
"id": "superserve-key",
"type": "promptString",
"description": "Superserve API key",
"password": true
}
],
"servers": {
"superserve": {
"type": "http",
"url": "https://mcp.superserve.ai",
"headers": { "Authorization": "Bearer ${input:superserve-key}" }
}
}
}
```
[Anthropic Messages API](https://docs.anthropic.com/en/docs/agents-and-tools/mcp-connector) 요청에서 커넥터로 전달하세요:
```json theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
{
"mcp_servers": [
{
"type": "url",
"name": "superserve",
"url": "https://mcp.superserve.ai",
"authorization_token": "ss_live_xxxxxxxxxxxxxxxx"
}
]
}
```
로컬 서버와 동일한 도구와 동작 — 유일한 차이는 전송 방식과 키가 env 변수 대신 베어러 헤더로 전달된다는 점입니다.
도구
| 도구 | 기능 |
|---|---|
sandbox_create | 새 샌드박스 생성; id을 반환합니다. secrets, 이그레스 규칙, preview_access을 허용합니다. |
sandbox_update | 메타데이터, 이그레스 규칙, 수명 주기 창 또는 preview_access을 변경합니다. |
sandbox_list | 샌드박스 목록(활성 및 일시 중지)을 메타데이터로 필터링하여 표시합니다. |
sandbox_info | 하나의 샌드박스 상태, 리소스, 메타데이터, 네트워크 규칙, 비밀 바인딩을 가져옵니다. 읽기 전용. |
sandbox_exec | 셸 명령 실행; stdout, stderr, 종료 코드를 반환합니다. 일시 중지된 샌드박스를 자동 재개합니다. |
sandbox_files_read | 파일 읽기(UTF-8 텍스트 또는 바이너리의 base64). |
sandbox_files_write | 파일 생성 또는 덮어쓰기. 상위 디렉터리는 자동으로 생성됩니다. |
sandbox_files_list | 디렉터리 항목 목록(이름, 유형, 크기, 수정 시간). |
sandbox_files_download_dir | 디렉터리를 base64 ZIP으로 다운로드(심볼릭 링크 건너뜀). 10MiB로 제한; 더 큰 경우 → SDK/CLI. |
sandbox_pause | 샌드박스 일시 중지; 상태가 보존됩니다. |
sandbox_resume | 일시 중지된 샌드박스 재개(일반적으로 불필요 — exec가 자동 재개). |
sandbox_kill | 샌드박스를 영구적으로 삭제합니다. |
sandbox_preview_url | 포트를 게시하고 깨끗한 공개 URL 또는 만료되는 비공개 서명 URL을 반환합니다. |
sandbox_network_log | 재개하지 않고 샌드박스의 아웃바운드 연결(호스트, 판정, 바이트)을 감사합니다. |
sandbox_template_list | 팀이 시작할 수 있는 템플릿(기본 이미지) 목록을 표시합니다. |
sandbox_template_create | 특정 vCPU/메모리/디스크 형태 또는 사전 설치된 소프트웨어로 사용자 정의 템플릿을 빌드합니다(비동기 — 준비 상태 폴링). |
secret_list | 바인딩 가능한 팀 비밀 목록(메타데이터만 — 값은 절대 아님). |
sandbox_attach_secret | 저장된 비밀을 실행 중인 샌드박스에 환경 변수로 바인딩합니다. |
sandbox_detach_secret | 샌드박스에서 비밀 바인딩을 제거합니다. |
대부분의 도구는 sandbox_id을 사용합니다; 예외는 sandbox_create, sandbox_list, sandbox_template_list, sandbox_template_create, secret_list입니다. ID를 얻으려면 이 중 하나로 시작한 다음 이후 호출에 연결하세요. 읽기 전용 도구(sandbox_list, sandbox_info, sandbox_files_read, sandbox_files_list, sandbox_files_download_dir, sandbox_network_log, sandbox_template_list, secret_list)는 클라이언트가 확인 프롬프트를 건너뛸 수 있도록 주석 처리되어 있습니다; sandbox_preview_url은 요청된 포트를 게시하므로 멱등 쓰기이고, sandbox_kill은 파괴적 주석이 있습니다.
예시
*"샌드박스를 만들고, 첫 번째 소수를 출력하는 Python 스크립트를 작성하고, 실행하세요"*에 대한 일반적인 에이전트 흐름:
sandbox_create { name: "primes" }
→ { id: "a1b2c3…", name: "primes", status: "active" }
sandbox_files_write { sandbox_id: "a1b2c3…", path: "/app/primes.py", content: "…" }
→ { path: "/app/primes.py", bytes: 142 }
sandbox_exec { sandbox_id: "a1b2c3…", command: "python /app/primes.py" }
→ { exit_code: 0, stdout: "2 3 5 7 11 13 17 19 23 29", stderr: "" }
완료되면 에이전트는 sandbox_pause(상태 보존, 유지 비용 저렴) 또는 sandbox_kill(영구)을 수행할 수 있습니다.
구성
| 변수 | 필수 | 설명 |
|---|---|---|
SUPERSERVE_API_KEY | 예 | Superserve API 키(ss_live_로 시작). |
SUPERSERVE_BASE_URL | 아니요 | 제어 평면 URL 재정의(기본값: https://api.superserve.ai). |
동작 및 제한
- 자동 재개.
sandbox_exec및 파일 도구는 일시 중지된 샌드박스를 투명하게 재개하므로 에이전트가 먼저sandbox_resume을 호출할 필요가 없습니다.sandbox_resume은 샌드박스를 명시적으로 예열하는 데만 존재합니다. - 출력은 컨텍스트를 위해 제한됩니다.
sandbox_exec은 stdout과 stderr를 각각 32KiB로 자릅니다 — 잘린 결과는truncated: true을 설정하고 원래 바이트 길이를 보고합니다.sandbox_files_read은 1MiB보다 큰 파일을 거부합니다(부분 콘텐츠를 반환하지 않음); 오류는sandbox_exec으로 슬라이스를 읽거나(예:head -c) SDK/CLI로 전체 파일을 다운로드하라고 알려줍니다.sandbox_files_write인라인 콘텐츠는 8MiB로 제한됩니다. - 기본 명령 시간 제한은 60초, 최대 10분. 호출별로
timeout_ms으로 재정의하세요. - 이그레스는 제어 가능합니다.
allow_out(도메인 패턴 또는 CIDR)은 허용 대상을 추가합니다;deny_out(CIDR만)은 차단합니다.allow_out만으로는 샌드박스를 잠그지 않습니다 — 엄격한 허용 목록의 경우deny_out: ["0.0.0.0/0"](모두 거부 후 나열된 대상 허용)과 결합하세요.sandbox_create또는sandbox_update에서 설정하고sandbox_network_log으로 샌드박스가 실제로 도달한 대상을 감사하세요. - 오류는 실행 가능합니다. 실패한 도구 호출은 원시 스택 추적 대신 에이전트에게 다음에 무엇을 해야 하는지 알려주는 짧은 메시지를 반환합니다 — 예: "샌드박스 할당량에 도달했습니다. 샌드박스를 일시 중지하거나 종료하거나 나중에 다시 시도하세요." — 에이전트가 스스로 수정할 수 있습니다.
비밀, 템플릿 및 포트
비밀. 자격 증명을 평문 env_vars으로 전달하지 마세요. 대신:
- TypeScript SDK(
Secret.create()) 또는 콘솔로 비밀을 한 번 생성하세요 — 원시 값은 에이전트나 MCP 서버를 통해 이동하지 않으므로 비밀 생성은 의도적으로 MCP 도구가 아닙니다. secret_list으로 바인딩 가능한 비밀을 검색하세요(메타데이터만 — 값은 플랫폼을 떠나지 않음).- 생성 시 바인딩 —
sandbox_create의secrets: { ANTHROPIC_API_KEY: "anthropic-prod" }— 또는 나중에sandbox_attach_secret/sandbox_detach_secret으로 바인딩하세요.
샌드박스는 프록시 토큰을 봅니다; 플랫폼은 비밀의 허용된 호스트로의 아웃바운드 요청에만 실제 자격 증명을 교체합니다.
템플릿. 샌드박스는 템플릿에서 vCPU/메모리/디스크를 상속하며 sandbox_create 시간에 재정의할 수 없습니다. 특정 형태(예: 4 vCPU 샌드박스) 또는 사전 설치된 소프트웨어를 얻으려면 sandbox_template_create으로 템플릿을 빌드한 다음 status이 ready이 될 때까지 sandbox_template_list을 폴링한 후 from_template으로 전달하세요.
포트. 새 MCP 샌드박스는 새로 게시된 포트의 기본 액세스로 public을 사용합니다; 명시적으로 게시된 포트만 연결 가능합니다. sandbox_create(또는 sandbox_update)에 preview_access: "private"을 전달하여 향후 포트의 기본값을 변경하세요. 기존 포트는 자체 모드를 유지합니다. sandbox_exec으로 서버를 시작한 다음 sandbox_preview_url을 호출하세요; 도구는 해당 포트 하나를 멱등적으로 게시하고 반환된 포트 모드를 사용하여 깨끗한 공개 URL 또는 만료되는 비공개 서명 URL을 반환합니다. 비공개 링크는 기본적으로 1시간; expires_in_seconds을 1~604800초 값으로 설정하세요. 미리보기 URL 참조.
아직 MCP 표면에 없는 기능
MCP 서버는 일반적인 에이전트 루프를 다룹니다; 위 표는 완전한 v1 도구 세트입니다. 몇 가지 SDK 기능은 아직 노출되지 않았습니다 — TypeScript SDK를 직접 사용하세요:
- 비밀 생성 —
Secret.create()(MCP 서버는 기존 비밀만 바인딩합니다). - 스트리밍 및 대화형 명령 —
run()콜백 및commands.spawn스트리밍 (stdin, 신호, 장기 실행 프로세스). - 대용량 또는 스트리밍 전송 — 디렉터리 다운로드는
sandbox_files_download_dir을 통해 최대 10MiB까지 지원됩니다. 그 이상(및 아카이브/스트리밍 업로드 또는 1MiB 읽기 / 8MiB 인라인 쓰기 한도를 초과하는 단일 파일)의 경우 SDK/CLI를 사용하세요(files.downloadDir, 스트리밍 업로드). - 청구 및 공급자 검색 — 사용량 데이터 및 비밀 공급자 설정을 위한
Provider.list().
이러한 항목은 후속 작업으로 추적됩니다.
작동 방식
서버는 TypeScript SDK를 래핑하며 제어 플레인 SUPERSERVE_API_KEY만 보유합니다. 각 도구 호출은 ID로 대상 샌드박스에 연결됩니다. SDK는 샌드박스별 데이터 플레인 액세스 토큰을 내부적으로 관리하고 재개 시 회전시키므로 모델에 노출되거나 도구 출력에 반환되지 않습니다. 도구는 상태 비저장입니다 — 숨겨진 "현재 샌드박스"가 없으므로 다중 턴 및 병렬 도구 호출에서 동작이 예측 가능합니다.
문제 해결
- 도구가 표시되지 않거나 서버가 시작되지 않습니다. API 키가 거의 항상 원인입니다 — MCP 클라이언트는 셸의 환경 변수를 상속하지 않습니다. 터미널뿐만 아니라 서버의
env블록에SUPERSERVE_API_KEY을 설정하세요(설치 참조). Authentication failed. 키가 없거나 잘못되었습니다. 프로덕션 키는ss_live_으로 시작합니다. API 키 페이지에서 생성하세요.- 첫 번째 호출이 느립니다.
npx이 첫 사용 시 패키지를 다운로드하고 캐시합니다. 이후 시작은 빠릅니다. - Node 18+ 필요. 로컬 서버는
npx을 통해 Node에서 실행됩니다. (호스팅 엔드포인트는 로컬 런타임 요구 사항이 없습니다.) - 호스팅 엔드포인트에서
401 Unauthorized. 베어러 토큰이 없거나 유효한ss_live_키가 아닙니다.Authorization: Bearer ss_live_…으로 전송하세요(호스팅 참조).