
ironcurtain memory-mcp-server/v0.2.1
一个用于自主 AI 代理的安全*运行时。策略源自纯英文宪法。(*https://ironcurtain.dev)
IronCurtain
一个面向自主 AI 代理的安全*运行时,其安全策略源自人类可读的宪法。
*当有人写下“安全”时,你应当立即保持怀疑。我们所说的安全是什么意思?
[!WARNING] 研究原型。 IronCurtain 是一个早期研究项目,探索如何让 AI 代理足够安全,从而真正有用。API、配置格式和架构可能会发生变化。欢迎贡献和反馈。
演示
代理被要求克隆一个仓库并推送更改。git_clone 和 git_push 都被策略引擎升级处理,但自动批准器会自动批准它们——用户在命令模式(Ctrl-A)下的受信输入提供了明确的意图,因此无需手动 /approve。
问题
自主 AI 代理可以代表你管理文件、运行 git 命令、发送消息并与 API 交互。但如今的代理框架赋予代理与用户相同的权限,例如对文件系统、凭据和网络的完全访问权限。安全研究人员称之为环境权限,这意味着一次提示注入或多轮漂移就可能导致代理删除文件、窃取数据或推送恶意代码。
常见的应对方式要么是将代理限制在狭窄的沙箱中(限制其有用性),要么是要求用户批准每一个操作(限制其自主性)。两者都不令人满意。
方法
IronCurtain 走了一条不同的路:用通俗英语表达你的安全意图,然后让系统自行确定执行方式。
你编写一部宪法,这是一份简短文档,描述你的代理被允许和不允许做什么。IronCurtain 使用 LLM 流水线将其编译为确定性安全策略,根据生成的测试场景验证编译后的规则,然后在运行时对每一次工具调用执行该策略。结果是,代理可以在你用自然语言定义的边界内自主工作。
关键理念:
- 代理是不可信的。 IronCurtain 假设 LLM 可能因提示注入或漂移而被攻陷。安全性不依赖于模型“表现良好”。
- 输入英语,输出执行。 你编写意图(“未经批准不得执行破坏性 git 操作”);系统将其编译为确定性规则,并在运行时无需进一步 LLM 参与即可执行。
- 语义插入。 不是给代理原始系统访问权限,而是让所有交互都通过 MCP 服务器(文件系统、git 等)进行。每一次工具调用都会经过策略引擎,该引擎可以允许、拒绝或升级给用户批准。
- 纵深防御。 代理代码运行在 V8 隔离环境中,无法直接访问宿主机。唯一的出口是通过具有语义意义的 MCP 工具调用,而每一次调用都会根据策略进行检查。
架构
IronCurtain 支持两种具有不同信任模型的会话模式:
-
内置代理(代码模式) — IronCurtain 自有的 LLM 代理编写在 V8 沙箱中执行的 TypeScript 片段。IronCurtain 控制代理、沙箱和策略引擎。每一次工具调用都会以结构化 MCP 请求的形式离开沙箱,经过策略引擎(允许 / 拒绝 / 升级),然后才到达真正的 MCP 服务器。
-
Docker 代理模式 — 外部代理(Claude Code、Goose、Codex)运行在无法直接访问公共网络的容器内。IronCurtain 调解外部影响:LLM API 调用经过终止 TLS 的 MITM 代理(主机允许列表、假密钥到真密钥的替换),MCP 工具调用经过同一策略引擎,受支持的软件包安装经过验证型软件包代理。
可选的嵌套 Docker 为开发者会话提供一个私有、临时的守护进程,而不会暴露宿主机 Docker socket。已实现的配置文件覆盖 macOS 上的 Apple Container 和 Docker Desktop,以及 amd64 上的 WSL2 与 Docker Desktop。其 offline、images 和 packages 模式分别对应本地镜像使用、经调解的公共镜像拉取,以及受支持的软件包构建。原生 Linux Engine 不允许用于嵌套;有关先决条件和限制,请参阅配置参考。
在两种模式中,代理都是不可信的。安全性不依赖于模型遵循指令——它是在边界处强制执行的。
有关完整架构(含图表)、逐层信任分析和 macOS 平台说明,请参阅 SANDBOXING.md。
快速开始
先决条件
- Node.js 24 或 26 — IronCurtain 测试的偶数主版本线。两者都会安装预构建的
isolated-vm二进制文件。Node 25 不受支持且未经测试。 - Docker — 不是必需,但强烈推荐用于 Docker 代理模式,因为它提供最强的隔离。在 macOS 26+(Apple 芯片)上,Apple
container可作为替代后端(每个容器一个 VM;当其服务运行时自动使用——参见ironcurtain config中的containerRuntime) - 至少一个 LLM 提供商(Anthropic、Google 或 OpenAI)的 API 密钥
安装
作为全局 CLI 工具(最终用户):
npm install -g @provos/ironcurtain
从源码(开发):
git clone https://github.com/provos/ironcurtain.git
cd ironcurtain
npm install
一次性设置
1. 设置你的 API 密钥:
export ANTHROPIC_API_KEY=sk-ant-...
你也可以将密钥放在项目根目录的 .env 文件中(通过 dotenv 自动加载),或通过 ironcurtain config 将其添加到 ~/.ironcurtain/config.json。环境变量优先于配置文件中的值。支持:ANTHROPIC_API_KEY、GOOGLE_GENERATIVE_AI_API_KEY、OPENAI_API_KEY。
2. 运行首次启动向导(在使用推荐的 mux 路径之前显式运行此命令;它也会在首次非 mux 的 ironcurtain start 时自动运行):
ironcurtain setup
引导你完成 GitHub token 设置、Web 搜索提供商、模型选择以及其他设置。根据你的选择创建 ~/.ironcurtain/config.json。
运行 IronCurtain
IronCurtain 附带一套面向开发者体验的默认策略——只读操作被允许,变更操作(写入、推送、创建 PR)会升级以请求人工批准。你可以在设置完成后立即开始使用它。
终端复用器(推荐)
使用 IronCurtain 的推荐方式。它让你能够充分利用代理的交互式 TUI(Claude Code 或 Goose)的全部能力,同时 IronCurtain 通过其策略引擎对每一次工具调用进行中介——全部在一个终端中完成。
ironcurtain mux
主要功能:
- 完整的 agent TUI — agent 在 Docker 容器内的 PTY 中运行,且无网络访问权限。你可以像它在本地运行一样与之交互。
- 内联升级处理 — 当工具调用需要审批时,升级选择器会覆盖视口,并提供单键操作(a/d/w 分别对应批准/拒绝/加入白名单)。使用
/approve+ N可在本次会话剩余时间内将某个域名或路径加入白名单。 - 可信用户输入 — 在命令模式(Ctrl-A)下输入的文本会在进入容器之前于宿主机侧被捕获。这会创建一个经过验证的意图信号,供自动批准器使用——例如,输入 "push my changes to origin" 将自动批准随后的
git_push升级请求。 - 标签页管理 — 生成多个并发会话(
/new),在它们之间切换(/tab N、Alt-1..9),关闭它们(/close)。多个 mux 实例可以并行运行。
有关完整演练,请参阅 DEVELOPER_GUIDE.md:输入模式、可信输入安全模型、升级工作流以及键盘参考。
非 mux 会话
对于快速一次性任务、脚本,或当你明确希望使用本地内置 agent 时,请使用 ironcurtain start。对于常规的交互式 Docker-agent 工作,请使用 ironcurtain mux。
ironcurtain start "Summarize the files in ./src" # Single-shot mode
ironcurtain start -w ./my-project "Fix the tests" # Single-shot workspace mode
ironcurtain start --agent builtin # Local builtin REPL, no Docker
ironcurtain start --persona my-assistant "Check my email" # Use a persona
其他运行模式
IronCurtain 还支持会话恢复(--resume <session-id>)、传统的原始 PTY/调试模式、用于移动端审批的 Signal 消息传输,以及用于定时 cron 任务的守护进程模式。守护进程有一个可选的Web UI(--web-ui),用于基于浏览器的监控和升级处理。详情请参阅 RUNNING_MODES.md。
多智能体工作流
IronCurtain 通过结构化工作流编排多个 AI 智能体。内置的漏洞发现工作流通过分层测试框架流水线(第 1 层隔离函数 → 第 2 层多组件 → 第 3 层完整构建)在原生代码中搜寻内存安全和逻辑缺陷,并带有 libFuzzer/AFL++ 覆盖率门控、假设驱动的 discover/triage 状态,以及最终的人工报告审查关卡。设计与编码工作流运行计划/设计/实现/审查循环,同样带有人工关卡。每个智能体都在自己的 Docker 容器中运行,具有角色特定的策略边界;引擎自动管理状态转换、产物传递和崩溃恢复检查点。开源,完全在你的机器上运行,通过基于宪法的策略引擎强制执行每个智能体的安全策略,并可与任何 Docker 容器化的智能体配合使用——在编码任务的范围上与 Amazon Kiro 和 Google Jules 相当,但具有一流的安全性和可扩展的工作流定义格式。

Web UI 是工作流运行的预期界面。 启动守护进程,打开打印出的 URL,然后从 Workflows 页面驱动运行——上方的状态机图是实时的,智能体消息时间线以 markdown 渲染流式传输,关卡审查包含工作区 + 产物浏览器,并且过去的运行记录会保持列出。
ironcurtain daemon --web-ui
CLI 访问可用于脚本编写、自动化和调试:
ironcurtain workflow start vuln-discovery \
"Find memory-safety bugs in libical" --workspace ~/src/libical
ironcurtain workflow start design-and-code \
"Build a REST API with authentication"
完整文档请参见 WORKFLOWS.md。
自定义你的策略
默认策略适用于一般开发场景,但你可以根据自身工作流进行调整:
1. 自定义你的章程(可选但推荐):
ironcurtain customize-policy
一个由 LLM 辅助的对话,生成一份针对你的工作流量身定制的章程,保存到 ~/.ironcurtain/constitution-user.md。你也可以直接编辑此文件。
2. 编译策略:
ironcurtain compile-policy
将你的 constitution 翻译为确定性规则,生成测试场景,并对其进行验证。编译产物输出到 ~/.ironcurtain/generated/。
Personas
Personas 是命名的策略配置文件——每个都捆绑了一个 constitution、编译后的策略、持久化工作区和语义记忆。使用它们来以不同的角色或访问级别运行 agents。
ironcurtain persona create my-assistant # Create a persona
ironcurtain persona compile my-assistant # Compile its policy
ironcurtain start --persona my-assistant "Check my calendar"
在 mux 模式下,/new my-assistant 会使用该 persona 生成一个标签页。Persona 也可以分配给 cron 任务。有关计划任务的配置,请参见 DAEMON.md。
Persona 也可以通过 Web UI 进行管理——浏览、创建、编辑 constitution,并在实时进度中编译 policy。由于 policy 是安全边界,除非守护进程以 --allow-policy-mutation 启动(默认关闭),否则 Web UI 的变更控件为只读。
Skills
将 SKILL.md 包放到 ~/.ironcurtain/skills/<name>/ 下,即可让每个 Docker agent 会话都能使用特定用途的指导(辅助脚本、确定性检查、领域知识)。合并后的集合会被暂存到每个 bundle 的主机目录中,并以只读方式 bind-mount 到容器内当前 agent 原生发现机制所遍历的路径——Claude Code 通过 --add-dir 指向暂存目录,Goose 扫描 ~/.config/goose/skills/<name>/SKILL.md。agent 会自动发现它们,并根据每个 skill 的 frontmatter 描述决定何时读取。SKILL.md 的_格式_是 Claude Code、Goose 和 Codex 采用的开放标准;只有_发现路径_因 agent 而异。Workflow 可以在 workflow 包内附带按状态划分的 skills——请参见 WORKFLOWS.md。