关于 Grantex
Grantex 是面向 AI Agent 的委托授权协议与参考实现,提供多语言 SDK 和服务端组件。它为 Agent 建立可验证身份,并支持范围受限、限时、可撤销的授权及审计记录。
主要功能
- 01可验证的 Agent 身份
- 02范围受限且可撤销的授权
- 03多 Agent 委托
- 04服务端授权验证与审计
- 05预付钱包与支出控制
适用场景
- 01代表个人或组织调用受保护服务
- 02限制 Agent 的支付对象与支出
- 03在多 Agent 工作流中委托权限
- 04验证 Agent 执行操作的授权范围
MCP 相关
Grantex 补充 MCP 的工具连接能力,为 Agent 提供身份和操作授权判断。项目包含 MCP 相关软件包,但此处未说明其具体接口。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
17收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 便于人类阅读的 Agent 名称 |
| description | string | 是 | 此 Agent 的功能 |
| scopes | array | 是 | 请求的权限范围 |
详细介绍
Grantex
AI Agent 授权与委托访问,配备开源 SDK
OAuth 2.0 之于人类,正如 Grantex 之于 Agent。
文档 | 快速入门 | 发布 JSON | LLM 索引 | 规范 | IETF 草案
所有权: Grantex 归 Orchestrum Technologies LLP 所有。发明人及所有者:Sanjeev Kumar。联系方式:[email protected] 或 [email protected]。
网站运营方:营销咨询的递交与受理。
如需开展范围明确的技术试点,请先了解安全控制、 令牌验证以及 OACP 权限边界。 AgenticOrg 运行买方/卖方 Agent 和工作流;Grantex 管理委托权限;商户系统和支付服务提供商保留运营权限。 如需讨论银行、金融科技或商户集成事宜,请联系 [email protected],但请勿分享凭据 或客户隐私记录。
Grantex 使用两种许可证。LICENSING.md 列出了各目录使用的许可证。
| 部分 | 许可证 | 组织使用条件 |
|---|---|---|
packages/ 中的 SDK 和客户端包(TypeScript、Python 和 Go SDK、框架集成、验证器、MCP、x402 和 MPP 包、CLI、Terraform provider 等)以及 examples/ | Apache License 2.0,开源 | 可免费用于任何用途,包括商业用途 |
Grantex 平台:身份验证服务和开发者门户(apps/)、协议规范文本、文档和网站 | Orchestrum Personal Use License 1.0,源码可用,自 2026 年 10 月 21 日起及其后的所有更新均适用 | 需事先获得 Orchestrum Technologies LLP 的书面许可,并签署协议 |
- **平台,免费:**个人出于自身目的使用、复制或修改(用于学习、个人研究、实验和业余项目),且不代表任何组织行事、不为任何组织行事或谋取任何组织的利益。
- **平台,需事先获得 Orchestrum Technologies LLP 的书面许可:**任何组织直接或间接进行的使用,无论组织是公司、事务所、个体经营者、慈善机构、学校、大学、研究机构还是政府部门,也无论使用是否付费。包括评估、测试、试点、内部使用、托管或 SaaS、转售、分发,以及将平台嵌入其他产品。通过托管服务(
grantex.devAPI)进行的商业使用也需要签署协议,即使是通过开源 SDK 使用。请参阅 COMMERCIAL-LICENSE.md,并联系 [email protected]。 - **现有用户:**2026 年 10 月 21 日之前发布的版本仍按发布时所附的条款提供。自该日起发布的平台版本和更新不适用这些条款,因此组织需要获得书面许可才能使用。
- 名称:“Grantex”和“AgenticOrg”是 Orchestrum Technologies LLP 的商标。未经 Orchestrum 事先书面批准,不得将这些名称、徽标或品牌用于商业用途,包括与 Apache 许可的 SDK 和早期版本一同使用。请参阅 TRADEMARKS.md。
什么是 Grantex?
Grantex 是一套面向 AI Agent 的委托授权协议和参考实现,提供开源 SDK 和源码可用的服务端。它为每个 Agent 提供可验证的身份,以及由个人或组织授予的、范围受限、具有时效且可撤销的权限,并支持多 Agent 委托、服务端验证和审计记录。
Grantex 与 OAuth 2.0 和 MCP 相辅相成:OAuth 负责应用和用户授权,MCP 连接模型与工具,而 Grantex 用于证明哪个 Agent 可以代表哪个主体执行哪些操作。当 AI Agent 代表个人或组织行事,而依赖该 Agent 的服务必须准确验证其可执行操作时,请使用 Grantex。
对于 AgenticOrg 的企业入驻场景,Grantex 授予委托的工具权限,而 AgenticOrg 负责租户隔离、案例状态、本地案例用途允许列表、人工审核以及提供商调用边界。最近一次经过验证的 AgenticOrg 集成并未强制执行令牌级别的案例用途或每个案例的限额。已发布的 Python grantex==0.7.2 包含用途和限额 API,但尚未验证该集成是否使用了这些 API。请参阅受管控案例集成边界和发布状态。本仓库和 MCP 工具均不会授予 Agent 批准案例的人工权限。
Agent 预付钱包和 x402 v2
仓库源码包含由委托主体控制、供 AI Agent 使用的预付钱包。 委托主体可以分配一个或多个钱包,并实施分配、钱包、 Agent、共享预算组、委托主体和开发者级控制,限制 收款方、资源来源、操作、商户、用途、项目和成本中心,要求 获得确切的人为审批,管理充值频率,并停用一个 分配、一个钱包或 Agent 可用的所有钱包。授权会在 PostgreSQL 中以原子方式 预留金额,并绑定到 Agent 的 DPoP OAuth 身份和经策略评估的语义上下文。
@grantex/x402 使用官方 x402 v2 PAYMENT-REQUIRED、
PAYMENT-SIGNATURE 和 PAYMENT-RESPONSE 消息。不再使用旧的模拟
X-Payment-Proof 流程。sandbox_ledger 已实现端到端流程;
除非已配置的提供方能够验证资金和结算,否则外部托管记录会以拒绝方式处理。源码检出版本现已包含可选启用的 Base 原生 USDC EIP-3009 支付,具备受策略控制的签名、经验证的资金、持久化签名重试和已最终确认的链上对账。Python 0.7.2
和 Go v0.4.3 发布了 EVM 响应与对账 API;两者都未添加
自动 HTTP 支付封装。已发布的 TypeScript 0.8.2 和 x402 0.4.1
包含可选启用的 Base 自动 402/签名/重试流程。四个版本均已通过注册表验证。请参阅
Base USDC 托管指南,其中也说明了
停用操作无法撤回已发出的链上签名这一限制。
import { PrepaidWalletAgentClient } from '@grantex/sdk';
import { createX402Agent } from '@grantex/x402';
const walletAgent = new PrepaidWalletAgentClient({ oauthClient, accessToken });
const x402 = createX402Agent({
authorizePayment: walletAgent.x402Authorizer,
// walletId is optional; omit it for policy-based wallet selection.
});
const logicalPaymentId = 'order_01JZ8Y6Q2M4N7P9T';
const response = await x402.fetch('https://merchant.example/paid-resource', {
// The merchant uses this header to recover a response lost after settlement.
headers: { 'Idempotency-Key': logicalPaymentId },
// Grantex uses this option to recover a reservation response lost before settlement.
idempotencyKey: logicalPaymentId,
});
对于会产生副作用的资源,商户必须使用 Idempotency-Key 持久缓存业务结果。
Grantex 结算具有幂等性,但已结算的支付授权无法再次验证,也不能再次执行受保护的工作。
OAuth 授权必须包含 wallet:spend,以及作为 extra.grantexScope 公布的确切商户操作范围;钱包分配策略可以限制经人工批准的权限,但不能扩大该权限。
Grantex 的定位
Grantex 负责委托 Agent 身份、语义支出策略、跨钱包预算、确切审批、原子预留、停用控制和审计。AgenticOrg 部署或其他 Agent 运行时负责编排和与人类交互。钱包发行方或托管方仍负责 KYC/KYB、AML 和制裁管控、托管、网络授权、MCC/地理位置/卡片控制、结算、外汇、退款、争议、欺诈和对账。商户仍负责由服务器可信的数据确定价格/收款方、订单幂等性、结算门控,以及交付已支付的结果。
请参阅Agent 钱包治理,了解完整的责任矩阵、策略组合、确切审批协议和如实列出的剩余差距。
托管客户端已在通过注册表验证的 @grantex/[email protected]、
@grantex/[email protected]、Python grantex==0.7.2 和 Go v0.4.3 中实现。外部托管、委托主体通知的发送,以及
商户结果的幂等性仍由运营方负责。
请参阅 x402 集成
指南、钱包
生命周期和生产就绪
指南。
自托管预付钱包依赖项
运行 auth-service 不会自动配置真实货币产品所需的所有依赖项。自托管运营方必须明确提供并测试以下内容:
- PostgreSQL 迁移文件
091_agent_prepaid_wallets.sql和092_layered_wallet_spend_controls.sql,以及针对只追加钱包账本和策略决策的备份、恢复与对账; - 面向确切 OAuth 受众的 HTTPS 入口,包括
/v1/prepaid-wallets和/v1/prepaid-wallets/**(即使源服务运行正常,静态托管返回404也会导致 Agent 无法访问钱包); - 在使用
external钱包之前,接入特定提供商的托管、资金注入、结算、Webhook 去重和恢复适配器;如果没有适配器,Grantex 会有意返回503 CUSTODY_ADAPTER_UNAVAILABLE; - 当必须通过电子邮件、SMS、Slack、WhatsApp 或其他外部渠道通知主体时,提供用于重新加载事件的 SSE/WebSocket 通知桥接;不承诺内置钱包邮件投递功能;
- 商户端持久化结果缓存,以 HTTP
Idempotency-Key为键,用于结算后的副作用; - 独立的安全、提供商、对账、事件响应及适用的法律/监管审查。
服务端部署与各 SDK 版本是相互独立的。注册表使用者在安装前应核实确切版本,而不要根据仓库清单推断其是否可用。 生产就绪指南包含完整的托管检查清单,以及仅供维护者使用的 PowerShell 发布操作手册。
供应链与许可证控制
安全工作流会审计所有受跟踪的 npm 锁文件、所有受跟踪的 Python 项目和 requirements 清单,以及全部三个 Go 模块。它会检查 Dependabot 是否覆盖仓库清单,将外部 GitHub Actions 和容器镜像固定到不可变摘要,并在 CI 中拒绝未经审查的 npm 许可证标识符。发布前,请在本地运行 npm run audit:supply-chain 和
npm run audit:python。
Grantex 许可证涵盖 Grantex 源代码,不涵盖第三方依赖项。有关当前 Sharp/libvips LGPL 和 caniuse-lite CC-BY 分发说明,请参阅
THIRD_PARTY_NOTICES.md;有关运营方检查清单,请参阅
供应链安全指南。此清单是一项工程控制,并非法律上的不侵权意见;分发方必须审查实际发布的具体制品。
OAuth Agent Grants 配置文件
托管式身份验证服务和 TypeScript 仓库客户端实现了候选版本 draft-mishra-oauth-agent-grants-03 中的三个角色。经过测试的配置文件要求使用 PAR、PKCE S256、DPoP 发送方约束、RFC 9207 响应颁发者验证、5 分钟访问令牌、带家族重放撤销机制的轮换刷新令牌、在刷新响应丢失时提供 300 秒的精确请求恢复、带过期清理机制的 AES-256-GCM 加密恢复状态、同一资源的 RFC 8693 权限收窄,以及 RFC 7009 撤销。
| 发现机制和端点 | URL |
|---|---|
| 授权服务器元数据 | https://grantex.dev/.well-known/oauth-authorization-server |
| PAR / authorize / token / revoke | https://grantex.dev/oauth/{par,authorize,token,revoke} |
| 实现指南 | docs.grantex.dev/guides/oauth-agent-grants |
| 证据 | 实现报告 和 30 个行为测试向量 |
验证已完成,包括 2,138 个身份验证服务测试、456 个 TypeScript SDK 测试,以及 23 个按顺序执行的 Docker E2E 文件中的 255 个测试。这些是针对经过测试的 Grantex 配置的自评证据,并非独立的互操作性认证、OAuth 工作组采纳或 IETF 背书。更新后的 OAuthAgentClient 已以通过注册表验证的 @grantex/[email protected] 发布。
修订版 -02 仍是 Datatracker 上当前发布的版本。候选版本 -03 不得在 2026-09-09 之前上传,且须在预定的最终审查后获得新的明确批准。
开放式 Agent 商务协议(OACP)权威层
开放式 Agent 商务协议(OACP)是 Grantex 的 Agent 商务信任与制品权威层。Grantex 负责管理 OACP 策略、签署制品和授权的签发或拒绝、验证以及兼容性适配器。AgenticOrg 负责买方和卖方 AI Agent 运行时、商户自助入驻、Shopify 连接器运行时、未来的商户连接器设置意图、买方会话、渠道桥接、OACP 缓存以及由服务提供方负责的能力验证。
Shopify、未来的 WooCommerce/ERP 数据源、POS 系统和服务提供方系统等商户系统仍是记录系统。服务提供方、银行、POS 和支付网络负责授权、支付及店内执行。Grantex 负责签署和验证制品;它不是商户连接器运行时,也不会对买卖双方的每条消息收取通行费。
flowchart LR
merchant[Shopify, future ERP/WooCommerce, POS, provider systems] --> agentic[AgenticOrg buyer and seller runtime]
agentic -->|redacted authority request| grantex[Grantex OACP authority]
grantex -->|ES256-signed OACP artifacts or blockers| agentic
agentic --> buyer[Buyer surfaces]
agentic -->|capability check or handoff| provider[Pine Labs Plural/P3P, bank/POS/provider rails]
| 区域 | 当前状态 |
|---|---|
| 状态(2026-10-20) | 此表中的所有内容均已合并到 main 并部署。在生产环境中,目前尚无 OACP 发行方密钥,且 OACP_STATUS_LIST_PUBLIC_ENABLED 已关闭,因此签发请求会返回 503 oacp_issuer_key_unavailable,依赖方会拒绝;启用顺序见运维手册。 |
| Grantex C6Z 授权路由 | 已为加入允许列表的 AgenticOrg 租户实现,路由为 POST /v1/commerce/oacp/c6z/authority-requests。 |
| Arbiter 决策账本 | POST /v1/commerce/oacp/arbiter-decisions 以仅追加方式记录 AgenticOrg 策略仲裁器的每项决策,并为 allow 决策共同签署机器配置文件决策授权(approver_auth: policy_arbiter);拒绝不会签发任何内容,人工决策授权验证器会拒绝机器配置文件。 |
| 审计见证 | POST /v1/audit/witness-checkpoints 使用平台密钥(audit-witness+jwt)共同签署 AgenticOrg 审计链头;见证位置上的哈希不同则会以 WITNESS_FORK 为由拒绝并记录。 |
| 工件系列 | C6Z 路由会签发或拒绝 11 种 OACP 系列工件,其中包含来源沿袭、TTL、新鲜度、撤销状态、受限能力和非敏感证据引用;撤销和结算收据路由会签发 revocation 和 commitment_evidence 工件。 |
| 工件签名 | 每个工件都由数据库支持的 OACP 发行方密钥(oacp-... kid)对其 RFC 8785 信封进行 ES256 分离式 JWS 签名(typ oacp-artifact+jws),并发布于 /.well-known/jwks.json;密钥会轮换,已退役密钥会持续发布,直至其工件过期,被撤销的密钥则会撤下。共享验证向量:spec/examples/oacp/oacp-artifact-jws-v1.json。 |
| 授权凭证 | Intent、Cart 和 Payment 授权凭证(POST /v1/commerce/oacp/mandates/intent|cart|payment、.../verify、.../:jti/revoke)是由 OACP 发行方密钥签名的 ES256 JWT,其声明映射到 AP2 v0.2(checkout_hash、transaction_id、约束、cnf),且每项都位于 OACP Token Status List 上;仅在 Commerce Passport 限额范围内且存在有效同意时签发;human_present 购物车需要通过挑战值为其 checkout_hash 的通行密钥断言(Grantex 扩展)。参见 OACP mandates decision。 |
| 持久化与撤销 | 每次签发和拒绝都会存储(oacp_artifacts);内部路由可读取、重放、撤销、暂停和恢复工件。每个工件都位于通过 GET /status/oacp/:list 提供的 OACP Token Status List 上(由 OACP_STATUS_LIST_PUBLIC_ENABLED 控制,默认关闭);撤销时会签发带签名的 revocation 工件。参见 OACP artifact authority。 |
| 协议适配器 | UCP 业务档案版本为 2026-04-08 / 2026-08-25(仅限 dev.ucp.*,能力由已签发工件支持;只有商家选择加入且 OACP_PUBLIC_DISCOVERY_ISSUANCE_ENABLED 已启用时才公开发现,默认关闭);面向 Grantex 订单的 ACP order_create / order_update 事件,以及 Commerce Passport 限额中的委托付款额度;@grantex/mcp-auth 上的 UCP 身份关联和 Grantex ACP 作用域;AP2 映射的签名授权凭证(见上文);基于 OACP 工件派生的 Schema.org、A2A、MCP 和 OpenAPI 兼容性映射。 |
| Agent 网络身份 | @grantex/agent-httpsig / grantex-agent-httpsig 可根据 Grantex、Visa Trusted Agent Protocol 和 Web Bot Auth 配置文件,对符合 RFC 9421 的 Agent 请求进行签名和验证,并支持 TAP 主体对象和 Grantex 同意记录对象。注册表可提供加入计划的 Agent 密钥的 HTTP Message Signatures 密钥目录(HTTP_SIGNATURE_DIRECTORY_ENABLED,默认关闭),在 Agent 证明中携带不透明的 Visa / Mastercard 方案 Agent ID(REGISTRY_SCHEME_AGENT_IDS_ENABLED,默认关闭),并为 Agent Passport 添加由运营方映射的 KYA 等级(AGENT_PASSPORT_KYA_TIER_ENABLED,默认关闭)。参见 Agent network identity。 |
| 结算证据 | POST /v1/commerce/oacp/commitment-evidence/settlement-receipts 将成功的 x402 结算或 MPP Payment-Receipt 绑定到一项承诺,作为带签名的 commitment_evidence 工件(包含收据哈希,不含付款方;记录为已报告,而非已验证)。工件架构会验证 mandate_capability 上可选的方案令牌绑定 {scheme, token_ref, agent_id, merchant_scope, limits}(C6Z 路由目前尚未设置此项);Grantex 不会执行该绑定。 |
| SDK 验证器 | TypeScript 中的 verifyOacpArtifact / verifyOacpMandate,Python 中的 verify_oacp_artifact / verify_oacp_mandate,以及 Go 中的 VerifyOacpArtifact / VerifyOacpMandate,均基于 spec/examples/oacp/ 中的共享向量和 oacp 一致性测试套件。新增代码尚未包含在已发布版本中。 |
| AgenticOrg 运行时 | 商家自助配置、Seller 入驻、Shopify 同步、未来连接器 / 提供方意图采集、缓存、买家问答、桥接,以及提供方能力验证均位于 AgenticOrg 中。 |
| 支付 / 订单 / POS 执行 | 不属于 OACP 工件授权范围。提供方、POS 和商家系统必须执行并确认;Agent 不得凭空声称成功。 |
| 历史 Commerce V1 文档 | 保留供参考,但对于 AgenticOrg OACP 运行时划分而言已被取代。 |
| 从 OACP 运行时启动闭环 PRD、OACP 权限概览、商户自助配置边界、事实清单、AgenticOrg 集成指南、POS 桥接边界和运营人员操作手册开始。较早的 Commerce V1 概览仅供历史参考和了解背景,不应据此认为 Grantex 拥有 AgenticOrg 商户连接器运行时。 |
Agent Trust Registry:经认可的签发方与 Agent 护照
该注册表让依赖方(例如商户、支付服务提供商或 API)能够在 AI Agent 执行操作前对其进行检查。它回答三个问题:该 Agent 是什么软件、持有什么密钥,以及哪个经认可的签发方为其背书。返回的是计算得出的信任级别,而不是 Agent 自行声明的内容。授权仍规定 Agent 可以执行哪些操作;护照则说明 Agent 的身份。请参阅护照与授权。
| 部件 | main 上的内容 |
|---|---|
| 经认可的签发方 | 注册表运营方会认可签发方,每个签发方都有静态 JWKS、status_list_base 和获准证明的信任标记类型。签发方通过运营方密钥(REGISTRY_OPERATOR_API_KEYS)使用 POST 和 PATCH /v1/registry/issuers 进行管理。签发方可以被暂停;暂停期间,其证明不再计入。 |
| Agent 密钥 | 每个 Agent 都有密钥历史记录(/v1/agents/{id}/keys)。在任何内容能够为密钥作出证明之前,密钥必须先通过应答质询来证明持有权。密钥可以通过重叠期进行轮换,也可以报告为已泄露;报告为已泄露后不可撤销。 |
| 证明 | 经认可的签发方向 POST /v1/registry/attestations 提交紧凑型 JWS。注册表会检查签发方、签名、Agent 及其已证明的密钥、哈希规则、有效时间,以及签发方自己的 Token Status List。每次拒绝都会附带稳定的代码和原因。 |
| 信任级别 | basic、verified、attested 或 attested_verified,并带有 key_compromised、issuer_suspended 和 attestation_expiring 等标记。任何被暂停的内容都会显示为 basic:注册表会采用默认拒绝策略。 |
| 接受状态列表 | 注册表会以两种格式发布其对每项证明的接受状态:Token Status List(/status/attestations/{list})和 Bitstring Status List。 |
| 查询与清单 | GET /v1/registry/agents/{did} 以及指纹和凭证形式会返回经过最小化处理的记录。/.well-known/agent-registry.json 是一份已签名清单,列出签发方、其密钥、信任标记分类和状态列表,供不支持 Federation 的依赖方使用。 |
| 绑定护照的授权 | POST /v1/authorize 可以接收 Agent 护照(SD-JWT VC)。授权会绑定到护照的密钥和注册表的接受条目,并在每次代码交换和刷新时再次检查绑定。目前,绑定护照的授权尚不能委托。 |
现有路径上的新行为默认关闭。请按部署启用:
REGISTRY_PUBLIC_ENDPOINTS_ENABLED提供无需身份验证的读取接口:签发方列表、状态列表、无需 API 密钥的查询,以及清单。PASSPORT_BOUND_GRANTS_ENABLED启用绑定护照的授权。AGENT_KEY_HISTORY_MIRROR_ENABLED使POST和PATCH /v1/agents将 Agent 的密钥写入密钥历史记录,并拒绝已泄露或属于其他 Agent 的密钥。REGISTRY_ATTESTATION_EDDSA_ENABLED除 ES256 外,还接受 EdDSA 证明。
自托管列出了所有变量。面向各类受众的指南:
规范包括注册表联合、证明、Agent 密钥、Agent Passport 1.0、护照绑定和验证。此 Agent Passport 是由经认可的签发方签发的 SD-JWT VC,与下文#mpp-agent-identity所述的 MPP AgentPassportCredential 相互独立。
演示:开发者选择加入的证明
make demo-attest 会针对仓库的模拟认证发行方端到端运行注册流程,无需任何外部参与方:注册 Agent、证明其密钥、通过发行方适配器接口请求证明、在公开查询中看到等级为 attested,在发行方处撤销,并看到等级下降。make demo-verify 会继续演示与护照绑定的授权、依赖方的 verify() 验证通过、发行方撤销后 verify() 拒绝,以及验证器的对抗性测试样例全部被拒绝。每一步都标注为 live(注册表)、fixture(模拟发行方)或 verifier。请参阅运行模拟发行方和验证 Agent。
当前版本
Grantex 的各组件分别进行版本管理。协议规范仍为 v1.0 Final;SDK、MCP 软件包和路线图里程碑的版本属于独立的发布线,并不代表整个 monorepo 的统一版本。
以下公开版本已于 2026-10-04 核实。在相应的软件包注册表确认发布之前,仓库中的版本均为候选版本。
当前版本为:TypeScript 0.8.2、Python 0.7.2、Go v0.4.3、CLI 0.4.2、gateway 0.3.0 和 MCP Auth 4.1.0。升级前请参阅完整的迁移指南:Node.js 要求、受众绑定、限额调用金额和默认在线撤销均为破坏性变更。
TypeScript 0.8.2 和 Python 0.7.2 默认包含服务端 enforce() 受众绑定、拒绝金额不受信任的限额调用,以及在线撤销。进行受众绑定授权前,请先注册 Agent 的资源服务器,在服务边界配置预期受众,并为每次限额调用提供经过验证的金额。仅进行离线验证无法证明当前撤销状态;集成必须明确接入当前状态的强制检查。变更后的 npm 软件包要求 Node.js 22.12+。请参阅发布限制。
| 组件 | 已发布版本 | 仓库版本 | 可复现安装 |
|---|---|---|---|
| TypeScript SDK | @grantex/sdk 0.8.2 | 0.8.2 | npm install @grantex/[email protected] |
| x402 支付协议 | @grantex/x402 0.4.1 | 0.4.1 | npm install @grantex/[email protected] @grantex/[email protected] |
| Python SDK | grantex 0.7.2 | 0.7.2 | python -m pip install grantex==0.7.2 |
| Go SDK | github.com/mishrasanjeev/grantex-go v0.4.3(Go 1.26.1+) | v0.4.3 | go get github.com/mishrasanjeev/[email protected] |
| MCP 授权服务器 | @grantex/mcp-auth 4.1.0 | 4.1.0 | npm install @grantex/[email protected] @grantex/[email protected] |
| CLI | @grantex/cli 0.4.2 | 0.4.2 | npm install -g @grantex/[email protected] |
| Gateway | @grantex/gateway 0.3.0 | 0.3.0 | npm install @grantex/[email protected] @grantex/[email protected] |
| 服务适配器 | @grantex/adapters 0.2.1 | 0.2.1 | npm install @grantex/[email protected] @grantex/[email protected] |
| Strands TypeScript | @grantex/strands 0.2.1 | 0.2.1 | npm install @grantex/[email protected] @grantex/[email protected] |
| Strands Python | grantex-strands 0.2.2 | 0.2.2 | python -m pip install grantex-strands==0.2.2 grantex==0.7.2 |
10 月 4 日的 npm 和 PyPI 构件与经过验证的 CI 归档一致;Go 标签可通过公共代理解析,下载的模块也通过了测试和 vet。Python SDK 在工作站上的全新安装测试通过。早期 Docker 测试适用于历史验证报告中的版本。
**部署责任:**MCP Auth
4.1.0支持持久化共享存储、呈现式同意页面和已修正的代码交接。生产环境使用前,请配置共享状态、资源受众、必需的经主机身份验证的人类主体解析器,以及受信任的当前授权验证。仅凭同意页面本身无法验证人类身份或配置通行密钥。请参阅发布状态指南。
**仓库开发状态:**该身份验证服务会对由标准身份验证插件处理的 API 密钥路由,强制执行基于 Redis 的 Free/Pro/Enterprise 开发者限额,分别为每分钟 100/500/2,000 次请求;撤销操作和紧急停止各有独立限额,撤销信息流和状态读取也各有独立限额。自定义身份验证的配额策略仍未确定,托管服务的推出也独立于 SDK 的发布。
安装注册表当前最新版本时,请省略版本固定信息。完整的软件包兼容性矩阵请参阅发布状态文档和 COMPATIBILITY.md,发行说明请参阅 CHANGELOG.md。
- @grantex/gemma:离线同意包和设备端验证示例
- MCP Authorization Server(
@grantex/mcp-auth):提供 OAuth 2.1 + PKCE 端点,并支持持久化存储适配器、呈现式同意页面、经身份验证的人类主体解析、资源绑定和当前授权验证;版本 4 要求配置主机身份验证 - MCP Tool Server(
@grantex/mcp):面向 Agent 的 Grantex 工具,供 MCP 客户端使用 - @grantex/dpdp:DPDP Act 2023 和 EU AI Act 控制映射
- 信任注册表:公共 DID 验证注册表 —
grantex.dev/registry grantex verify:令牌检查 CLI — 无需账户- Agent CLI 技能:为 Hermes、OpenClaw 和可移植的 Agent Skills 客户端提供一键式
SKILL.md安装 - 异常检测:四项已实现的、由 SQL 驱动的检查、生命周期 API,以及已存储的规则/渠道配置;通知发送需要主机工作进程
SDK 快速入门
执行权限与人类身份
仅验证签名无法确立当前权限,也无法证明执行任务的 Agent 属于经身份验证的人类。已发布的 TypeScript SDK 0.8.1 新增了可选的逐次调用颁发方检查,以及受信任的主体/Agent 绑定。Python、Go 和已更改的执行集成现已发布。现有离线默认设置保持不变。人类身份验证和实时同意仍由颁发方/主机负责。必须根据实际执行输入执行与操作绑定的决策和累计支出控制,而不能仅凭有效 JWT 推断。有关设置、软件包边界和发布要求,请参阅 SDK 执行权限。
npm install @grantex/[email protected]
import { Grantex, verifyGrantToken } from '@grantex/sdk';
const gx = new Grantex({ apiKey: process.env.GRANTEX_API_KEY });
// 1. Register an agent, then request authorization from a user
const agent = await gx.agents.register({
name: 'quickstart-agent',
description: 'Grantex quickstart agent',
scopes: ['calendar:read', 'email:send'],
});
const auth = await gx.authorize({
agentId: agent.id,
userId: 'user-456',
scopes: ['calendar:read', 'email:send'],
});
// Live mode requires consent at this URL and returns the code to your callback.
// Sandbox or policy auto-approval can return the code immediately.
if (!auth.code) {
console.log(`Approve access at: ${auth.consentUrl}`);
} else {
// 2. Exchange the authorization code for a scoped, signed JWT
const { grantToken } = await gx.tokens.exchange({ code: auth.code, agentId: agent.id });
// 3. Verify locally using the issuer's published JWKS
const grant = await verifyGrantToken(grantToken, {
jwksUri: 'https://api.grantex.dev/.well-known/jwks.json',
});
console.log(grant.scopes); // ['calendar:read', 'email:send']
}
python -m pip install grantex==0.7.2 # Python SDK
go get github.com/mishrasanjeev/[email protected] # Go SDK (Go 1.26.1+)
npm install @grantex/[email protected] @grantex/[email protected] # MCP endpoint authorization
npm install -g @grantex/[email protected] # Optional CLI tooling
Hermes、OpenClaw 和任意 Agent CLI
支持 Shell 的 Agent 使用相同的 JSON 优先 CLI;无需针对特定 Agent 的 SDK:
npm install -g @grantex/[email protected]
grantex agent install --target openclaw # writes ./skills
grantex agent install --target hermes # writes ~/.hermes/skills/grantex
grantex agent install --target portable # writes ./.agents/skills
该套件会为委托授权操作安装 use-grantex-cli,并为服务边界实现工作安装 integrate-grantex。对于其他主机,请使用 grantex agent install --dir /path/to/skills。令牌输入优先使用 --env、--file 或 --stdin,并确保最终强制执行逻辑位于受保护的服务内部。
35 个软件包,涵盖 TypeScript、Python 和 Go。集成支持 Anthropic SDK、LangChain、OpenAI Agents SDK、Google ADK、Strands Agents SDK、CrewAI、Vercel AI、AutoGen、MCP、Express.js、FastAPI 和 Terraform。版本信息请参阅兼容性矩阵,发行说明请参阅变更日志,当前 CI 状态请查看 GitHub Actions。SDK 使用 Apache-2.0 许可证;可自托管的服务使用 Orchestrum Personal Use License 1.0,任何组织都需要书面许可(请参阅许可证)。新的 relying-party Python 验证器仍为私有源代码,不作为注册表版本发布。
问题所在
AI Agent 正在代表真实用户预订旅行、发送电子邮件、部署代码和花钱。但:
- 无法限定权限 — Agent 获得的访问权限与密钥所有者相同
- 无需征得同意 — 用户从未批准 Agent 可以执行的操作
- 没有 Agent 独立身份 — 你知道密钥被使用了,却不知道是哪个 Agent 使用的,也不知道原因
- 无法精细撤销 — 一个 Agent 行为不当,就得轮换密钥,全部停用
- 无法控制委派 — Agent A 调用 Agent B?只能复制粘贴凭据
- 没有支出限制 — 持有云 API 密钥的 Agent 可以无限创建资源
OAuth 和 IAM 提供了必要的基础,但许多 Agent 部署仍依赖共享凭据,无法识别具体 Agent,也无法明确编码其被委派的权限。
工作原理
快速入门
1. 注册 Agent
import { Grantex } from '@grantex/sdk';
const grantex = new Grantex({ apiKey: process.env.GRANTEX_API_KEY });
const agent = await grantex.agents.register({
name: 'travel-booker',
description: 'Books flights and hotels on behalf of users',
scopes: ['calendar:read', 'payments:initiate:max_500', 'email:send'],
});
console.log(agent.did);
// → did:grantex:ag_01HXYZ123abc...
2. 请求用户授权
const authRequest = await grantex.authorize({
agentId: agent.id,
userId: 'user_abc123', // your app's user identifier
scopes: ['calendar:read', 'payments:initiate:max_500'],
expiresIn: '24h',
redirectUri: 'https://yourapp.com/auth/callback',
});
// Redirect user to authRequest.consentUrl
// Grantex handles the consent UI — plain language, mobile-first
console.log(authRequest.consentUrl);
// → https://consent.grantex.dev/authorize?req=eyJ...
3. 将授权码兑换为授权令牌
// After user approves, your redirectUri receives a `code`.
// Exchange it for a signed grant token (RS256 JWT):
const token = await grantex.tokens.exchange({
code, // from the redirect callback
agentId: agent.id,
});
console.log(token.grantToken); // RS256 JWT — pass this to your agent
console.log(token.scopes); // ['calendar:read', 'payments:initiate:max_500']
console.log(token.grantId); // 'grnt_01HXYZ...'
console.log(token.refreshToken); // store securely for active-grant rotation
刷新令牌只能使用一次,每次刷新成功后都会轮换。如果服务器已提交更改,但 HTTP 刷新响应丢失,请立即使用同一个先前的刷新令牌重试;Grantex 可在 5 分钟(300 秒)内恢复已轮换的令牌对。刷新不会延长 token.expiresAt;授权过期后,请发起新的授权请求。
4. 验证令牌并使用
// Verify locally after retrieving the issuer's published JWKS
import { verifyGrantToken } from '@grantex/sdk';
const grant = await verifyGrantToken(token.grantToken, {
jwksUri: 'https://api.grantex.dev/.well-known/jwks.json',
requiredScopes: ['calendar:read'],
});
console.log(grant.principalId); // 'user_abc123'
console.log(grant.scopes); // ['calendar:read', 'payments:initiate:max_500']
// Pass to your agent — it's now authorized
await travelAgent.run({ grantToken: token.grantToken, task: 'Book cheapest flight to Delhi on March 1' });
5. 在执行边界记录操作
// At the trusted execution boundary: explicitly record the outcome
await grantex.audit.log({
agentId: agent.id,
agentDid: agent.did,
grantId: token.grantId,
principalId: authRequest.principalId,
action: 'payment.initiated',
status: 'success',
metadata: { amount: 420, currency: 'USD', merchant: 'Air India' },
});
6. 验证令牌(服务端)
// In any service that receives agent requests — no Grantex account needed
import { verifyGrantToken } from '@grantex/sdk';
const grant = await verifyGrantToken(token.grantToken, {
jwksUri: 'https://api.grantex.dev/.well-known/jwks.json',
requiredScopes: ['payments:initiate'],
});
// Throws if the token is expired, tampered with, has invalid claims, or lacks required scopes.
// Use grantex.tokens.verify(token.grantToken) when you also need current revocation status.
7. 让用户管理自己的权限
// Generate a short-lived link for the end-user to view & revoke agent access
const session = await grantex.principalSessions.create({
principalId: 'user_abc123',
expiresIn: '2h',
});
// Send session.dashboardUrl to the user via email, in-app notification, etc.
// The short-lived session token is carried in the URL fragment, not the query string.
Python SDK
import os
from grantex import Grantex, AuthorizeParams, ExchangeTokenParams
client = Grantex(api_key=os.environ["GRANTEX_API_KEY"])
# Register agent
agent = client.agents.register(
name="finance-agent",
scopes=["transactions:read", "payments:initiate:max_100"],
)
# Authorize a user
auth = client.authorize(AuthorizeParams(
agent_id=agent.id,
user_id="user_abc123",
scopes=["transactions:read", "payments:initiate:max_100"],
))
# Redirect user to auth.consent_url — they approve in plain language
# Exchange the authorization code for a grant token
token = client.tokens.exchange(ExchangeTokenParams(code=code, agent_id=agent.id))
# Verify locally after retrieving the issuer's published JWKS
from grantex import verify_grant_token, VerifyGrantTokenOptions
grant = verify_grant_token(token.grant_token, VerifyGrantTokenOptions(
jwks_uri="https://api.grantex.dev/.well-known/jwks.json",
))
print(grant.scopes) # ('transactions:read', 'payments:initiate:max_100')
# Log an action
client.audit.log(
agent_id=agent.id,
agent_did=agent.did,
grant_id=token.grant_id,
principal_id=auth.principal_id,
action="transaction.read",
status="success",
metadata={"account_last4": "4242"},
)
授权令牌
Grantex 令牌是标准 JWT(RS256),并扩展了 Agent 专属声明。任何服务都可以使用发行方公布的 JWKS 在本地验证其签名。提供的验证器会从配置的 JWKS URL 获取这些密钥,因此应用应考虑网络可用性、缓存和密钥轮换:
{
"iss": "https://grantex.dev",
"sub": "user_abc123",
"agt": "did:grantex:ag_01HXYZ123abc",
"dev": "org_yourcompany",
"scp": ["calendar:read", "payments:initiate:max_500"],
"iat": 1709000000,
"exp": 1709086400,
"jti": "tok_01HXYZ987xyz",
"grnt": "grnt_01HXYZ456def"
}
| 声明 | 含义 |
|---|---|
sub | 授权此 Agent 的最终用户 |
agt | Agent 的 DID — 可通过密码学方式验证的身份 |
dev | 构建此 Agent 的开发者组织 |
scp | 获授的确切权限范围 — 服务应检查这些范围 |
jti | 唯一令牌 ID — 用于检查授权状态和撤销状态 |
grnt | 授权记录 ID — 将令牌关联到已持久化的授权记录 |
aud | 目标受众(可选)— 如果 aud 不匹配,服务应拒绝令牌 |
委派声明(存在于子 Agent 令牌中):
| 声明 | 含义 |
|---|---|
parentAgt | 派生此子 Agent 的父 Agent 的 DID |
parentGrnt | 父授权的 ID — 可追踪完整的委派链 |
delegationDepth | 与根授权相距的跳数(根节点 = 0) |
多 Agent 委派
Grantex 支持多 Agent 工作流,根 Agent 可派生权限范围更窄的子 Agent。子 Agent 令牌包含完整的委派链,任何服务都可以检查该链。
// Root agent has a grant for ['calendar:read', 'calendar:write', 'email:send']
// It spawns a sub-agent that only needs calendar read access
const delegated = await grantex.grants.delegate({
parentGrantToken: rootGrantToken, // root agent's token
subAgentId: subAgent.id, // sub-agent to authorize
scopes: ['calendar:read'], // must be ⊆ parent scopes
expiresIn: '1h', // capped at parent token's expiry
});
// delegated.grantToken is a fully signed JWT with:
// parentAgt, parentGrnt, delegationDepth = 1
# Python equivalent
delegated = grantex.grants.delegate(
parent_grant_token=root_grant_token,
sub_agent_id=sub_agent.id,
scopes=["calendar:read"],
expires_in="1h",
)
协议强制执行的约束:
- 子 Agent 的权限范围必须严格小于父 Agent 的权限范围 — 权限范围升级会被拒绝,并返回 400
- 子 Agent 令牌的有效期为
min(parent expiry, requested expiry)— 子 Agent 的有效期绝不会超过父 Agent - 撤销根授权会以原子方式级联撤销所有后代授权
高级功能
企业 SSO - OIDC 和 SAML 2.0,以及 LDAP 直接绑定预览版
## 企业 SSOGrantex 提供 OIDC 和 SAML 2.0 企业 SSO,支持多个身份提供方连接、电子邮件域名路由、JIT 配置,以及基于身份提供方声明的群组到 scope 映射。LDAP 接口是直接绑定预览功能:它会验证提供的目录身份,但不会搜索目录或检索 LDAP 群组。托管式仪表板登录目前支持 OIDC;SAML 和 LDAP 回调流程用于自定义集成。
主要功能:
- 多 IdP 连接 - 为每个组织配置多个 OIDC 和 SAML 2.0 身份提供方;LDAP 连接记录支持直接绑定预览功能
- OIDC Discovery + JWKS 验证 — 自动发现端点并以加密方式验证 ID token
- SAML 2.0 — 完整解析 SAML 响应,并通过证书验证签名
- LDAP / Active Directory 预览 - 仅支持直接绑定身份验证;尚未实现目录搜索和 LDAP 群组检索
- 基于域名的路由 — 根据用户的电子邮件域名,自动将其路由到正确的 IdP
- JIT 配置 — 用户首次通过 SSO 登录时,自动创建或更新主体
- 群组到 scope 映射 - 将 OIDC 或 SAML 群组/角色声明映射到 Grantex scope;此功能不会检索 LDAP 群组
- 强制人类用户使用 SSO — 启用服务端功能并由组织选择加入后,托管式仪表板登录和主体授权都必须使用匹配的 SSO 会话;实时授权仍需使用通行密钥。机器 API 密钥仍可用于 API 自动化。
- 会话管理 — 跟踪、列出和撤销有效的 SSO 会话
TypeScript
// Create an OIDC connection
const conn = await grantex.sso.createConnection({
name: 'Okta Production',
protocol: 'oidc',
issuerUrl: 'https://mycompany.okta.com',
clientId: 'your-client-id',
clientSecret: 'your-client-secret',
domains: ['mycompany.com'],
jitProvisioning: true,
groupAttribute: 'groups',
groupMappings: { Engineering: ['read', 'write', 'deploy'], Admins: ['admin'] },
defaultScopes: ['read'],
});
// Create a SAML 2.0 connection
await grantex.sso.createConnection({
name: 'Azure AD SAML',
protocol: 'saml',
idpEntityId: 'https://sts.windows.net/tenant-id/',
idpSsoUrl: 'https://login.microsoftonline.com/tenant-id/saml2',
idpCertificate: '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----',
spEntityId: 'urn:grantex:mycompany',
spAcsUrl: 'https://myapp.com/sso/callback/saml',
domains: ['mycompany.com'],
});
// Enforce SSO for the organization
// First complete an OIDC login that maps an administrator to the admin scope.
// The server must have SSO_HUMAN_ENFORCEMENT_ENABLED=true.
await grantex.sso.setEnforcement({ enforce: true });
// Handle OIDC callback with verified ID token
const result = await grantex.sso.handleOidcCallback({ code, state });
console.log(result.email, result.mappedScopes, result.sessionId);
// result.sessionToken is an opaque bearer credential when enabled. Keep it secret.
// List and revoke sessions
const { sessions } = await grantex.sso.listSessions();
await grantex.sso.revokeSession(sessions[0].id);
Python
# Create an OIDC connection
conn = client.sso.create_connection(CreateSsoConnectionParams(
name="Okta Production",
protocol="oidc",
issuer_url="https://mycompany.okta.com",
client_id="your-client-id",
client_secret="your-client-secret",
domains=["mycompany.com"],
jit_provisioning=True,
group_attribute="groups",
group_mappings={"Engineering": ["read", "write", "deploy"]},
))
# Handle OIDC callback
result = client.sso.handle_oidc_callback(SsoOidcCallbackParams(code=code, state=state))
print(result.email, result.mapped_scopes, result.session_id)
CLI
# Create a connection
grantex sso connections create --name "Okta" --protocol oidc \
--issuer-url https://mycompany.okta.com \
--client-id $CLIENT_ID --client-secret $CLIENT_SECRET \
--domains mycompany.com --jit-provisioning
# List connections
grantex sso connections list
# Test connectivity
grantex sso connections test sso_01HXYZ...
# Enforce SSO
grantex sso enforce --enable
启用后,先前的浏览器 SSO 会话将失效,并且只会安全迁移身份明确、且有会话证明的 JIT 身份。如果某个主体映射到多个 IdP subject,则启用操作会失败并返回 SSO_IDENTITY_CONFLICT,直至问题解决。必须有一个已启用 JIT 的 OIDC 连接,以及近期成功的管理员 SSO 登录记录。开发者 API 密钥是特意保留的机器访问例外:它仍可调用管理 API 并关闭强制要求,因此应将其作为特权密钥妥善保存。有关推出流程和本地签名 IdP 测试步骤,请参阅企业 SSO 指南。
FIDO2 / WebAuthn — 基于通行密钥的授权验证
FIDO2 / WebAuthn
Grantex 支持使用 FIDO2/WebAuthn 进行基于通行密钥的人类在场验证。实时模式下的授权需要通行密钥断言;沙盒模式账户可通过设置 fidoRequired: true 选择启用。断言用于确认在授权流程中使用了已注册的凭据。要求使用通行密钥的沙盒请求与实时授权一样会保持待处理状态:/v1/authorize 和 OAuth PAR 都不会自动批准该请求,开发者密钥快捷方式也无法批准或拒绝该请求。
工作原理
- 开发者配置 FIDO — 实时模式已默认要求使用 FIDO;设置
fidoRequired: true,通过PATCH /v1/me也可在沙盒模式下启用此要求。 - 应用为客户注册 — 验证客户身份后,应用会为其确切的主体 ID 签发一次性托管注册链接。仅凭授权 URL 无法注册通行密钥。
- 用户在授权时进行身份验证 — 后续授权请求中,用户需要完成 WebAuthn 断言质询,而非简单点击按钮
- 授权需要经过验证的在场证明 — 启用可移植证据后,Grantex 会将经过验证的断言存储在待处理请求中,将其绑定到授权,并在授权令牌中加入带签名的摘要引用。选择加入的 VC 会携带断言验证所需的输入参数。
已发布的 @grantex/[email protected]、
grantex==0.7.2 和
github.com/mishrasanjeev/[email protected] 均包含托管注册功能。
Grantex 托管服务已设置 PASSKEY_ENROLLMENT_ENABLED=true,并使用
grantex.dev 作为其 WebAuthn RP ID;可自托管的运营方必须配置
自己的 HTTPS 源并启用该标志。发布 SDK 并不会在服务上启用此功能。
// Enable FIDO for your developer account
await grantex.updateSettings({ fidoRequired: true, fidoRpName: 'My App' });
// Server-side, after authenticating the end customer:
const { enrollmentUrl } = await grantex.webauthn.createEnrollmentSession({
principalId: authenticatedCustomer.grantexPrincipalId,
});
// Show the one-use link only to that customer. The hosted page handles WebAuthn.
// List and manage credentials
const { credentials: creds } = await grantex.webauthn.listCredentials('user_abc123');
await grantex.webauthn.deleteCredential(credentialId);
# Enable FIDO for your developer account
from grantex import UpdateDeveloperSettingsParams
client.update_settings(UpdateDeveloperSettingsParams(
fido_required=True,
fido_rp_name="My App",
))
# After your app authenticates the customer, issue a one-use hosted link.
session = client.webauthn.create_enrollment_session(principal_id="user_abc123")
enrollment_url = session.enrollment_url
# List and manage credentials
creds = client.webauthn.list_credentials("user_abc123").credentials
client.webauthn.delete_credential(credential_id)
WebAuthn API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
POST | /v1/webauthn/register/options | 生成通行密钥注册选项 |
POST | /v1/webauthn/register/verify | 验证注册并存储凭据 |
POST | /v1/webauthn/enrollment-sessions | 签发一次性托管注册链接(需身份验证) |
GET | /passkey-enroll | 托管浏览器注册(受功能开关控制) |
POST | /v1/webauthn/enroll/options | 生成与票据绑定的托管注册选项 |
POST | /v1/webauthn/enroll/verify | 验证通行密钥并使用票据 |
GET | /v1/webauthn/credentials | 列出某个主体的 WebAuthn 凭据 |
DELETE | /v1/webauthn/credentials/:id | 删除凭据 |
POST | /v1/webauthn/assert/options | 生成用于授权同意的断言选项 |
POST | /v1/webauthn/assert/verify | 在授权同意期间验证断言 |
PATCH | /v1/me | 更新开发者设置(FIDO 配置) |
托管注册要求设置 PASSKEY_ENROLLMENT_ENABLED=true,并正确配置 HTTPS FIDO_ORIGIN/FIDO_RP_ID;服务端功能默认关闭。实时模式下的授权同意要求已有通行密钥,不提供更弱的回退方式。有关客户身份绑定和一次性链接的要求,请参阅 WebAuthn 指南。该指南还区分了托管 SDK 方法与仅限 REST 的自定义断言流程。
要在生产环境推出此功能,请先部署身份验证服务和 /passkey-enroll 托管重写规则,然后再启用该标志。接着,从 GitHub Actions 运行 Production Passkey and Irregularity E2E。该测试会创建一个隔离的实时账户、注册虚拟通行密钥、批准授权同意、检查选择加入型 VC 中可移植的凭证、刷新并委派授权,以及测试仅告警和撤销模式。测试会在生产环境中保留测试账户和审计记录;请勿对客户账户运行此测试。
该工作流还会测试沙盒/实时授权同意一致性、两台身份验证器设备、拒绝、凭据移除、一次性票据重放,以及在交互式主体选择后批准和拒绝实时 OAuth。移除凭据会阻止新的断言。仪表板浏览器回归测试涵盖登录、签发注册链接、注册、列表和确认移除,并使用不带请求体的 DELETE;门户仅在请求包含 JSON 请求体时才发送 JSON 内容类型。请单独撤销现有授权。已签发 VC 的 Agent 无法被硬删除(409 AGENT_HAS_CREDENTIAL_HISTORY);应将其停用并撤销其授权,以保留可验证的状态历史。Chromium 虚拟身份验证器检查并不代表对所有实体设备或浏览器的认证。
可验证凭证 — W3C VC-JWT 的签发与验证
可验证凭证
Grantex 除了签发标准 JWT,还可以签发 W3C 可验证凭证(VC)。JWT 针对实时授权进行了优化,而 VC 则提供可移植、防篡改且基于标准的授权证明,可呈交给任何验证方——包括 Grantex 生态系统之外的系统。
VC 对 Agent 的重要性
在 Agent 商务中,代表你行事的 Agent 需要向可能未直接集成 Grantex 的第三方服务证明其授权。可验证凭证是一份独立且经过加密签名的文档,任何一方都可以使用签发方公开发布的 DID 文档进行验证——无需 API 调用、账户或信任关系。
### 工作原理将授权码兑换为授权令牌时,传入 credentialFormat: "vc-jwt",即可在标准授权令牌之外获取可验证凭证:
const result = await grantex.tokens.exchange({
code,
agentId: agent.id,
credentialFormat: 'vc-jwt', // opt-in to VC issuance
});
console.log(result.grantToken); // standard RS256 JWT (unchanged)
console.log(result.verifiableCredential); // W3C VC-JWT
result = client.tokens.exchange(ExchangeTokenParams(
code=code,
agent_id=agent.id,
credential_format="vc-jwt",
))
print(result.verifiable_credential) # W3C VC-JWT
凭证类型
| 类型 | 描述 |
|---|---|
AgentGrantCredential | 为直接授权颁发——证明主体已授权 Agent 使用特定权限范围 |
DelegatedGrantCredential | 为委托授权颁发——包含完整的委托链 |
验证 VC
const verification = await grantex.credentials.verify(vcJwt);
console.log(verification.valid);
console.log(verification.credentialSubject);
console.log(verification.issuer); // "did:web:grantex.dev"
verification = client.credentials.verify(vc_jwt)
print(verification.valid)
print(verification.credential_subject)
通过 StatusList2021 撤销
Grantex 实现了 W3C StatusList2021 撤销机制。每份凭证都会引用一个状态列表条目。撤销授权后,状态列表中的相应位会翻转,任何检查该凭证的验证方都会看到它已被撤销。
// Check a specific credential's status
const cred = await grantex.credentials.get(credentialId);
console.log(cred.status); // "active" or "revoked"
// List credentials with filters
const { credentials } = await grantex.credentials.list({
grantId: 'grnt_01HXYZ...',
status: 'active',
});
可移植的 Passkey 证据
托管的 Grantex 服务于 2026 年 9 月 27 日启用了可移植证据,并通过了生产环境下的 Passkey、委托、刷新和撤销端到端工作流。 可自托管的安装仍默认关闭此功能,必须遵循 推出指南。当前发布的 TypeScript、Python 和 Go SDK 均提供类型化的授权证据引用和 VC 证明;自定义断言流程仍需使用 REST 端点。
实时同意需要 Passkey 断言。启用 PORTABLE_WEBAUTHN_EVIDENCE_ENABLED=true(源码默认关闭)后,新颁发的授权和授权令牌会携带带签名的 webauthnEvidence 摘要,其中包含断言摘要。启用此功能还需要设置 IRREGULARITY_CASCADE_REVOCATION_ENABLED=true 和 PORTABLE_WEBAUTHN_EVIDENCE_STATUS_CHECK_ENABLED=true,以便自动撤销授权时同步更新委托授权、VC 和公开状态列表位,并由颁发方验证底层授权。如果之后回退可移植证据的颁发,请保持这两个安全标志开启。在令牌兑换时请求 credentialFormat: 'vc-jwt'(或 'both'),即可获取带签名的 VC,其中 vc.evidence 包含原始断言、公钥、质询、RP ID、来源和先前计数器。启用此推出功能或已存在证据时,VC 会与授权一并原子颁发。委托授权会继承原始流程的证据,而非新的人工审批。未捕获证据的历史授权无法追溯升级;主体必须在功能启用后完成新的同意流程。
验证 VC 的签名、有效期和最新撤销状态列表;要求 RP ID 和来源均可信;重新验证 WebAuthn 断言;并将其摘要与授权令牌引用进行比较。仅进行离线签名验证无法证明授权当前仍有效。认证器签署的是质询,而不是授权的权限范围。Grantex 的颁发方签名提供了这种绑定,并证明其凭证注册过程;验证方必须自行决定是否信任该颁发方及其注册流程。原始证据包含稳定的凭证公钥,因此默认不启用,以免演示之间产生关联。此功能不代表获得任何支付网络认证。请参阅 WebAuthn 指南和 VC 指南。
DID 基础设施
Grantex 在 /.well-known/did.json(did:web:grantex.dev)发布 W3C DID 文档。此文档包含用于签署可验证凭证的公钥,使任何一方都能在不联系 Grantex 的情况下验证凭证:
curl https://api.grantex.dev/.well-known/did.json
可验证凭证 API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
GET | /v1/credentials/:id | 获取可验证凭证 |
GET | /v1/credentials | 列出可验证凭证 |
POST | /v1/credentials/verify | 验证 VC-JWT |
GET | /v1/credentials/status/:id | StatusList2021 凭证 |
GET | /.well-known/did.json | W3C DID 文档 |
MPP Agent 身份 — 用于机器支付的可验证 Agent 身份
MPP Agent 身份
MPP(Machine Payments Protocol)为软件客户端定义了 HTTP 402 支付流程。Grantex 可以附加基于 W3C Verifiable Credentials 2.0 的 AgentPassportCredential,以便已配置的商家在获取颁发者密钥和最新状态数据后,验证 Agent、主体、类别、金额上限、有效期和委托声明。该凭证承载授权上下文;它不能证明支付已结算、订单已获批准或服务提供商已接受交易。
为什么需要 Agent Passport?
钱包或支付来源标识符可能无法告知商家当前由哪个内部 Agent 执行操作、哪个主体委托了权限,或适用了哪些策略限制。如果双方都进行了集成并予以强制执行,Agent Passport 就能提供这些上下文。
当前的 Grantex Passport 采用 Ed25519 签名、W3C VC 2.0 数据模型、已配置的购买类别、交易上限、有效期、委托上下文和 StatusList2021 风格的状态数据。依赖方商家仍必须验证颁发者,按照自身风险策略刷新密钥和状态,在受保护操作处强制执行声明,并运行自己的支付、欺诈、制裁、订单和结算控制。
工作原理
| 步骤 | 参与方 | 操作 |
|---|---|---|
| 1. 颁发 | 已授权应用 | 请求 AgentPassportCredential,其中包含已配置的类别、金额上限、委托上下文和有效期 |
| 2. 存储 | Agent 托管端 | 将凭证作为敏感授权材料存储 |
| 3. 出示 | Agent 托管端 | 在集成已配置时,将凭证附加到受支持的 MPP 请求 |
| 4. 验证 | 商家服务 | 验证签名、颁发者、有效期、类别、金额以及足够及时的状态数据 |
| 5. 决策 | 商家和支付系统 | 在执行前应用商家策略,并进行独立的支付、订单、服务提供商和结算检查 |
| 6. 记录 | 各参与系统 | 记录各自配置为观察的事件;仅验证凭证并不能构成执行或结算审计日志 |
**验证边界:**检索后,缓存的密钥可用于本地签名检查。要检查当前撤销状态,必须刷新状态数据;缓存策略决定依赖服务多快能观察到变更。
凭证结构
| 字段 | 描述 |
|---|---|
id | urn:grantex:passport:<ulid> |
issuer | did:web:grantex.dev |
credentialSubject.id | Agent DID(did:grantex:ag_...) |
credentialSubject.humanPrincipal | 授权人员的 DID |
credentialSubject.organizationDID | 组织 DID(did:web:<domain>) |
credentialSubject.grantId | 链接到底层 Grantex 授权 |
credentialSubject.allowedMPPCategories | inference、compute、data、storage、search、media、delivery、browser、general |
credentialSubject.maxTransactionAmount | 每笔交易的上限 { amount, currency } |
credentialSubject.delegationDepth | 从授权委托链继承 |
credentialStatus | StatusList2021 撤销条目 |
proof | Ed25519Signature2020 |
颁发 Passport
TypeScript:
import { Grantex } from '@grantex/sdk';
const grantex = new Grantex({ apiKey: process.env.GRANTEX_API_KEY });
const passport = await grantex.passports.issue({
agentId: 'ag_01HXYZ...',
grantId: 'grnt_01HXYZ...',
allowedMPPCategories: ['inference', 'compute'],
maxTransactionAmount: { amount: 50, currency: 'USDC' },
paymentRails: ['tempo'],
expiresIn: '24h',
});
// passport.passportId → "urn:grantex:passport:01HXYZ..."
// passport.encodedCredential → base64url for X-Grantex-Passport header
cURL:
curl -X POST https://api.grantex.dev/v1/passport/issue \
-H "Authorization: Bearer $GRANTEX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "ag_01HXYZ...",
"grantId": "grnt_01HXYZ...",
"allowedMPPCategories": ["inference", "compute"],
"maxTransactionAmount": { "amount": 50, "currency": "USDC" },
"expiresIn": "24h"
}'
附加到 MPP 请求
import { createMppPassportMiddleware } from '@grantex/mpp';
const middleware = createMppPassportMiddleware({ passport });
const enrichedRequest = await middleware(new Request(url, init));
// enrichedRequest now has X-Grantex-Passport header
const response = await fetch(enrichedRequest);
在商家端验证
独立验证:
import { verifyPassport } from '@grantex/mpp';
const verified = await verifyPassport(encodedCredential, {
requiredCategories: ['inference'],
maxAmount: 10,
});
// verified.humanDID → "did:grantex:user_alice"
// verified.organizationDID → "did:web:acme.com"
// verified.allowedCategories → ["inference", "compute"]
// verified.maxTransactionAmount → { amount: 50, currency: "USDC" }
Express 中间件(单行):
import { requireAgentPassport } from '@grantex/mpp';
app.use('/api/inference', requireAgentPassport({
requiredCategories: ['inference'],
maxAmount: 10,
}));
// req.agentPassport is populated on valid requests
// 403 with typed error code on invalid requests
### 402 挑战流程
MPP 的 HTTP 402 流程采用“Payment”HTTP 身份验证方案:在 402 响应中使用 WWW-Authenticate: Payment,在重试请求中使用 Authorization: Payment,成功时使用 Payment-Receipt。(PAYMENT-REQUIRED / PAYMENT-SIGNATURE / PAYMENT-RESPONSE 是 x402 v2 的请求头。)
import { requirePayment } from '@grantex/mpp';
app.get('/api/report', requirePayment({
secret: process.env.PAYMENT_CHALLENGE_SECRET!,
realm: 'api.merchant.example',
offers: () => [{ method: 'tempo', intent: 'charge', request: { amount: '1000', currency: 'usd' } }],
verifyPayload: async (credential) => verifyWithYourPaymentMethod(credential.payload),
}), handler);
// 402 with WWW-Authenticate challenges; on a valid credential, Payment-Receipt and req.payment
信任注册表
查询任意组织经过验证的信任等级——无需身份验证:
curl https://api.grantex.dev/v1/trust-registry/did:web:grantex.dev
# {"organizationDID":"did:web:grantex.dev","trustLevel":"soc2","domains":["grantex.dev"]}
import { lookupOrgTrust } from '@grantex/mpp';
const record = await lookupOrgTrust('did:web:acme.com');
// record.trustLevel → "verified" | "soc2" | "basic"
// record.verificationMethod → "dns-txt" | "manual" | "soc2"
撤销
撤销 Passport 会立即更新服务端状态。只有在线检查撤销状态或刷新状态数据后,本地验证器才会发现这一变化,因此缓存的结果可能会滞后:
await grantex.passports.revoke('urn:grantex:passport:01HXYZ...');
// Revocation-aware verification rejects after checking refreshed status data
错误代码
| 代码 | HTTP | 说明 |
|---|---|---|
PASSPORT_EXPIRED | 403 | 凭证的 validUntil 已过期 |
PASSPORT_REVOKED | 403 | 已设置 StatusList2021 位 |
INVALID_SIGNATURE | 403 | 签名验证失败 |
UNTRUSTED_ISSUER | 403 | 颁发者 DID 不在受信任列表中 |
CATEGORY_MISMATCH | 403 | 类别不包含所需服务 |
AMOUNT_EXCEEDED | 403 | 最高金额低于所需阈值 |
MISSING_PASSPORT | 403 | 缺少 X-Grantex-Passport 请求头 |
MALFORMED_CREDENTIAL | 403 | base64url 无效或缺少 VC 字段 |
MPP Agent 身份 API 端点
| 方法 | 端点 | 身份验证 | 说明 |
|---|---|---|---|
POST | /v1/passport/issue | API 密钥 | 签发 AgentPassportCredential |
GET | /v1/passports | API 密钥 | 列出 Passport(可按 agentId、grantId、status 筛选) |
GET | /v1/passport/:id | API 密钥 | 按 ID 获取 Passport |
POST | /v1/passport/:id/revoke | API 密钥 | 撤销 Passport(StatusList2021) |
GET | /v1/trust-registry/:orgDID | 无 | 查询组织信任记录(公开) |
GET | /v1/trust-registry | 当 TRUST_REGISTRY_ADMIN_LISTING_ENFORCED=true 时,需要 API 密钥和管理员密钥(ADMIN_API_KEY) | 列出所有开发者的全部信任记录(运营方) |
完整的软件包文档请参阅 packages/mpp/。演示:grantex.dev/mpp-demo。
SD-JWT 选择性披露 — 保护隐私的凭证展示
SD-JWT 选择性披露
Grantex 支持 SD-JWT(选择性披露 JWT),用于保护隐私的凭证展示。标准 VC-JWT 会向每个验证方披露所有声明,而 SD-JWT 允许持有者精确选择要披露的字段,同时隐藏其他所有内容。
为什么使用 SD-JWT?
在 Agent 商务中,不同的验证方需要不同层级的信息。支付处理方需要知道 Agent 的权限范围和预算,但不需要知道委托人的身份。合规审计员需要委托人信息和时间戳,但不需要权限范围。SD-JWT 支持最小化披露的展示,既满足各验证方的要求,又避免过度共享。
工作原理
交换授权码时,传入 credentialFormat: "sd-jwt",即可获取 SD-JWT 凭证:
const result = await grantex.tokens.exchange({
code,
agentId: agent.id,
credentialFormat: 'sd-jwt', // opt-in to SD-JWT issuance
});
console.log(result.grantToken); // standard RS256 JWT (unchanged)
console.log(result.sdJwt); // SD-JWT with selective disclosure
result = client.tokens.exchange(ExchangeTokenParams(
code=code,
agent_id=agent.id,
credential_format="sd-jwt",
))
print(result.sd_jwt) # SD-JWT with selective disclosure
创建展示
持有者在向验证方展示凭证时,可选择要披露的声明:
const presentation = await grantex.credentials.present({
sdJwt: result.sdJwt,
disclosedClaims: ['scopes', 'agentId'], // only reveal these fields
});
// Send presentation to the verifier — they see scopes and agentId,
// but principalId, developerId, grantId, etc. remain hidden
presentation = client.credentials.present(
sd_jwt=result.sd_jwt,
disclosed_claims=["scopes", "agent_id"],
)
SD-JWT 格式
SD-JWT 由以下内容组成:<issuer-jwt>~<disclosure1>~<disclosure2>~...~
每个披露项都是经过 base64url 编码的 JSON 数组 [salt, claim-name, claim-value]。验证方只能看到已提供披露项对应的声明。
可披露的声明
| 声明 | 说明 |
|---|---|
principalId | 授权该授权的最终用户 |
developerId | 拥有该 Agent 的开发者 |
scopes | 已授权的权限范围 |
agentId | Agent 的 DID |
grantId | 授权记录标识符 |
issuedAt | 凭证的签发时间 |
expiresAt | 凭证的过期时间 |
| 方法 | 端点 | 描述 |
|---|---|---|
POST | /v1/token | 用授权码换取授权令牌 + SD-JWT(使用 credentialFormat: "sd-jwt") |
POST | /v1/credentials/verify | 验证 SD-JWT 演示 |
预算控制 — 按 Agent 设置支出限额,并以原子方式扣款
预算控制
Grantex 提供按授权设置的预算控制,开发者可借此限制 Agent 的支出金额。预算分配以原子方式执行——如果扣款会超出剩余余额,则会失败并返回 402 INSUFFICIENT_BUDGET 错误。消耗达到 50% 和 80% 时会触发阈值提醒,剩余预算则通过 bdg JWT 声明嵌入授权令牌中。
// Allocate a budget to a grant
const budget = await grantex.budgets.allocate({
grantId: 'grnt_01HXYZ...',
amount: 1000,
currency: 'USD',
});
// Debit against the budget
const debit = await grantex.budgets.debit({
grantId: 'grnt_01HXYZ...',
amount: 42.50,
description: 'Flight booking',
});
console.log(debit.remaining); // 957.50
// Check the current balance
const balance = await grantex.budgets.balance('grnt_01HXYZ...');
console.log(balance.remainingBudget);
// List all budget transactions for a grant
const { transactions } = await grantex.budgets.transactions('grnt_01HXYZ...');
# Allocate a budget to a grant
budget = client.budgets.allocate(
grant_id="grnt_01HXYZ...",
amount=1000,
currency="USD",
)
# Debit against the budget
debit = client.budgets.debit(
grant_id="grnt_01HXYZ...",
amount=42.50,
description="Flight booking",
)
print(debit.remaining) # 957.50
# Check the current balance
balance = client.budgets.balance("grnt_01HXYZ...")
# List all budget transactions
transactions = client.budgets.transactions("grnt_01HXYZ...")
预算 API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
POST | /v1/budget/allocate | 为授权创建预算分配 |
POST | /v1/budget/debit | 从授权的预算中扣款(余额不足时返回 402) |
GET | /v1/budget/balance/:grantId | 获取授权的剩余余额 |
GET | /v1/budget/allocations | 列出所有预算分配 |
GET | /v1/budget/transactions/:grantId | 列出授权的交易记录和总支出 |
事件流 — 实时 SSE 和 WebSocket
事件流
自托管用户可以设置 EVENT_STREAM_READY_ENABLED=true,在订阅就绪后立即发送初始 SSE 注释,避免等待空闲 30 秒心跳。此标志默认关闭;托管部署会启用它。身份验证、连接限制和事件负载均不变,也无需更新 SDK。
Grantex 通过 Server-Sent Events(SSE)和 WebSocket 提供实时事件流。订阅授权生命周期事件,及时了解授权创建、撤销、令牌签发和预算阈值提醒。事件会同时发布到 Webhook 和流式端点,因此你可以选择推送或拉取。
// SSE — async generator, automatically reconnects
for await (const event of grantex.events.stream()) {
console.log(event.type); // 'grant.created', 'token.issued', etc.
console.log(event.data);
}
// Convenience wrapper with a callback
grantex.events.subscribe((event) => {
if (event.type === 'budget.threshold') {
alert(`Grant ${event.data.grantId} is at ${event.data.percentage}% budget`);
}
});
# SSE — async generator
async for event in client.events.stream():
print(event.type) # 'grant.created', 'grant.revoked', etc.
print(event.data)
# Convenience wrapper
async def handler(event):
if event.type == "budget.exhausted":
await revoke_grant(event.data["grant_id"])
await client.events.subscribe(handler)
事件类型
| 事件 | 描述 |
|---|---|
grant.created | 终端用户批准了新的授权 |
grant.revoked | 授权已被撤销(由用户、开发者或级联操作执行) |
token.issued | 授权令牌已换取或刷新 |
budget.threshold | 预算分配的使用量达到 50% 或 80% |
budget.exhausted | 预算分配的剩余金额已降至 0 |
事件流 API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
GET | /v1/events/stream | SSE 事件流(Bearer 身份验证) |
GET | /v1/events/ws | WebSocket 事件流 |
用量计量 — 跟踪每位开发者的 API 使用量
用量计量
Grantex 会跟踪每位开发者的 API 使用量,包括令牌换取、授权请求和验证调用。使用计量 API 监控消耗、执行方案限额,并导出用量数据以供计费。
// Get current period usage
const usage = await grantex.usage.current();
console.log(usage.tokenExchanges);
console.log(usage.authorizations);
console.log(usage.totalRequests);
// Get usage history over the last 30 days
const { entries } = await grantex.usage.history({ days: 30 });
entries.forEach((e) => console.log(`${e.date}: ${e.totalRequests} requests`));
# Get current period usage
usage = client.usage.current()
print(usage.token_exchanges)
print(usage.total_requests)
# Get usage history over the last 30 days
history = client.usage.history(days=30)
for entry in history.entries:
print(f"{entry.date}: {entry.total_requests} requests")
用量计量 API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
GET | /v1/usage | 已通过身份验证的开发者在当前周期的用量 |
GET | /v1/usage/history?days=N | 最近 N 天的每日用量历史记录 |
自定义域名 — 注册并验证域名以进行白标化
自定义域名
Grantex 提供域名注册和基于 DNS 的所有权验证,让你的账户完成配置,并可随时在自己的域名上托管 Grantex。目前,API 支持注册、验证、列出和删除;通过已验证域名路由运行时流量(由你的域名提供同意界面 / API 端点)已列入路线图,目前仍由 *.grantex.dev 提供服务。请在 issues 中跟踪进展。
// Register a custom domain
const domain = await grantex.domains.create({ domain: 'auth.yourapp.com' });
console.log(domain.verificationToken);
// → Add a DNS TXT record: _grantex-verify.auth.yourapp.com = <token>
// Verify the domain after adding the DNS record
const verified = await grantex.domains.verify(domain.id);
console.log(verified.verified); // true
// List all registered domains
const { domains } = await grantex.domains.list();
// Delete a domain
await grantex.domains.delete(domain.id);
# Register a custom domain
domain = client.domains.create(domain="auth.yourapp.com")
print(domain.verification_token)
# Verify after adding DNS TXT record
verified = client.domains.verify(domain.id)
print(verified.verified) # True
# List all domains
domains = client.domains.list()
# Delete a domain
client.domains.delete(domain.id)
自定义域名 API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
POST | /v1/domains | 注册新的自定义域名 |
GET | /v1/domains | 列出所有已注册的域名 |
POST | /v1/domains/:id/verify | 通过 DNS TXT 验证域名所有权 |
DELETE | /v1/domains/:id | 移除自定义域名 |
策略即代码 — OPA 和 Cedar 策略后端
策略即代码
Grantex 支持可插拔的策略后端,用于进行精细的授权决策。除了内置策略引擎,你还可以连接 OPA(Open Policy Agent)或 Cedar,根据外部管理的策略包评估授权请求。策略包可以通过直接上传进行同步,也可以由 git 仓库 webhook 自动触发。
// Upload a policy bundle
await grantex.policies.sync({
format: 'opa', // 'opa' or 'cedar'
bundle: bundleBuffer, // policy bundle as Buffer
});
// List policy bundles
const { bundles } = await grantex.policies.bundles();
# Upload a policy bundle
client.policies.sync(
format="opa",
bundle=bundle_bytes,
)
# List policy bundles
bundles = client.policies.bundles()
支持的策略后端
| 后端 | 描述 | 配置 |
|---|---|---|
| 内置 | 默认规则引擎 — 范围匹配 + 委托约束 | 无需配置 |
| OPA | Open Policy Agent — 在 POST /v1/data/grantex/authz 评估 Rego 策略 | POLICY_BACKEND=opa、OPA_URL=... |
| Cedar | AWS Cedar — 在 POST /v1/is_authorized 评估 Cedar 策略 | POLICY_BACKEND=cedar、CEDAR_URL=... |
策略即代码 API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
POST | /v1/policies/sync | 上传策略包(OPA 或 Cedar) |
POST | /v1/policies/sync/webhook | 通过 Git webhook 触发策略同步 |
GET | /v1/policies/bundles | 列出已上传的策略包 |
DPDP 合规 — 印度《2023 年数字个人数据保护法》
DPDP 法案 2023 合规
DPDP 法案 2023 支持包括:与授权绑定的同意记录、带有签名证明的版本化通知、可选择撤销授权的撤回操作、报告保留内容及原因的删除操作、注明已公布响应期限的申诉、违规事件登记册,以及各类导出(DPDP 审计、个人 GDPR 第 15 条、EU AI Act 证据)。这是技术控制映射,并非法律认证:Grantex 并非注册的 Consent Manager,也不会向 Data Protection Board 或数据主体发送通知。大多数 DPDP 义务自 2027 年 5 月 13 日起生效(DPDP Rules 2025)。请参阅 DPDP 合规。
已发布的 SDK(@grantex/[email protected]、grantex==0.7.2、[email protected])和 CLI(@grantex/[email protected])涵盖下方第一个表格中的路由;除非你的 SDK 版本列出了第二个表格中的路由,否则请通过 REST 调用这些路由。
import { Grantex } from '@grantex/sdk';
const grantex = new Grantex({ apiKey: process.env.GRANTEX_API_KEY });
// Register a consent notice version
const notice = await grantex.dpdp.createConsentNotice({
noticeId: 'privacy-v1',
version: '1.0',
title: 'Data Processing Notice',
content: 'We process your data for...',
purposes: [{ code: 'analytics', description: 'Usage analytics' }],
});
// Record consent against an existing, active grant
const record = await grantex.dpdp.createConsentRecord({
grantId: 'grnt_01HXYZ...',
dataPrincipalId: '[email protected]',
purposes: [{ code: 'analytics', description: 'Usage analytics' }],
consentNoticeId: 'privacy-v1',
processingExpiresAt: '2027-01-01T00:00:00Z',
});
// Records held about a principal, for an access request (DPDP s.11)
const { records } = await grantex.dpdp.listPrincipalRecords('[email protected]');
// Withdraw consent (s.6(4)); optionally revoke the grant and ask your
// application, by webhook, to delete the data it processed
const withdrawal = await grantex.dpdp.withdrawConsent(record.recordId, {
reason: 'No longer needed',
revokeGrant: true,
deleteProcessedData: true,
});
// Record a grievance (DPDP s.13)
const grievance = await grantex.dpdp.fileGrievance({
dataPrincipalId: '[email protected]',
type: 'unauthorized-processing',
description: 'Data used beyond the consented purpose',
});
// Act on an erasure request (DPDP s.12)
const erasure = await grantex.dpdp.requestErasure('[email protected]');
// Generate a DPDP audit export
const report = await grantex.dpdp.createExport({
type: 'dpdp-audit',
dateFrom: '2026-01-01T00:00:00Z',
dateTo: '2026-04-01T00:00:00Z',
});
# Python SDK
from grantex import CreateConsentRecordParams, Grantex
client = Grantex(api_key="gx_...")
record = client.dpdp.create_consent_record(CreateConsentRecordParams(
grant_id="grnt_01HXYZ...",
data_principal_id="[email protected]",
purposes=[{"code": "analytics", "description": "Usage analytics"}],
consent_notice_id="privacy-v1",
processing_expires_at="2027-01-01T00:00:00Z",
))
records = client.dpdp.list_principal_records("[email protected]")
erasure = client.dpdp.request_erasure("[email protected]")
DPDP API 端点
| 方法 | 端点 | 描述 |
|---|---|---|
POST | /v1/dpdp/consent-notices | 注册一个同意通知版本 |
POST | /v1/dpdp/consent-records | 创建一条同意记录 |
GET | /v1/dpdp/consent-records/:id | 获取一条同意记录 |
GET | /v1/dpdp/consent-records | 列出同意记录 |
POST | /v1/dpdp/consent-records/:id/withdraw | 撤回同意(第 6(4) 条) |
GET | /v1/dpdp/data-principals/:id/records | 关于某个数据主体所持有的记录(第 11 条) |
POST | /v1/dpdp/data-principals/:id/erasure | 删除请求(第 12 条) |
POST | /v1/dpdp/grievances | 记录一项申诉(第 13 条) |
GET | /v1/dpdp/grievances/:id | 获取一项申诉 |
POST | /v1/dpdp/exports | 生成导出文件 |
GET | /v1/dpdp/exports/:id | 获取导出文件(7 天) |
新增路由,采用 REST 风格:
| 方法 | 端点 | 描述 |
|---|---|---|
GET | /v1/dpdp/consent-notices | 列出同意通知版本 |
GET | /v1/dpdp/consent-notices/:noticeId | 获取通知的所有版本 |
GET | /v1/dpdp/grievances | 列出申诉 |
PATCH | /v1/dpdp/grievances/:id | 推进申诉审核流程 |
GET | /v1/dpdp/erasure-requests/:requestId | 获取删除请求 |
POST | /v1/dpdp/breaches | 记录一次泄露事件(知悉事件后 72 小时内须向 Board 提交详细报告) |
GET | /v1/dpdp/breaches | 列出泄露事件 |
GET | /v1/dpdp/breaches/:breachId | 获取一次泄露事件 |
PATCH | /v1/dpdp/breaches/:breachId | 记录报告、通知时间、延期和状态 |
POST | /v1/dpdp/breaches/:breachId/principal-intimations | 记录已通知数据主体 |
作用域执行
在任何连接器上执行工具级权限——定义自己的清单,或使用 53 个预构建清单。
快速开始
from grantex import Grantex, ToolManifest, Permission
grantex = Grantex(api_key="gx_...")
# Define a manifest for any connector — yours, not ours
grantex.load_manifest(ToolManifest(
connector="my-crm",
tools={"search": Permission.READ, "create_deal": Permission.WRITE, "delete_account": Permission.DELETE},
))
result = grantex.enforce(grant_token=token, connector="my-crm", tool="delete_account")
# result.allowed = False — "write scope does not permit delete operations"
权限层级
| 作用域级别 | READ 工具 | WRITE 工具 | DELETE 工具 |
|---|---|---|---|
| read | 是 | 否 | 否 |
| write | 是 | 是 | 否 |
| delete | 是 | 是 | 是 |
| admin | 是 | 是 | 是 |
**使用自己的清单:**可内联定义、从 JSON 文件加载、从目录加载,或通过 CLI 从源代码自动生成。 **包含 53 个预构建清单:**Salesforce、HubSpot、Jira、Stripe、SAP、S3、Gmail、Slack、GitHub 等另外 44 个——可直接使用,也可作为起点。
框架辅助工具:wrapTool() 可封装 LangChain 工具并自动执行作用域检查。createGrantexTool() 提供 TypeScript Agent 框架辅助工具,包括 Strands Agents SDK。create_grantex_tool() 提供适用于 Python OpenAI Agents SDK、Google ADK 和 Strands Agents SDK 工具的辅助功能。enforceMiddleware() 可为 Express/Fastify 路由添加一行代码即可启用执行。FastAPI 使用 GrantexEnforcer 依赖项。
完整文档请参阅作用域执行指南。
本地开发
使用 Node.js 24 LTS 安装、构建和测试仓库。升级后的 Vitest 5 工具链需要 Node.js 22.12 或更高版本;这是贡献者要求,与已发布 SDK 的运行时要求不同。
使用仓库中已提交的锁文件运行 npm ci,并参阅 CONTRIBUTING.md。
使用一条命令启动完整技术栈:
git clone https://github.com/mishrasanjeev/grantex.git
cd grantex
docker compose up --build
系统会自动预置两个 API 密钥:
| 密钥 | 模式 | 用途 |
|---|---|---|
dev-api-key-local | live | 完整的授权流程,包含重定向 |
sandbox-api-key-local | sandbox | 跳过授权界面——立即获取 code |
Sandbox 模式专为测试设计。使用 sandbox 密钥并设置 fidoRequired: false(默认值)时,POST /v1/authorize 会在响应正文中返回 code,无需重定向。设置 fidoRequired: true,即可演练真实的注册与授权流程:
# Authorize + get code in one step
curl -s -X POST http://localhost:3001/v1/authorize \
-H "Authorization: Bearer sandbox-api-key-local" \
-H "Content-Type: application/json" \
-d '{"agentId":"<id>","principalId":"test-user","scopes":["calendar:read"]}'
# → { ..., "sandbox": true, "code": "01J..." }
# Exchange immediately for a grant token
curl -s -X POST http://localhost:3001/v1/token \
-H "Authorization: Bearer sandbox-api-key-local" \
-H "Content-Type: application/json" \
-d '{"code":"<code>","agentId":"<id>"}'
开发者门户位于 grantex.dev/dashboard——注册或输入 API 密钥,即可在浏览器中管理 Agent、授权、策略、异常、合规性导出和账单。
实时授权与异常情况的账户设置:“账单”页面会显示你账户的实际套餐。源码限制为:Free 套餐最多 1,000 个活跃授权,Pro 套餐最多 50,000 个,Enterprise 套餐不限;限制按开发者账户统计,而非按 Agent 统计。使用经过身份验证的 GET /v1/billing/subscription 查询已部署账户;仅凭 Agent ID 无法得知其套餐。如果设置了 IRREGULARITY_RESPONSE_POLICY_ENABLED=true,“异常情况”页面可对 POST /v1/anomalies/detect 返回的发现启用账户级 alert_only 响应策略。未启用此服务端标志时,检测器仍会在发现高危或严重问题时,按原有方式撤销该 Agent 的所有活跃授权。仅告警会保留告警,不会绕过手动撤销或独立的安全防护机制。请参阅设置指南。服务端是否可用取决于部署情况和发布标志。TypeScript @grantex/[email protected]、Python grantex==0.7.2 和 Go v0.4.3 均已发布客户端方法。
本地开发时,身份验证服务还会在 http://localhost:3001/dashboard 提供轻量级仪表板。
有关生产部署指导,请参阅自托管指南;完整的部署参考(系统要求、环境变量、Docker/Kubernetes/Cloud Run 选项、安全检查清单和监控)请参阅 DEPLOYMENT.md。Python 依赖项列于 requirements.txt。
为什么选择开放标准?
Grantex 构建为开放协议,而非封闭的 SaaS 产品。这一点很重要,原因如下:
不依赖特定模型。 Grantex 在 SDK 或受保护服务的边界运行,而不依赖某个模型提供商。项目文档介绍了如何与 OpenAI、Anthropic、Google、Llama 和 Mistral 模型配合使用。
原生支持框架。 提供一流集成,支持 LangChain、AutoGen、CrewAI、OpenAI Agents SDK、Google ADK、Strands Agents SDK 以及纯代码。安装一个包,即可在现有技术栈中使用 Grantex。
可离线验证的签名。 服务使用公开发布的 JWKS 在本地验证令牌签名。应用应规划好 JWKS 获取和密钥轮换;签发方服务中断期间能否继续可用,取决于验证器的缓存行为。
面向合规的控制。 欧盟《人工智能法案》、GDPR 以及新兴的 AI 法规越来越要求记录自动化系统执行了哪些操作,以及由谁授权。Grantex 从一开始就提供可支持这些计划的技术控制。
范围命名约定
Grantex 定义了标准范围格式:resource:action[:constraint]
| 范围 | 含义 |
|---|---|
calendar:read | 读取日历事件 |
calendar:write | 创建和修改事件 |
email:send | 代表用户发送电子邮件 |
payments:initiate:max_500 | 发起金额不超过 $500 的付款 |
files:read | 读取用户文件 |
profile:read | 读取用户个人资料 |
服务提供商为其 API 实现范围定义。Agent 声明所需的范围。用户看到的是通俗易懂的说明,而不是原始范围字符串。
集成
此表是截至 2026-09-07 的来源与注册状态快照;主要 SDK 条目依据经 2026-09-29 核实的发布快照。对于集成包,“已发布的软件包”表示公开的软件包入口;选择版本前,请查看其注册表页面和兼容性说明。
| 框架 | 包 | 安装 | 状态 |
|---|---|---|---|
| Gemma 4(离线身份验证) | @grantex/gemma (0.1.2) | npm install @grantex/[email protected] | 已发布的包 |
| Gemma 4(Python) | grantex-gemma (0.1.2) | pip install grantex-gemma==0.1.2 | 已发布的包 |
| DPDP 合规性 | @grantex/dpdp (0.2.0) | npm install @grantex/[email protected] | 已发布的包 |
| 适配器 | @grantex/adapters | npm install @grantex/adapters | 已发布的包 |
| MCP 工具服务 | @grantex/mcp (0.1.11) | npm install @grantex/[email protected] | 已发布的包 |
| MCP 授权服务 | @grantex/mcp-auth (4.1.0) | npm install @grantex/[email protected] @grantex/[email protected] | 已发布;请配置持久化状态、主体移交和撤销 |
| 网关 | @grantex/gateway (0.3.0) | npm install @grantex/[email protected] @grantex/[email protected] | 已发布的包 |
| Express.js | @grantex/express | npm install @grantex/express | 已发布的包 |
| FastAPI | grantex-fastapi (0.1.7) | pip install grantex-fastapi==0.1.7 | 已发布的包 |
| LangChain | @grantex/langchain | npm install @grantex/langchain | 已发布的包 |
| AutoGen / OpenAI | @grantex/autogen | npm install @grantex/autogen | 已发布的包 |
| CrewAI | grantex-crewai (0.1.9) | pip install grantex-crewai==0.1.9 | 已发布的包 |
| OpenAI Agents SDK | grantex-openai-agents (0.1.8) | pip install grantex-openai-agents==0.1.8 | 已发布的包 |
| Google ADK | grantex-adk (0.1.8) | pip install grantex-adk==0.1.8 | 已发布的包 |
| Strands Agents SDK(TypeScript) | @grantex/strands | npm install @grantex/strands | 已发布的包 |
| Strands Agents SDK(Python) | grantex-strands (0.2.2) | pip install grantex-strands==0.2.2 | 已发布的包 |
| Anthropic SDK | @grantex/anthropic | npm install @grantex/anthropic | 已发布的包 |
| Vercel AI SDK | @grantex/vercel-ai | npm install @grantex/vercel-ai | 已发布的包 |
| TypeScript SDK | @grantex/sdk (0.8.2) | npm install @grantex/[email protected] | 已通过注册表验证的已发布包 |
| Python SDK | grantex (0.7.2) | python -m pip install grantex==0.7.2 | 已通过注册表验证的已发布包 |
| Go SDK | grantex-go (v0.4.3,Go 1.26.1+) | go get github.com/mishrasanjeev/[email protected] | 标签和公共 Go 代理均已验证 |
| CLI | @grantex/cli (0.4.2) | npm install -g @grantex/[email protected] | 已通过注册表验证的已发布包;Node.js 22.12+ |
| Hermes Agent | @grantex/cli 0.3.0+ + Agent Skills | grantex agent install --target hermes | 已在 0.3.0 中发布;无需专用 SDK |
| OpenClaw | @grantex/cli 0.3.0+ + Agent Skills | grantex agent install --target openclaw | 已在 0.3.0 中发布;无需专用 SDK |
| 可移植 Agent Skills | @grantex/cli 0.3.0+ + SKILL.md | grantex agent install --target portable | 已在 0.3.0 中发布 |
| 一致性套件 | @grantex/conformance (0.1.9) | npm install -g @grantex/[email protected] | 已发布的包 |
| A2A 桥接(TS) | @grantex/a2a | npm install @grantex/a2a | 已发布的包 |
| A2A 桥接(Py) | grantex-a2a (0.1.6) | pip install grantex-a2a==0.1.6 | 已发布的包 |
| 事件目标 | @grantex/destinations | npm install @grantex/destinations | 已发布的包 |
| Terraform 提供程序 | terraform-provider-grantex | 源码构建评估 | 仅提供源码;公共注册表查询于 2026 年 9 月 7 日返回 404 |
| x402 支付协议 | @grantex/x402 (0.4.1) | npm install @grantex/[email protected] @grantex/[email protected] | 已通过注册表验证的分层 x402 v2 版本;外部托管仍由运营方提供 |
受保护的 publish-primary-sdks.yml 工作流会构建并测试每个已准备好的版本一次,然后发布这些不可变制品。发布前,维护者必须配置受保护的 sdk-release GitHub 环境、两个 npm 包的 npm 可信发布者记录、grantex 的 PyPI 可信发布者,以及权限范围严格受限的 Go 仓库发布令牌。仅更新清单版本号并不构成发布。 |
社区 x402 服务
- JMT x402 Agent 工具 提供运行于 Base 主网的付费工具,涵盖搜索、分析、市场数据、备案文件、公司情报和新闻。查询其发现端点,获取当前工具目录和定价。
框架快速示例
Express.js — 授权令牌验证 + 基于作用域的授权:
import express from 'express';
import { requireGrantToken, requireScopes } from '@grantex/express';
const JWKS_URI = 'https://api.grantex.dev/.well-known/jwks.json';
app.use('/api', requireGrantToken({ jwksUri: JWKS_URI }));
app.get('/api/calendar', requireScopes('calendar:read'), (req, res) => {
res.json({ principalId: req.grant.principalId, scopes: req.grant.scopes });
});
FastAPI — 依赖注入与作用域强制执行:
from fastapi import Depends, FastAPI
from grantex import VerifiedGrant
from grantex_fastapi import GrantexAuth, GrantexFastAPIError, grantex_exception_handler
app = FastAPI()
app.add_exception_handler(GrantexFastAPIError, grantex_exception_handler)
grantex = GrantexAuth(jwks_uri="https://api.grantex.dev/.well-known/jwks.json")
@app.get("/api/calendar")
async def calendar(grant: VerifiedGrant = Depends(grantex.scopes("calendar:read"))):
return {"principalId": grant.principal_id}
LangChain — 作用域强制执行工具 + 审计回调:
import { createGrantexTool } from '@grantex/langchain';
const tool = createGrantexTool({
name: 'read_calendar',
description: 'Read upcoming calendar events',
grantToken,
requiredScope: 'calendar:read',
func: async (input) => JSON.stringify(await getCalendarEvents(input)),
});
// Use with any LangChain agent — signature and scope checked locally using JWKS
Vercel AI SDK — 在构造时检查作用域:
import { createGrantexTool } from '@grantex/vercel-ai';
import { z } from 'zod';
const tool = createGrantexTool({
name: 'read_calendar',
description: 'Read upcoming calendar events',
parameters: z.object({ date: z.string() }),
grantToken,
requiredScope: 'calendar:read',
execute: async (args) => await getCalendarEvents(args.date),
});
// Use with generateText, streamText, etc.
AutoGen / OpenAI 函数调用:
import { createGrantexFunction, GrantexFunctionRegistry } from '@grantex/autogen';
const fn = createGrantexFunction({
name: 'read_calendar',
description: 'Read upcoming calendar events',
parameters: { type: 'object', properties: { date: { type: 'string' } }, required: ['date'] },
grantToken,
requiredScope: 'calendar:read',
func: async (args) => await getCalendarEvents(args.date),
});
// Pass fn.definition to OpenAI, call fn.execute() when selected
CrewAI(Python):
from grantex_crewai import GrantexTool
tool = GrantexTool(
name="read_calendar",
description="Read upcoming calendar events",
grant_token=grant_token,
required_scope="calendar:read",
func=get_calendar_events,
)
# Use with any CrewAI agent
OpenAI Agents SDK(Python):
from grantex_openai_agents import create_grantex_tool
tool = create_grantex_tool(
name="read_calendar",
description="Read upcoming calendar events",
grant_token=grant_token,
required_scope="calendar:read",
func=get_calendar_events,
)
# Returns a FunctionTool — use with any OpenAI Agents SDK agent
Google ADK(Python):
from grantex_adk import create_grantex_tool
read_calendar = create_grantex_tool(
name="read_calendar",
description="Read upcoming calendar events",
grant_token=grant_token,
required_scope="calendar:read",
func=get_calendar_events,
)
# Returns a plain function — pass directly to google.adk.Agent(tools=[...])
Strands Agents SDK(Python):
from grantex_strands import create_grantex_tool
read_calendar = create_grantex_tool(
name="read_calendar",
description="Read upcoming calendar events",
grant_token=grant_token,
required_scope="calendar:read",
func=get_calendar_events,
)
# Returns a Strands-compatible tool — pass into your Strands agent tools list
CLI(90 多条命令,全部支持 --json,供 AI Agent / 脚本使用):
grantex config set --url https://api.grantex.dev --key YOUR_API_KEY
grantex me # check identity
grantex agents register --name "Bot" --description "..." --scopes email:read
grantex agents update ag_... --redirect-uri https://client.example/grants/callback
grantex authorize --agent ag_... --principal [email protected] --scopes email:read
grantex tokens exchange --code <code> --agent-id ag_...
grantex tokens verify <jwt>
grantex tokens refresh --refresh-token <token> --agent-id ag_...
grantex grants delegate --grant-token <jwt> --agent-id ag_child... --scopes email:read
grantex budgets allocate --grant-id grnt_... --amount 100
grantex audit list --agent ag_...
grantex grants revoke grnt_...
# DPDP Act 2023 records (11 subcommands)
grantex dpdp consent create --grant-id grnt_... --principal-id [email protected] --notice-id privacy-v1 --processing-expires-at 2027-01-01T00:00:00Z --purposes '[{"code":"analytics","description":"Usage analytics"}]'
grantex dpdp consent get <recordId>
grantex dpdp consent list --principal [email protected]
grantex dpdp consent withdraw <recordId> --reason "No longer needed"
# Create a consent notice with the released --notice-version option:
grantex dpdp notices create --notice-id privacy-v1 --notice-version 1.0 --title "Privacy Notice" --content "We process your data for..." --purposes '[{"code":"analytics","description":"Usage analytics"}]'
grantex dpdp grievances file --principal-id [email protected] --type unauthorized-processing --description "Data used beyond the consented purpose"
grantex dpdp grievances get <grievanceId>
grantex dpdp erasure [email protected]
grantex dpdp exports create --type dpdp-audit --date-from 2026-01-01 --date-to 2026-04-01
grantex dpdp exports get <exportId>
grantex dpdp principal-records [email protected]
# Machine-readable output for scripts and AI coding assistants
grantex --json agents list | jq '.[0].agentId'
交互式 Playground
在浏览器中实时体验完整的 Grantex 授权流程 — 无需注册:
逐步体验协议的全部 7 个步骤:注册 Agent、授权、交换令牌、验证、刷新、撤销,以及验证撤销结果。使用沙盒模式和你的 API 密钥。
示例
| 示例 | 描述 | 运行 |
|---|---|---|
quickstart-ts | 核心授权流程 — 注册、授权、交换、验证、审计、撤销 | npm start |
quickstart-py | 使用 Python 实现相同流程 | python main.py |
nextjs-starter | 交互式 Next.js 应用 — 在浏览器中完成完整的同意界面流程 | npm run dev |
langchain-agent | 使用强制执行作用域的工具的 LangChain Agent | npm start |
anthropic-tool-use | 使用 Anthropic SDK 工具并强制执行作用域 | npm start |
vercel-ai-chatbot | 使用 Grantex 工具的 Vercel AI SDK 聊天机器人 | npm start |
crewai-agent | 使用 Grantex 授权的 CrewAI Agent | python main.py |
openai-agents | OpenAI Agents SDK 集成 | python main.py |
google-adk | 使用 Grantex 工具的 Google ADK Agent | python main.py |
gateway-proxy | 带 YAML 配置并强制执行作用域的网关反向代理 | npm start |
adapter-google-calendar | 使用授权令牌验证的 GoogleCalendarAdapter | npm start |
multi-agent-delegation | 支持级联撤销的父子委托 | npm start |
gemma-raspberry-pi | 在 Raspberry Pi 上运行、支持离线授权的 Gemma 4 Agent | python agent.py |
gemma-android-kotlin | 支持离线验证的 Android Gemma 4 Agent | Android Studio |
gemma-ios-swift | 使用 CryptoKit 验证的 iOS Gemma 4 Agent | swift run |
quickstart-go | 使用 Go SDK 实现的核心授权生命周期 | go run . |
multi-agent-email-flow | 支持委托、强制执行和级联撤销的多 Agent 邮件自动化 | npm start |
audit-dashboard | 审计跟踪查询、筛选和哈希链完整性验证 | npm start |
token-expiry-refresh | 活跃授权刷新轮换、300 秒丢失响应恢复,以及过期授权重新授权 | npm start |
x402-agent-demo | 绑定 DPoP 的 Agent 通过官方 x402 v2 使用分配的预付钱包,并确保幂等性持久化 | npm start |
x402-weather-api | 使用 Grantex 预付验证/结算的官方 x402 v2 资源服务 | npm start |
架构
┌──────────────────────────────────────────────────────────────────────┐
│ YOUR APPLICATION │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────────────┐ │
│ │ AI Agent │ │ Grantex SDK │ │ End User Dashboard │ │
│ │ (any model) │◄──►│ (2 lines) │ │ (view / revoke) │ │
│ └──────────────┘ └──────┬───────┘ └───────────────────────┘ │
└──────────────────────────────┼───────────────────────────────────────┘
│ HTTPS
▼
┌──────────────────────────────────────────────────────────────────────┐
│ GRANTEX PROTOCOL │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌──────────┐ │
│ │ Identity │ │ Auth │ │ Consent │ │ Audit │ │
│ │ Service │ │ Service │ │ UI │ │ Chain │ │
│ │ (DID/JWKS) │ │ (token i/o) │ │ (hosted) │ │ (append) │ │
│ └─────────────┘ └──────────────┘ └─────────────┘ └──────────┘ │
└──────────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────┐
│ Any Service / API │
│ Verifies via JWKS │
│ No Grantex dep needed │
└──────────────────────────┘
产品路线图
当前的产品路线图将 2026.08 生产信任基线列为优先事项:持久化 MCP 授权、主 SDK 的功能一致性与发布安全、支持撤销的强制执行、计划处理能力,以及生产级 Commerce 同意流程。仓库进展记录在未发布版本下;发布状态指南、兼容性矩阵和特定软件包的文档,仍是已发布版本、部署状态和限制的权威信息来源。以下标签是历史来源里程碑,不代表发布或已具备生产就绪能力。
| 里程碑 | 历史范围 | 当前说明 |
|---|---|---|
| v0.1 - 基础 | 协议规范、TypeScript 和 Python SDK、身份验证服务、同意界面、审计跟踪、多 Agent 委派、沙箱模式 | 历史来源里程碑 |
| v0.2 - 集成 | LangChain、AutoGen、webhook、Stripe 计费、CLI | 历史来源里程碑;请核实软件包状态 |
| v0.3 - 企业版 | CrewAI、Vercel AI、合规性导出、策略引擎、SCIM/SSO、异常检测 | 历史来源里程碑;功能边界各不相同 |
| v1.0 - 稳定协议 | 协议规范 v1.0、安全材料、SOC 2 就绪度映射、个人 IETF Internet-Draft | 协议 v1.0 已定稿;映射和草案均不代表认证或 IETF 背书 |
| v2.0 - 平台 | MCP 授权软件包、Credential Vault、适配器、webhook 投递日志、示例 | 历史来源里程碑;MCP Auth 2.0.2 是单进程评估软件 |
| v2.1 - 企业规模 | 事件流、预算控制、可观测性、Terraform 源码、网关、一致性验证 | 历史来源里程碑;请核实各部署界面 |
| v2.2 - 生态系统 | OPA/Cedar 后端、A2A 桥接、用量计量、自定义域名注册、策略即代码 | 历史来源里程碑;自定义域名的运行时路由支持各不相同 |
| v2.3 - 信任与身份 | Passkey、可验证凭证、SD-JWT、DID 基础设施、状态数据、意图映射 | 历史来源里程碑;映射不代表第三方认证 |
| v2.4 - 企业 SSO | OIDC 和 SAML 2.0 多 IdP 支持、JIT 配置、群组映射、强制执行、会话、LDAP 直接绑定预览 | 历史来源里程碑;尚未实现 LDAP 目录搜索和群组检索 |
参与贡献
Grantex 欢迎贡献。CONTRIBUTING.md 说明了贡献许可,该许可允许 Orchestrum Technologies LLP 对贡献进行许可,包括用于商业用途:
- 报告错误 — 在 GitHub Issue 中提交问题并附上复现步骤
- 提出功能建议 — 在 GitHub Discussion 中说明你的使用场景
- 构建新的集成 — 为你喜爱的框架添加 Grantex 支持
- 改进文档 — 提供更好的示例、教程和翻译
提交 PR 前,请阅读 CONTRIBUTING.md。
标准与合规
| OWASP | 涵盖 Agentic Security Top 10 中的 ASI-01、ASI-03、ASI-05、ASI-10(2025 年 12 月) |
| EU AI Act | 仅提供技术控制映射,不构成法律建议或合格评定。根据经 Regulation (EU) 2026/1744 修订的 Regulation (EU) 2024/1689(于 2026 年 7 月 27 日生效),第 50 条透明度义务自 2026 年 8 月 2 日起适用,附件 III 高风险义务自 2027 年 12 月 2 日起适用,附件 I(嵌入产品)高风险义务自 2028 年 8 月 2 日起适用。请参阅欧盟委员会时间表。 |
| NIST AI RMF | Govern 1.1、Map 5.1、Measure 2.5——仓库评论草案;没有公开提交回执或背书 |
| IETF | 正在进行的个人互联网草案;修订版 -02 已发布。修订版 -03 及其对客户端/授权服务器/资源服务器实现的自评正在 docs/ietf-draft/ 中审核,2026-09-09 前不会上传。这并非独立认证、采纳或 IETF 背书(Datatracker) |
| AuthZEN | 已完成符合性映射 |
| SOC 2 | 已发布就绪度控制映射;尚未发布正式的第三方鉴证 |
| Protocol Spec | v1.0 Final——已冻结、公开可读,Orchestrum Personal Use License 1.0 |
完整合规矩阵:docs.grantex.dev/guides/compliance-matrix
信赖者
正在根据与 Orchestrum 签订的商业协议使用 Grantex?请写信至 [email protected],以便列入此处。
常见问题
这只是另一个身份验证库吗?
人类身份系统和 Grantex 解决的是不同层面的问题。人类身份验证用于确认个人身份;Grantex 则承载该个人或组织委托给特定 Agent 的限定权限。目前,撤销权限需要在执行点进行在线状态检查,或同步撤销数据。
为什么不直接使用 OAuth 2.0?
OAuth 2.0 的设计初衷是“用户授权应用访问其数据”。Agent 带来了新的需求:Agent 需要有可验证的身份,且该身份应与其创建者相互独立;授权需要能在多 Agent 流水线中逐级传递;每个自主操作都必须可追溯、可审计。我们在扩展 OAuth 2.0 概念的同时,加入了它所缺少的 Agent 专用基础机制。
MCP(Model Context Protocol)呢?
MCP 将客户端连接到工具和资源,并为 HTTP 传输定义可选的 OAuth 授权。Grantex 则在工具或服务边界添加 Agent 专用的委托权限:哪个 Agent 可以代表哪个主体执行什么操作。这两个层面相辅相成。
谁拥有这项标准?
v1.0 协议规范依据 Orchestrum Personal Use License 1.0 发布在此代码库中。Grantex 归 Orchestrum Technologies LLP 所有,Sanjeev Kumar 列为发明人和所有者。Orchestrum Technologies LLP 维护参考实现。修订版 -02 作为有效的个人 IETF Internet-Draft 发布,修订版 -03 正在审查中;无论是发布草案还是在代码库中实现,都不代表工作组采纳、独立认证或 IETF 背书。
我可以自行托管吗?
可以。SDK 采用 Apache-2.0 许可,可免费用于任何用途。身份验证服务和门户采用 Orchestrum Personal Use License 1.0 许可:个人可以自行托管以供本人使用;任何组织自行托管或为其托管(包括评估和试点)均需事先获得 Orchestrum Technologies LLP 的书面许可(参见许可)。只需一条命令即可通过 Docker Compose 部署。完整指南请参见 DEPLOYMENT.md,或查看自行托管文档。
许可证
SDK 和客户端软件包(packages/)以及示例(examples/):Apache-2.0,
开源,可免费用于任何用途。身份验证服务、门户、规范文本、
文档和网站:采用 Orchestrum Personal Use License 1.0,
许可方为 Orchestrum Technologies LLP;仅限个人免费用于个人用途,
任何组织均需事先获得 Orchestrum Technologies LLP 的书面许可
(COMMERCIAL-LICENSE.md,
[email protected])。目录适用范围:
LICENSING.md。商标:TRADEMARKS.md。
第三方软件包以及 THIRD_PARTY_NOTICES.md
中列出的第三方文件均保留其各自的许可证。
重新分发前,请先阅读该文件。
产品所有权:Grantex 归 Orchestrum Technologies LLP 所有。发明人和所有者:Sanjeev Kumar。所有权联系邮箱:[email protected] 或 [email protected]。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。