TomCruiseTorpedo/gatewarden
GitHub: TomCruiseTorpedo/gatewarden
一个 MCP/A2A 内联网关,在单一进程中评估下游服务器的 agent 可用性并通过签名租约管控每一次工具调用。
Stars: 0 | Forks: 0
# gatewarden
一个内联的**网关**,针对下游的 MCP server —— 或远程的 **A2A agent** —— 既**评估**其暴露的内容,又通过能力租约(capability leases)**管控**每一次调用 —— 只需一个进程,一份配置。它在单一接口之后融合了两个先前的工具:
- **score** —— agent 可用性评估器(内省 → lint → `Scorecard`;A2A Agent Card lint,签名验证 + 签名)。
- **govern** —— 能力租约代理 + 内联执行代理(签名、限定范围、限时租约;默认拒绝;哈希链审计;A2A 租约扩展)。
将其指向下游的 server,你将在一个流程中获得可用性记分卡**以及**最小权限、经过审计的执行。将其指向远程的 A2A agent,你将在上一层协议获得同样的安全态势 —— 并且它可以将其自身受管控的工具接口*作为* A2A agent 提供服务。
## 工作区布局
| package | role |
|---|---|
| `@gatewarden/score` | 内省 + lint + 评估下游 MCP server |
| `@gatewarden/govern` | 租约、签名 (PASETO v4.public)、策略、审计、每次调用的执行器 |
| `@gatewarden/gateway` | 融合体:附加时的评估快照 + 内联租约执行 |
这两个核心是从其独立代码库中原样引入的 —— [mcp-fit](https://github.com/TomCruiseTorpedo/mcp-fit) (score) 和 [leasebroker](https://github.com/TomCruiseTorpedo/leasebroker) (govern);网关是在它们之上的轻量级组合。
## 快速演示(无需密钥)
- `bun install`
- `bun run demo`
该演示前置了参考文件系统 MCP server,打印其 agent 可用性记分卡(确定性的 —— 不需要 API 密钥),然后在同一流程中证明执行效果:对 `private/secret.txt` 的超范围读取被租约范围拒绝,而对 `allowed.txt` 的范围内读取则成功。
## CLI
- `bun run build`
- `bun packages/gateway/dist/cli/index.js --help`
网关命令(`score`、`serve`、`rescore`)以及完整的租约生命周期(`request`、`approve`、`deny`、`pending`、`revoke`、`policy`、`audit`)。
`@gatewarden/govern` 还提供了一个独立的 CLI(`packages/govern/dist/cli/index.js`),用于在没有网关层的情况下管理租约生命周期。
完整的评分(行为评估轴)需要 `ANTHROPIC_API_KEY`;无需密钥的演示和确定性 lint 轴则不需要。
## A2A:评估 + 管控远程 agent
同样的态势,向上一层协议([A2A](https://a2a-protocol.org/) v1.0; ADR-H/ADR-I):
- `a2a-attach ` —— 以只读方式附加到远程 agent:获取其 RAW
Agent Card,对其进行评分(7 个确定性 card 轴 + 签名报告),并写入
`card-compat.json`。`--verify-keys ` / `--verify-jku` 添加
加密验证层。
- `a2a-card --interface-url ` —— 从其受管控的 MCP 工具接口生成本网关自己的
Agent Card(skills 与 tools 为 1:1 对应;租约扩展声明为
`required: true`)。内部验证机制:绝不会发布其自身内置评分器发现错误的
card。`--signing-key` 发布带有签名的 card。
- `a2a-serve --interface-url ` —— 将受管控的接口作为
**活跃的 A2A agent** 提供服务:已知的 card + JSON-RPC endpoint。每一个入站
消息在执行任何下游工具调用之前,都会运行租约入站阶梯流程(声明扩展 → 验证租约 →
否决 → 允许);拒绝路径永远不会触及下游。`--signing-key` 提供一个 SIGNED card 并挂载
`/.well-known/jwks.json`。
- `a2a-keygen --out ` —— 生成 card 签名密钥对(私有 JWK 以
0600 模式写入 + 可发布的 `jwks.json`)。
出站委托也受到管控:`GovernedA2aDownstream` 对在远程 agent 的 endpoint 上的每一次 `http.call` 发送进行拦截(租约会限定范围*允许委托给哪些 agent*),根据
[leasebroker A2A extension profile](https://github.com/TomCruiseTorpedo/leasebroker/blob/main/docs/a2a-lease-extension-v1.md) 携带租约,
并可选择强制执行从 DataParts 提取的 `spend`。
## 开发
- `bun install`
- `bun run test` —— 运行所有包套件 (vitest)
- `bun run typecheck` —— 工作区范围内的 `tsc --noEmit`
- `bun run build` —— 编译所有包
- `bun run --filter '@gatewarden/score' check:score-sync` —— 验证内置的 score 引擎是否偏离了其 mcp-fit 上游(CI 会强制执行此操作)
## 设计
- 规范:`specs/gatewarden/spec.md`
- 决策:`docs/adrs.md`
- 计划 + 分解:`plan.md`,`BEADS.md`
## 状态
**在 `main` 分支上:** 完整的 MCP 网关以及 A2A 通道 —— 整个工作区共有 622 个
测试(score 237,govern 240,gateway 145),所有三个包的 typecheck 和 build 均通过,无需密钥的演示通过,CI 通过。
**在 npm 上:** `@gatewarden/score` / `@gatewarden/govern` / `@gatewarden/gateway`
版本为 **0.1.0**,该版本早于 A2A 通道(附加、card 生成/签名、
A2A server 接口以及 a2a-* 命令在下次发布之前仅限于 `main` 分支)。私有根工作区版本保持为 `0.0.0`。
## 许可证
Apache-2.0。
标签:A2A, AI网关, Bun, MCP, Streamlit, 审计日志, 自动化攻击, 访问控制, 零信任架构