mcpField
A
A2H: ask a human

A2H: ask a human

本地服务
github.comAI 与智能体02 天前更新

关于 A2H: ask a human

A2H: ask a human 是供 Agent 和脚本请求人工批准或信息的可自托管网关,并返回签名响应。它支持电子邮件、Telegram 和推送渠道;高保证级别的批准可要求通行密钥验证。

主要功能

  1. 01请求批准、信息或通知
  2. 02通过电子邮件、Telegram 或推送发送请求
  3. 03对响应签名并验证决定
  4. 04高保证级别批准要求通行密钥
  5. 05防止请求重放

适用场景

  1. 01部署前要求人工批准
  2. 02通过表单向人员收集信息
  3. 03验证高风险操作的批准者
  4. 04向人员通知 Agent 进度或结果

MCP 相关

`a2h mcp` MCP 服务提供请求批准、询问、通知、检查待处理请求和取消请求的工具。它会在报告决定前验证网关签名。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"andreaacanfora-a2h-gateway": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"A2H_GATEWAY",
"-e",
"A2H_API_KEY",
"-e",
"A2H_TO",
"-e",
"A2H_PRINCIPAL",
"ghcr.io/andreaacanfora/a2h-gateway:0.3.0"
],
"env": {
"A2H_GATEWAY": "<A2H_GATEWAY>",
"A2H_API_KEY": "<A2H_API_KEY>",
"A2H_TO": "<A2H_TO>",
"A2H_PRINCIPAL": "<A2H_PRINCIPAL>"
}
}
}
}
启动命令docker run -i --rm -e A2H_GATEWAY -e A2H_API_KEY -e A2H_TO -e A2H_PRINCIPAL ghcr.io/andreaacanfora/a2h-gateway:0.3.0
需要配置的环境变量
A2H_GATEWAYURL of your A2H gateway, e.g. https://a2h.example.com
A2H_API_KEY密钥API key of the gateway
A2H_TOWhere to reach you: mailto:[email protected], tg:<chat_id> or an ntfy topic URL
A2H_PRINCIPALYour principal ID on the gateway (optional)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/andreaacanfora/a2h-gateway:0.3.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

a2h-gateway

CI

适用于 A2H 的可自托管网关。A2H 是 Agent-to-Human 协议:AI Agent 和脚本向人员请求批准或信息,人员通过电子邮件、Telegram 或推送通知作答,Agent 随后会收到附有签名、可证明决策者身份的答复。它是一个使用 SQLite 的独立 Go 二进制文件。

$ a2h ask -to mailto:[email protected] -why "Rolls back if health checks fail." "Deploy v2.3 to production?"
Waiting for an answer from mailto:[email protected] (interaction 01a1bbcf-…)…
Approved (email_link.v1) at 2026-11-08T15:37:50Z.
$ echo $?
0

Twilio Labs 于 2026 年 2 月发布了 A2H,并提供了规范、OpenAPI 模式和概念验证演示。其路线图将参考网关和正式 JSON Schema 列为下一步。本项目是这两者的独立实现,与 Twilio 无关。

功能

  • 完整的面向 Agent 的 A2H 1.0 API:发现(/.well-known/a2h)、POST /v1/intent、状态、取消、nonce、JWKS。
  • **支持所有意图:**AUTHORIZE(批准或拒绝)、COLLECT(包含文本、选项、数字和日期的表单,并进行验证)、INFORM、RESULT、ESCALATE。
  • **通知渠道:**电子邮件(SMTP)、Telegram 机器人、通过 ntfy 推送(可自托管或使用 ntfy.sh),以及用于开发的控制台渠道。支持按规范中的退避策略重试,并支持备用渠道。
  • 决策证明:
    • 每个 RESPONSE 都经过签名(基于 JCS 的 ES256 分离式 JWS,密钥存储在 JWKS 中);
    • assurance.level: HIGH 的请求必须通过通行密钥(WebAuthn)批准,质询会按第 1.11.4 节的要求绑定到交互。
  • 重放保护:
    • 基于 message_id 的幂等性;
    • 时间戳有效期和一次性 nonce;
    • 与交互同时过期、不可猜测且只能使用一次的链接。
  • Webhook 使用 HMAC 签名(X-A2H-Signature),按 10 秒 / 60 秒 / 5 分钟的间隔重试,并支持轮询作为备用方式。
  • JSON Schema:为每种 A2H 消息提供模式,位于 schemas/。
  • MCP 服务(a2h mcp):Claude、Cursor 和其他 MCP 客户端中的 Agent 可将此服务用作工具来请求你批准。
  • 一致性测试套件,用于测试任意 A2H 网关:a2h conform。

快速开始

从发布页面下载适用于 Linux、macOS、Windows 或 FreeBSD 的二进制文件,使用 Docker 镜像 ghcr.io/andreaacanfora/a2h-gateway,或使用 Go 安装:

go install github.com/AndreaAcanfora/a2h-gateway/cmd/a2h@latest

# Development: no authentication, links printed in the log.
A2H_BASE_URL=http://localhost:8080 A2H_DEV=1 a2h serve

在另一个终端中:

A2H_GATEWAY=http://localhost:8080 a2h ask -to console:me "Delete 3 unused files?"

网关会在日志中输出一个链接(url=http://localhost:8080/i/…):打开链接并批准后,a2h ask 将以 0 退出。

用于生产环境
docker run -d -p 8080:8080 -v a2h-data:/data \
  -e A2H_BASE_URL=https://a2h.example.com \
  -e A2H_API_KEYS="deploy-bot:$(openssl rand -hex 24)" \
  -e SMTP_HOST=smtp.example.com -e [email protected] -e SMTP_PASSWORD=… \
  -e TELEGRAM_BOT_TOKEN=123456:ABC… \
  -e A2H_PUSH=1 \
  ghcr.io/andreaacanfora/a2h-gateway

将其部署在 HTTPS 后面:人员需要打开它生成的链接,而通行密钥只有在安全源上才能使用。

**Telegram:**使用 @BotFather 创建机器人,然后向机器人发送任意消息,以便它能向你发送消息。你的聊天 ID 位于 https://api.telegram.org/bot<token>/getUpdates 中(message.chat.id)。当 A2H_BASE_URL 是公开主机名时,消息会显示操作按钮;如果使用 localhost,链接会显示在文本中,因为 Telegram 不允许此类按钮。

变量含义
A2H_BASE_URL人员打开的公开 URL(必填)
A2H_LISTEN监听地址,默认为 :8080
A2H_DATA_DIR数据库、签名密钥和链接密钥,默认为 ./a2h-data
A2H_API_KEYS以逗号分隔的 name:key 键值对;Agent 发送 X-A2H-API-Key
SMTP_HOST、SMTP_PORT、SMTP_USERNAME、SMTP_PASSWORD、SMTP_FROM电子邮件渠道(STARTTLS 或 TLS)
TELEGRAM_BOT_TOKENTelegram 渠道;地址格式为 tg:<chat_id>(见下文)
A2H_PUSH、NTFY_TOKEN推送渠道(ntfy);地址为主题 URL
A2H_CONSOLE控制台渠道(链接显示在日志中)
A2H_DEV开发模式:不进行身份验证,允许使用 http:// Webhook,并启用控制台。切勿将其暴露给外部。

通过 Agent 发起请求

任何 HTTP 客户端都可以使用:

curl -s https://a2h.example.com/v1/intent -H "X-A2H-API-Key: $KEY" -H 'content-type: application/json' -d '{
  "type": "AUTHORIZE",
  "message_id": "'$(uuidgen)'",
  "agent_id": "did:web:booking-agent.example.com",
  "principal_id": "usr_alice",
  "channel": { "type": "email", "address": "mailto:[email protected]",
               "fallback": [{ "type": "push", "address": "https://ntfy.sh/alice-a2h-7f3k" }] },
  "render": { "title": "Book flight?", "body": "Book the non-refundable flight to Lisbon for 412 EUR?" },
  "explanation_bundle": { "why": "The fare expires in 30 minutes." },
  "ttl_sec": 1800,
  "callback": { "url": "https://agent.example.com/a2h/webhook", "secret": "whsec_…" }
}'

随后等待 Webhook,或轮询 GET /v1/status/{interaction_id},直到状态变为 ANSWERED、EXPIRED、CANCELLED 或 FAILED。

在 Go 中,a2h 包会完成所有这些操作并验证答复:

c := a2h.NewClient("https://a2h.example.com", key)
sent, _ := c.Send(ctx, msg)
status, _ := c.Wait(ctx, sent.InteractionID, 2*time.Second)
resp, err := c.VerifyResponse(ctx, status.Response, msg.MessageID) // checks responds_to and the JWS
if err == nil && resp.Decision == a2h.Approve { /* go ahead */ }

在 AI Agent 中使用(MCP)

a2h mcp 是一个 Model Context Protocol 服务:Claude Code、Claude Desktop、Cursor 和其他 MCP 客户端可以使用其中的工具, 在采取行动前征求你的意见。

工具功能
request_approval请求你批准或拒绝某项操作;返回经过验证的决定
ask_human请你填写一份简短表单(文本、数字、日期、选项、是/否)
notify_human向你发送消息(进度、结果、提醒)
check_request跟进仍在等待处理的请求
cancel_request撤回尚未得到答复的请求

它已作为 io.github.AndreaAcanfora/a2h-gateway 列入 官方 MCP Registry,因此可以浏览注册表的 MCP 客户端能够安装它;也可以手动配置。

Claude Code:

claude mcp add a2h \
  -e A2H_GATEWAY=https://a2h.example.com -e A2H_API_KEY=… -e A2H_TO=tg:123456789 \
  -- a2h mcp

Claude Desktop(claude_desktop_config.json)、Cursor 等:

{
  "mcpServers": {
    "a2h": {
      "command": "a2h",
      "args": ["mcp"],
      "env": { "A2H_GATEWAY": "https://a2h.example.com", "A2H_API_KEY": "…", "A2H_TO": "mailto:[email protected]" }
    }
  }
}

然后告诉 Agent 何时应该征求意见,例如:“删除任何内容或花钱之前,先用 request_approval 征求我的批准”。

  • 接收方由配置决定。 模型可以撰写问题,但无法选择发送对象,因此 Agent 不能给其他人发消息。
  • 答案会经过验证:工具报告决定前,会根据网关的签名验证答案。验证失败的答案会报告为失败,绝不会被视为批准。
  • 长时间等待: 工具调用最多等待 10 分钟(-max-wait),期间会发送进度通知。如果对方届时尚未答复,工具会说明这一点,Agent 随后使用 check_request 继续跟进。
  • 高风险事项: 设置 require_passkey: true 后,批准必须使用通行密钥。

高风险审批的通行密钥

带有 "assurance": {"level": "HIGH"} 的请求(或 required_factors 包含 passkey.webauthn.v1 的请求)不能通过点击批准:对方必须使用通行密钥确认(Face ID、Touch ID、Windows Hello 或安全密钥)。只有操作员可以在服务上注册通行密钥:

a2h enroll -principal usr_alice
# Send this link to usr_alice. It works once and expires in 24h0m0s:
# https://a2h.example.com/enroll/…

RESPONSE 随后会携带 WebAuthn 断言、质询随机数和公钥,因此 Agent 可以自行验证对方的签名。

一致性

a2h conform -gateway https://gateway.example.com -key $KEY -to mailto:[email protected]
PASS  MUST   §1.4      discovery document
PASS  MUST   §1.3      RESPONSE type from an agent is rejected
PASS  MUST   §1.5      unsupported profile is rejected
PASS  MUST   §1.10.2   duplicate message_id returns the original interaction
PASS  MUST   §1.7      cancel a waiting interaction
…
conforming to the agent-facing API of A2H 1.0

测试套件会向你提供的地址发送实际意图,然后将其取消。

规范中不明确的部分

A2H 1.0 有些细节尚未明确,或以两种方式描述。此处采用的选择列在 docs/implementation-notes.md 中,作为对下一版规范的反馈。

开发

go test -race ./...                        # unit and integration tests
go build -o e2e/a2h ./cmd/a2h && (cd e2e && npm install && npm test)   # passkeys in Chromium

许可证

MIT。A2H 由 Twilio Labs 版权所有,采用 MIT 许可证。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。