你要跑一個 Claude agent 自動處理 Jira ticket。

問題是這個 Jira 在公司 VPN 後面、沒有 public endpoint,外面打不進來。傳統做法你會做什麼?開個反向代理、租個跳板機、塞個 OAuth proxy 在 DMZ、然後跟資安部門吵兩個月。最後上線時候那個架構複雜到沒人敢動。

Anthropic 5 月 19 日為 Claude Managed Agents 加了兩個東西,讓上面那段話可以縮成「裝個 daemon、跑一個指令、收工」:Self-hosted sandboxes(自架沙箱)和 MCP Tunnels(私有通道)。前者把 tool 執行搬回你自己的機房,後者讓 Anthropic 那邊的 agent 不開外網就能連你內網的 MCP server。

要看懂這兩個功能設計上的精巧之處,要先把「Claude agent 到底由幾塊組成」這件事拆開來。


一個 AI Agent 拆成兩塊:思考 vs 動手

把 agent 想成餐廳:

主廚坐在中央廚房想菜單、看訂單、決定接下來該炒哪盤——這是 agent loop,負責 orchestration(決定下一步)、context management(記得目前進度)、error recovery(菜炒壞了怎麼辦)。

雜工是真正動手切菜、開瓦斯、洗鍋子的人——這對應 tool execution,實際把 read_filewrite_filerun_shell 這些指令跑出來。

過去 Anthropic 的設計是把主廚跟雜工綁在同一個 sandbox 裡,全部跑在 Anthropic 的基礎設施上。這對「給 Claude 一個任意題目讓它自己玩」沒問題,但只要你的 agent 要碰公司資料——客戶清單、財報草稿、內網檔案——這套架構就會讓資安團隊馬上跳出來:「我們的資料怎麼會跑到 Anthropic 的機器上?」

Self-hosted sandboxes 做的事很簡單:雜工搬回你家。主廚還是在 Anthropic 的中央廚房(agent loop),但所有實際碰資料的動作都在你自己控制的環境跑。

MCP Tunnels 解決的是另一個問題:主廚怎麼問你家冰箱有什麼。MCP server 是 agent 拿到「外部知識」的橋——可能是公司的內部知識庫、Jira、PostgreSQL。但這些東西放在你 VPN 裡面,主廚一打過去就被防火牆擋掉。


Self-hosted Sandboxes:把 tool 執行搬回自己機房

機制比直覺更簡單。你在自己機房(或雲端 VM)跑一個叫 environment worker 的 process,它的工作只有一件事:接收 Anthropic 那邊 agent loop 發過來的 tool 執行請求,在本地跑掉,把結果回傳。

1
2
3
4
5
6
7
8
9
10
11
[Anthropic 雲端 Agent Loop]
↓ "請執行: read_file('/secret/q4_report.pdf')"

[你機房的 environment worker]
↓ 真的去讀檔案

↑ 回傳檔案內容

[Anthropic 雲端 Agent Loop]
↓ 根據檔案內容決定下一步
↓ ...

關鍵設計是「敏感資料永遠不離開你的網路邊界」。檔案在你機房被讀,內容被當作 tool 結果送回 agent——但那個檔案本身、那個 Python package、那個 service 連線,都還在你家。

官方公開測試版本目前認證了四家 managed provider,各自定位不同:

四家認證 provider 怎麼選

Cloudflare — 推出時就最完整:除了基礎 sandbox 還加了 egress control(控制 sandbox 對外連線白名單)、browser access(agent 可以開瀏覽器)、custom tool 支援。Cloudflare 的 Sandbox SDK 是這四家裡 lift-and-shift 摩擦力最低的選擇。

Daytona — 完整的可組裝電腦(full composable computers)。每個 sandbox 都是長期運行、有狀態的——你可以 SSH 進去看 agent 操作到哪、可以 pause + restore 保留所有狀態。適合需要「人類接手 debug」的場景。

Modal — Anthropic 文件直接寫「為 AI workload 而生」。sandbox 跟 Modal 既有的 functions、storage、networking primitives 共享底層。custom container runtime 號稱任何 image 都 sub-second 啟動,可以擴到上萬個並發 sandbox,CPU/GPU 隨點隨開。

Vercel — 沒在搜尋結果裡單獨展開,但定位是給 Next.js + serverless 已經 all-in 在 Vercel 的團隊一個「不換 vendor 就能加 agent」的選項。

選哪家的問題比想像中單純:你公司現在主要雲端基礎設施在哪邊,就選哪邊。換 vendor 加 agent 的複雜度遠高於 agent 本身。

從零部署:以 Cloudflare 為例

最完整且摩擦力最低的路徑是 Cloudflare。流程不到十分鐘:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 安裝 Cloudflare Sandbox SDK
npm install @cloudflare/sandbox

# 2. 設定 wrangler.toml 加上 sandbox binding
cat >> wrangler.toml <<EOF
[[services]]
binding = "SANDBOX"
service = "claude-sandbox"
EOF

# 3. 部署 environment worker 到 Cloudflare
wrangler deploy

# 4. 在 Claude Console 註冊這個 sandbox
# Workspace Settings → Managed Agents → Sandbox Providers → Add Cloudflare

註冊成功後,下次你建立 agent 時可以指定:

1
2
3
4
5
6
7
8
9
10
11
12
import anthropic

client = anthropic.Anthropic()
response = client.managed_agents.create(
name="財報摘要 agent",
sandbox_provider="cloudflare",
sandbox_config={
"egress_allowlist": ["api.internal.example.com"],
"tools": ["read_file", "write_file", "shell"],
},
instructions="你是一個內部財報處理 agent...",
)

egress_allowlist 是 Cloudflare 整合的賣點之一:你可以白名單化 sandbox 能對外連到哪幾個 host。Agent 想偷打去其他地方?被 Cloudflare 擋掉。這對於資安部門要簽核的時候差很多——你能拿出一個 host 清單講「就只能去這幾個地方」。

自己手搓 environment worker(不用 managed provider)

如果你不想綁 Cloudflare/Modal 這類 provider,自己跑 environment worker 也可以。Anthropic 提供了 Python SDK:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# environment_worker.py
from anthropic.managed_agents import EnvironmentWorker

worker = EnvironmentWorker(
api_key="sk-ant-...",
workspace_id="ws_xxx",
sandbox_root="/var/lib/claude-sandbox",
)

@worker.tool("read_file")
async def read_file(path: str) -> str:
# 你可以在這裡加任意檢查邏輯
if not path.startswith("/var/lib/claude-sandbox/"):
raise PermissionError("路徑超出 sandbox 範圍")
with open(path) as f:
return f.read()

@worker.tool("query_db")
async def query_db(sql: str) -> list[dict]:
# 連到內網 PostgreSQL,這個連線永遠在你機房
return await db.fetch_all(sql)

if __name__ == "__main__":
worker.run()

跑起來這個 process,它會跟 Anthropic 建立一個 outbound 長連線、等待 agent loop 派發 tool 執行請求。沒有 inbound port、沒有對外公開的 endpoint。這是核心安全設計。


MCP Tunnels:讓 Agent 連進你的內網而不需要開門

Self-hosted sandbox 解決了「tool 執行在哪跑」,但還沒解決一個常見場景:你的 MCP server 在 VPN 後面

MCP server 是 agent 拿到「外部知識」的橋。可能是你公司自己寫的 Jira 連接器、可能是接你內部知識庫的 RAG server、可能是接 PostgreSQL 的 query MCP。問題是這些東西放在內網,Anthropic 那邊的 agent loop 怎麼打進來?

過去的解決方案讓資安部門很頭痛:

  • 開個反向代理在 DMZ → 增加攻擊面
  • 把 MCP server 部署到公雲 → 資料離開公司
  • 跑 ngrok 或 cloudflared → 流量不受控

MCP Tunnels 走的是相反的方向:讓 tunnel 是你打出去的、不是 Anthropic 打進來的

工作原理(用打電話來類比)

想像你要跟外面某個人講話,但你家門禁森嚴不讓人按門鈴。怎麼辦?你自己打電話出去——電話線是你拉的、你決定什麼時候掛、你看得到對方號碼。對方雖然能透過這條電話線跟你講話,但他沒辦法在你家門口出現。

MCP Tunnel 就是這條電話線:

1
2
3
4
5
6
7
8
9
[你機房]
├── 你的內網 MCP server (postgres-mcp:3000)
└── 你部署的 lightweight gateway

↓ 主動建立 outbound TLS 長連線

[Anthropic Workspace]

↑ Agent loop 透過這條 tunnel 呼叫 MCP server

關鍵設計:

  • single outbound connection:你機房對外只開一個 outbound TLS 連線
  • no inbound firewall rules:不需要在防火牆開洞讓 Anthropic 打進來
  • no public endpoints:你的 MCP server 沒有 public IP、沒有 public DNS
  • end-to-end encrypted:tunnel 內所有 traffic TLS 加密

如果你熟悉 SSH reverse tunnel 或 Cloudflare Tunnel,這個概念你已經懂了——只是這次的對端是 Anthropic Workspace、語意層是 MCP。

設定 MCP Tunnel

整個操作在 Claude Console 走完。MCP Tunnels 目前是 research preview,要先在 workspace settings 申請存取權。拿到權限後流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 在 Claude Console 建立一個 tunnel
# Workspace Settings → MCP Tunnels → Create Tunnel
# 拿到 tunnel_id 和 secret token

# 2. 在你機房跑 gateway
docker run -d \
--name claude-mcp-tunnel \
--restart unless-stopped \
-e TUNNEL_ID=tnl_xxx \
-e TUNNEL_TOKEN=...secret... \
-e MCP_SERVER_URL=http://postgres-mcp.internal:3000 \
anthropic/mcp-tunnel-gateway:latest

# 3. 在 Claude Console 把這個 tunnel 連到你要用的 agent
# Workspace Settings → Managed Agents → Add MCP Server → Use Tunnel

接下來你建 agent 的時候,MCP server 就像直接掛在 Anthropic workspace 上一樣可用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
response = client.managed_agents.create(
name="Jira ticket triage agent",
mcp_servers=[
{
"type": "tunnel",
"tunnel_id": "tnl_xxx",
"endpoint": "/jira", # tunnel 內走到 Jira MCP
},
{
"type": "tunnel",
"tunnel_id": "tnl_xxx",
"endpoint": "/postgres", # tunnel 內走到 PostgreSQL MCP
},
],
instructions="你是一個 ticket 分流 agent...",
)

注意一個 tunnel 可以代理多個 MCP server(用 path 區分),不需要每個 server 拉一條 tunnel。

MCP Tunnel 不限於 Managed Agents

文件裡有個容易被忽略但很重要的細節:MCP Tunnels 同時支援 Messages API。意思是即使你不用 Managed Agents(你用自己的 Anthropic SDK 應用程式呼叫 Claude),一樣可以透過 MCP Tunnel 給 Claude 接到你內網的 MCP server。

這個彈性把整個 Anthropic 開發者平台變成「你內網的延伸」——只要你有 outbound 網路,內網資料就能被 Claude 用上。


Claude Code 的引導設定指令

如果你嫌 console 點來點去太累,最新版 Claude Code 內建了一個 slash command 把整個設定流程包起來:

1
2
$ claude
> /claude-api managed-agents-onboard

這個 command 會用對話的方式問你:

  1. 你是要設定 sandbox 還是 MCP tunnel?
  2. 用哪家 provider?
  3. 要連到內網哪個 service?

回答完之後它會自動產出設定檔、跑必要的 deploy command、把結果驗證一遍。對於第一次設定的人來講,這比讀文件快兩倍。


該選哪個?決策框架

工程師最容易犯的錯是「兩個都裝」——不需要。先想清楚你解的是哪個問題:

只用 self-hosted sandbox:你需要 agent 跑 tool(讀檔、跑 shell、改檔),且這些動作要在你機房做。但 MCP server 你沒有,agent 不需要連內網其他 service。

只用 MCP tunnel:你的 agent 跑 Anthropic-managed sandbox 就好,沒有 tool 要在你機房跑。但你有內網 MCP server(Jira、Postgres、ticketing system)要給 agent 用。

兩個都用:完整的「內部 agent」場景——agent 要碰你的檔案、跑你的 service、又要連你的 MCP server。這時兩個一起裝。

決策的核心是「資料的最遠流動範圍」。資料只在 agent loop 出現過、實體不離開你機房 → self-hosted sandbox 就好。資料在 MCP query 裡進出、但 tool execution 不碰它 → MCP tunnel 就好。兩種狀況同時存在 → 兩個都要。


限制與該留意的事

公開測試版本還有幾個值得知道的限制:

Self-hosted sandbox:是 public beta、可以正式使用,但建議在 staging 環境先壓過幾天再上 production。Anthropic 那邊的 agent loop 跟你 environment worker 之間 latency 會反映在 user-facing 速度上。你機房離 Anthropic data center 越遠、agent 反應就越慢——美西的 AWS 跟 Anthropic 美西 region 之間是 30-50ms RTT,台灣機房直連大概 150-200ms。延遲對 multi-step agent 來說會放大十倍以上。

MCP Tunnels:還在 research preview,要排隊申請存取權。Anthropic 沒公開 SLA,正式 Production-grade SLA 要等 GA 階段。

Audit 跟稽核:如果你公司有合規需求要記錄每一次 tool 呼叫,environment worker 需要自己接 logging pipeline。Anthropic 的 audit log 只記到 agent loop 那層、看不到 tool 內部的 input/output。

provider lock-in 風險:四家認證 provider 各自的 API 不完全相容。如果你今天選 Cloudflare、明天想換 Daytona,environment worker 邏輯要重寫。建議把業務邏輯(讀檔、查 DB、呼叫 service)跟 provider SDK 分開包,換 vendor 的時候只動 adapter 那層。


上手練習:你可以今天試什麼

不用等到有正式案件再學。今晚就可以跑一個玩具實驗:

  1. Anthropic Console 申請 Managed Agents 存取
  2. 在你 Mac 上跑一個 Python environment worker(不用真機房,本機就行)
  3. 註冊一個本地 sandbox 到 console
  4. 建一個 agent,讓它讀你 ~/Documents/ 的一個檔案、用內容寫一個摘要回來
  5. 觀察 Anthropic Workspace 的 audit log,確認 agent loop 跟 tool execution 確實分離

你會在五分鐘內感受到「agent 在外面想、檔案永遠在我家」是什麼意思。這個感覺一旦建立,後面跟資安部門解釋自架 sandbox 的好處就會容易很多。


延伸閱讀