Superserve Sandbox MCP
ทางการเครื่องเสมือนที่ปลอดภัยสำหรับเอเจนต์ที่โฮสต์โดย Superserve
คุณทำอะไรได้บ้างด้วย Superserve Sandbox MCP?
- สร้างและรันแซนด์บ็อกซ์ — ขอให้ผู้ช่วยของคุณสร้างแซนด์บ็อกซ์ด้วย
sandbox_createและรันคำสั่งเช่นpython --versionผ่านsandbox_exec - จัดการไฟล์ในแซนด์บ็อกซ์ — ใช้
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โดยไม่เปิดเผยค่าดิบ - สร้างเทมเพลตที่กำหนดเอง — สร้างเทมเพลตแซนด์บ็อกซ์ที่นำกลับมาใช้ใหม่ได้ด้วยรูปแบบ CPU/หน่วยความจำ/ดิสก์เฉพาะโดยใช้
sandbox_template_createและแสดงรายการด้วยsandbox_template_list
เอกสาร
MCP Server
สร้าง รัน และจัดการ Superserve sandboxes จาก MCP client ใดก็ได้
ต้องการให้ agent สร้าง sandboxes ด้วยตัวเองหรือไม่? MCP server นี้ทำได้
MCP server ของ Superserve (@superserve/mcp) เปิดเผย sandbox primitives เป็นเครื่องมือ Model Context Protocol ดังนั้น client ที่รองรับ MCP ใดก็ได้ — Claude, Cursor, VS Code, Windsurf, Codex — สามารถสร้าง sandboxes, รันคำสั่ง, อ่านและเขียนไฟล์, สร้าง templates, จัดการ secrets, และควบคุมการเข้าถึงเครือข่ายใน Firecracker microVM ที่แยกออกมา
รันได้สองวิธี: ในเครื่อง ผ่าน stdio ด้วย npx หรือกับ hosted endpoint ที่ https://mcp.superserve.ai โดยไม่ต้องติดตั้งในเครื่อง ทั้งสองวิธีตรวจสอบสิทธิ์ด้วย SUPERSERVE_API_KEY ของคุณและกำหนดเป้าหมาย sandbox ต่อการเรียกตาม ID มันเป็น wrapper บางๆ เหนือ TypeScript SDK ดังนั้น per-sandbox data-plane token จะไม่ไปถึงโมเดล
Quickstart
เพิ่ม server ไปยัง client ของคุณ (ดู Install) จากนั้นขอให้ agent "สร้าง sandbox และรัน python --version ในนั้น" agent จะเรียก sandbox_create จากนั้น sandbox_exec และรายงานผลลัพธ์ — โดยไม่ต้องเขียนโค้ดจากคุณ
คุณต้องมี Superserve API key — สร้างได้ที่หน้า API key ไม่มีการติดตั้งแบบ global; npx จะดึง server มาในการใช้งานครั้งแรก
Install
```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/`):Note
ตั้งค่า
SUPERSERVE_API_KEYในenvของ server — MCP clients ไม่ได้รับค่าต่อจาก shell ของคุณ ควรใช้ secret-input prompt มากกว่าการวาง key ดิบในที่ที่ client ของคุณรองรับ (ดู 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` (global):
```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` จะถามหา key แทนการเก็บเป็น plain text:
```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` จาก environment ของคุณ ดังนั้น key ดิบจะไม่ถูกเก็บในไฟล์ config (export ใน shell ก่อน) Codex ยังอ่าน `instructions` ของ server สำหรับคำแนะนำ workflow ข้ามเครื่องมือ
```toml theme={"theme":{"light":"github-light","dark":"vitesse-dark"}}
[mcp_servers.superserve]
command = "npx"
args = ["-y", "@superserve/mcp"]
env_vars = ["SUPERSERVE_API_KEY"]
```
สำหรับ [hosted](#hosted-remote) endpoint ใช้ `url = "https://mcp.superserve.ai"` กับ `bearer_token_env_var = "SUPERSERVE_API_KEY"`
Hosted (remote)
ไม่อยากรันอะไรในเครื่อง? hosted endpoint ที่ https://mcp.superserve.ai พูด Streamable HTTP — ไม่ต้องใช้ npx ไม่ต้องใช้ Node ส่ง Superserve API key ของคุณเป็น bearer token endpoint ไม่มีสถานะและจำกัดตามบัญชี (key ของคุณแมปกับทีมของคุณแล้ว) และ per-sandbox data-plane token ไม่เคยออกจาก server
```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` (global):Note
Bearer auth ทำงานใน client ใดก็ได้ที่ให้คุณตั้งค่า request header — Claude Code, Cursor, VS Code, และ Anthropic Messages API connector Claude.ai, Claude Desktop's Custom Connector UI, และ ChatGPT developer mode ไม่มีฟิลด์ static-bearer / custom-header (พวกเขาคาดหวัง OAuth) ซึ่ง hosted endpoint ยังไม่รองรับ — ใช้ local install ในกรณีนั้น
```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` จะถามหา key แทนการเก็บเป็น plain text:
```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}" }
}
}
}
```
ส่งเป็น connector ในคำขอ [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"
}
]
}
```
เครื่องมือและพฤติกรรมเหมือนกับ local server — ข้อแตกต่างคือ transport และ key ที่เดินทางเป็น bearer header แทนตัวแปร env
Tools
| Tool | สิ่งที่ทำ |
|---|---|
sandbox_create | สร้าง sandbox ใหม่; คืนค่า id ยอมรับ secrets, กฎ egress, และ preview_access |
sandbox_update | เปลี่ยน metadata, กฎ egress, ช่วงเวลา lifecycle, หรือ preview_access |
sandbox_list | แสดงรายการ sandboxes ของคุณ (active และ paused), กรองตาม metadata |
sandbox_info | ดูสถานะ ทรัพยากร metadata กฎเครือข่าย และ secret bindings ของ sandbox หนึ่ง อ่านอย่างเดียว |
sandbox_exec | รันคำสั่ง shell; คืนค่า stdout, stderr, exit code resume sandbox ที่ paused อัตโนมัติ |
sandbox_files_read | อ่านไฟล์ (UTF-8 text หรือ base64 สำหรับ binary) |
sandbox_files_write | สร้างหรือเขียนทับไฟล์ สร้างไดเรกทอรีแม่โดยอัตโนมัติ |
sandbox_files_list | แสดงรายการในไดเรกทอรี (ชื่อ, ประเภท, ขนาด, เวลาแก้ไข) |
sandbox_files_download_dir | ดาวน์โหลดไดเรกทอรีเป็น base64 ZIP (ข้าม symlinks) จำกัดที่ 10 MiB; ใหญ่กว่านั้น → ใช้ SDK/CLI |
sandbox_pause | หยุด sandbox ชั่วคราว; สถานะถูกเก็บรักษา |
sandbox_resume | resume sandbox ที่ paused (ปกติไม่จำเป็น — exec resume อัตโนมัติ) |
sandbox_kill | ลบ sandbox ถาวร |
sandbox_preview_url | เผยแพร่พอร์ตและคืนค่า public URL ที่สะอาดหรือ private signed URL ที่หมดอายุ |
sandbox_network_log | ตรวจสอบการเชื่อมต่อขาออกของ sandbox (host, verdict, bytes) โดยไม่ต้อง resume |
sandbox_template_list | แสดงรายการ templates (base images) ที่ทีมของคุณสามารถใช้เริ่มต้นได้ |
sandbox_template_create | สร้าง template ที่กำหนดเองด้วยรูปร่าง vCPU/หน่วยความจำ/ดิสก์เฉพาะหรือซอฟต์แวร์ที่ติดตั้งไว้ล่วงหน้า (async — poll จนพร้อม) |
secret_list | แสดงรายการ team secrets ที่ผูกได้ (metadata เท่านั้น — ไม่มีค่า) |
sandbox_attach_secret | ผูก secret ที่เก็บไว้กับ sandbox ที่รันอยู่ภายใต้ env var |
sandbox_detach_secret | เอา secret binding ออกจาก sandbox |
เครื่องมือส่วนใหญ่รับ 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) ถูก annotate เพื่อให้ clients ข้ามขั้นตอนยืนยันได้; sandbox_preview_url เป็น idempotent write เพราะเผยแพร่พอร์ตที่ขอ และ sandbox_kill ถูก annotate ว่า destructive
Example
โฟลว์ agent ทั่วไปสำหรับ "สร้าง sandbox เขียน Python script ที่พิมพ์ primes แรก และรันมัน":
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: "" }
เมื่อเสร็จแล้ว agent สามารถ sandbox_pause (สถานะถูกเก็บ ถูกกว่าในการเก็บไว้) หรือ sandbox_kill (ถาวร)
Configuration
| Variable | จำเป็น | คำอธิบาย |
|---|---|---|
SUPERSERVE_API_KEY | ใช่ | Superserve API key ของคุณ (ขึ้นต้นด้วย ss_live_) |
SUPERSERVE_BASE_URL | ไม่ | แทนที่ control-plane URL (ค่าเริ่มต้นคือ https://api.superserve.ai) |
Behavior and limits
- Auto-resume.
sandbox_execและเครื่องมือไฟล์ resume sandbox ที่ paused อย่างโปร่งใส ดังนั้น agents ไม่ต้องเรียกsandbox_resumeก่อนsandbox_resumeมีไว้เพื่อ warm sandbox อย่างชัดเจนเท่านั้น - Output ถูกจำกัดสำหรับ context.
sandbox_execตัด stdout และ stderr ที่ 32 KiB ต่ออัน — ผลลัพธ์ที่ถูกตัดจะตั้งค่าtruncated: trueและรายงานความยาวไบต์เดิมsandbox_files_readปฏิเสธ ไฟล์ที่ใหญ่กว่า 1 MiB (ไม่คืนค่าเนื้อหาบางส่วน); ข้อผิดพลาดจะบอกให้อ่านเป็นชิ้นด้วยsandbox_exec(เช่นhead -c) หรือดาวน์โหลดทั้งไฟล์ด้วย SDK/CLIsandbox_files_writeinline content จำกัดที่ 8 MiB - ค่าเริ่มต้น command timeout คือ 60 วินาที สูงสุด 10 นาที แทนที่ต่อการเรียกด้วย
timeout_ms - Egress ควบคุมได้
allow_out(รูปแบบโดเมนหรือ CIDRs) เพิ่มปลายทางที่อนุญาต;deny_out(CIDRs เท่านั้น) บล็อกพวกมันallow_outเพียงอย่างเดียว ไม่ ล็อก sandbox ลง — สำหรับ allowlist ที่เข้มงวด รวมกับdeny_out: ["0.0.0.0/0"](ปฏิเสธทั้งหมด แล้วอนุญาตปลายทางที่ระบุ) ตั้งค่าเหล่านี้บนsandbox_createหรือsandbox_updateและตรวจสอบสิ่งที่ sandbox เข้าถึงจริงด้วยsandbox_network_log - ข้อผิดพลาดนำไปปฏิบัติได้ การเรียกเครื่องมือที่ล้มเหลวคืนค่าข้อความสั้นๆ บอก agent ว่าต้องทำอะไรต่อไป — เช่น "Sandbox quota reached. Pause or kill a sandbox, or retry later." — แทน stack trace ดิบ เพื่อให้ agent แก้ไขตัวเองได้
Secrets, templates, and ports
Secrets. อย่าส่ง credentials เป็น env_vars plaintext แทน:
- สร้าง secret ครั้งเดียวด้วย TypeScript SDK (
Secret.create()) หรือ console — ค่าดิบไม่เคยเดินทางผ่าน agent หรือ MCP server ดังนั้น การสร้าง secret จึงไม่ใช่ MCP tool โดยตั้งใจ - ค้นหา secrets ที่ผูกได้ด้วย
secret_list(metadata เท่านั้น — ค่าไม่เคยออกจากแพลตฟอร์ม) - ผูกตอนสร้าง —
secrets: { ANTHROPIC_API_KEY: "anthropic-prod" }บนsandbox_create— หรือทีหลังด้วยsandbox_attach_secret/sandbox_detach_secret
sandbox เห็น proxy token; แพลตฟอร์มสลับเป็น credential จริงเฉพาะสำหรับคำขอขาออกไปยัง hosts ที่ secret อนุญาต
Templates. sandbox สืบทอด vCPU/หน่วยความจำ/ดิสก์จาก template และไม่สามารถแทนที่ได้ตอน sandbox_create เพื่อให้ได้รูปร่างเฉพาะ (เช่น sandbox 4 vCPU) หรือซอฟต์แวร์ที่ติดตั้งไว้ล่วงหน้า สร้าง template ด้วย sandbox_template_create จากนั้น poll sandbox_template_list จนกว่า status เป็น ready ก่อนส่งเป็น from_template
Ports. MCP sandboxes ใหม่ใช้ public เป็นการเข้าถึงค่าเริ่มต้นสำหรับพอร์ตที่เผยแพร่ใหม่; เฉพาะพอร์ตที่เผยแพร่อย่างชัดเจนเท่านั้นที่เข้าถึงได้ ส่ง preview_access: "private" ไปยัง sandbox_create (หรือ sandbox_update) เพื่อเปลี่ยนค่าเริ่มต้นสำหรับพอร์ตในอนาคต พอร์ตที่มีอยู่คงโหมดของตัวเอง เริ่ม server ด้วย sandbox_exec จากนั้นเรียก sandbox_preview_url; เครื่องมือเผยแพร่พอร์ตนั้นหนึ่งพอร์ตแบบ idempotent และใช้โหมดพอร์ตที่คืนมาเพื่อคืนค่า public URL ที่สะอาดหรือ private signed URL ที่หมดอายุ ลิงก์ส่วนตัวค่าเริ่มต้นหนึ่งชั่วโมง; ตั้งค่า expires_in_seconds เป็นค่าตั้งแต่ 1 ถึง 604800 วินาที ดู Preview URLs
ยังไม่มีใน MCP surface
MCP server ครอบคลุมลูป agent ทั่วไป; ตารางด้านบนคือชุดเครื่องมือ v1 ที่สมบูรณ์ ความสามารถ SDK บางอย่างยังไม่เปิดเผย — ใช้ TypeScript SDK โดยตรงสำหรับ:
- การสร้าง Secret —
Secret.create()(MCP server จะ ผูก กับ secret ที่มีอยู่เท่านั้น) - คำสั่งแบบสตรีมมิ่งและแบบโต้ตอบ — การสตรีม
run()callbacks และcommands.spawn(stdin, สัญญาณ, กระบวนการที่ทำงานยาวนาน) - การถ่ายโอนขนาดใหญ่หรือแบบสตรีมมิ่ง — การดาวน์โหลดไดเรกทอรีรองรับสูงสุด 10 MiB ผ่าน
sandbox_files_download_dir; เกินกว่านั้น (และสำหรับการอัปโหลดแบบ archive/สตรีมมิ่ง หรือไฟล์เดี่ยวที่เกินขีดจำกัดการอ่าน 1 MiB / การเขียนแบบ inline 8 MiB) ให้ใช้ SDK/CLI (files.downloadDir, การอัปโหลดแบบสตรีมมิ่ง) - การเรียกเก็บเงินและการค้นหาผู้ให้บริการ — ข้อมูลการใช้งานและ
Provider.list()สำหรับการตั้งค่าผู้ให้บริการ secret
สิ่งเหล่านี้ถูกติดตามเป็นงานติดตามผล
วิธีการทำงาน
เซิร์ฟเวอร์ครอบคลุม TypeScript SDK และเก็บเฉพาะ SUPERSERVE_API_KEY ของ control-plane ของคุณเท่านั้น การเรียกใช้เครื่องมือแต่ละครั้งจะเชื่อมต่อกับ sandbox เป้าหมายตาม ID; SDK จะจัดการ data-plane access token ต่อ sandbox ภายในและหมุนเวียนเมื่อ resume ดังนั้นจึงไม่ถูกเปิดเผยต่อโมเดลหรือส่งกลับในผลลัพธ์ของเครื่องมือ เครื่องมือไม่มีสถานะ — ไม่มี "sandbox ปัจจุบัน" ที่ซ่อนอยู่ — ซึ่งทำให้พฤติกรรมคาดเดาได้ในการเรียกใช้เครื่องมือแบบหลายรอบและแบบขนาน
การแก้ไขปัญหา
- เครื่องมือไม่ปรากฏ หรือเซิร์ฟเวอร์ไม่เริ่มทำงาน สาเหตุเกือบทั้งหมดมาจาก API key — MCP clients ไม่ สืบทอดตัวแปรสภาพแวดล้อมจาก shell ของคุณ ตั้งค่า
SUPERSERVE_API_KEYในบล็อกenvของเซิร์ฟเวอร์ (ดู การติดตั้ง) ไม่ใช่แค่ในเทอร์มินัลของคุณ Authentication failedคีย์หายไปหรือไม่ถูกต้อง คีย์สำหรับการผลิตเริ่มต้นด้วยss_live_; สร้างได้ที่หน้า API key- การเรียกครั้งแรกช้า
npxดาวน์โหลดแพ็กเกจในการใช้ครั้งแรกและแคชไว้; การเริ่มครั้งต่อไปจะเร็ว - ต้องใช้ Node 18+ เซิร์ฟเวอร์ท้องถิ่นทำงานบน Node ผ่าน
npx(endpoint โฮสต์ ไม่มีข้อกำหนดรันไทม์ท้องถิ่น) 401 Unauthorizedจาก endpoint ที่โฮสต์ bearer token หายไปหรือไม่ใช่คีย์ss_live_ที่ถูกต้อง ส่งเป็นAuthorization: Bearer ss_live_…(ดู โฮสต์)