工具网关服务

ASHTON平台的首个可执行工具网关,提供工具发现、路由调用、调用者身份验证和审计日志功能,适用于服务路由和控制场景。

  • by ixxet
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 ixxet/ashton-mcp-gateway

使用说明

阿什顿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是否 实际上是有保证的。

这一选择值得关注,因为它标志着克制。重点是 这个仓库不是“炫耀多种语言”。重点是“构建一个有用的 仅当平台获得控制层时。"

文档地图

为什么这次回购很重要

老实说,网关仓库现在显示平台可以路由两个 真实的、源支持的工具调用,具有明确的调用者归属和持久性 在不假装完全控制平面已经存在的情况下进行审计。那是一个 比华而不实的存根或投机代理平台的声明更有说服力。