GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
Run commands, edit files and manage Git and persistent sessions in your own isolated sandbox.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
Authorization你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
在终端中运行这条命令
claude mcp add --transport http headmesh-sandbox 'https://{sandbox_host}/mcp' --header 'Authorization: Bearer {sandbox_token}'运行前请先填写空着的值。
地址中有只有你知道的 {…} 部分(例如你的账户),请复制后自行填写。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"headmesh-sandbox": {
"url": "https://{sandbox_host}/mcp",
"headers": {
"Authorization": "Bearer {sandbox_token}"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
地址中有只有你知道的 {…} 部分(例如你的账户),请复制后自行填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"headmesh-sandbox": {
"type": "http",
"url": "https://{sandbox_host}/mcp",
"headers": {
"Authorization": "Bearer {sandbox_token}"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
你的选择通过 Cookie 保存在这台设备上,无需账户。
Authorization HTTP header这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
这个地址需要填入你自己的值,所以我们无法替你读取工具列表。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月6日
注册名称已通过 GitHub 账户 headmesh-dev 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
这个地址需要填入你自己的账户信息,所以我们无法替你检查
这个地址需要填入你自己的账户信息,所以我们无法替你检查
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
GitHub 仓库最后更新于–,最新版本(0.1.0)于前天进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:GitHub, Desktop Commander, Cloudflare MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
Cloudflare MCP servers
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A persistent Docker container on the ASUS that joins Aaryn's Headscale tailnet as its own tagged node, so cloud agents can work with real files, real dependencies and private services. Agents reach it through several front doors:
headmesh-sandboxd;codex exec-server, driven from the host through the Agents API.It implements plan §6 and §7 (docs/plan.md).
| Path | What |
|---|---|
image/ | Multi-stage Dockerfile on ubuntu:26.04 (pinned by digest), s6-overlay services, git hooks, guidelines template, docker-bake.hcl, container-structure-test, hadolint config |
compose/ | compose.yaml with the regular and yolo profiles (embedded in the CLI) |
config/ | sandbox.example.toml and its JSON Schema (sandbox.schema.json) |
sandboxd/ | The MCP daemon: tools, sessions (tmux), auth, audit, status |
cmd/headmesh-sandboxd/ | Daemon binary, plus the in-container helpers (hm) |
cmd/headmesh-sandbox/ | Host CLI |
host/ | Egress firewall and restic backup units. Aaryn installs them with sudo; see host/README.md |
tests/acceptance/ | The five-check harness, the recreate bonus and prompt.md |
tests/e2e/ | Live test against a running container |
docs/ | container-contract.md (the interface between image, Compose, CLI and daemon) and the ADRs |
This is its own Go module, github.com/headmesh-dev/headmesh/sandbox; the root go.work includes it. Run go test -race ./... here.
All of this was run locally, without tailnet enrollment:
go test -race ./... passes. That includes integration tests on real tmux and real git, and the harness against an in-process sandboxd. golangci-lint run with the repo config reports 0 issues.docker buildx bake -f sandbox/image/docker-bake.hcl sandbox-local builds headmesh-sandbox:dev (2.39 GB). hadolint is clean, and container-structure-test passes 43/43.headmesh-sandbox up starts the container through Compose with the §6.3 hardening. It reports healthy with tailscaled logged out, and the unconfigured front doors idle and say why. status and doctor work.tools/list (31 tools), exec, session_* and fs_* pass over the unix socket, and over HTTP with a bearer token. Both protocol versions work: 2026-07-28 stateless and the 2025-11-25 handshake (tests/e2e).mcp and route ssh (run inside the container, phase 1, then phase 2 from a new process):acceptance recreate passes 5/5: home and ~/.bash_history persist, the boot identity changes, and old sessions report lost (container restarted at …). The tailnet identity part was skipped (not enrolled)./host. Writes fail even as root, propagation is private, /etc/shadow reads as 0 bytes, ~/.ssh is masked, and the host tailscaled state and Docker data-root are left out.up is Regular.Spike outcomes are in docs/adr/spike-t0{1,2,3,7,8}-*.md and docs/adr/spike-t16-*.md. Other implementation decisions are in docs/adr/0001-sandbox-implementation-decisions.md.
host/firewall, step 1 below). A Docker bridge container can otherwise reach whatever the host can: its LAN, its own services and, on a host that is itself a tailnet node, that tailnet. Host-specific findings are in the internal ops notes.[mounts] extra_denylist: denylisted subtrees are left out of /host.UV_PROJECT_ENVIRONMENT=.venv-sandbox, so uv never rebuilds a project's host .venv against container paths. Make sure each project's .gitignore covers .venv-sandbox (or .venv*).cd /mnt/storage/projects/headmesh/sandbox
go build -o ~/.local/bin/headmesh-sandbox ./cmd/headmesh-sandbox docker buildx bake -f image/docker-bake.hcl sandbox-local # headmesh-sandbox:dev headmesh-sandbox init # /mnt/storage/headmesh/sandbox $EDITOR /mnt/storage/headmesh/sandbox/config/sandbox.toml # image = "headmesh-sandbox:dev" until GHCR has a release headmesh-sandbox scan-secrets # review, then --apply headmesh-sandbox token create claude-code-mac > ~/.config/headmesh/sandbox-token headmesh-sandbox render --diff headmesh-sandbox up headmesh-sandbox status headmesh-sandbox doctor
Other commands: down [--yolo|--all], recreate, logs [service|audit] [-f], shell [--root], attach (watch agents in tmux), backup, token list|revoke, acceptance run|verify|report|recreate, and agent run --provider openai.
Secrets live in /mnt/storage/headmesh/sandbox/secrets/ , mode 0600; an empty file means that front door is off. They are never mounted. The CLI passes them to docker compose through the environment, and Compose copies each one into the container as root:root 0400 (spike T-1).
Each step needs sudo, a production change or an account. None of them has been done.
host/README.md. Check the result with headmesh-sandbox doctor; it should show egress firewall ✓ and home backup ✓.doctor checks this).This builds on plan §5.2 and §6.6. Add the tags and grants to api/infra/headscale/policy.hujson in the Xcelsior repo. Run headscale policy check first; the policy tests must pass.
"tagOwners": { "tag:sandbox": ["group:admin"], "tag:sandbox-yolo": ["group:admin"] },
"grants": [ // Regular: only the private services you list (keep sandbox.toml [mode.regular] reach in sync). { "src": ["tag:sandbox"], "dst": ["tower-server"], "ip": ["tcp:11434"] }, { "src": ["tag:sandbox-yolo"], "dst": ["*"], "ip": ["*"] }, ], "ssh": [ { "action": "accept", "src": ["xcelsior@"], "dst": ["tag:sandbox", "tag:sandbox-yolo"], "users": ["agent"] }, ],
xcelsior@ must mean Aaryn's own devices only. That's true once the provider hosts are tagged (§5.2).
# On prod-hetzner: a single-use pre-auth key that carries the tag (Headscale 0.29.6).
sudo headscale preauthkeys create --user --tags tag:sandbox --expiration 1h
install -m 600 /dev/stdin /mnt/storage/headmesh/sandbox/secrets/ts_authkey # paste, then Ctrl-D headmesh-sandbox recreate headmesh-sandbox status # tailnet Running, node asus-sandbox, dns-check ok
--advertise-tags is never passed, because Headscale rejects it with a tagged key (spike T-8). tailscale-up checks the enrolled tags against TS_TAGS instead.tailscale up runs with the key only while no state exists, so later restarts never re-authenticate. Tagged nodes don't expire. Clear the key file after enrollment.asus-sandbox-yolo, tag:sandbox-yolo) with its own state directory. Enroll it the same way, with a tag:sandbox-yolo key, during the first up --yolo.MCP over the tailnet (Claude Code, any MCP client):
headmesh-sandbox token create claude-code-mac # prints hms_… once
claude mcp add --transport http sandbox http://asus-sandbox.mesh.xcelsior.ca:8780/mcp \ --header "Authorization: Bearer hms_…"
Tokens are scoped (sandbox:read|exec|write|admin) and can be revoked: headmesh-sandbox token revoke claude-code-mac takes effect within seconds. OAuth (RFC 9728 metadata is already served at /.well-known/oauth-protected-resource/mcp) arrives with the Headmesh authorization server in M3.
Claude self-hosted runner (plan §7.1):
secrets/claude_env_secret, and fill secrets/github_token with a fine-grained PAT.[entrypoints.claude_runner] enabled = true, then run headmesh-sandbox up.The runner runs as root. Every session goes through claude-session, which drops to agent with setpriv, so sessions can't read the secret (spike T-1). The checkout hook links repos mapped in [repos] to the shared working copy, on main. One live check is still pending: what the runner puts in the sessions' environment.
Claude Remote Control (plan §7.2):
[entrypoints.claude_rc] enabled = true, then run headmesh-sandbox up.headmesh-sandbox shell, then claude auth login (a full claude.ai login), trust /home/agent, and run claude remote-control once to answer "Enable Remote Control? y".headmesh-sandbox recreate.Never set DISABLE_TELEMETRY, DO_NOT_TRACK, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC or DISABLE_GROWTHBOOK: Remote Control refuses to start with any of them (spike T-2). Whether it restarts on its own without a TTY still needs checking after this login.
Codex over Tailscale SSH (plan §7.3):
ssh rule from step 2.agent@asus-sandbox.mesh.xcelsior.ca.ssh agent@asus-sandbox.mesh.xcelsior.ca codex --version.OpenAI Secure MCP Tunnel (plan §7.4):
secrets/openai_tunnel_key and the id in [entrypoints.openai_tunnel] tunnel_id. Set enabled = true, then run up.headmesh-sandbox token create chatgpt-tunnel --route tunnel (exec ≤ 110 s, responses ≤ 8 MiB).Codex `exec-server` via the Agents API (plan §7.6):
secrets/openai_app_key (0600; never mounted, and denylisted from YOLO's /host). /etc/headmesh/openai-app.key is also accepted if you can read it.secrets/openai_env_key. headmesh-sandbox agent run --provider openai --repo xcelsior \
--prompt-file sandbox/tests/acceptance/prompt.md
The executor runs as agent in the repo with --linux-sandbox-pid-namespace inherit and full access inside the container. Codex's bubblewrap sandbox can't run under the container's seccomp and AppArmor profiles, so the container is the boundary (spike T-16). The environment key reaches the executor through stdin, and the transcript goes to logs/agent-runs/ .jsonl.
headmesh-sandbox acceptance run --route mcp \
--url http://asus-sandbox.mesh.xcelsior.ca:8780/mcp --token-file ~/.config/headmesh/sandbox-token ssh agent@asus-sandbox.me
只显示了开头部分;其余内容请在仓库中阅读