阿什顿mcp网关
ASHTON的第一个可执行工具网关。
当前实际切片:一个Go HTTP运行时,从中加载两个共享清单ashton-proto,保持POST /mcp/v1/tools/list开放和狭窄,需要 显式呼叫者身份POST /mcp/v1/tools/call,路由两个只读 ATHENA占用读取,严格验证声明的参数,拒绝 清单路径逃逸,并将经过净化的审计行持久化到Postgres,同时 保持该行为只读。目前还没有更广泛的说法。
这才是正确的现状。网关只值得实施 一旦平台有了真正的服务真理来路由。此README保持了狭义 运行时保持诚实,同时保留更大的未来控制平面形状。
状态图例
| 标签 | 含义 |
|---|---|
Shipped | git标签存在,表示已发布的repo行 |
Working line | repo当前包含此行,但匹配的标签可能存在也可能不存在 |
Planned | 仅记录未来的工作 |
截至目前 2026-04-10:
- 最新发货标签:
v0.2.0 - 当前工作线路
main:v0.2.1 - 之后的下一个计划行:
v0.3.0
当前和未来的架构
当前和未来视图的独立Mermaid源代码位于 docs/diagrams/gateway-route-and-approval.mmd.
flowchart LR
clients["LangGraph agents, Claude, CLI, automation"]
registry["tool registry
active, narrow"]
auth["caller identity
active, narrow"]
router["service router
active, narrow"]
audit["audit log
active, narrow"]
hitl["HITL gate
planned"]
athena["athena tools
two routed reads real"]
apollo["apollo tools
future routes"]
hermes["hermes tools
future routes"]
clients --> registry --> auth --> router
router --> audit
router --> hitl
router --> athena
hitl -. later .-> apollo
hitl -. later .-> hermes当前交货状态
| 区域 | 状态 | 注释 |
|---|---|---|
| README、路线图、运行手册、ADR和成长痛苦日志 | 已建立 | 该仓库使网关范围可读 |
| Go网关实现 | 真实、狭义 | 一个HTTP运行时在本地启动并加载静态清单 |
| 健康表面 | 真实 | GET /health 返回服务状态和清单计数 |
| 类似MCP的列表表面 | 真实、开放和狭窄 | POST /mcp/v1/tools/list 返回已注册的工具元数据,而不扩展到身份验证平台工作 |
| 呼叫者身份 | 真实、狭义 | POST /mcp/v1/tools/call 接受内部呼叫者的可信呼叫者头和用于自动化的API密钥,并进行恒定时间秘密比较 |
| 持久审计 | 真实、狭义 | 路由调用将经过清理的审计行持久化到Postgres,并在审计写入失败时失败关闭 |
| 参数验证 | 真实、狭义 | 路由调用在上游路由之前拒绝未声明的参数和错误类型的可选参数 |
| 清单加载边界 | 真实、狭窄 | 配置的清单目录拒绝符号链接转义和非常规清单文件 |
| 第一个路由只读呼叫 | 真实 | POST /mcp/v1/tools/call 路线 athena.get_current_occupancy |
| 第二次路由只读呼叫 | 真实 | POST /mcp/v1/tools/call 路线 athena.get_current_zone_occupancy |
| 可检查的读取路径日志 | 真实 | 成功和路由失败会发出有界的结构化日志,而不会泄露机密 |
| 审批门 | 未开始 | 故意推迟到 v0.3.0 |
| Rust重写 | 未开始 | 明确推迟,直到真正的Go瓶颈存在 |
技术和交付计划
| 层 | 技术/模式 | 状态 | 线条 | 为什么 |
|---|---|---|---|---|
| 文档库 | Markdown自述、路线图、运行手册、ADR、成长之痛 | 已建立 | v0.0.1 | 在代码存在之前保持网关概念的结构化 |
| 网关运行时 | Go | 已建立 | v0.1.0 -> v0.2.0 | 用平台的主要语言证明模式的最快方法 |
| 协议 | HTTP上类似JSON的窄MCP | 已建立 | v0.1.0 -> v0.2.0 | 足以证明发现和路由呼叫,而无需假装整个网关已完成 |
| 工具发现 | 当前来自一个配置目录的静态清单 ashton-proto/mcp | 真实、狭窄 | v0.1.0 -> v0.2.1 | 在运行时仍仅支持两次清单支持的ATHENA读取时,保持服务所有权明确 |
| 呼叫者标识 | 受信任的呼叫者标头加上API密钥 | 真实,窄 | v0.2.0 -> v0.2.1 | 交互式和自动调用者需要不同的信任路径,而无需重写身份验证平台 |
| 审计跟踪 | Postgres加结构化日志 | 真实、狭义 | v0.2.0 -> v0.2.1 | 没有持续审计的工具路由将是一个薄弱的控制层 |
| 审批路径 | 明确的人在回路门 | 计划 | v0.3.0 | 在暴露实际写入操作之前需要 |
| 速率限制 | Redis令牌桶 | 延迟 | v0.4.0 | 稍后有用,只读路由切片不需要 |
| 稍后重写路径 | Rust | Deferred | 晚于 v0.4.0 | 仅在存在测量的路由或并发压力后获得 |
为什么现在建造
| 原因 | 解释 |
|---|---|
| 没有工具的网关是剧场 | 在共享路由器有任何意义之前,平台需要真正的服务表面 |
| 读路由必须先于编排 | 第一个有用的证据是一小部分可发现、可路由的只读调用 |
| 呼叫者身份和审计应在写入治理之前确定 | 下一个信任边界是归因和持久性,而不是写入 |
| Rust应该获得,而不是假设 | Go优先的决定是一种工程学科的选择,而不是语言对冲 |
当前发布线
当前的发布线是权威的边界提醒。
| 范围内 | 范围外 |
|---|---|
| 加载两个真实清单 | 广泛的多服务编排 |
保持 tools/list 开放和狭义 | 完整的写审批工作流 |
| 仅在路由呼叫时要求呼叫者身份 | 身份验证平台重写 |
| 对路由呼叫进行持续的净化审计 | 对尚不存在的流量进行速率限制 |
| 路由两个只读ATHENA占用调用端到端 | 在Go版本获得之前进行Rust重写 |
运行时曲面
| 表面 | 路径 | 状态 | 注释 |
|---|---|---|---|
| 健康 | GET /health | Real | 返回服务状态和 manifests_loaded |
| 工具列表 | POST /mcp/v1/tools/list | 真实、开放和狭义 | 精确返回已注册的清单支持的工具定义 |
| 工具调用 | POST /mcp/v1/tools/call | 真实的、调用者感知的 | 在路由支持的只读工具调用之前,需要显式的调用者身份、有界的JSON解码和声明的参数验证 |
| 受信任的呼叫者身份 | X-Gateway-Trusted-Caller-Token, X-Gateway-Caller-Type, X-Gateway-Caller-Id,可选 X-Gateway-Caller-Display | 真实、狭窄 | 仅适用于可信的内部边界 |
| 自动呼叫者身份 | X-Gateway-API-Key | 真实、狭义 | 仅适用于配置的自动化呼叫者 |
| 清单注册表 | GATEWAY_MANIFEST_DIR | 真实 | 负载 *.json 工具从配置的目录中显示并拒绝符号链接目录/文件转义 |
| 审计存储 | GATEWAY_AUDIT_DATABASE_URL | Real | 为路由呼叫保留经过净化的审计行 |
| 读取路径日志 | stdout结构化日志 | 真实 | 发射 tool_name, source_service、路由参数, latency_ms,以及 outcome 不泄露秘密 |
边界提醒
| 网关应拥有 | 网关不应拥有 |
|---|---|
| 工具发现和路由 | 占用、成员或员工工作流的域真相 |
| 面向调用者的读取边界 | 特定于服务的业务逻辑 |
| 路由呼叫的可审计性 | 服务数据模型的私有副本 |
当前状态块
此回购中已经存在
- 一个Go HTTP运行时在本地启动
- 一个清单支持的工具注册表从以下位置加载
GATEWAY_MANIFEST_DIR POST /mcp/v1/tools/list返回两个已注册的工具:
athena.get_current_occupancy 和 athena.get_current_zone_occupancy
POST /mcp/v1/tools/call需要明确的呼叫者身份和路由
通过ATHENA的公众 GET /api/v1/presence/count
- 路由调用会保留经过净化的审核行以确保成功、工具未知、无效-
论证和跨越路线边界的上游故障结果
- 如果审核存储不可用,路由呼叫将失败关闭
- 路由调用拒绝未声明的参数和错误类型的可选参数
在他们触碰雅典娜之前
- 工具调用请求体具有大小限制,并拒绝未知的顶级JSON
领域
- 在没有直接字符串相等的情况下比较受信任的调用方令牌和API密钥
捷径
- 路由呼叫在成功和路由失败路径上都会发出可检查的日志
真实但有意缩小
- 只有ATHENA可以通行
- 仅实现只读路由
- 呼叫者标识仅限于受信任的呼叫者标头和已配置的API密钥
tools/list保持开放和狭窄tools/call是身份和
审计边界
- 审计存储是真实的,但审批流、速率限制和部署证明
仍被推迟
故意推迟
- APOLLO或HERMES路由读取
- 写治理
- 实时部署证明
- Redis支持的速率限制
- Rust重写
发布历史
| 发布行 | 确切标签 | 状态 | 什么变成了现实 | 什么被推迟了 |
|---|---|---|---|---|
v0.0.1 | v0.0.1 | 已发货 | 仅文档计划基线 | 可执行运行时、清单、路由、审计、批准和速率限制 |
v0.1.0 | - | 历史工作线 | 可执行Go运行时,第一个清单支持的路由ATHENA占用读取和可检查的路由日志 | 调用者身份、持久审计、批准和更广泛的路由 |
v0.2.0 | v0.2.0 | 当前Tracer 15发布了线路 | 呼叫者身份、持久审计和第二次路由ATHENA区域占用读写批准、速率限制、实时部署证明和更广泛的路由 |
版本控制规程
网关现在遵循正式的预配置-1.0.0 语义版本控制。
PATCH发布内容包括强化、文档同步、部署收尾、可观察性、,
以及有界的非加宽修复
MINOR版本涵盖了新的路由功能、新的信任边界,或
有意预-1.0.0 合同变更
- 在…前
1.0.0突破性的变化仍然需要MINOR,从来没有PATCH 1.0.0保留用于具有清晰标识的稳定路由控制表面,
审计和批准预期
计划发布线
| 计划标签 | 预期目的 | 限制 | 它还不应该做什么 |
|---|---|---|---|
v0.3.0 | 第一行写批准和HITL | 仅在读取路径受信任后才为写调用添加明确的人工批准 | 不要在同一行中扩展到速率限制或完全多服务编排 |
v0.4.0 | 速率限制和更宽的注册表行 | 只有在网关已经具有真正的读写证明后才能扩展 | 在没有测量的Go瓶颈的情况下,不能证明Rust重写是合理的 |
下一个阶梯角色
| 行 | 角色 | 为什么重要 |
|---|---|---|
v0.2.0 / Tracer 15 | 呼叫者身份、持久审计和一秒路由读取 | 将网关从精简的第一路由转变为呼叫者感知和可审计的控制界面 |
v0.3.0 | 第一个写批准和HITL行 | 仅在读取路径受信任后添加显式的写治理 |
v0.4.0 | 更广泛的注册表和速率限制 | 只有在存在真正的读写证明后才能扩大控制平面 |
计划组件图
| 计划组件 | 责任 | 状态 |
|---|---|---|
| 工具注册表 | 发现和注册工具清单 | 真实、狭义 |
| 身份验证层 | 验证交互式和自动调用者 | 真实、狭义 |
| 服务路由器 | 将工具调用分派到后端服务 | 真实、狭义 |
| 审批门 | 等待明确审批的写入操作 | 已计划 |
| 审计日志 | 跟踪参与者、工具、延迟、经过净化的输入和结果 | 真实、狭义 |
| CLI | 手动操作员检查和测试呼叫 | 推迟 |
| 基准测试工具 | 稍后证明或拒绝Rust重写 | 推迟 |
先去,后生锈
仓库中已经包含了正确的架构决策 docs/adr/001-go-first-rust-later.md: 在Go中发布第一个真正的网关,测量现实,然后决定Rust是否 实际上是有保证的。
这一选择值得关注,因为它标志着克制。重点是 这个仓库不是“炫耀多种语言”。重点是“构建一个有用的 仅当平台获得控制层时。"
文档地图
为什么这次回购很重要
老实说,网关仓库现在显示平台可以路由两个 真实的、源支持的工具调用,具有明确的调用者归属和持久性 在不假装完全控制平面已经存在的情况下进行审计。那是一个 比华而不实的存根或投机代理平台的声明更有说服力。
