阿什顿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<br/>active, narrow"]
auth["caller identity<br/>active, narrow"]
router["service router<br/>active, narrow"]
audit["audit log<br/>active, narrow"]
hitl["HITL gate<br/>planned"]
athena["athena tools<br/>two routed reads real"]
apollo["apollo tools<br/>future routes"]
hermes["hermes tools<br/>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是否
实际上是有保证的。
这一选择值得关注,因为它标志着克制。重点是
这个仓库不是“炫耀多种语言”。重点是“构建一个有用的
仅当平台获得控制层时。"
文档地图
为什么这次回购很重要
老实说,网关仓库现在显示平台可以路由两个
真实的、源支持的工具调用,具有明确的调用者归属和持久性
在不假装完全控制平面已经存在的情况下进行审计。那是一个
比华而不实的存根或投机代理平台的声明更有说服力。