使用说明
支付门mcp
只需一个命令即可将任何MCP服务器货币化。向任何模型上下文协议服务器添加API密钥身份验证、每工具定价、速率限制和使用计量。零依赖。零配置。零代码更改。
目录
- 快速开始
- 它的作用
- 用法 --本地stdio、远程HTTP、多服务器、客户端SDK
- API 参考 --所有199+个端点
- CLI选项
- 部署 --Docker、Docker编写、systemd、PM2
- 负载测试 --k6生产基准测试
- 错误代码 --完整的错误代码参考
- 功能参考 --每个功能的详细文档
- 程序化API
- 安全
- 经过测试 --针对流行的MCP服务器进行验证
- 当前限制
- 路线图
- 需求
- 许可证
快速开始
# Interactive setup wizard (generates paygate.json)
npx paygate-mcp init
# Or wrap directly with CLI flags
npx paygate-mcp wrap --server "npx @modelcontextprotocol/server-filesystem /tmp"
# Gate a remote MCP server (Streamable HTTP transport)
npx paygate-mcp wrap --remote-url "https://my-server.example.com/mcp" --price 5
就是这样。您的MCP服务器现在在API密钥后面使用基于信用的计费。
它的作用
PayGate位于AI代理和MCP服务器之间:
Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
- API密钥认证 --客户需要有效的
X-API-Key调用工具 - 信用账单 --每次工具调用的成本积分(可按工具配置)
- 速率限制 --滑动窗口每键速率限制+每工具速率限制
- 使用计量 --追踪谁打了什么电话,什么时候打,花了多少钱
- 多服务器模式 --使用工具前缀路由将N个MCP服务器包裹在一个PayGate后面
- 客户端SDK —
PayGateClient具有自动402重试、平衡跟踪和键入错误 - 两次运输 --通过stdio包装本地服务器,或通过Streamable HTTP包装远程服务器
- 每个工具ACL -每个API密钥的白名单/黑名单工具(企业访问控制)
- 每工具速率限制 --每个工具的独立费率限制,而不仅仅是全球范围内的
- 密钥过期(TTL) -在设定时间后自动导出API密钥
- 支出限额 -按API键限制总开支,以防止成本失控
- 使用配额 --每个密钥的每日/每月通话和信用额度(UTC自动重置)
- 动态定价 --根据输入大小收取额外积分(
creditsPerKbInput) - OAuth 2.1 --具有PKCE、客户端注册和承载令牌的完全授权服务器
- SSE流媒体 --完整的MCP流式HTTP传输(POST SSE、GET通知、DELETE会话)
- 审计日志 -具有保留策略、查询API、CSV/JSON导出的结构化审核跟踪
- 注册表/发现 --代理可通过以下方式发现定价
/.well-known/mcp-payment,/pricing,以及/.well-known/mcp.json身份证 - OpenAPI 3.1+交互式文档 --自动生成的规格
/openapi.jsonSwagger用户界面/docs--记录了所有199+个端点 - 公共端点速率限制 --可配置每IP速率限制(默认300/min)
/health,/info,/pricing,/docs,/openapi.json,/.well-known/*,/robots.txt,/--429带有Retry-After标头 - Robots.txt+头部支持 --标准
/robots.txt(允许公共,不允许管理员/密钥),所有公共端点上的HEAD方法用于正常运行时间监控 - 普罗米修斯指标 —
/metrics端点,带有标准文本格式的计数器、仪表和正常运行时间 - 关键点旋转 -在不丢失信用、ACL或配额的情况下旋转API密钥
- 速率限制标头 —
X-RateLimit-*和X-Credits-Remaining在每一个/mcp回应 - Webhook签名 --HMAC-SHA256签名的webhook有效载荷(
X-PayGate-Signature)用于防篡改交付 - 管理员生命周期事件 --key.created、key.revoked、key.rotated、key.topup的Webhook通知
- IP允许列表 -将API密钥限制为特定IP或CIDR范围(IPv4)
- 关键标签/元数据 -将任意键-值标记附加到API键以进行外部系统集成
- 使用情况分析 -时间序列分析API,包括工具细分、顶级消费者和趋势比较
- 提醒Webhooks --可配置的支出阈值、低信用、配额警告、密钥到期、利率上限峰值警报
- 团队管理 -将API密钥分组到具有共享预算、配额和使用情况跟踪的团队中
- 水平缩放(Redis) -用于多进程部署的Redis支持状态,具有原子信用扣减、分布式利率限制、持久使用审计跟踪、实时发布/子通知和管理API同步
- Webhook重试队列 -指数退避重试(1s、2s、4s…),带有死信队列,用于永久失败的交付,管理API,用于监控、清除和回放
- 管理员仪表板v2 --标签式网络仪表板位于
/dashboard包括概述、密钥管理(创建/挂起/恢复/撤销/充值)、分析(信用流、拒绝原因、顶级消费者、webhook健康状况)和系统状态——所有数据都通过安全的DOM方法,30秒自动刷新 - 自助服务门户 -API密钥持有者门户网站
/portal--在没有管理员权限的情况下检查信用、使用情况、费率限制、可用工具和最近的活动;包括购买积分UI、具有支出速度的信用历史记录、使用警报和自助密钥轮换 - 条纹结账 --通过Stripe Checkout Sessions进行自助信用卡购买--
POST /stripe/checkout创建会话,GET /stripe/packages列出可用包;使用Node.js实现零依赖https,通过webhook自动充值积分 - 状态备份和还原 —
GET /admin/backup将完整的服务器状态(密钥、团队、组、Webhook)导出为带有SHA-256校验和的版本化JSON;POST /admin/restore具有合并/覆盖/完整模式和完整性验证的导入 - API版本头 —
X-PayGate-Version用于客户端版本跟踪的每个HTTP响应上的标头,通过CORS公开 - 就绪探针 —
GET /ready根据操作状态(不排水、不维护、后端连接)返回200/503,与/health活性探针,Kubernetes的理想选择 - 健康检查+优雅关机 —
GET /health带有状态、正常运行时间、版本、正在处理的请求、Redis和webhook统计信息的公共端点;gracefulStop()在拆卸之前删除飞行中的请求 - 配置验证+试运行 —
paygate-mcp validate --config paygate.json在开始之前发现错误配置;--dry-run发现工具,打印定价表,然后退出 - 批处理工具调用 —
tools/call_batch在一个请求中调用多个工具的方法,包括全有或全无计费、聚合信用检查和并行执行 - 多租户命名空间 -通过名称空间过滤的管理端点、分析和使用导出按租户隔离API密钥和使用数据
- 范围令牌 --问题持续时间短
pgt_令牌作用于特定工具,具有自动过期(最多24小时)、HMAC-SHA256签名、服务器端状态为零 - 令牌撤销列表 -使用O(1)查找、自动清理、Redis跨实例同步和管理API在到期前吊销作用域令牌
- 基于使用情况的自动充值 --当余额降至阈值以下时,通过可配置的每日限额、审计跟踪、webhook事件和Redis同步自动添加信用
- 管理员API密钥管理 --具有基于角色的权限(超级管理员、管理员、查看器)、文件持久性、审计跟踪和安全防护的多个管理员密钥
- 插件系统 --可扩展的中间件挂钩,用于自定义计费逻辑、请求/响应转换、自定义端点和生命周期管理
- 键群 -将共享ACL、速率限制、定价覆盖、IP允许列表和配额应用于具有自动继承和密钥级别覆盖支持的API密钥组的策略模板
- 失败退款 --下游工具调用失败时自动退款
- 贷记转账 -使用验证、审计跟踪和webhook事件在API密钥之间原子传输信用
- 批量密钥操作 --在单个请求中执行多个关键操作(创建、充值、撤销、挂起、恢复),并对每个操作进行错误处理和索引跟踪
- 关键导入/导出 -导出用于备份/迁移的所有API密钥(JSON或CSV),并使用冲突解决方案导入(跳过、覆盖、错误模式)
- Webhook过滤器 -根据事件类型和API密钥前缀,使用过滤器机密、独立重试队列和管理员CRUD API,将webhook事件路由到不同的目的地
- 密钥克隆 —
POST /keys/clone使用相同的配置(ACL、配额、标记、IP、命名空间、组、支出限制、过期、自动使用)创建一个新的API密钥,但使用新的计数器-非常适合配置类似的密钥 - 钥匙悬挂 -暂时禁用API密钥而不吊销它们-已挂起的密钥在门口被拒绝,但可以恢复,并且管理操作(topup、ACL等)仍然对已挂起密钥有效
- 按密钥使用 —
GET /keys/usage?key=...返回特定密钥的详细使用情况细分:每个工具的统计数据、每小时的时间序列、拒绝原因、最近的事件和密钥元数据 - Webhook测试 —
POST /webhooks/test向您配置的webhook URL发送测试事件,并同步响应,包括状态代码、响应时间和交付成功/失败——验证webhook连接,而不生成真实事件 - Webhook交付日志 —
GET /webhooks/log返回所有webhook传递尝试的可查询日志,包括时间戳、HTTP状态代码、响应时间、成功/失败、重试尝试、事件计数和事件类型——按成功状态、时间范围和限制进行筛选 - Webhook暂停/恢复 —
POST /webhooks/pause和POST /webhooks/resume在维护期间暂时停止webhook传递——事件会被缓冲(不会丢失)并在恢复时刷新,暂停状态在中可见/webhooks/stats - 关键别名 —
POST /keys/alias分配人类可读的别名(例如。my-service,prod-backend)到API密钥-在任何管理终结点(topup、revoke、suspend、resume、clone、transfer、use)中使用别名,而不是不透明的密钥ID,具有唯一性强制、格式验证、状态文件持久性和审核跟踪 - 密钥过期扫描程序 -主动式后台扫描程序,可在API密钥过期前检测过期的密钥-可配置的扫描间隔和通知阈值(默认值:7d、24h、1h),消除重复
key.expiry_warningwebhook事件、审计跟踪、,GET /keys/expiring?within=86400查询端点和优雅关闭 - 键盘模板 -API密钥创建的命名模板-定义可重复使用的预设(信用、ACL、配额、IP、标签、命名空间、到期TTL、支出限制、自动使用),并使用
template: "free-tier"-显式参数覆盖模板默认值,CRUD管理API,Prometheus仪表,文件持久性,最多100个模板 - 环境变量配置 --通过配置所有内容
PAYGATE_*Docker/K8s部署的环境变量——18个环境变量,涵盖所有CLI标志,优先级为:CLI标志>环境变量>配置文件>默认值,PAYGATE_CONFIG加载配置文件路径,Docker示例帮助文本 - 请求ID跟踪 --每个HTTP响应都包括
X-Request-Id标题(自动生成req_前缀+16个十六进制字符)用于分布式跟踪--传播传入X-Request-Id来自负载平衡器/代理,包含在门审计日志元数据中,CORS公开,可通过getRequestId(req)助手 - 服务器信息端点 —
GET /info返回服务器功能、启用的功能、身份验证方法、定价摘要、速率限制和可用端点——公共,不需要管理密钥,是代理自动发现和调试的理想选择 - 可配置CORS --控制哪些源可以访问您的服务器:单个源、多个源或通配符(
*默认),支持凭据,可配置飞行前最大年龄,以及Vary: Origin正确缓存--通过配置文件设置cors对象,--cors-originCLI标志,或PAYGATE_CORS_ORIGINenv 是 - 自定义响应标头 --添加安全标头(
X-Frame-Options,X-Content-Type-Options等)、缓存控制或所有HTTP响应的任何自定义标头——通过配置文件设置customHeaders对象,--headerCLI标志,或PAYGATE_CUSTOM_HEADERSenv 是 - 配置导出 —
GET /config返回正在运行的服务器配置,其中隐藏了敏感值(webhook机密→***,服务器命令→***,webhook URL→ 仅限scheme+host)--需要管理员身份验证,包括审计跟踪 - 可信代理 --配置受信任的代理IP/CIDR以确保准确
X-Forwarded-Forextraction--从右向左遍历标头,跳过受信任的代理以查找真实的客户端IP,支持精确的IP和CIDR范围(IPv4),未配置时向后兼容(第一个IP) - 关键列表分页 --增强型
GET /keys基于光标的分页(limit/offset),排序(sortBy/order),并按命名空间、组、活动/暂停/过期状态、名称前缀和信用范围进行过滤——向后兼容(未使用分页参数时返回平面数组) - 关键统计数据 —
GET /keys/stats返回所有键的聚合统计信息——总计/活动/暂停/过期/撤销计数、信用聚合(已分配/已花费/剩余)、总调用数、命名空间和组细分,可选?namespace=过滤器 - 速率限制状态 —
GET /keys/rate-limit-status?key=...返回任何键的当前速率限制窗口状态——全局调用已使用/剩余/重置时间、每个工具的速率限制和单独使用、只读(不消耗调用) - 配额状态 —
GET /keys/quota-status?key=...返回任何密钥的每日/每月配额使用情况——已使用的调用和信用/剩余/限制、重置期、配额来源(每个密钥vs全局vs无) - 信用记录 —
GET /keys/credit-history?key=...每个密钥信用突变日志的返回值——跟踪初始分配、充值、转账(入/出)、自动充值、类型/限制/自过滤、每个条目前后的余额、最新的首次订购,每个密钥最多100个条目 - 支出速度 —
GET /keys/spending-velocity?key=...返回信用消耗率和消耗预测——每小时/每天的信用/呼叫数、估计的消耗日期、按支出列出的顶级工具、可配置的分析窗口(1h-30d) - 关键比对 —
GET /keys/compare?keys=pg_a,pg_b返回2-10个键(信用、使用、速度、速率限制、状态、元数据(名称空间/组/标签))的并排比较,以及未找到的键报告 - 关键健康评分 —
GET /keys/health?key=...返回包含加权组件细分的复合健康评分(0-100):余额健康(30%)、配额利用率(25%)、速率限制压力(20%)、错误率(25% - 维护模式 —
POST /maintenance使用自定义消息启用/禁用维护模式--/mcp在管理端点保持操作的同时向客户端返回503,GET /maintenance检查状态,GET /health反映维护状态,完整的审计跟踪 - 管理员事件流 —
GET /admin/eventsSSE端点将实时审计事件流式传输到管理客户端——工具调用、拒绝、关键操作、维护更改,所有这些都是可选的?types=事件类型过滤、保活ping、多客户端支持过滤器 - 关键要点 —
POST /keys/notes将带时间戳的注释添加到API密钥,GET /keys/notes?key=...列出笔记,DELETE /keys/notes?key=...&index=N删除注释——每个密钥最多50个字符,1000个字符限制,处理挂起/撤销的密钥,别名支持,审计跟踪 - 计划行动 —
POST /keys/schedule在API密钥上创建未来日期的动作(撤销/暂停/停止),GET /keys/schedule列出待定的日程安排(可选)?key=过滤器,DELETE /keys/schedule?id=...取消计划——每个密钥最多20个,别名支持,后台执行计时器,审计跟踪 - 关键活动时间表 —
GET /keys/activity?key=...返回特定键的审计事件和使用事件的统一时间顺序提要——最新优先,可选?since=和?limit=过滤器,别名支持 - 信用预订 —
POST /keys/reserve持有学分,POST /keys/reserve/commit扣除持有的信用额度,POST /keys/reserve/release释放控制,GET /keys/reserve列出活动预订——防止超额承诺,可配置TTL(10秒-1小时),每个密钥最多50个,自动到期,审计跟踪 - 请求日志 —
GET /requests每个工具调用的可查询日志,包括时间、收费信用、状态(允许/拒绝)、拒绝原因、密钥和请求ID——按密钥/工具/状态/原因、分页、汇总统计(总计+平均持续时间)、5000个条目环形缓冲区进行过滤 - 工具统计信息 —
GET /tools/stats按工具分析:呼叫计数、成功率、平均/p95延迟、消耗的信用、拒绝原因细分、前10名消费者——可选?tool=对于详细的单工具视图,?since=过滤器 - 请求日志导出 —
GET /requests/export将完整的请求日志导出为JSON或CSV格式,并带有Content-Disposition标头——按键/工具/状态/自/直到筛选,组合时间窗口查询,无分页限制 - 工具调用模拟运行 —
POST /requests/dry-run在不执行的情况下模拟工具调用——检查密钥有效性、ACL、速率限制、信用和支出限制,返回计算后的预测结果以及信用和速率限制状态 - 批量试运行 —
POST /requests/dry-run/batch一次模拟多个工具调用——聚合信用检查、每个工具ACL验证、支出限额、每个工具的返回结果,包括所需的总信用和之后的信用 - 工具可用性 —
GET /tools/available?key=...每个关键工具的可用性回报,包括定价、可负担性(canAfford)、ACL执行(可访问/拒绝原因)和每个工具+全球费率限制状态 - 关键仪表板 —
GET /keys/dashboard?key=...整合的单端点视图,包括元数据、余额、健康评分、支出速度、费率限制、配额、使用情况摘要和最近的活动时间线 - 管理员通知 —
GET /admin/notifications扫描所有密钥以查找可操作的问题:过期/到期密钥、零信用、信用耗尽速度、挂起密钥、高错误率和速率限制压力——具有严重性过滤和优先级排序 - 系统仪表盘 —
GET /admin/dashboard全系统概述,包括关键计数(活动/暂停/撤销/过期)、信用摘要(已分配/已花费/剩余)、使用情况细分(包括拒绝原因)、主要消费者、主要工具、通知计数和正常运行时间 - 关键生命周期报告 —
GET /admin/lifecycle聚合生命周期趋势,包括每日创建/撤销/暂停桶、平均密钥生命周期和有风险的密钥(到期、过期、零信用) - 成本分析 —
GET /admin/costs以成本为中心的视图,包括每个工具和每个命名空间的成本细分、每小时的支出趋势、最高支出者、每次调用的平均成本和命名空间过滤 - 利率限制分析 —
GET /admin/rate-limits速率限制利用率分析,包括每个键和每个工具的细分、拒绝趋势、限制最多的键和当前窗口利用率 - 配额分析 —
GET /admin/quotas配额利用率分析,包括每个密钥的每日/每月使用量与限制、每个工具的拒绝细分、最受限制的密钥以及全局/每个密钥的配额源跟踪 - 否认分析 —
GET /admin/denials按原因类型(信用不足、利率限制、配额超标、密钥暂停等)进行全面的拒绝细分,包括每个密钥和每个工具的统计数据、每小时的趋势和大多数被拒绝的密钥 - 流量分析 —
GET /admin/traffic请求量分析,包括工具流行度、小时数、按呼叫数划分的顶级消费者、命名空间细分、高峰时段识别和成功率 - 响应缓存 --SHA-256键控响应缓存用于相同的工具调用——跳过后端调用和缓存命中、LRU驱逐、每个工具或全局TTL的信用扣减,
X-Cache: HIT/MISS标题,管理员管理(GET/DELETE /admin/cache)普罗米修斯测量仪 - 断路器 --三态断路器(闭合→ open → half_open)用于后端故障检测——在连续N次故障后打开,冷却后自动恢复,错误代码
-32003,管理(GET/POST /admin/circuit) - 可配置超时 --每个工具和工具调用的全局超时--返回错误代码
-32004超时时,通过按工具覆盖toolPricing[tool].timeoutMs,触发断路器故障记录 - 基于结果的定价 --根据响应输出大小收取额外积分--
creditsPerKbOutput根据工具配置、响应后计费,X-Output-Surcharge标题,补语creditsPerKbInput基于尺寸的完整定价 - 合规审计导出 --SOC 2、GDPR、HIPAA的特定框架合规报告--
GET /admin/compliance/export,事件分类为访问控制/数据处理/配置更改/安全、JSON或CSV导出、可配置时间段 - 每键Webhook URL --密钥级webhook路由——特定密钥的事件与全局webhook一起发送到密钥的webhook URL,SSRF保护,HMAC-SHA256签名,懒惰发射器管理,通过
POST/GET/DELETE /keys/webhook - 安全审计 —
GET /admin/security安全态势分析,识别没有IP分配表、配额、ACL限制、支出限制或到期日期的密钥,标记高信用密钥,并计算综合安全评分 - 收入分析 —
GET /admin/revenue收入指标,包括每个工具的收入细分、每个关键支出、每小时收入趋势、信贷流摘要(分配/支出/剩余)和每次通话的平均收入 - 关键投资组合健康状况 —
GET /admin/key-portfolio整个投资组合的密钥健康状况,包括活动/非活动/暂停计数、过期密钥、即将到期的密钥、年龄分布、信用利用率和命名空间细分 - 内容物护栏 -工具调用输入/输出的基于Regex的PII检测和编校-8个内置规则(信用卡、SSN、电子邮件、电话、AWS密钥、API机密、IBAN、passport)、4个操作(log/warn/block/redact)、范围过滤(输入/输出/两者都有)、逐个目标、使用查询API的违规跟踪、管理员CRUD端点(
/admin/guardrails,/admin/guardrails/violations) - IP国家限制 --具有允许/拒绝国家列表的按关键地理访问控制(ISO 3166-1 alpha-2)——来自反向代理标头的国家代码(
X-Country,CF-IPCountry,可配置),通过CRUD/keys/geo,在门口评估时强制执行,零依赖地理围栏 - 批量暂停/恢复 --已添加
suspend和resume行动POST /keys/bulk--在一个请求中临时禁用或重新激活多个密钥,并对每个操作进行错误处理 - 并发限制器 --每个键和每个工具的飞行请求上限——与速率限制不同,限制同时进行的活动请求,以保护后端免受突发并行性、错误代码的影响
-32005随着Retry-After标头,运行时间可通过以下方式调整GET/POST /admin/concurrency - 流量镜像 -即发即弃请求复制到影子后端,用于a/B测试MCP服务器版本-基于百分比的采样、可配置的超时、对主响应路径的零影响、通过
GET/POST/DELETE /admin/mirror - 工具别名+弃用 --工具重命名符合RFC 8594标准——将旧工具名称映射到新工具名称
Deprecation,Sunset,以及Link标头、防链、每个别名调用计数、CRUDGET/POST/DELETE /admin/tool-aliases - 使用计划 --分层关键策略(免费/专业/企业)——将利率限制、配额、信用乘数和工具ACL捆绑到可重用的模板中,通过以下方式为计划分配密钥
POST /admin/keys/plan,拒绝工具,并返回错误代码-32403,通过CRUDGET/POST/DELETE /admin/plans - 工具输入模式验证 --网关上的每工具JSON模式验证——注册模式以在无效有效负载到达下游之前拒绝它们,零依赖JSON模式子集(类型、必需、枚举、minLength、模式、项目),错误代码
-32602如果有详细的错误,请通过以下方式进行管理GET/POST/DELETE /admin/tools/schema - 金丝雀路线 --主MCP服务器和金丝雀MCP服务器之间的加权流量分流——通过基于百分比的路由(0-100%)实现零停机升级,无偏见
crypto.randomInt决策、每次后端调用/错误跟踪、无需重新启动即可更新权重、通过管理GET/POST/DELETE /admin/canary - 请求/响应转换 --工具调用参数和响应的声明性重写——注入默认值、删除字段、重命名键和模板
{{variables}}从上下文、通配符工具匹配、优先级排序、应用时的深度克隆、导入/导出以进行备份、通过管理GET/POST/PUT/DELETE /admin/transforms - 后端重试策略 --针对瞬态故障,采用指数回退的自动重试方式——可配置的最大重试次数、基本/最大回退、完全抖动、重试预算(冷启动宽限期重试的最大流量百分比)、每个工具的统计数据、可重试的错误模式匹配、通过管理
GET/POST /admin/retry-policy - 自适应速率限制 --基于关键行为的动态速率调整——高错误率自动收紧,良好参与者自动提升,冷却期,可配置阈值,按关键行为跟踪,LRU驱逐,批量评估,通过以下方式管理
GET/POST /admin/adaptive-rates - 请求重复数据删除 --Idempotency层防止代理重试时重复计费--
X-Idempotency-Key带有自动生成回退(SHA-256)的标头、正在进行的请求合并、可配置的TTL窗口、LRU驱逐、信用保存跟踪、通过管理GET/POST/DELETE /admin/dedup - 优先队列 --具有公平调度的分层请求优先级(关键/高/正常/低/后台)——按密钥优先级分配,每层可配置的最大等待时间,通过自动升级防止饥饿,最大队列深度限制,通过
GET/POST /admin/priority-queue - 成本分配标签 --根据请求,通过以下方式进行成本归因
X-Cost-Tags企业按存储容量使用计费的标头(JSON)——按任何标签维度聚合报告、交叉表、CSV导出、每个密钥所需的标签强制、基数限制、通过管理GET/POST/DELETE /admin/cost-tags - IP访问控制 --基于IP的细粒度访问控制,支持CIDR表示法——全局允许/拒绝列表、按密钥IP绑定、可配置违规阈值后的自动阻止、X-Forwarded-For/X-Real-IP可信代理深度、IPv6映射的IPv4规范化、通过
GET/POST/DELETE /admin/ip-access - 请求签名(HMAC-SHA256) --具有重放保护的加密请求身份验证--
X-Signature: t=<ts>,n=<nonce>,s=<sig>标头、带随机数去重的时间戳容差、带旋转的每个密钥签名密钥、定时安全比较、通过管理GET/POST/DELETE /admin/signing - 多租户隔离 -针对平台运营商的全租户隔离-租户利率限制、信用池、使用情况跟踪、API密钥绑定、租户暂停/激活、跨租户报告、可配置限制(10K租户、1K密钥/租户),通过
GET/POST/DELETE /admin/tenants - 请求跟踪 --端到端结构化跟踪,在门、后端和转换阶段进行跨度记录——跟踪/请求ID查找、时序分解(gateMs/backendMs/transformMs)、可配置采样率、保留限制、P95延迟跟踪、JSON导出、通过管理
GET/POST/DELETE /admin/tracing - 预算策略引擎 --具有渐进节流功能的燃烧率监控——每日/每月预算执行、可配置窗口内的信用/分钟燃烧率跟踪、三个操作(警报/节流/拒绝)、每个命名空间和每个密钥目标、预算剩余预测、自动每日/每月重置、通过管理
GET/POST/DELETE /admin/budget-policies - 工具依赖关系图 --基于DAG的工作流验证——注册工具依赖关系、强制执行顺序、故障传播(上游故障块下游)、拓扑排序、循环检测、每个工作流执行跟踪、硬依赖关系与软依赖关系、组范围、通过
GET/POST/DELETE /admin/tool-deps - 配额管理 -每个API密钥的每日/每周/每月严格上限-每任务或全局配额、呼叫或信用指标、突发津贴(临时超限百分比)、三项超限操作(拒绝/警告/节流)、基于UTC的期限边界(每日午夜、每周周一、每月1日)、自动期限展期,通过
GET/POST/DELETE /admin/quota-rules - Webhook重播(DLQ) --失败的webhook交付的死信队列管理——使用完整的请求上下文(URL、标头、正文、HMAC签名)记录失败,重放单个或批量失败的交付,状态跟踪(待定→ 重试→ 成功/耗尽)、可配置的带超时的最大重试次数、按ID或状态清除、基于年龄的过期、通过管理
GET/POST/DELETE /admin/webhook-replay - 配置配置文件 --带有保存/激活/回滚的命名配置预设--配置文件继承链(基本→ 子合并)、SHA-256校验和、用于比较的平面键差分(only InA/only InB/更改/未更改)、使用合并或替换模式导入/导出为JSON、激活历史、循环继承检测、通过管理
GET/POST/DELETE /admin/config-profiles - 计划的报告 --通过webhook交付的自动定期使用、计费、合规性和安全报告——具有UTC周期边界的每日/每周/每月频率、HMAC-SHA256签名的有效载荷、命名空间/组/工具/密钥过滤器、具有交付跟踪的报告生成、可配置的超时、通过
POST /admin/scheduled-reports - 审批工作流 --高成本或敏感工具调用的预执行批准门——三个条件(cost_threshold、带glob的tool_match、带前缀的key_match)、带可配置TTL的未决请求(默认1h)、批准/拒绝/过期生命周期、触发器计数、通过管理
POST /admin/approval-workflows - 网关挂钩 --自定义逻辑的请求前/请求后生命周期挂钩——三个阶段(Pre_gate、Pre_backend、post_backend),四种类型(日志、header_inject、元数据标签、拒绝),基于优先级的执行管道,工具/密钥球过滤,拒绝短路处理,执行计数,通过管理
POST /admin/gateway-hooks - 异常检测 —
GET /admin/anomalies识别异常模式:具有高拒绝率、快速信用耗尽、低剩余信用、严重性评级和详细描述的密钥 - 使用预测 —
GET /admin/forecast通过每个密钥的消耗估计、剩余通话、风险密钥识别、全系统消耗总量和每个工具的成本细分来预测未来的信贷消耗 - 合规报告 —
GET /admin/compliance生成合规就绪报告,其中包含关键治理(到期覆盖率)、访问控制(ACL/IP/支出限制覆盖率),审计跟踪完整性,加权总分和可操作建议 - SLA监控 —
GET /admin/sla跟踪服务级别指标:成功率、按原因划分的拒绝故障、每个工具的可用性和错误率、正常运行时间跟踪、按呼叫量排序 - 容量规划 —
GET /admin/capacity系统容量分析,包括信用消耗率、利用率、顶级消费者、每个命名空间细分和扩展建议 - 关键依赖关系图 —
GET /admin/dependencies工具到关键关系图,包括工具使用流行度、每个工具的唯一关键计数、每个关键工具列表以及使用/未使用的工具标识 - 工具延迟分析 —
GET /admin/latency每个工具的响应时间指标,包括平均/p95/min/最大持续时间、最慢工具排名和每个密钥的延迟细分 - 错误率趋势 —
GET /admin/error-trends拒绝率趋势,包括每个工具的错误率、拒绝原因细分、性能最差的工具和趋势方向 - 信贷流量分析 —
GET /admin/credit-flow信贷流入/流出分析,包括利用率、最高支出者和每种工具的支出明细 - 关键年龄分析 —
GET /admin/key-age密钥年龄分布,包括最旧/最新密钥、年龄段(24h/7d/30d/old)和最近创建的列表 - 命名空间使用情况摘要 —
GET /admin/namespace-usage每个命名空间的使用指标,包括信用分配、支出、呼叫计数和跨命名空间比较 - 审计总结 —
GET /admin/audit-summary审计事件分析,包括类型细分、主要参与者、最近事件和活动摘要 - 集团绩效 —
GET /admin/group-performance按组分析,包括关键计数、信用分配/支出、呼叫量、利用率和策略摘要 - 请求数量趋势 —
GET /admin/request-trends请求量、成功/失败计数、信用支出、平均持续时间和高峰时段识别的每小时时间序列 - 关键状态概述 —
GET /admin/key-status密钥状态仪表板,显示活动/暂停/撤销/过期计数和需要注意的密钥(低信用、接近到期) - Webhook健康 —
GET /admin/webhook-healthwebhook传递健康概述,包括成功率、挂起重试、死信数、暂停状态和缓冲事件 - 消费者洞察 —
GET /admin/consumer-insights对顶级消费者、最活跃的呼叫者、工具多样性和支出模式进行按关键行为分析 - 系统健康评分 —
GET /admin/system-health综合0-100健康评分,包括关键健康、错误率和信用利用率的加权分量细分 - 工具采用 —
GET /admin/tool-adoption每个工具的采用指标,包括唯一消费者、采用率、首次/最后一次出现的时间戳和使用排名 - 信贷效率 —
GET /admin/credit-efficiency信用分配效率,包括燃烧效率、浪费率、过度供应和供应不足的密钥检测 - 访问热图 —
GET /admin/access-heatmap每小时访问模式,包括工具细分、唯一消费者和高峰时段识别 - 关键流失分析 —
GET /admin/key-churn密钥流失指标,包括创建/撤销率、流失率和保留率,以及从未使用过的密钥检测 - 工具相关性 —
GET /admin/tool-correlation工具共现分析,显示哪些工具通常由同一消费者一起使用 - 消费者细分 —
GET /admin/consumer-segmentation将API关键消费者分为功率/常规/临时/休眠细分市场,并使用细分市场指标 - 信用分配 —
GET /admin/credit-distribution具有桶范围和中值计算的活动密钥信用余额直方图 - 响应时间分布 —
GET /admin/response-time-distribution具有延迟桶和p50/p95/p99百分位数的响应时间直方图 - 消费者终身价值 —
GET /admin/consumer-lifetime-value每个消费者的支出分析,包括价值等级、工具多样性和顶级消费者排名 - 工具收入排名 —
GET /admin/tool-revenue根据通话次数、唯一消费者和百分比细分消耗的总积分对工具进行排名 - 消费者保留队列 —
GET /admin/consumer-retention按创建日期、保留率和每个队列的平均支出对消费者进行分组 - 错误分解 —
GET /admin/error-breakdown按原因对拒绝的请求进行分类,包括计数、百分比、受影响的消费者和错误率 - 信贷利用率 —
GET /admin/credit-utilization显示具有利用率带和过度配置检测的活动密钥的利用率百分比 - 命名空间收入 —
GET /admin/namespace-revenue按命名空间划分的收入明细,包括支出、呼叫数、密钥数和百分比明细 - 集团收入 —
GET /admin/group-revenue按关键组划分的收入明细,包括支出、通话次数、关键次数和百分比明细 - 峰值使用时间 —
GET /admin/peak-usage按小时划分的流量模式,包括请求计数、信用、唯一消费者和高峰时段标识 - 消费者活动 —
GET /admin/consumer-activity每个消费者的活动指标,包括通话、支出、剩余信用、上次活动时间和活动/非活动状态 - 工具流行度 —
GET /admin/tool-popularity工具使用受欢迎程度,包括通话次数、信用、唯一消费者、百分比和最受欢迎的工具标识 - 信贷分配汇总 —
GET /admin/credit-allocation跨活动密钥的信用分配,包括级别细分(1-100、101-500、501+)、总计和平均分配 - 每日摘要 —
GET /admin/daily-summary每日汇总请求、花费的积分、新密钥、错误、独特消费者和趋势分析工具 - 关键排名 —
GET /admin/key-ranking活动密钥排行榜,按支出、通话或剩余积分进行排序,可配置排序 - 每小时交通量 —
GET /admin/hourly-traffic每小时的请求计数,包括允许/拒绝的细分、信用、消费者、工具和最繁忙的时间 - 刀具误差率 —
GET /admin/tool-error-rate每个工具的错误率,包括拒绝/允许的计数、错误百分比和整体可靠性指标 - 消费者支出速度 —
GET /admin/consumer-spend-velocity每个消费者的消费率,包括信用/小时、消耗预测和速度排名 - 命名空间活动 —
GET /admin/namespace-activity每个命名空间活动指标,包括多租户可见性的键计数、支出、调用、剩余信用 - 信贷消耗率 —
GET /admin/credit-burn-rate全系统信用消耗率,包括信用/小时、利用率、消耗预测 - 消费者风险评分 —
GET /admin/consumer-risk-score基于利用率和风险水平(低/中/高/关键)的每位消费者风险评分 - 收入预测 —
GET /admin/revenue-forecast预计收入,每小时/每天/每周/每月预测受剩余信用额度的限制 - 系统概述 —
GET /admin/system-overview包含关键计数、信用总额、利用率、活动指标的执行摘要 - 关键健康概述 —
GET /admin/key-health-overview包括利用率、状态级别、健康分布的整体按密钥健康检查 - 命名空间比较 —
GET /admin/namespace-comparison并行命名空间与分配、支出、利用率、领导者的比较 - 消费者增长 —
GET /admin/consumer-growth消费者增长指标,包括年龄、支出率、分配的信贷、新消费者数量 - 工具盈利能力 —
GET /admin/tool-profitability每个工具的盈利能力分析,包括收入、通话次数、每次通话的平均收入、唯一通话者 - 信用浪费分析 —
GET /admin/credit-waste每个关键信用浪费分析,包括利用率指标和浪费百分比 - 小组活动 —
GET /admin/group-activity每组活动指标,包括用于策略模板分析的关键计数、支出、通话、剩余信用 - 配置热重新加载 —
POST /config/reload无需重新启动服务器,即可从配置文件中重新加载定价、费率限制、Webhook、配额和行为标志 - Webhook事件 --将使用事件批处理到任何URL以进行外部计费/警报
- 配置文件模式 --从JSON文件加载所有设置(
--config) - 阴影模式 --在不强制付款的情况下记录所有内容(用于测试)
- 永久存储 --密钥、信用点、管理员密钥和组在重启后仍然有效
--state-file - 零依赖 --没有外部npm包。仅使用Node.js内置。
用法
包装本地MCP服务器(stdio)
# Default: 1 credit per call, 60 calls/min, port 3402
npx paygate-mcp wrap --server "npx @modelcontextprotocol/server-filesystem /tmp"
# Custom pricing and limits
npx paygate-mcp wrap \
--server "python my-server.py" \
--price 2 \
--rate-limit 30 \
--port 8080
# Per-tool pricing
npx paygate-mcp wrap \
--server "node server.js" \
--tool-price "search:1,generate:5,premium_analyze:20"
# Shadow mode (observe without enforcing)
npx paygate-mcp wrap --server "node server.js" --shadow
网关远程MCP服务器(流式HTTP)
屏蔽任何支持以下功能的远程MCP服务器 可流式HTTP传输 (MCP规范2025-03-26):
npx paygate-mcp wrap --remote-url "https://my-mcp-server.example.com/mcp"
# With custom pricing
npx paygate-mcp wrap \
--remote-url "https://api.example.com/mcp" \
--price 5 \
--tool-price "gpt4:20,search:2"
代理处理:
- 通过HTTP POST进行JSON-RPC转发
- SSE(文本/事件流)响应解析
Mcp-Session-Id会话管理- 优雅的会话清理(关闭时HTTP删除)
启动后,您将在控制台中看到您的管理员密钥。保存它。
多服务器模式
将多个MCP服务器封装在单个PayGate实例后面。工具前缀为服务器名称:
npx paygate-mcp wrap --config multi-server.json
示例 multi-server.json:
{
"port": 3402,
"defaultCreditsPerCall": 1,
"servers": [
{
"prefix": "fs",
"serverCommand": "npx",
"serverArgs": ["@modelcontextprotocol/server-filesystem", "/tmp"]
},
{
"prefix": "github",
"remoteUrl": "https://github-mcp.example.com/mcp"
}
]
}
工具以前缀显示: fs:read_file, fs:write_file, github:search_repos等等。定价和ACL对前缀名称起作用:
{
"toolPricing": {
"github:search_repos": { "creditsPerCall": 5 },
"fs:read_file": { "creditsPerCall": 1 }
}
}
所有后台共享信用-一个API密钥适用于所有服务器。
客户端SDK
使用 PayGateClient 使用auto 402重试从TypeScript/Node.js调用工具:
import { PayGateClient, PayGateError } from 'paygate-mcp/client';
const client = new PayGateClient({
url: 'http://localhost:3402',
apiKey: 'pg_abc123...',
autoRetry: true,
onCreditsNeeded: async (info) => {
// Called when credits run out — add credits and return true to retry
await topUpCredits(info.creditsRequired);
return true;
},
});
const tools = await client.listTools();
const result = await client.callTool('search', { query: 'hello' });
const balance = await client.getBalance();
特征:
- 自动402重试:当工具调用返回所需付款时,调用
onCreditsNeeded并重试 - 余额跟踪:
client.lastKnownBalance跟踪来自的学分getBalance()电话 - 键入错误:
PayGateError随着.isPaymentRequired,.isRateLimited,.isExpired助手 - 零依赖:使用内置的Node.js
http/https
创建API密钥
curl -X POST http://localhost:3402/keys \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "my-client", "credits": 100}'
呼叫工具
curl -X POST http://localhost:3402/mcp \
-H "Content-Type: application/json" \
-H "X-API-Key: CLIENT_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "read_file",
"arguments": {"path": "/tmp/test.txt"}
}
}'
充值积分
curl -X POST http://localhost:3402/topup \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "credits": 500}'
检查余额(客户自助服务)
curl http://localhost:3402/balance \
-H "X-API-Key: CLIENT_API_KEY"
返回积分、总花费、呼叫计数和上次使用的时间戳。客户无需管理员权限即可查看自己的余额。
导出使用数据(管理员)
# JSON export
curl http://localhost:3402/usage \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# CSV export (for spreadsheet/billing import)
curl "http://localhost:3402/usage?format=csv" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by date
curl "http://localhost:3402/usage?since=2025-01-01T00:00:00Z" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
返回每次调用的使用事件,包括工具名称、收取的点数和时间戳。API键在输出中被屏蔽。
检查状态
curl http://localhost:3402/status \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
返回活动密钥、使用统计数据、每个工具的细分和拒绝原因。
管理仪表盘
在浏览器中打开web仪表板:
http://localhost:3402/dashboard
用于管理密钥、查看使用情况和监视工具调用的实时管理UI。输入您的管理员密钥进行身份验证。具有每30秒自动刷新、顶级工具图表、活动提要和密钥创建/管理功能。
API 参考
| 端点 | 方法 | 身份验证 | 描述 |
|---|---|---|---|
/mcp |
职位 | X-API-Key 或 Bearer |
JSON-RPC 2.0代理(返回JSON或SSE) |
/mcp |
得到 | X-API-Key 或 Bearer |
SSE通知流(流式HTTP) |
/mcp |
删除 | Mcp-Session-Id |
终止MCP会话 |
/balance |
得到 | X-API-Key |
客户自助服务——检查信用、配额、ACL、到期 |
/keys |
职位 | X-Admin-Key |
创建API密钥(包含ACL、过期、配额、信用) |
/keys |
得到 | X-Admin-Key |
列出所有密钥(掩码,带过期状态) |
/topup |
职位 | X-Admin-Key |
为现有密钥添加点数 |
/keys/transfer |
职位 | X-Admin-Key |
在API密钥之间转移信用 |
/keys/bulk |
职位 | X-Admin-Key |
在一个请求中执行多个关键操作(创建、充值、撤销) |
/keys/export |
得到 | X-Admin-Key |
导出用于备份/迁移的所有API密钥(JSON或CSV) |
/keys/import |
职位 | X-Admin-Key |
从备份导入API密钥并解决冲突 |
/keys/revoke |
职位 | X-Admin-Key |
永久吊销API密钥 |
/keys/suspend |
职位 | X-Admin-Key |
暂时挂起钥匙(可逆) |
/keys/resume |
职位 | X-Admin-Key |
恢复挂起的密钥 |
/keys/clone |
职位 | X-Admin-Key |
克隆密钥(新密钥、相同配置、新计数器) |
/keys/usage |
得到 | X-Admin-Key |
按密钥使用情况细分(按工具、时间序列、拒绝原因) |
/keys/rotate |
职位 | X-Admin-Key |
旋转键(新键,相同学分/ACL/配额) |
/keys/acl |
职位 | X-Admin-Key |
在密钥上设置工具ACL(白名单/黑名单) |
/keys/expiry |
职位 | X-Admin-Key |
设置或删除密钥过期(TTL) |
/keys/quota |
职位 | X-Admin-Key |
设置使用配额(每日/每月限制) |
/keys/tags |
职位 | X-Admin-Key |
设置关键标签/元数据(合并语义) |
/keys/ip |
职位 | X-Admin-Key |
设置IP分配列表(CIDR+完全匹配) |
/keys/search |
职位 | X-Admin-Key |
按标签值搜索关键字 |
/keys/auto-topup |
职位 | X-Admin-Key |
配置或禁用密钥的自动充值 |
/admin/keys |
得到 | X-Admin-Key (super_admin) |
列出所有管理员密钥(掩码) |
/admin/keys |
职位 | X-Admin-Key (super_admin) |
创建具有角色的新管理员密钥 |
/admin/keys/revoke |
职位 | X-Admin-Key (super_admin) |
撤销管理员密钥 |
/limits |
职位 | X-Admin-Key |
设置密钥的支出限制 |
/usage |
得到 | X-Admin-Key |
导出使用数据(JSON或CSV) |
/status |
得到 | X-Admin-Key |
带有使用统计数据的完整仪表板 |
/dashboard |
GET | 无(浏览器中的管理员键) | 实时管理员web仪表板 |
/stripe/checkout |
职位 | X-API-Key |
创建Stripe结账会话以进行信用购买 |
/stripe/packages |
GET | 无 | 列出可用的信用包(公共,利率有限) |
/stripe/webhook |
POST | 条纹签名 | 付款时自动充值信用 |
/admin/backup |
得到 | X-Admin-Key |
将完整服务器状态导出为版本化的JSON快照 |
/admin/restore |
职位 | X-Admin-Key |
从备份导入状态(合并/覆盖/完整模式) |
/admin/cache |
得到 | X-Admin-Key |
响应缓存统计数据(条目、命中率、未命中率、命中率) |
/admin/cache |
删除 | X-Admin-Key |
清除缓存(全部或 ?tool= 过滤器) |
/admin/circuit |
得到 | X-Admin-Key |
断路器状态(状态、故障、拒收) |
/admin/circuit |
职位 | X-Admin-Key |
将断路器重置为闭合状态 |
/admin/compliance/export |
得到 | X-Admin-Key |
合规审计导出(SOC 2/GDPR/HIPAA、JSON/CSV) |
/keys/webhook |
职位 | X-Admin-Key |
按键设置webhook URL |
/keys/webhook |
得到 | X-Admin-Key |
获取每个键的webhook状态 |
/keys/webhook |
删除 | X-Admin-Key |
删除每个键的webhook URL |
/.well-known/oauth-authorization-server |
GET | 无 | OAuth 2.1服务器元数据 |
/oauth/register |
POST | 无 | 动态客户端注册(RFC 7591) |
/oauth/authorize |
GET | 无 | 授权端点(需要PKCE) |
/oauth/token |
POST | 无 | 令牌端点(代码交换+刷新) |
/oauth/revoke |
POST | 无 | 令牌撤销(RFC 7009) |
/oauth/clients |
得到 | X-Admin-Key |
列出已注册的OAuth客户端 |
/.well-known/mcp-payment |
GET | 无 | 服务器支付元数据(2007年9月) |
/.well-known/mcp.json |
GET | 无 | MCP服务器身份证(发现) |
/pricing |
GET | 无 | 每个工具的完整定价明细 |
/openapi.json |
GET | 无 | OpenAPI 3.1规范(所有199+端点) |
/docs |
GET | None | 交互式API文档(Swagger UI) |
/robots.txt |
GET | None | 爬虫指令(允许公共,不允许管理员/密钥) |
/portal |
GET | None | Self-service API密钥门户(浏览器UI,通过X-API-key提示进行身份验证) |
/ready |
GET | 无 | 准备就绪探头(准备就绪时为200,排水/维护时为503) |
/metrics |
GET | 无 | 普罗米修斯指标(计数器、仪表、正常运行时间) |
/analytics |
得到 | X-Admin-Key |
使用分析(时间序列、工具细分、趋势) |
/alerts |
得到 | X-Admin-Key |
使用待处理的警报 |
/alerts |
职位 | X-Admin-Key |
配置警报规则 |
/teams |
得到 | X-Admin-Key |
列出所有团队 |
/teams |
职位 | X-Admin-Key |
创建团队(名称、预算、配额、标签) |
/teams/update |
职位 | X-Admin-Key |
更新团队设置 |
/teams/delete |
职位 | X-Admin-Key |
删除(停用)团队 |
/teams/assign |
职位 | X-Admin-Key |
将API密钥分配给团队 |
/teams/remove |
职位 | X-Admin-Key |
从团队中删除API密钥 |
/teams/usage |
得到 | X-Admin-Key |
团队使用情况总结及成员细分 |
/tokens |
职位 | X-Admin-Key |
创建一个作用域令牌(短期、工具受限) |
/tokens/revoke |
职位 | X-Admin-Key |
撤销作用域令牌(通过完整令牌字符串) |
/tokens/revoked |
得到 | X-Admin-Key |
列出所有已撤销的令牌条目 |
/namespaces |
得到 | X-Admin-Key |
列出所有具有密钥/信用/支出统计信息的命名空间 |
/audit |
得到 | X-Admin-Key |
查询审核日志(按类型、参与者、时间筛选) |
/audit/export |
得到 | X-Admin-Key |
导出完整审计日志(JSON或CSV) |
/audit/stats |
得到 | X-Admin-Key |
审计日志统计 |
/plugins |
得到 | X-Admin-Key |
列出带有钩子信息的已注册插件 |
/groups |
得到 | X-Admin-Key |
列出所有关键组(策略模板) |
/groups |
职位 | X-Admin-Key |
创建具有共享策略的密钥组 |
/groups/update |
职位 | X-Admin-Key |
更新组策略 |
/groups/delete |
职位 | X-Admin-Key |
删除(停用)组 |
/groups/assign |
职位 | X-Admin-Key |
将API密钥分配给组 |
/groups/remove |
职位 | X-Admin-Key |
从组中删除API密钥 |
/webhooks/filters |
得到 | X-Admin-Key |
列出所有webhook过滤规则 |
/webhooks/filters |
职位 | X-Admin-Key |
创建webhook筛选规则 |
/webhooks/filters/update |
职位 | X-Admin-Key |
更新webhook筛选规则 |
/webhooks/filters/delete |
职位 | X-Admin-Key |
删除webhook筛选规则 |
/webhooks/replay |
职位 | X-Admin-Key |
回放死信webhook事件(全部或按索引) |
/webhooks/test |
职位 | X-Admin-Key |
将测试事件发送到配置的webhook URL(同步) |
/webhooks/log |
得到 | X-Admin-Key |
带有状态、时间和过滤器的Webhook传递日志 |
/webhooks/pause |
职位 | X-Admin-Key |
暂停webhook传递(事件缓冲,直到恢复) |
/webhooks/resume |
职位 | X-Admin-Key |
恢复webhook传递和刷新缓冲事件 |
/keys/alias |
职位 | X-Admin-Key |
为API键设置或清除可供人员使用的别名 |
/keys/expiring |
得到 | X-Admin-Key |
列出在时间窗口内过期的密钥(?within=86400 秒) |
/keys/templates |
得到 | X-Admin-Key |
列出所有关键模板 |
/keys/templates |
职位 | X-Admin-Key |
创建或更新密钥模板 |
/keys/templates/delete |
职位 | X-Admin-Key |
删除密钥模板 |
/config/reload |
职位 | X-Admin-Key |
热重载配置文件(定价、费率限制、webhooks、配额) |
/health |
GET | 无 | 健康检查(状态、正常运行时间、版本、运行中、Redis/webhook状态) |
/ |
GET | 无 | 根端点(端点列表) |
免费方法
这些MCP方法无需授权或计费即可通过:
initialize, initialized, ping, tools/list, resources/list, prompts/list
门控方法: tools/call (单), tools/call_batch (批处理——全部或全部计费,并行执行)。看 批处理工具调用.
命令行命令
paygate-mcp wrap [options] # Start a payment-gated MCP proxy
paygate-mcp init [--output] [--force] # Interactive setup wizard
paygate-mcp validate --config <path> # Validate config without starting
paygate-mcp completions <bash|zsh|fish> # Generate shell completions
paygate-mcp version [--json] # Print version
壳牌完井
# Bash
paygate-mcp completions bash > ~/.local/share/bash-completion/completions/paygate-mcp
# Zsh
paygate-mcp completions zsh > ~/.zfunc/_paygate-mcp
# Add to .zshrc: fpath=(~/.zfunc $fpath) && compinit
# Fish
paygate-mcp completions fish > ~/.config/fish/completions/paygate-mcp.fish
机器可读输出
# Version as JSON (for CI/CD)
paygate-mcp version --json
# → {"version":"10.3.0"}
# Validate config with structured output
paygate-mcp validate --config paygate.json --json
# → {"valid":true,"diagnostics":[...],"errors":0,"warnings":0}
CLI选项
--server <cmd> MCP server command to wrap via stdio
--remote-url <url> Remote MCP server URL (Streamable HTTP transport)
--port <n> HTTP port (default: 3402)
--price <n> Default credits per tool call (default: 1)
--rate-limit <n> Max calls/min per key (default: 60, 0=unlimited)
--name <s> Server display name
--shadow Shadow mode — log without enforcing payment
--admin-key <s> Set admin key (default: auto-generated)
--tool-price <t:n> Per-tool price (e.g. "search:5,generate:10")
--import-key <k:c> Import existing key with credits (e.g. "pg_abc:100")
--state-file <path> Persist keys/credits to a JSON file (survives restarts)
--stripe-secret <s> Stripe webhook signing secret (enables /stripe/webhook)
--webhook-url <url> POST batched usage events to this URL
--webhook-secret <s> HMAC-SHA256 secret for signing webhook payloads
--refund-on-failure Refund credits when downstream tool call fails
--redis-url <url> Redis URL for distributed state (e.g. "redis://localhost:6379")
--config <path> Load settings from a JSON config file
--discovery <mode> Tool discovery mode: static (default) or dynamic
--json Machine-readable JSON output
注: 使用
--server或--remote-url对于单服务器模式。使用servers在多服务器模式的配置文件中。
动态工具发现
对于具有许多工具的服务器,动态发现模式通过公开3个元工具而不是完整的工具列表来减少代理上下文窗口的膨胀:
npx paygate-mcp wrap --server "your-server" --discovery dynamic
代理人看到3个工具: paygate_list_tools (分页列表), paygate_search_tools (关键字搜索),以及 paygate_call_tool (代理任何工具)。这将上下文窗口中的N个工具减少到3个,同时保留了全部功能。
永久存储
添加 --state-file 将API密钥和信用保存到磁盘。数据在服务器重启后仍然有效。
npx paygate-mcp wrap --server "your-mcp-server" --state-file ~/.paygate/state.json
条纹集成
连接Stripe可在客户付款时自动充值积分:
npx paygate-mcp wrap \
--server "your-mcp-server" \
--state-file ~/.paygate/state.json \
--stripe-secret "whsec_your_stripe_webhook_secret"
设置:
- 使用元数据创建条纹结账会话:
paygate_api_key-客户的API密钥(例如。pg_abc123...)paygate_credits--在付款时增加信用(例如。500)
- 将您的Stripe webhook指向
https://your-server/stripe/webhook - 订阅
checkout.session.completed和invoice.payment_succeeded事件
当客户完成付款时,信用将自动添加到他们的API密钥中。订阅在每个计费周期自动续订积分。
安全:
- HMAC-SHA256签名验证(Stripe的v1方案)
- 定时安全比较,防止定时攻击
- 5分钟时间戳容差,防止重放攻击
- 付款状态验证(仅限
paid触发信用) - 零依赖——使用内置的Node.js
crypto
每个工具ACL(访问控制)
控制每个API密钥可以访问哪些工具:
# Create a key that can only access search and read tools
curl -X POST http://localhost:3402/keys \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "limited-client", "credits": 100, "allowedTools": ["search", "read_file"]}'
# Create a key with specific tools blocked
curl -X POST http://localhost:3402/keys \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "safe-client", "credits": 100, "deniedTools": ["delete_file", "admin_reset"]}'
# Update ACL on an existing key
curl -X POST http://localhost:3402/keys/acl \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "allowedTools": ["search"], "deniedTools": ["admin"]}'
- 允许的工具 (白名单):只有这些工具是可访问的。空=所有工具。
- 拒绝工具 (黑名单):这些工具总是被拒绝。在允许的工具后使用。
- ACL也过滤
tools/list--客户只能看到他们允许的工具。
每工具速率限制
为每个工具设置独立的速率限制(在全局限制之上):
{
"toolPricing": {
"expensive_analyze": { "creditsPerCall": 10, "rateLimitPerMin": 5 },
"search": { "creditsPerCall": 1, "rateLimitPerMin": 30 },
"cheap_read": { "creditsPerCall": 1 }
}
}
每个API密钥独立执行Per-tool限制。一个密钥在访问其他工具时,可以在一个工具上进行速率限制。全球 --rate-limit 适用于所有工具。
密钥过期(TTL)
创建自动导出的API密钥:
# Create a key that expires in 1 hour (3600 seconds)
curl -X POST http://localhost:3402/keys \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "trial-user", "credits": 50, "expiresIn": 3600}'
# Create a key with a specific expiry date
curl -X POST http://localhost:3402/keys \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "quarterly", "credits": 1000, "expiresAt": "2026-06-01T00:00:00Z"}'
# Set or extend expiry on an existing key
curl -X POST http://localhost:3402/keys/expiry \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "expiresIn": 86400}'
# Remove expiry (key never expires)
curl -X POST http://localhost:3402/keys/expiry \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "expiresAt": null}'
过期的密钥返回清除 api_key_expired 错误。管理员可以随时延长或删除到期时间。
贷记转账
API密钥之间的原子传输信用:
curl -X POST http://localhost:3402/keys/transfer \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{ "from": "pg_source_key", "to": "pg_dest_key", "credits": 500, "memo": "Monthly allocation" }'
答复:
{
"transferred": 500,
"from": { "keyMasked": "pg_sour...key1", "balance": 500 },
"to": { "keyMasked": "pg_dest...key2", "balance": 700 },
"memo": "Monthly allocation",
"message": "Transferred 500 credits"
}
验证: 这两个密钥都必须存在,处于活动状态(未被撤销/过期),并且源必须具有足够的信用。分数学分被降为整数。自助转账被拒绝。
审计跟踪: 每次传输都会记录一个 key.credits_transferred 使用掩码键、金额、余额和备忘录的审计事件。
批量密钥操作
在单个请求中执行多个关键操作(创建、充值、撤销)。失败的操作不会阻止后续的操作——每个结果都包括成功状态和索引,以便于关联。
curl -X POST http://localhost:3402/keys/bulk \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "action": "create", "name": "api-key-1", "credits": 500, "tags": { "env": "prod" } },
{ "action": "create", "name": "api-key-2", "credits": 200 },
{ "action": "topup", "key": "pg_existing_key", "credits": 1000 },
{ "action": "revoke", "key": "pg_old_key" }
]
}'
答复:
{
"total": 4,
"succeeded": 4,
"failed": 0,
"results": [
{ "index": 0, "action": "create", "success": true, "result": { "key": "pg_abc...", "name": "api-key-1", "credits": 500 } },
{ "index": 1, "action": "create", "success": true, "result": { "key": "pg_def...", "name": "api-key-2", "credits": 200 } },
{ "index": 2, "action": "topup", "success": true, "result": { "creditsAdded": 1000, "newBalance": 1500 } },
{ "index": 3, "action": "revoke", "success": true, "result": { "message": "Key revoked" } }
]
}
行动: create (可选名称、学分、标签、命名空间、allowdTools、deniedTools), topup (关键+学分), revoke (关键)。未知操作在不停止批处理的情况下返回错误结果。
限制: 每个请求最多100个操作。空操作数组返回400。
审计跟踪: 每个成功的操作都会记录一个带有“(批量)”后缀的单独审计事件。
关键导入/导出
导出所有API密钥,以便在PayGate实例之间进行备份或迁移:
# Export as JSON (includes full key secrets)
curl http://localhost:3402/keys/export \
-H "X-Admin-Key: $ADMIN_KEY" \
-o paygate-keys-backup.json
# Export as CSV
curl "http://localhost:3402/keys/export?format=csv" \
-H "X-Admin-Key: $ADMIN_KEY" \
-o paygate-keys-backup.csv
# Export only active keys in a specific namespace
curl "http://localhost:3402/keys/export?activeOnly=true&namespace=production" \
-H "X-Admin-Key: $ADMIN_KEY"
将密钥导入PayGate实例:
curl -X POST http://localhost:3402/keys/import \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"keys": [{ "key": "pg_abc123...", "name": "my-key", "credits": 500, "active": true, "tags": {} }],
"mode": "skip"
}'
答复:
{
"total": 1,
"imported": 1,
"overwritten": 0,
"skipped": 0,
"errors": 0,
"mode": "skip",
"results": [{ "key": "pg_abc123...", "name": "my-key", "status": "imported" }]
}
冲突模式: skip (默认)--跳过已经存在的键, overwrite --替换现有密钥, error --重复密钥失败。
限制: 每个导入请求最多1000个密钥。密钥必须以开头 pg_ 前缀。
导出格式: JSON(包含所有字段的完整记录)或CSV(电子表格使用的关键子集)。
支出限额
限制任何API密钥可以花费的总信用:
# Set a spending limit on a key (admin only)
curl -X POST http://localhost:3402/limits \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "spendingLimit": 500}'
# Check remaining budget
curl http://localhost:3402/balance -H "X-API-Key: CLIENT_API_KEY"
# → { "spendingLimit": 500, "remainingBudget": 350, ... }
集 spendingLimit 到 0 无限制。当一个键达到其极限时,工具调用将被拒绝,并显示一个明显的错误。
失败退款
当下游工具调用失败时自动返回积分:
npx paygate-mcp wrap --server "node server.js" --refund-on-failure
在工具调用之前扣除积分。如果包装好的服务器返回错误,则退还积分 totalSpent / totalCalls 被回滚。防止因操作失败而向用户收费。
Webhook事件
将使用事件POST到任何外部URL以进行计费、警报或分析:
npx paygate-mcp wrap --server "node server.js" --webhook-url "https://billing.example.com/events"
事件被分批处理(每次POST最多10个),每5秒刷新一次。每个事件包括工具名称、收取的信用、API密钥和时间戳。
重试队列和死信
失败的webhook交付将以指数回退方式重试(1秒、2秒、4秒、8秒、16秒——最多可配置为 --webhook-retries 尝试)。在所有重试尝试结束后,事件将移动到死信队列供管理员检查。
# Custom max retries (default: 5)
npx paygate-mcp wrap --server "node server.js" \
--webhook-url "https://billing.example.com/events" \
--webhook-retries 10
管理端点:
| 端点 | 方法 | 描述 |
|---|---|---|
/webhooks/stats |
GET | 传递统计信息(已传递、失败、等待重试、死信) |
/webhooks/dead-letter |
GET | 列出永久失败的交付及其错误详细信息 |
/webhooks/dead-letter |
DELETE | 清除死信队列 |
/webhooks/replay |
POST | 重播死信事件(全部或按索引) |
重试尝试包括 X-PayGate-Retry 带有可观察性尝试号的标头。
Webhook事件回放
从死信队列中回放永久失败的webhook事件:
# Replay all dead letter entries
curl -X POST http://localhost:3402/webhooks/replay \
-H "X-Admin-Key: $ADMIN_KEY"
# Replay specific entries by index
curl -X POST http://localhost:3402/webhooks/replay \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{ "indices": [0, 2, 5] }'
重播的条目将从死信队列中删除,并重新排队等待新的投递(尝试计数器重置为0)。如果传递再次失败,它们将遵循正常的重试/死信流程。
Webhook签名(HMAC-SHA256)
对webhook有效负载进行签名以进行防篡改交付:
npx paygate-mcp wrap --server "node server.js" \
--webhook-url "https://billing.example.com/events" \
--webhook-secret "whsec_your_secret_here"
当 --webhook-secret 设置后,每个webhook POST都包含一个 X-PayGate-Signature 头球
X-PayGate-Signature: t=1709123456,v1=a1b2c3d4...
验证签章 (Node.js示例):
import { WebhookEmitter } from 'paygate-mcp';
const signature = req.headers['x-paygate-signature'];
const [tPart, v1Part] = signature.split(',');
const timestamp = tPart.split('=')[1];
const sig = v1Part.split('=')[1];
// Reconstruct signed payload: timestamp.body
const signedPayload = `${timestamp}.${rawBody}`;
const isValid = WebhookEmitter.verify(signedPayload, sig, 'whsec_your_secret_here');
签名涵盖 timestamp.body 以防止重放攻击。使用定时安全比较(内置于 WebhookEmitter.verify).
管理员生命周期事件
启用webhook后,管理员操作还会触发webhook事件:
| 事件类型 | 触发器 | 元数据 |
|---|---|---|
key.created |
POST/keys | 密钥掩码、姓名、点数 |
key.topup |
POST/充值 | 密钥屏蔽,添加信用,newBalance |
key.revoked |
POST/密钥/撤销 | 密钥掩码 |
key.rotated |
POST/按键/旋转 | 旧KeyMasked,新KeyMasked |
key.expired |
闸门评估 | keyMasked |
alert.fired |
门评估 | alertType、keyPrefix、消息、值、阈值 |
team.created |
POST/团队 | 团队ID、名称、预算 |
team.updated |
POST/团队/更新 | teamId,更改 |
team.deleted |
POST/团队/删除 | teamId |
team.key_assigned |
POST/团队/分配 | teamId,keyMasked |
team.key_removed |
POST/teams/remove | teamId,keyMasked |
管理员事件出现在 adminEvents webhook有效负载数组(与使用情况分开 events).这两个数组可以存在于同一批中。
Webhook筛选器(事件路由)
根据事件类型和API密钥前缀将webhook事件路由到不同的目的地。每个筛选规则都使用独立的重试队列、死信队列和可选的签名密钥将匹配的事件路由到自己的URL。
创建筛选规则:
curl -X POST http://localhost:3402/webhooks/filters \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "production-alerts",
"events": ["key.created", "key.revoked", "alert.fired"],
"url": "https://alerts.example.com/webhook",
"secret": "whsec_alerts_secret",
"keyPrefixes": ["pk_prod_"],
"active": true
}'
列表筛选器:
curl http://localhost:3402/webhooks/filters -H "X-Admin-Key: $ADMIN_KEY"
更新筛选器:
curl -X POST http://localhost:3402/webhooks/filters/update \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{ "id": "wf_abc123", "active": false }'
删除筛选器:
curl -X POST http://localhost:3402/webhooks/filters/delete \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{ "id": "wf_abc123" }'
筛选规则:
events--要匹配的事件类型数组(精确匹配或"*"所有事件的通配符)keyPrefixes-API密钥前缀的可选阵列(例如。,["pk_prod_"]).只有当关联的键以这些前缀之一开头时,事件才会匹配。省略所有按键。url--匹配事件的目标URL(每个唯一的URL都有自己的重试队列)secret--此目标的可选HMAC-SHA256签名密钥active--启用/禁用筛选器而不删除它
路由行为:
- 将与筛选器规则匹配的事件发送到筛选器的目标URL
- 默认的webhook URL(如果已配置)始终接收所有事件(向后兼容)
- 多个过滤器可以匹配同一事件——它被发送到所有匹配的目的地
- 路由过程中跳过非活动筛选器
配置文件:
{
"webhookUrl": "https://billing.example.com/events",
"webhookFilters": [
{
"name": "production-alerts",
"events": ["key.created", "key.revoked", "alert.fired"],
"url": "https://alerts.example.com/webhook",
"keyPrefixes": ["pk_prod_"]
}
]
}
统计数据: GET /webhooks/stats 包括所有筛选器目标以及默认端点的每个URL传递统计信息。
使用配额
根据API键设置每日或每月使用限制:
# Create a key with 10 calls/day, 200 calls/month
curl -X POST http://localhost:3402/keys \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "metered-user", "credits": 1000, "quota": {"dailyCallLimit": 10, "monthlyCallLimit": 200}}'
# Set credit-based quotas (max 50 credits/day)
curl -X POST http://localhost:3402/keys/quota \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "dailyCreditLimit": 50}'
# Remove per-key quota (fall back to global defaults)
curl -X POST http://localhost:3402/keys/quota \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "CLIENT_API_KEY", "remove": true}'
配额类型: dailyCallLimit, monthlyCallLimit, dailyCreditLimit, monthlyCreditLimit。设置为0表示无限制。计数器在UTC午夜(每天)和UTC月边界(每月)重置。在配置文件中设置全局默认值 globalQuota.
动态定价
根据输入参数大小收取额外积分:
{
"toolPricing": {
"analyze_text": { "creditsPerCall": 2, "creditsPerKbInput": 5 },
"search": { "creditsPerCall": 1 }
}
}
对于 analyze_text,3 KB的输入将花费 2 + ceil(3 × 5) = 17 信用。小输入四舍五入至少为1KB。无工具 creditsPerKbInput 使用固定基础价格。
OAuth 2.1
MCP客户端的完整OAuth 2.1授权服务器。实现PKCE、动态客户端注册、令牌刷新和撤销。
在配置中启用OAuth:
{
"oauth": {
"accessTokenTtl": 3600,
"refreshTokenTtl": 2592000,
"scopes": ["tools:*", "tools:read", "tools:write"]
}
}
全流量:
# 1. Register an OAuth client
curl -X POST http://localhost:3402/oauth/register \
-H "Content-Type: application/json" \
-d '{"client_name": "My Agent", "redirect_uris": ["http://localhost:8080/callback"], "api_key": "pg_..."}'
# 2. Generate PKCE challenge (code_verifier → SHA256 → base64url)
# 3. Authorize: GET /oauth/authorize?response_type=code&client_id=...&redirect_uri=...&code_challenge=...&code_challenge_method=S256
# 4. Exchange code for tokens
curl -X POST http://localhost:3402/oauth/token \
-H "Content-Type: application/json" \
-d '{"grant_type": "authorization_code", "code": "...", "client_id": "...", "redirect_uri": "...", "code_verifier": "..."}'
# 5. Use Bearer token on /mcp
curl -X POST http://localhost:3402/mcp \
-H "Authorization: Bearer pg_at_..." \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "search", "arguments": {"query": "hello"}}}'
# 6. Refresh token
curl -X POST http://localhost:3402/oauth/token \
-d '{"grant_type": "refresh_token", "refresh_token": "pg_rt_...", "client_id": "..."}'
OAuth令牌由API密钥支持-每个令牌映射到一个API密钥以进行计费。这 /mcp 端点接受两者 X-API-Key 和 Authorization: Bearer 标题。
SSE流媒体(MCP流媒体HTTP)
PayGate实现了具有SSE支持的完整MCP流式HTTP传输:
# POST /mcp with SSE response (add Accept header)
curl -N -X POST http://localhost:3402/mcp \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-H "X-API-Key: YOUR_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"analyze","arguments":{}}}'
# Response: SSE stream with event: message + data: {jsonrpc response}
# GET /mcp — Open SSE notification stream
curl -N http://localhost:3402/mcp \
-H "Accept: text/event-stream" \
-H "Mcp-Session-Id: mcp_sess_..."
# Receives server-initiated notifications as SSE events
# DELETE /mcp — Terminate session
curl -X DELETE http://localhost:3402/mcp \
-H "Mcp-Session-Id: mcp_sess_..."
会话管理:
- 岗位
/mcp响应包括Mcp-Session-Id头球 - 客户端通过发送来重用会话
Mcp-Session-Id后续请求 - 获取
/mcp为服务器到客户端的通知打开一个长期的SSE连接 - 删除
/mcp终止会话并关闭所有SSE连接 - 会话在30分钟不活动后自动过期
运输方式:
POST /mcp没有Accept: text/event-stream→ 标准JSON响应(向后兼容)POST /mcp随着Accept: text/event-stream→ SSE封装JSON-RPC响应GET /mcp随着Accept: text/event-stream→ 长期通知流
审计日志
每一项重要操作都记录在结构化的审计跟踪中:
# Query audit events (with filtering)
curl http://localhost:3402/audit?types=key.created,gate.deny&limit=50 \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Export full audit log as CSV
curl http://localhost:3402/audit/export?format=csv \
-H "X-Admin-Key: YOUR_ADMIN_KEY" > audit.csv
# Get audit statistics
curl http://localhost:3402/audit/stats \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
跟踪事件: key.created, key.revoked, key.topup, key.acl_updated, key.expiry_updated, key.quota_updated, key.limit_updated, key.tags_updated, key.ip_updated, gate.allow, gate.deny, session.created, session.destroyed, oauth.client_registered, oauth.token_issued, oauth.token_revoked, admin.auth_failed, admin.alerts_configured, billing.refund, team.created, team.updated, team.deleted, team.key_assigned, team.key_removed.
保留: 环形缓冲区(默认10000个事件)、基于年龄的清理(默认30天)、自动定期执行。
注册/发现(代理可发现定价)
AI代理可以在调用工具之前以编程方式发现服务器的定价和支付要求。与2007年9月(MCP付款规范草案)一致。
# Discover server payment metadata (public, no auth)
curl http://localhost:3402/.well-known/mcp-payment
# → { "specVersion": "2007-draft", "billingModel": "credits", "defaultCreditsPerCall": 1, ... }
# Get full pricing breakdown (public, no auth)
curl http://localhost:3402/pricing
# → { "server": {...}, "tools": [{ "name": "search", "creditsPerCall": 5, "pricingModel": "dynamic" }, ...] }
它是如何工作的:
/.well-known/mcp-payment--服务器级支付元数据(计费模型、身份验证方法、错误代码)/pricing--每个工具的完整定价明细,包括覆盖tools/list回应包括_pricing每个工具的元数据(creditsPerCall、pricingModel、rateLimitPerMin)-32402错误响应包括定价细节,以便代理知道如何负担得起该工具
两个发现端点都是 公共 (不需要身份验证),因此代理可以在获取API密钥之前检查定价。
普罗米修斯指标
使用任何兼容Prometheus的监控系统监控您的PayGate服务器:
curl http://localhost:3402/metrics
以标准Prometheus文本展示格式返回指标:
# HELP paygate_tool_calls_total Total tool calls processed
# TYPE paygate_tool_calls_total counter
paygate_tool_calls_total{status="allowed",tool="search"} 42
paygate_tool_calls_total{status="denied",tool="premium"} 3
# HELP paygate_credits_charged_total Total credits charged
# TYPE paygate_credits_charged_total counter
paygate_credits_charged_total{tool="search"} 210
# HELP paygate_active_keys_total Number of active (non-revoked) API keys
# TYPE paygate_active_keys_total gauge
paygate_active_keys_total 5
# HELP paygate_uptime_seconds Server uptime in seconds
# TYPE paygate_uptime_seconds gauge
paygate_uptime_seconds 3600
可用指标:
paygate_tool_calls_total{tool,status}--工具调用(允许/拒绝)paygate_credits_charged_total{tool}--按工具收取的积分paygate_denials_total{reason}--理由拒绝(信用不足、利率受限等)paygate_rate_limit_hits_total{tool}--每个工具的点击率限制paygate_refunds_total{tool}--每个工具的信用退款paygate_http_requests_total{method,path,status}--HTTP请求paygate_active_keys_total-活动API键(仪表)paygate_active_sessions_total--活动MCP会话(仪表)paygate_total_credits_available--所有密钥的总学分(衡量标准)paygate_uptime_seconds--服务器正常运行时间(仪表)
这 /metrics 端点是 公共 (无需身份验证),便于普罗米修斯抓取。
密钥克隆
使用与现有密钥相同的配置创建一个新的API密钥,但使用新计数器。非常适合为团队成员、临时环境或批量密钥创建提供类似密钥:
# Clone with same config and credits
curl -X POST http://localhost:3402/keys/clone \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_source..."}'
# → { "message": "Key cloned", "key": "pg_newkey...", "name": "source-clone", "credits": 200, ... }
# Clone with overrides
curl -X POST http://localhost:3402/keys/clone \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_source...", "name": "staging-key", "credits": 50, "namespace": "staging"}'
什么被克隆: allowdTools、deniedTools、expiresAt、配额、标记、ipAllowlist、命名空间、组、spendingLimit、autoTopup配置。 重置内容: totalSpend、totalCalls、lastUsedAt、每日通话、挂起状态。您可以覆盖 name, credits, tags,以及 namespace 在克隆请求中。可以克隆已挂起和过期的密钥(但不能复制已吊销的密钥)。
关键点旋转
在不丢失信用、ACL、配额或开支限制的情况下旋转API密钥:
curl -X POST http://localhost:3402/keys/rotate \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_oldkey..."}'
# → { "message": "Key rotated", "newKey": "pg_newkey...", "name": "my-key", "credits": 500 }
旧密钥立即失效。所有状态(信用、总花费、总调用、ACL、配额、到期、支出限制)都转移到新密钥。将其用于定期密钥轮换策略、受损密钥响应或密钥迁移。
关键暂停和恢复
暂时禁用API密钥而不永久吊销它。挂起的密钥在门口被拒绝(key_suspended 原因),但管理操作(充值、ACL、配额、标签等)仍然有效——这使其成为调查滥用、暂停计费或临时锁定的理想选择:
# Suspend a key (with optional reason for audit trail)
curl -X POST http://localhost:3402/keys/suspend \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_abc123...", "reason": "investigating abuse"}'
# → { "message": "Key suspended", "suspended": true }
# Resume a suspended key
curl -X POST http://localhost:3402/keys/resume \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_abc123..."}'
# → { "message": "Key resumed", "suspended": false }
暂停与撤销:
- 暂停 --可逆。钥匙仍然有效,但在门口被拒绝。管理操作仍然有效。用于临时锁定。
- 撤销 --永久。密钥已停用,无法恢复。用于泄露或停用的密钥。
悬架火灾 key.suspended 和 key.resumed 审计事件和webhook通知。阴影模式允许挂起的按键通过( shadow:key_suspended 原因)进行测试。
按密钥使用
获取特定API密钥的详细使用情况细分-每小时统计数据、每小时时间序列、拒绝原因和最近事件:
# Get full usage for a key
curl http://localhost:3402/keys/usage?key=pg_abc123... \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by time (ISO 8601)
curl "http://localhost:3402/keys/usage?key=pg_abc123...&since=2025-01-01T00:00:00Z" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复包括:
| 字段 | 描述 |
|---|---|
key |
屏蔽API密钥(前10个字符+ ...) |
name |
密钥名称 |
credits |
当前信用余额 |
active / suspended |
关键状态 |
totalCalls |
进行的工具调用总数 |
totalAllowed / totalDenied |
允许与拒绝细分 |
totalCreditsSpent |
消耗的总积分 |
perTool |
按工具细分: { calls, credits, denied } |
denyReasons |
带有计数的汇总拒绝理由 |
timeSeries |
每小时桶数: { hour, calls, credits, denied } |
recentEvents |
最后50个事件(最新事件优先),包括工具、积分和拒绝理由 |
适用于活动密钥、挂起密钥和过期密钥。可用于调试、计费审核和按客户分析。
Webhook测试
向配置的webhook URL发送测试事件以验证连接,而不生成真实事件:
# Send test event
curl -X POST http://localhost:3402/webhooks/test \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# With custom message
curl -X POST http://localhost:3402/webhooks/test \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"message": "Testing from staging deploy"}'
答复:
| 字段 | 描述 |
|---|---|
url |
Webhook URL(凭据被屏蔽) |
success |
true 如果webhook返回2xx |
statusCode |
来自webhook端点的HTTP状态代码 |
responseTime |
往返交付时间(毫秒) |
error |
错误消息(仅在失败时) |
测试活动包括 X-PayGate-Test: 1 标题和 X-PayGate-Signature 当配置webhook密钥时。如果未配置webhook URL,则返回400。创建审计跟踪条目(webhook.test).
Webhook交付日志
查询所有webhook传递尝试的日志——成功、失败和重试:
# Get recent deliveries (default: last 50, newest first)
curl http://localhost:3402/webhooks/log \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by success/failure
curl "http://localhost:3402/webhooks/log?success=false" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by time and limit
curl "http://localhost:3402/webhooks/log?since=2025-01-01T00:00:00Z&limit=10" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
每个条目包括:
| 字段 | 描述 |
|---|---|
id |
自动递增交货ID |
timestamp |
当尝试交付时 |
url |
Webhook URL(凭据被屏蔽) |
statusCode |
HTTP状态代码(连接错误为0) |
success |
true 如果webhook返回2xx |
responseTime |
往返时间(毫秒) |
attempt |
重试次数(0=第一次尝试) |
error |
错误消息(仅在失败时) |
eventCount |
批处理中的事件数 |
eventTypes |
不同的事件类型(例如。 ["usage"], ["key.created"]) |
查询参数: limit (默认50,最大200), since (ISO 8601), success (true 或 false).内存中的条目上限为500。搭配使用 /webhooks/stats 对于聚合计数器。
Webhook暂停/恢复
在维护窗口期间暂时停止webhook交付。事件会被缓冲(不会丢失)并在恢复时刷新:
# Pause delivery
curl -X POST http://localhost:3402/webhooks/pause \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Check pause status (visible in /webhooks/stats)
curl http://localhost:3402/webhooks/stats \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# → { "paused": true, "pausedAt": "2025-...", "bufferedEvents": 12, ... }
# Resume delivery (flushes buffered events)
curl -X POST http://localhost:3402/webhooks/resume \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# → { "paused": false, "flushedEvents": 12 }
暂停时,事件继续在缓冲区中累积。恢复时,所有缓冲的事件都会立即刷新。暂停状态和缓冲事件计数在中可见 /webhooks/stats。创建审计跟踪条目(webhook.pause, webhook.resume).
关键别名
为API密钥分配可人工修改的别名,以便您可以按名称引用它们,而不是在管理端点中使用不透明的密钥ID:
# Set an alias
curl -X POST http://localhost:3402/keys/alias \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_abc123...", "alias": "prod-backend"}'
# → { "key": "pg_abc12...", "alias": "prod-backend", "message": "Alias set to \"prod-backend\"" }
# Use the alias in any admin endpoint
curl -X POST http://localhost:3402/topup \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "prod-backend", "credits": 500}'
curl -X POST http://localhost:3402/keys/suspend \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "prod-backend", "reason": "maintenance"}'
curl -X POST http://localhost:3402/keys/transfer \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"from": "prod-backend", "to": "staging-api", "credits": 100}'
# Clear an alias
curl -X POST http://localhost:3402/keys/alias \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "prod-backend", "alias": null}'
| 字段 | 描述 |
|---|---|
alias |
1-100个字符,仅限字母数字+连字符+下划线 |
| 唯一性 | 别名在所有键中必须是唯一的,不能与现有键ID冲突 |
| 作用域 | 别名在所有管理端点(充值、撤销、挂起、恢复、克隆、传输、使用)中都有效——它们确实有效 不 上的API密钥身份验证工作 /mcp |
| 持久性 | 别名保存到状态文件中,并在服务器重启后继续存在 |
| 克隆 | 克隆的密钥可以 不 继承源密钥的别名 |
| 审计 | key.alias_set 为每次设置/清除操作记录事件 |
密钥过期扫描程序
主动式后台扫描程序,可检测即将到期的API密钥,并在其到期前发送webhook通知-即使密钥未被积极使用:
# Query keys expiring within 24 hours (default)
curl http://localhost:3402/keys/expiring \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# → { "within": 86400, "count": 2, "scanner": { ... }, "keys": [ ... ] }
# Query keys expiring within 7 days
curl http://localhost:3402/keys/expiring?within=604800 \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
在配置文件中配置扫描仪:
{
"expiryScanner": {
"enabled": true,
"intervalSeconds": 3600,
"thresholds": [604800, 86400, 3600]
}
}
| 字段 | 描述 |
|---|---|
enabled |
启用/禁用背景扫描仪。违约: true |
intervalSeconds |
扫描频率(秒)。违约: 3600 (1小时)。最低:60 |
thresholds |
到期前几秒通知。违约: [604800, 86400, 3600] (7天、24小时、1小时) |
| Webhook | 火灾 key.expiry_warning 具有键名、别名、命名空间、过期时间和剩余秒数的事件 |
| 重复数据消除 | 每个键+阈值对只通知一次(没有重复警报) |
| 渐进式 | 最大阈值首先触发,然后在后续扫描中逐渐减小阈值 |
| 审计 | key.expiry_warning 为每个通知记录事件 |
| 端点 | GET /keys/expiring?within=N 列出在N秒内过期的密钥(默认值:86400) |
键盘模板
API密钥创建的命名模板。定义可重复使用的预设并使用创建密钥 template: "free-tier":
# Create a template
curl -X POST http://localhost:3402/keys/templates \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{
"name": "free-tier",
"description": "Free plan with basic access",
"credits": 50,
"allowedTools": ["search", "read"],
"deniedTools": ["admin"],
"tags": {"plan": "free"},
"namespace": "public",
"expiryTtlSeconds": 2592000,
"spendingLimit": 200
}'
# List all templates
curl http://localhost:3402/keys/templates \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Create a key from template (inherits all defaults)
curl -X POST http://localhost:3402/keys \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "new-user", "template": "free-tier"}'
# Create a key from template with overrides
curl -X POST http://localhost:3402/keys \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "vip-user", "template": "free-tier", "credits": 500, "tags": {"plan": "vip"}}'
# Delete a template
curl -X POST http://localhost:3402/keys/templates/delete \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "free-tier"}'
| 功能 | 详细信息 |
|---|---|
| 字段 | 学分、允许的工具、拒绝的工具、配额、ipAllowlist、支出限制、标签、命名空间、过期TtlSeconds、自动充值 |
| 覆盖 | 中的显式参数 POST /keys 始终覆盖模板默认值 |
| TTL | expiryTtlSeconds 设置相对于密钥创建时间的过期时间(0=从不) |
| 限制 | 每台服务器最多100个模板 |
| 坚持不懈 | -templates.json 与状态文件一起,在重新启动后仍然有效 |
| 审计 | template.created, template.updated, template.deleted 事件 |
| 普罗米修斯 | paygate_templates_total 轨距轨道模板计数 |
环境变量配置
通过配置所有内容 PAYGATE_* 环境变量——Docker、Kubernetes和CI/CD部署的理想选择:
# Docker example
docker run -e PAYGATE_SERVER="node /app/server.js" \
-e PAYGATE_PORT=8080 \
-e PAYGATE_PRICE=5 \
-e PAYGATE_ADMIN_KEY=sk-admin-secret \
-e PAYGATE_REDIS_URL=redis://redis:6379 \
-e PAYGATE_WEBHOOK_URL=https://hooks.example.com/billing \
-p 8080:8080 node:20 npx paygate-mcp wrap
# Or use a config file via env var
docker run -e PAYGATE_CONFIG=/etc/paygate/config.json \
-v ./config.json:/etc/paygate/config.json \
-p 3402:3402 node:20 npx paygate-mcp wrap
所有18个支持的环境变量:
| 环境变量 | CLI标志 | 描述 |
|---|---|---|
PAYGATE_SERVER |
--server |
要包装的MCP服务器命令(stdio) |
PAYGATE_REMOTE_URL |
--remote-url |
远程MCP服务器URL(HTTP) |
PAYGATE_CONFIG |
--config |
JSON配置文件的路径 |
PAYGATE_PORT |
--port |
服务器端口(默认值:3402) |
PAYGATE_PRICE |
--price |
每次工具调用的点数(默认值:1) |
PAYGATE_RATE_LIMIT |
--rate-limit |
每个按键每分钟最大通话次数(默认值:60) |
PAYGATE_NAME |
--name |
用于显示的服务器名称 |
PAYGATE_SHADOW |
--shadow |
启用阴影模式(真/假) |
PAYGATE_ADMIN_KEY |
--admin-key |
管理员API密钥 |
PAYGATE_STATE_FILE |
--state-file |
持久状态文件路径 |
PAYGATE_WEBHOOK_URL |
--webhook-url |
Webhook传递URL |
PAYGATE_WEBHOOK_SECRET |
--webhook-secret |
HMAC-SHA256 webhook密钥 |
PAYGATE_WEBHOOK_RETRIES |
--webhook-retries |
最大webhook重试次数 |
PAYGATE_REFUND_ON_FAILURE |
--refund-on-failure |
工具故障退款(真/假) |
PAYGATE_REDIS_URL |
--redis-url |
用于水平扩展的Redis URL |
PAYGATE_DRY_RUN |
--dry-run |
发现工具并退出(真/假) |
PAYGATE_TOOL_PRICE |
--tool-price |
按工具定价(工具=价格,…) |
PAYGATE_STRIPE_SECRET |
--stripe-secret |
支付的条纹密钥 |
优先: CLI标志>环境变量>配置文件>默认值。这意味着您可以通过Docker中的env变量设置默认值,并在命令行上覆盖特定值。
请求ID跟踪
每个HTTP响应都包含一个 X-Request-Id 用于分布式跟踪的标头。如果传入请求具有 X-Request-Id 头(例如,来自负载平衡器或API网关),它被传播通过。否则,将自动生成一个新的ID,格式为 req_<16 hex chars>.
# Auto-generated request ID
curl -v http://localhost:3402/health
# < X-Request-Id: req_a1b2c3d4e5f67890
# Propagate your own trace ID
curl -v -H "X-Request-Id: my-trace-123" http://localhost:3402/health
# < X-Request-Id: my-trace-123
| 功能 | 详细信息 |
|---|---|
| 格式 | req_ +16个十六进制字符(8个随机字节) |
| 传播 | 传入 X-Request-Id 保留并返回标头 |
| CORS | 包含在 Access-Control-Allow-Headers 和 Access-Control-Expose-Headers |
| 审核 | 请求ID出现在 gate.allow, gate.deny,以及 session.created 审计元数据 |
| 出口 | generateRequestId() 和 getRequestId(req) 在SDK中可用 |
服务器信息端点
GET /info 返回一个全面的JSON对象,描述服务器的功能。公共终结点--不需要管理员密钥。
curl http://localhost:3402/info
{
"name": "My API Server",
"version": "5.5.0",
"transport": "stdio",
"port": 3402,
"auth": ["api_key", "scoped_token"],
"features": {
"shadowMode": false,
"webhooks": true,
"webhookSignatures": true,
"refundOnFailure": true,
"redis": false,
"oauth": false,
"plugins": false,
"multiServer": false
},
"pricing": {
"defaultCreditsPerCall": 1,
"toolPricing": {
"expensive-tool": { "creditsPerCall": 10 }
}
},
"rateLimit": { "globalPerMin": 60 },
"endpoints": {
"mcp": "/mcp",
"health": "/health",
"info": "/info",
"status": "/status (admin)",
"keys": "/keys (admin)",
"metrics": "/metrics",
"pricing": "/pricing",
"audit": "/audit (admin)",
"analytics": "/analytics (admin)"
}
}
可配置CORS
控制哪些浏览器源可以访问您的PayGate服务器。默认值为 * (允许所有人)。
# CLI flag: single origin
npx paygate-mcp wrap --server "..." --cors-origin "https://myapp.com"
# CLI flag: multiple origins (comma-separated)
npx paygate-mcp wrap --server "..." --cors-origin "https://app1.com,https://app2.com"
# Env var
PAYGATE_CORS_ORIGIN=https://myapp.com npx paygate-mcp wrap --server "..."
配置文件:
{
"cors": {
"origin": ["https://app1.com", "https://app2.com"],
"credentials": true,
"maxAge": 3600
}
}
| 功能 | 详细信息 |
|---|---|
| 默认值 | * (允许所有来源) |
| 单一来源 | 与请求完全匹配 Origin 头球 |
| 多个来源 | 允许的来源数组,与请求匹配 |
| 证书 | Access-Control-Allow-Credentials: true 启用时 |
| 最大年龄 | 飞行前缓存持续时间(默认值:86400=24小时) |
| 变化 | Vary: Origin 当原点不在时添加标头 * |
自定义响应标头
为所有响应添加自定义HTTP标头——非常适合安全标头、缓存控制或自定义跟踪。
# CLI flag: single header
npx paygate-mcp wrap --server "..." --header "X-Frame-Options:DENY"
# CLI flag: multiple headers (comma-separated)
npx paygate-mcp wrap --server "..." --header "X-Frame-Options:DENY,X-Content-Type-Options:nosniff"
# Env var
PAYGATE_CUSTOM_HEADERS="X-Frame-Options:DENY,X-Content-Type-Options:nosniff" npx paygate-mcp wrap --server "..."
配置文件:
{
"customHeaders": {
"X-Frame-Options": "DENY",
"X-Content-Type-Options": "nosniff",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains",
"X-Custom-Tag": "my-service"
}
}
自定义标头应用于每个HTTP响应(健康、信息、管理员、MCP、预检),并与CORS标头和请求ID共存。它们不会覆盖内置标头。
配置导出
检查正在运行的服务器配置以进行调试和验证:
curl http://localhost:3402/config -H "X-Admin-Key: YOUR_ADMIN_KEY"
返回包含屏蔽敏感值的完整配置:
| 字段 | 屏蔽 |
|---|---|
webhookSecret |
*** |
webhookUrl |
仅限方案+主机(例如。 https://hooks.example.com/***) |
serverCommand |
*** |
serverArgs |
['***'] |
| Webhook过滤器机密 | *** |
| Webhook过滤器URL | 仅限方案+主机 |
非敏感值(定价、费率限制、CORS、自定义标头、配额等)按原样返回。每次导出都记录在审计跟踪中 config.export.
可信代理
在负载均衡器或反向代理后面运行时,配置受信任的代理IP/CIDR,以便PayGate从 X-Forwarded-For 标题正确:
# CLI flag (comma-separated IPs and/or CIDRs)
paygate-mcp wrap --server "node server.js" --trusted-proxies "10.0.0.0/8,172.16.0.0/12"
# Environment variable
PAYGATE_TRUSTED_PROXIES="10.0.0.0/8,172.16.0.0/12" paygate-mcp wrap --server "node server.js"
配置文件:
{
"serverCommand": "node",
"serverArgs": ["server.js"],
"trustedProxies": ["10.0.0.0/8", "172.16.0.0/12", "192.168.1.1"]
}
它是如何工作的: 如果没有可信代理,第一个 X-Forwarded-For 使用值(向后兼容)。配置了受信任的代理后,标头将从右向左移动,跳过与受信任列表匹配的IP,第一个不受信任的IP将作为真实的客户端IP返回。这对于在代理服务器后面进行准确的IP分配至关重要。
支持精确的IPv4地址和CIDR表示法(/8, /16, /24, /32等等)。这 resolveClientIp 函数也从SDK导出以供自定义使用。
关键列表分页
这 GET /keys 当存在任何查询参数时,端点支持分页、过滤和排序:
# Paginate: 10 keys per page, second page
curl "http://localhost:3402/keys?limit=10&offset=10" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by namespace and active status
curl "http://localhost:3402/keys?limit=50&namespace=prod&active=true" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Sort by credits descending
curl "http://localhost:3402/keys?limit=20&sortBy=credits&order=desc" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by credit range
curl "http://localhost:3402/keys?limit=50&minCredits=100&maxCredits=1000" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Find keys by name prefix
curl "http://localhost:3402/keys?limit=50&namePrefix=prod-" -H "X-Admin-Key: YOUR_ADMIN_KEY"
查询参数:
| 参数 | 类型 | 说明 |
|---|---|---|
limit |
number | 每页结果数(1-500,默认值:50) |
offset |
number | 跳过N个结果(默认值:0) |
sortBy |
string | 排序字段: createdAt, name, credits, lastUsedAt, totalSpent, totalCalls |
order |
string | 排序方向: asc 或 desc (默认值: desc) |
namespace |
string | 按命名空间筛选 |
group |
string | 按组ID筛选 |
active |
字符串 | true 或 false |
suspended |
字符串 | true 或 false |
expired |
字符串 | true 或 false |
namePrefix |
string | 不区分大小写的名称前缀匹配 |
minCredits |
number | 最低学分(含) |
maxCredits |
number | 最高学分(含) |
响应格式 (当存在任何分页/筛选参数时):
{
"keys": [...],
"total": 150,
"offset": 20,
"limit": 10,
"hasMore": true
}
向后兼容: 没有任何分页/过滤/排序参数, GET /keys 返回与以前相同的平面数组。
关键统计数据
GET /keys/stats 返回所有键的聚合统计信息:
# Get all key statistics
curl http://localhost:3402/keys/stats -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by namespace
curl "http://localhost:3402/keys/stats?namespace=prod" -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"total": 150,
"active": 120,
"suspended": 10,
"expired": 15,
"revoked": 5,
"totalCreditsAllocated": 500000,
"totalCreditsSpent": 125000,
"totalCreditsRemaining": 375000,
"totalCalls": 84200,
"byNamespace": { "prod": 80, "staging": 50, "default": 20 },
"byGroup": { "enterprise": 30, "starter": 45 }
}
当 ?namespace= 如果提供了,则所有计数/聚合的作用域都在该命名空间中,并且 filteredByNamespace 字段包含在响应中。
速率限制状态
GET /keys/rate-limit-status?key=... 在不调用的情况下返回密钥的当前速率限制窗口状态:
curl "http://localhost:3402/keys/rate-limit-status?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_abc123...",
"name": "my-key",
"global": {
"limit": 100,
"used": 23,
"remaining": 77,
"resetInMs": 45000,
"windowMs": 60000
},
"perTool": {
"search": { "limit": 10, "used": 5, "remaining": 5, "resetInMs": 30000 },
"translate": { "limit": 20, "used": 0, "remaining": 20, "resetInMs": 60000 }
}
}
perTool 仅当工具具有通过以下方式配置的每工具速率限制时才存在 toolPricing。不包括没有自定义费率限制的工具。
配额状态
GET /keys/quota-status?key=... 返回密钥的每日/每月配额使用情况:
curl "http://localhost:3402/keys/quota-status?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_abc123...",
"name": "my-key",
"quotaSource": "global",
"daily": {
"callsUsed": 42,
"callsLimit": 100,
"callsRemaining": 58,
"creditsUsed": 150,
"creditsLimit": 500,
"creditsRemaining": 350,
"resetDay": "2026-02-26"
},
"monthly": {
"callsUsed": 850,
"callsLimit": 2000,
"callsRemaining": 1150,
"creditsUsed": 3200,
"creditsLimit": 10000,
"creditsRemaining": 6800,
"resetMonth": "2026-02"
}
}
quotaSource 指示配额的配置位置: "per-key" (关键级别超控), "global" (服务器范围配置),或 "none" (无配额)。当限制为 0 (无限制), remaining 是 null.
信用记录
GET /keys/credit-history?key=... 返回密钥的信用变异日志:
curl "http://localhost:3402/keys/credit-history?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by type, limit, or since timestamp
curl "http://localhost:3402/keys/credit-history?key=pg_...&type=topup&limit=10" -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_abc123...",
"name": "my-key",
"currentBalance": 700,
"totalEntries": 3,
"entries": [
{
"timestamp": "2026-02-26T12:30:00.000Z",
"type": "topup",
"amount": 200,
"balanceBefore": 500,
"balanceAfter": 700
},
{
"timestamp": "2026-02-26T12:00:00.000Z",
"type": "initial",
"amount": 500,
"balanceBefore": 0,
"balanceAfter": 500
}
]
}
条目类型: initial, topup, transfer_in, transfer_out, auto_topup, deduction, refund, bulk_topup。参赛作品以最新作品为准,每个密钥最多100个。转账包括 memo 字段(如果提供)。
支出速度
GET /keys/spending-velocity?key=... 返回信用消耗率和消耗预测:
curl "http://localhost:3402/keys/spending-velocity?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Custom analysis window (default 24h, max 720h/30d)
curl "http://localhost:3402/keys/spending-velocity?key=pg_...&window=48" -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_abc123...",
"name": "my-key",
"currentBalance": 750,
"velocity": {
"creditsPerHour": 12.5,
"creditsPerDay": 300,
"callsPerHour": 2.5,
"callsPerDay": 60,
"estimatedDepletionDate": "2026-03-01T18:00:00.000Z",
"estimatedHoursRemaining": 60,
"windowHours": 24,
"dataPoints": 45
},
"topTools": [
{ "tool": "search", "calls": 30, "credits": 150 },
{ "tool": "generate", "calls": 15, "credits": 120 }
]
}
estimatedDepletionDate 和 estimatedHoursRemaining 是 null 当没有消费活动时。 topTools 显示了使用数据中支出最高的5个工具。
关键比对
GET /keys/compare?keys=pg_a,pg_b,pg_c 返回2-10个键的并排比较:
curl "http://localhost:3402/keys/compare?keys=pg_abc,pg_xyz" -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"compared": 2,
"keys": [
{
"key": "pg_abc123...",
"name": "prod-agent",
"status": "active",
"credits": { "current": 750, "totalSpent": 250 },
"usage": { "totalCalls": 50, "totalAllowed": 48, "totalDenied": 2 },
"velocity": { "creditsPerHour": 12.5, "creditsPerDay": 300, "estimatedHoursRemaining": 60 },
"rateLimit": { "used": 3, "limit": 60, "remaining": 57 },
"metadata": { "namespace": "prod", "group": "team-a", "createdAt": "2026-02-01T00:00:00Z", "tags": { "env": "prod" } }
},
{
"key": "pg_xyz789...",
"name": "staging-agent",
"status": "active",
"credits": { "current": 200, "totalSpent": 800 },
"usage": { "totalCalls": 120, "totalAllowed": 120, "totalDenied": 0 },
"velocity": { "creditsPerHour": 8.3, "creditsPerDay": 200, "estimatedHoursRemaining": 24 },
"rateLimit": { "used": 0, "limit": 60, "remaining": 60 },
"metadata": { "namespace": "staging", "group": null, "createdAt": "2026-02-15T00:00:00Z", "tags": {} }
}
]
}
未找到密钥将在 notFound 阵列。支持别名。每次比较最多10个键。
关键健康评分
GET /keys/health?key=... 返回一个包含加权组件细分的综合健康评分(0-100):
curl "http://localhost:3402/keys/health?key=pg_abc" -H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_abc123...",
"name": "prod-agent",
"score": 72,
"status": "caution",
"issues": ["Key expires within 7 days", "Credits depleting rapidly"],
"components": {
"balance": { "score": 40, "risk": "warning", "weight": 0.30 },
"quota": { "score": 85, "risk": "good", "weight": 0.25 },
"rateLimit": { "score": 100, "risk": "healthy", "weight": 0.20 },
"errorRate": { "score": 75, "risk": "good", "weight": 0.25 }
}
}
组件: 平衡 (30%,直到信用耗尽的小时数), 配额 (25%,跨日/月限制的最大利用率), 费率限制 (20%,当前窗口使用率), 错误率 (25%,拒绝/总比率)。状态:健康(≥90)、良好(≥75)、谨慎(≥50)、警告(≥25)、危急(<25)。问题检测:撤销、暂停、过期、即将到期、零信用、快速耗尽。支持别名。
维护模式
将服务器置于维护模式,以优雅地拒绝客户端流量,同时保持管理端点的运行:
# Enable maintenance mode
curl -X POST http://localhost:3402/maintenance \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"enabled": true, "message": "Upgrading to v7 — back in 10 minutes"}'
# Check maintenance status
curl http://localhost:3402/maintenance -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Disable maintenance mode
curl -X POST http://localhost:3402/maintenance \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"enabled": false}'
响应(已启用):
{
"enabled": true,
"message": "Upgrading to v7 — back in 10 minutes",
"since": "2025-03-15T14:30:00.000Z"
}
启用后,所有 /mcp 请求返回 503 使用自定义消息。管理端点(/keys, /maintenance, /audit等等)保持完全运行。 GET /health 回报 {"status": "maintenance"}。启用和禁用操作都记录在审计跟踪中(maintenance.enabled / maintenance.disabled).
管理员事件流
通过服务器发送事件(SSE)将实时服务器事件流式传输到管理客户端:
# Stream all events
curl -N http://localhost:3402/admin/events \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Accept: text/event-stream"
# Stream only key operations
curl -N http://localhost:3402/admin/events?types=key.created,key.revoked,key.topup \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Accept: text/event-stream"
活动:
event: connected
data: {"message":"Admin event stream connected","filters":"all"}
event: audit
data: {"id":42,"timestamp":"2025-03-15T14:30:00.000Z","type":"key.created","actor":"admin","message":"Key created: prod-agent","metadata":{...}}
event: audit
data: {"id":43,"timestamp":"2025-03-15T14:30:01.000Z","type":"gate.allow","actor":"pg_abc12...","message":"Allowed: get_weather","metadata":{...}}
每个审计事件(工具调用、拒绝、关键操作、维护、警报)都是实时广播的。使用 ?types= 按逗号分隔的事件类型进行筛选。支持多个并发管理客户端。每15秒保持一次ping,防止连接超时。断开连接时会自动清理连接。
关键要点
将带时间戳的注释附加到API密钥以进行操作跟踪:
# Add a note
curl -X POST http://localhost:3402/keys/notes \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "text": "Increased credits per customer request #1234"}'
# List notes
curl "http://localhost:3402/keys/notes?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Delete a note by index
curl -X DELETE "http://localhost:3402/keys/notes?key=pg_...&index=0" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
回复(列表):
{
"key": "pg_abc1...2345",
"notes": [
{ "timestamp": "2025-03-15T14:30:00.000Z", "author": "admin", "text": "Increased credits per customer request #1234" },
{ "timestamp": "2025-03-16T09:00:00.000Z", "author": "admin", "text": "Upgraded to premium tier" }
],
"count": 2
}
每个键最多50个音符,每个音符1000个字符。在已暂停和已撤销的密钥上工作。支持别名。审计跟踪中记录的所有添加/删除操作(key.note_added / key.note_deleted).
计划行动
安排API密钥的未来日期操作-在指定时间自动撤销、暂停或追加信用:
# Schedule a key revocation in 24 hours
curl -X POST http://localhost:3402/keys/schedule \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "action": "revoke", "executeAt": "2025-04-01T00:00:00Z"}'
# Schedule a credit top-up
curl -X POST http://localhost:3402/keys/schedule \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "action": "topup", "executeAt": "2025-04-01T00:00:00Z", "params": {"credits": 500}}'
# List all pending schedules (optional ?key= filter)
curl "http://localhost:3402/keys/schedule" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Cancel a schedule
curl -X DELETE "http://localhost:3402/keys/schedule?id=sched_1" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
响应(创建):
{
"id": "sched_1",
"key": "pg_abc1...2345",
"action": "revoke",
"executeAt": "2025-04-01T00:00:00.000Z",
"createdAt": "2025-03-15T10:30:00.000Z"
}
支持的操作: revoke, suspend, topup (要求 params.credits).每个密钥最多20个计划。支持别名。后台计时器每10秒检查一次。审计跟踪中记录的所有创建/执行/取消操作(schedule.created / schedule.executed / schedule.cancelled).
关键活动时间表
获取特定密钥的所有事件的统一时间顺序提要——审计事件(创建、暂停、注释等)和使用事件(工具调用、拒绝)合并到一个时间线中:
# Get activity for a key (newest first, default limit 50)
curl "http://localhost:3402/keys/activity?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
# With filters
curl "http://localhost:3402/keys/activity?key=pg_...&limit=20&since=2025-03-15T00:00:00Z" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_abc1...2345",
"name": "my-agent",
"total": 42,
"limit": 50,
"events": [
{ "timestamp": "2025-03-16T10:30:00Z", "source": "usage", "type": "tool.call", "message": "Called search (5 credits)", "metadata": { "tool": "search", "creditsCharged": 5, "allowed": true } },
{ "timestamp": "2025-03-16T09:00:00Z", "source": "audit", "type": "key.note_added", "message": "Note added to key", "metadata": { "key": "pg_abc1...2345" } },
{ "timestamp": "2025-03-15T14:00:00Z", "source": "audit", "type": "key.created", "message": "Key created: my-agent", "metadata": { "keyMasked": "pg_abc1...2345" } }
]
}
每个请求最多200个事件。支持别名。在已暂停和已撤销的密钥上工作。
信用预订
在执行昂贵的操作之前预先储备信用。防止并发场景中的过度承诺:
# Reserve 500 credits (hold for 5 min default, or set ttlSeconds)
curl -X POST http://localhost:3402/keys/reserve \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "credits": 500, "ttlSeconds": 300, "memo": "Batch job #42"}'
# Commit — deducts the held credits
curl -X POST http://localhost:3402/keys/reserve/commit \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"reservationId": "rsv_1"}'
# Release — frees the hold without deducting
curl -X POST http://localhost:3402/keys/reserve/release \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"reservationId": "rsv_1"}'
# List active reservations (optional ?key= filter)
curl "http://localhost:3402/keys/reserve" -H "X-Admin-Key: YOUR_ADMIN_KEY"
回复(保留):
{
"id": "rsv_1",
"key": "pg_abc1...2345",
"credits": 500,
"createdAt": "2025-03-16T10:30:00Z",
"expiresAt": "2025-03-16T10:35:00Z",
"memo": "Batch job #42",
"available": 500
}
TTL范围:10秒到1小时(默认5分钟)。每把钥匙最多可预订50次。过期预订自动清理。别名支持。拒绝已撤销/暂停的密钥。审计追踪(credits.reserved / credits.committed / credits.released).
请求日志
每个MCP工具调用的可查询日志,包括时间、信用、状态和拒绝原因:
# Get all requests (newest first)
curl "http://localhost:3402/requests" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by tool name
curl "http://localhost:3402/requests?tool=my_tool" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by status (allowed or denied)
curl "http://localhost:3402/requests?status=denied" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by key (partial match on masked key)
curl "http://localhost:3402/requests?key=pg_abc1" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by time + pagination
curl "http://localhost:3402/requests?since=2025-03-01T00:00:00Z&limit=50&offset=0" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Combine filters
curl "http://localhost:3402/requests?tool=my_tool&status=allowed&limit=10" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"total": 42,
"offset": 0,
"limit": 100,
"summary": {
"totalAllowed": 38,
"totalDenied": 4,
"totalCredits": 190,
"avgDurationMs": 45
},
"requests": [
{
"id": 42,
"timestamp": "2025-03-16T10:30:00Z",
"tool": "my_tool",
"key": "pg_abc1...2345",
"status": "allowed",
"credits": 5,
"durationMs": 32,
"requestId": "req_a1b2c3d4e5f6g7h8"
},
{
"id": 41,
"timestamp": "2025-03-16T10:29:55Z",
"tool": "my_tool",
"key": "pg_xyz9...8765",
"status": "denied",
"credits": 0,
"durationMs": 1,
"denyReason": "insufficient_credits",
"requestId": "req_i9j0k1l2m3n4o5p6"
}
]
}
5000入口环形缓冲区。汇总统计数据是根据筛选结果计算的。拒绝理由: insufficient_credits, rate_limited, invalid_api_key, key_suspended, api_key_expired, tool_not_allowed, quota_exceeded.
工具统计信息
从请求日志中导出的每工具分析:
# Overview of all tools
curl "http://localhost:3402/tools/stats" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Detailed stats for a specific tool
curl "http://localhost:3402/tools/stats?tool=my_tool" -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by time range
curl "http://localhost:3402/tools/stats?since=2025-03-01T00:00:00Z" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
回复(概述):
{
"totalTools": 3,
"totalCalls": 150,
"tools": [
{
"tool": "my_tool",
"totalCalls": 100,
"allowed": 95,
"denied": 5,
"successRate": 95,
"totalCredits": 475,
"avgDurationMs": 42
}
]
}
回复(详细 ?tool=my_tool):
{
"tool": "my_tool",
"totalCalls": 100,
"allowed": 95,
"denied": 5,
"successRate": 95,
"totalCredits": 475,
"avgDurationMs": 42,
"p95DurationMs": 120,
"denyReasons": {
"insufficient_credits": 3,
"rate_limited": 2
},
"topConsumers": [
{ "key": "pg_abc1...2345", "calls": 50, "credits": 250 },
{ "key": "pg_xyz9...8765", "calls": 30, "credits": 150 }
]
}
顶级消费者限制在10人以内。概述中按通话次数排序的工具。数据来源于请求日志(5000条环形缓冲区)。
请求日志导出
将请求日志导出为JSON或CSV进行离线分析:
# Export as JSON (default)
curl "http://localhost:3402/requests/export" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" -o paygate-requests.json
# Export as CSV
curl "http://localhost:3402/requests/export?format=csv" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" -o paygate-requests.csv
# Export with filters
curl "http://localhost:3402/requests/export?tool=my_tool&status=denied&since=2025-03-01T00:00:00Z&until=2025-03-31T23:59:59Z" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
| 参数 | 说明 |
|---|---|
format |
json (默认)或 csv |
key |
按API键筛选(部分匹配) |
tool |
按工具名称筛选(完全匹配) |
status |
allowed 或 denied |
since |
ISO 8601开始时间戳 |
until |
ISO 8601结束时间戳 |
这两种格式都包含用于自动文件下载的Content-Disposition标头。不像 /requests,导出端点返回 全部 匹配条目(无分页限制)。CSV包括用逗号正确引用值。
工具调用模拟运行
模拟一个工具调用,检查是否允许——不扣除信用或增加利率限制:
curl -X POST http://localhost:3402/requests/dry-run \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "tool": "my_tool"}'
响应(允许):
{
"allowed": true,
"tool": "my_tool",
"creditsRequired": 5,
"creditsAvailable": 100,
"creditsAfter": 95,
"rateLimit": { "used": 3, "limit": 60, "remaining": 57, "resetInMs": 45000 }
}
响应(拒绝):
{
"allowed": false,
"reason": "insufficient_credits: need 5, have 2",
"tool": "my_tool",
"creditsRequired": 5,
"creditsAvailable": 2
}
检查密钥有效性、暂停、工具ACL、利率限制、信用余额和支出限制。支持别名密钥。对于希望在预订前检查通话的客服来说很有用。
批量试运行
同时模拟多个工具调用,以检查整个批处理是否成功:
curl -X POST http://localhost:3402/requests/dry-run/batch \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "tools": [{"name": "tool_a"}, {"name": "tool_b"}]}'
答复:
{
"allAllowed": true,
"totalCreditsRequired": 10,
"creditsAvailable": 100,
"creditsAfter": 90,
"results": [
{ "tool": "tool_a", "allowed": true, "creditsRequired": 5 },
{ "tool": "tool_b", "allowed": true, "creditsRequired": 5 }
]
}
执行汇总信用检查(所有工具价格与余额之和)、每个工具的ACL验证、支出限额和利率限额检查。返回每个工具的结果,以便您可以看到哪些特定工具会失败。每批最多100个工具。支持别名密钥。
工具可用性
检查每个关键工具的可用性,包括定价、可负担性和费率限制状态:
curl "http://localhost:3402/tools/available?key=pg_..." \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_c815...09a6",
"creditsAvailable": 100,
"totalTools": 3,
"accessibleTools": 2,
"globalRateLimit": { "limit": 60, "used": 5, "remaining": 55, "resetInMs": 45000 },
"tools": [
{ "tool": "tool_a", "accessible": true, "creditsPerCall": 10, "canAfford": true },
{ "tool": "tool_b", "accessible": false, "denyReason": "denied_by_acl", "creditsPerCall": 5, "canAfford": true },
{ "tool": "tool_c", "accessible": true, "creditsPerCall": 1, "canAfford": true, "rateLimit": { "limit": 10, "used": 3, "remaining": 7 } }
]
}
返回每个发现的工具: accessible (ACL检查), denyReason (如果被阻止), creditsPerCall, canAfford (信用与价格),以及每个工具 rateLimit 当配置时。包括全球利率限制信息。支持别名密钥。在挂起的钥匙上工作(信息性)。只读-不扣除学分或递增率计数器。
关键仪表板
在单个请求中获取任何API密钥的综合概述:
curl "http://localhost:3402/keys/dashboard?key=pg_..." \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"key": "pg_c815...09a6",
"name": "production-agent",
"status": "active",
"namespace": "prod",
"balance": { "credits": 850, "totalSpent": 150, "totalAllocated": 1000, "spendingLimit": 500 },
"health": { "score": 92, "status": "good" },
"velocity": { "creditsPerHour": 6.2, "creditsPerDay": 149, "estimatedDepletionDate": "2025-02-03T..." },
"rateLimits": { "global": { "limit": 60, "used": 12, "remaining": 48, "resetInMs": 35000 } },
"quotas": { "source": "global", "daily": { "callsUsed": 24, "callsLimit": 100 }, "monthly": { "callsUsed": 340, "callsLimit": 5000 } },
"usage": { "totalCalls": 340, "totalAllowed": 330, "totalDenied": 10, "totalCredits": 150 },
"recentActivity": [{ "timestamp": "...", "event": "gate.allowed", "tool": "search", "credits": 5 }]
}
结合元数据(状态/命名空间/组/标签)、余额(信用/支出/分配/支出限制)、健康评分(0-100综合)、支出速度与消耗预测、费率限制和配额状态、使用情况摘要以及最近10个审计事件。支持别名密钥。使用暂停/撤销/过期的密钥。只读。
管理员通知
获取有关需要注意的密钥的可操作通知:
# Get all notifications
curl http://localhost:3402/admin/notifications \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by severity
curl "http://localhost:3402/admin/notifications?severity=critical" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"total": 4,
"critical": 2,
"warning": 1,
"info": 1,
"notifications": [
{
"severity": "critical",
"category": "zero_credits",
"message": "Key has zero credits remaining",
"key": "pg_c815...09a6",
"keyName": "production-agent"
},
{
"severity": "critical",
"category": "key_expiring_soon",
"message": "Key expires within 8 hours",
"key": "pg_a3f1...b2e4",
"keyName": "staging-agent",
"details": { "expiresAt": "2026-02-27T08:00:00.000Z", "hoursRemaining": 7.5 }
},
{
"severity": "warning",
"category": "credits_depleting",
"message": "Credits will deplete in ~18 hours at current rate",
"key": "pg_d7e2...f1a3",
"keyName": "batch-worker",
"details": { "credits": 90, "creditsPerHour": 5.1, "estimatedHoursRemaining": 17.6 }
},
{
"severity": "info",
"category": "key_suspended",
"message": "Key is suspended",
"key": "pg_b4c9...e8d5",
"keyName": "deprecated-agent"
}
]
}
通知类别:
key_expired(关键)--密钥已过有效期key_expiring_soon(严重<24小时,警告<7天)——钥匙即将到期zero_credits(严重)--Key没有剩余学分credits_depleting(临界<6小时,警告<24小时)——支出速度预测耗尽key_suspended(info)--密钥已挂起high_error_rate(严重≥50%,警告≥25%)——高拒绝率(至少10个呼叫)rate_limit_pressure(警告≥90%)——速率限制几乎用尽
通知按严重程度排序(严重优先)。已撤销的密钥被排除在外。一个密钥可以出现在多个通知中(例如,零信用和即将到期)。过滤器 ?severity=critical|warning|info。只读。
系统仪表盘
在单个请求中获取系统范围的概述:
curl http://localhost:3402/admin/dashboard \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"keys": { "total": 15, "active": 10, "suspended": 2, "revoked": 2, "expired": 1 },
"credits": { "totalAllocated": 15000, "totalSpent": 4200, "totalRemaining": 10800 },
"usage": {
"totalCalls": 840,
"totalAllowed": 790,
"totalDenied": 50,
"totalCreditsSpent": 4200,
"denyReasons": [{ "reason": "insufficient_credits", "count": 30 }, { "reason": "rate_limited", "count": 20 }]
},
"topConsumers": [
{ "name": "production-agent", "calls": 320, "credits": 1600, "denied": 5 },
{ "name": "batch-worker", "calls": 210, "credits": 1050, "denied": 0 }
],
"topTools": [
{ "tool": "search", "calls": 450, "credits": 2250, "denied": 20 },
{ "tool": "generate", "calls": 300, "credits": 1500, "denied": 10 }
],
"notifications": { "critical": 2, "warning": 3, "info": 2 },
"uptime": { "startedAt": "2026-02-27T00:00:00.000Z", "uptimeSeconds": 86400, "uptimeHours": 24 }
}
按州、信用分配和支出总额、使用细分和拒绝原因、按信用支出排名的前10名消费者、按呼叫计数排名的前十名工具、通知严重性计数和服务器正常运行时间进行组合。只读。
关键生命周期报告
跟踪密钥创建、撤销、暂停趋势并识别有风险的密钥:
# Full lifecycle report
curl http://localhost:3402/admin/lifecycle \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by date range
curl "http://localhost:3402/admin/lifecycle?since=2026-02-01&until=2026-02-28" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
答复:
{
"events": { "created": 25, "revoked": 3, "suspended": 5, "resumed": 4, "rotated": 2, "cloned": 1 },
"trends": [
{ "date": "2026-02-25", "created": 5, "revoked": 1, "suspended": 2, "resumed": 1 },
{ "date": "2026-02-26", "created": 8, "revoked": 0, "suspended": 1, "resumed": 2 },
{ "date": "2026-02-27", "created": 12, "revoked": 2, "suspended": 2, "resumed": 1 }
],
"averageLifetimeHours": 168.5,
"atRisk": [
{ "key": "pg_c815...09a6", "name": "staging-agent", "risk": "expiring_soon", "details": { "expiresAt": "2026-03-01T...", "daysRemaining": 2.5 } },
{ "key": "pg_a3f1...b2e4", "name": "batch-worker", "risk": "zero_credits", "details": { "credits": 0 } }
]
}
显示聚合的生命周期事件计数、每日趋势桶(按时间顺序排序)、平均密钥生命周期(以小时为单位)(对于已撤销的密钥)以及有风险的密钥及其风险类别(expired, expiring_soon, zero_credits).支持 ?since= 和 ?until= 日期过滤器。从风险列表中排除已暂停和已撤销的密钥。只读。
成本分析
获取跨工具、命名空间和时间的以成本为中心的信贷使用明细:
# Full cost analysis
curl http://localhost:3402/admin/costs \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by namespace
curl "http://localhost:3402/admin/costs?namespace=prod" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Filter by time range
curl "http://localhost:3402/admin/costs?since=2026-02-01" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalCredits": 4250,
"totalCalls": 312,
"totalAllowed": 298,
"totalDenied": 14,
"avgCostPerCall": 13.62
},
"perTool": [
{ "tool": "generate_report", "calls": 85, "credits": 1700, "avgCost": 20 },
{ "tool": "query_data", "calls": 142, "credits": 1420, "avgCost": 10 }
],
"perNamespace": [
{ "namespace": "prod", "calls": 210, "credits": 3150 },
{ "namespace": "staging", "calls": 102, "credits": 1100 }
],
"hourlyTrends": [
{ "hour": "2026-02-26T14:00:00.000Z", "calls": 23, "credits": 345, "denied": 1 },
{ "hour": "2026-02-26T15:00:00.000Z", "calls": 31, "credits": 465, "denied": 0 }
],
"topSpenders": [
{ "key": "pg_a1b2...c3d4", "name": "ml-pipeline", "credits": 1800, "calls": 90 },
{ "key": "pg_e5f6...g7h8", "name": "batch-worker", "credits": 1200, "calls": 120 }
]
}
返回每个工具的成本明细(包括每次调用的平均成本)、每个命名空间的支出、每小时的趋势桶(过去24小时)以及按消耗的积分排名的前10名支出者。支持 ?since= 和 ?namespace= 查询筛选器。没有显式命名空间的键出现在 default。只读。
利率限制分析
分析密钥和工具的速率限制利用率:
curl http://localhost:3402/admin/rate-limits \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"config": {
"globalLimitPerMin": 60,
"windowMs": 60000
},
"summary": {
"totalCalls": 450,
"totalRateLimited": 12,
"rateLimitRate": 0.0267
},
"perKey": [
{ "name": "ml-pipeline", "calls": 200, "rateLimited": 8, "currentWindowUsed": 45, "currentWindowRemaining": 15 },
{ "name": "batch-worker", "calls": 150, "rateLimited": 4, "currentWindowUsed": 12, "currentWindowRemaining": 48 }
],
"perTool": [
{ "tool": "generate_report", "calls": 180, "rateLimited": 10 },
{ "tool": "query_data", "calls": 270, "rateLimited": 2 }
],
"hourlyTrends": [
{ "hour": "2026-02-26T14", "calls": 52, "rateLimited": 3 },
{ "hour": "2026-02-26T15", "calls": 48, "rateLimited": 1 }
],
"mostThrottled": [
{ "name": "ml-pipeline", "rateLimited": 8, "calls": 200, "throttleRate": 0.04 }
]
}
返回速率限制配置、具有限制率的拒绝摘要、具有当前滑动窗口利用率的每个密钥细分、每个工具的拒绝计数、每小时的拒绝趋势(过去24小时)以及按拒绝计数排名的前10个限制最多的密钥。处理无限速率限制(globalLimitPerMin:0)。只读。
配额分析
curl http://localhost:3000/admin/quotas -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"config": { "globalQuota": { "dailyCallLimit": 100, "monthlyCallLimit": 1000, "dailyCreditLimit": 500, "monthlyCreditLimit": 5000 } },
"summary": { "totalKeys": 5, "keysWithQuotas": 4, "totalQuotaDenials": 3, "quotaDenialRate": 0.02 },
"perKey": [
{ "name": "heavy-user", "dailyCalls": 95, "monthlyCalls": 450, "dailyCredits": 475, "monthlyCredits": 2250, "dailyCallLimit": 100, "monthlyCallLimit": 1000, "dailyCreditLimit": 500, "monthlyCreditLimit": 5000, "dailyCallUtilization": 0.95, "monthlyCallUtilization": 0.45, "source": "global" }
],
"perTool": [{ "tool": "summarize", "calls": 120, "quotaDenied": 2 }],
"hourlyTrends": [{ "hour": "2025-01-15T14", "calls": 15, "quotaDenied": 1 }],
"mostConstrained": [{ "name": "heavy-user", "dailyCalls": 95, "dailyCallLimit": 100, "dailyCallUtilization": 0.95, "monthlyCalls": 450, "monthlyCallLimit": 1000, "monthlyCallUtilization": 0.45 }]
}
返回配额配置(全局或null)、有/没有配额的密钥计数、带拒绝率的拒绝摘要、每个密钥的每日/每月呼叫和信用使用与使用百分比的限制、配额来源(每个密钥/全局/无)、每个工具的配额拒绝计数、每小时的拒绝趋势(过去24小时)以及按每日呼叫使用率排名的前10个最受限制的密钥。只读。
否认分析
curl http://localhost:3000/admin/denials -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalCalls": 150, "totalDenials": 12, "denialRate": 0.08 },
"byReason": { "insufficient_credits": 5, "rate_limited": 4, "quota_exceeded": 2, "key_suspended": 1 },
"perKey": [
{ "name": "heavy-user", "calls": 50, "denials": 8, "denialRate": 0.16, "topReason": "rate_limited" }
],
"perTool": [{ "tool": "summarize", "calls": 80, "denials": 6, "denialRate": 0.075, "topReason": "insufficient_credits" }],
"hourlyTrends": [{ "hour": "2025-01-15T14", "calls": 20, "denials": 3 }],
"mostDenied": [{ "name": "heavy-user", "denials": 8, "calls": 50, "denialRate": 0.16, "topReason": "rate_limited" }]
}
返回拒绝摘要,包括拒绝率、按规范原因类型细分的拒绝摘要(不足信用、速率限制、工具速率限制、配额超出、密钥暂停、api_key_expired、无效密钥、丢失密钥、工具不允许、ip_not_allowed、spending_limit_exceeded等)、每个密钥的拒绝计数(包括首要原因)、每个工具的拒绝计数、每小时的拒绝趋势(过去24小时)和前10个被拒绝最多的密钥。只读。
流量分析
curl http://localhost:3000/admin/traffic -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalCalls": 500, "totalAllowed": 470, "totalDenied": 30, "successRate": 0.94, "uniqueKeys": 8, "uniqueTools": 3, "peakHour": "2025-01-15T14", "peakHourCalls": 85 },
"toolPopularity": [{ "tool": "summarize", "calls": 250, "successRate": 0.96, "credits": 2500 }],
"hourlyVolume": [{ "hour": "2025-01-15T14", "calls": 85, "allowed": 80, "denied": 5, "credits": 400 }],
"topConsumers": [{ "name": "heavy-user", "calls": 150, "successRate": 0.92, "credits": 1380 }],
"byNamespace": [{ "namespace": "production", "calls": 400, "allowed": 380, "credits": 3800 }]
}
返回流量摘要,包括成功率和高峰小时数、按呼叫计数排名的工具流行度、成功率和信用总额、每小时流量(过去24小时)、允许/拒绝/信用细分、按呼叫数排名的前10名消费者,以及按命名空间统计的命名空间细分。只读。
安全审计
curl http://localhost:3000/admin/security -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"score": 72,
"summary": { "totalKeys": 5, "totalFindings": 12 },
"findings": [
{ "type": "no_ip_allowlist", "severity": "warning", "keys": ["prod-key", "dev-key"], "description": "Keys without IP allowlists can be used from any IP address" },
{ "type": "no_acl_restriction", "severity": "info", "keys": ["dev-key"], "description": "Keys without ACL restrictions can access all tools" },
{ "type": "high_credit_balance", "severity": "warning", "keys": ["whale-key"], "description": "Keys with 10000+ credits are high-value targets if compromised" }
]
}
返回一个复合安全评分(0-100),其中包含每个发现的细分。扫描所有活动密钥:缺少IP分配列表(警告)、缺少配额(信息)、不受限制的ACL(信息),没有支出限制(信息);没有到期日期(信息)和高信用余额(警告)。具有IP限制、工具ACL、配额、支出限制和到期日期的配置良好的密钥不会出现在任何结果中。只读--不修改系统状态。
收入分析
curl http://localhost:3000/admin/revenue -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalRevenue": 5000, "totalCalls": 250, "averageRevenuePerCall": 20 },
"byTool": [{ "tool": "summarize", "revenue": 3000, "calls": 150, "averagePerCall": 20 }],
"byKey": [{ "name": "heavy-user", "revenue": 2000, "calls": 80 }],
"hourlyRevenue": [{ "hour": "2025-01-15T14", "revenue": 500, "calls": 25 }],
"creditFlow": { "totalAllocated": 50000, "totalSpent": 5000, "totalRemaining": 45000 }
}
返回收入摘要,其中包含所赚取的总积分、按每次通话平均收入排名的每个工具收入、每个关键支出的前10名、每小时收入趋势(过去24小时)以及显示所有活动关键分配总额、支出总额和剩余额的积分流。只计算成功(允许)的呼叫。只读。
关键投资组合健康状况
curl http://localhost:3000/admin/key-portfolio -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalKeys": 10, "activeKeys": 7, "inactiveKeys": 2, "suspendedKeys": 1, "averageCreditUtilization": 0.35 },
"staleKeys": [{ "name": "unused-key", "createdAt": "2025-01-01T00:00:00Z", "credits": 500, "ageDays": 30 }],
"expiringSoon": [{ "name": "temp-key", "expiresAt": "2025-01-20T00:00:00Z", "hoursRemaining": 48, "credits": 100 }],
"ageDistribution": { "averageAgeDays": 15, "oldestAgeDays": 60, "newestAgeDays": 0 },
"byNamespace": [{ "namespace": "production", "total": 5, "active": 4, "suspended": 1 }]
}
返回整个投资组合的密钥健康状况:活动/非活动/暂停计数、平均信用利用率、过期密钥(创建但从未使用)、按紧急程度排序的7天内到期的密钥、年龄分布统计数据和命名空间细分。只读。
异常检测
curl http://localhost:3000/admin/anomalies -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalAnomalies": 3, "byType": { "high_denial_rate": 1, "rapid_credit_depletion": 1, "low_credits": 1 } },
"anomalies": [
{ "type": "high_denial_rate", "severity": "warning", "keyName": "test-key", "description": "Key \"test-key\" has 80% denial rate (8/10 calls denied)" },
{ "type": "rapid_credit_depletion", "severity": "warning", "keyName": "fast-spender", "description": "Key \"fast-spender\" has used 95% of allocated credits (950/1000)" },
{ "type": "low_credits", "severity": "info", "keyName": "nearly-empty", "description": "Key \"nearly-empty\" has only 5 credits remaining (5% of allocated)" }
],
"analyzedAt": "2025-01-15T14:30:00Z"
}
扫描所有活动密钥是否存在异常模式:拒绝率>50%(最低3次以上呼叫)、信用消耗快(花费>=75%)和剩余信用低(<=10信用或<=10%剩余)的密钥。每个异常都包括类型、严重性、受影响的密钥名称和人类可读的描述。只读。
使用预测
curl http://localhost:3000/admin/forecast -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalActiveKeys": 3, "keysAtRisk": 1 },
"keyForecasts": [
{ "keyName": "heavy-user", "creditsRemaining": 50, "totalSpent": 950, "callCount": 95, "avgCreditsPerCall": 10, "estimatedCallsRemaining": 5, "atRisk": true },
{ "keyName": "light-user", "creditsRemaining": 900, "totalSpent": 100, "callCount": 20, "avgCreditsPerCall": 5, "estimatedCallsRemaining": 180, "atRisk": false }
],
"systemForecast": {
"totalCreditsRemaining": 950,
"totalCreditsSpent": 1050,
"totalCalls": 115,
"byTool": [
{ "tool": "expensive_tool", "calls": 50, "totalCredits": 500, "avgCreditsPerCall": 10 },
{ "tool": "cheap_tool", "calls": 65, "totalCredits": 325, "avgCreditsPerCall": 5 }
]
},
"generatedAt": "2025-01-15T14:30:00Z"
}
预测所有活动密钥的信用消耗:每个密钥的消耗估计,包括剩余呼叫、风险识别(<=5个估计呼叫)、全系统信用汇总以及按收入排序的每个工具成本明细。不显示使用历史记录的密钥 estimatedCallsRemaining: null。只读。
合规报告
curl http://localhost:3000/admin/compliance -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"keyGovernance": { "totalKeys": 5, "keysWithExpiry": 3, "keysWithoutExpiry": 2 },
"accessControl": {
"keysWithAcl": 3, "keysWithoutAcl": 2,
"keysWithIpRestriction": 2, "keysWithoutIpRestriction": 3,
"keysWithSpendingLimit": 4, "keysWithoutSpendingLimit": 1
},
"auditTrail": { "totalEvents": 150, "uniqueTools": 5, "uniqueKeys": 4 },
"overallScore": 72,
"recommendations": [
"Set expiry dates on 2 key(s) without time-limited access",
"Add tool ACL restrictions to 2 key(s) with unrestricted tool access"
],
"generatedAt": "2025-01-15T14:30:00Z"
}
合规准备报告评分关键治理(到期25%)、访问控制(ACL 25%、IP 20%、支出限制15%)和审计跟踪(15%)。针对每个差距提出可采取行动的建议。只读。
SLA监控
curl http://localhost:3000/admin/sla -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalCalls": 150, "allowedCalls": 140, "deniedCalls": 10,
"successRate": 93.33,
"denialReasons": { "insufficient_credits": 6, "rate_limited": 3, "acl_denied": 1 }
},
"byTool": [
{ "tool": "tool_a", "totalCalls": 100, "allowedCalls": 95, "deniedCalls": 5, "successRate": 95 },
{ "tool": "tool_b", "totalCalls": 50, "allowedCalls": 45, "deniedCalls": 5, "successRate": 90 }
],
"uptime": { "startedAt": "2025-01-15T10:00:00Z", "uptimeSeconds": 16200 },
"generatedAt": "2025-01-15T14:30:00Z"
}
服务级别指标:总体成功率、按规范原因划分的拒绝细分(信用不足、利率限制、配额超出、acl_denied、支出限制、密钥暂停、密钥过期)、按调用量排序的每个工具的可用性,以及服务器正常运行时间跟踪。只读。
容量规划
curl http://localhost:3000/admin/capacity -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalCreditsAllocated": 10000, "totalCreditsSpent": 3500, "totalCreditsRemaining": 6500,
"utilizationPct": 35,
"burnRate": { "creditsPerCall": 10, "totalCalls": 350 }
},
"topConsumers": [
{ "keyName": "heavy-user", "creditsSpent": 2000, "creditsRemaining": 500, "callCount": 200 }
],
"byNamespace": {
"prod": { "allocated": 8000, "spent": 3000, "remaining": 5000, "keys": 3, "utilizationPct": 37 }
},
"recommendations": ["1 key(s) have less than 10% credits remaining"],
"generatedAt": "2025-01-15T14:30:00Z"
}
系统容量分析:总体信用利用率、烧钱率(信用/调用)、按支出排名的前10位消费者、每个命名空间细分以及高利用率(>=75%)或耗尽密钥的扩展建议。只读。
关键依赖关系图
curl http://localhost:3000/admin/dependencies -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalTools": 5, "usedTools": 3, "unusedTools": 2 },
"toolUsage": [
{ "tool": "search", "totalCalls": 150, "uniqueKeys": 8 },
{ "tool": "translate", "totalCalls": 45, "uniqueKeys": 3 }
],
"keyToolMap": [
{ "keyName": "power-user", "tools": ["search", "translate", "summarize"], "toolCount": 3 },
{ "keyName": "basic-user", "tools": ["search"], "toolCount": 1 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
工具到密钥关系图:显示每个密钥使用的工具、按总调用数排名的工具流行度、每个工具的唯一密钥计数,并标识孤立的工具(可用但未使用)。有助于理解工具的采用和修剪未使用的功能。只读。
工具延迟分析
curl http://localhost:3000/admin/latency -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalCalls": 200, "avgDurationMs": 45, "minDurationMs": 8, "maxDurationMs": 312, "p95DurationMs": 120 },
"byTool": [
{ "tool": "translate", "totalCalls": 80, "avgDurationMs": 65, "minDurationMs": 20, "maxDurationMs": 312, "p95DurationMs": 150 },
{ "tool": "search", "totalCalls": 120, "avgDurationMs": 32, "minDurationMs": 8, "maxDurationMs": 95, "p95DurationMs": 78 }
],
"slowestTools": [
{ "tool": "translate", "avgDurationMs": 65, "totalCalls": 80 }
],
"byKey": [
{ "keyName": "heavy-user", "totalCalls": 150, "avgDurationMs": 48, "minDurationMs": 8, "maxDurationMs": 312 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
每个工具的响应时间指标:每个工具的平均持续时间、p95、最小持续时间和最大持续时间,按最慢的平均时间、前10个最慢的工具排名、每个键的延迟细分和全局摘要排序。只计算成功(允许)的呼叫。只读。
错误率趋势
curl http://localhost:3000/admin/error-trends -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalCalls": 500, "totalDenials": 45, "overallErrorRate": 9, "trend": "improving" },
"byTool": [
{ "tool": "translate", "totalCalls": 200, "denials": 30, "errorRate": 15 },
{ "tool": "search", "totalCalls": 300, "denials": 15, "errorRate": 5 }
],
"denialReasons": [
{ "reason": "insufficient_credits", "count": 30 },
{ "reason": "rate_limited", "count": 15 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
拒绝率趋势:总体错误率、按表现最差、拒绝原因细分和趋势方向排序的每个工具的错误率(根据上半年与下半年的比较进行改进/降级/稳定)。只读。
信贷流量分析
curl http://localhost:3000/admin/credit-flow -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalAllocated": 10000, "totalSpent": 3500, "totalRemaining": 6500, "utilizationPct": 35 },
"topSpenders": [
{ "keyName": "heavy-user", "creditsSpent": 2000, "creditsRemaining": 500, "callCount": 200 }
],
"byTool": [
{ "tool": "search", "creditsSpent": 2000, "callCount": 400 },
{ "tool": "translate", "creditsSpent": 1500, "callCount": 150 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
信贷流入/流出分析:分配的总信贷(初始+支出)与支出与剩余信贷、利用率、按消耗的信贷排名的前10名支出者,以及按收入排序的每个工具支出明细。只读。
关键年龄分析
curl http://localhost:3000/admin/key-age -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalKeys": 15, "avgAgeHours": 168.5,
"oldestKey": { "keyName": "legacy", "ageHours": 720, "createdAt": "2025-01-01T00:00:00Z" },
"newestKey": { "keyName": "fresh", "ageHours": 0.5, "createdAt": "2025-01-31T12:00:00Z" }
},
"distribution": { "last24h": 3, "last7d": 5, "last30d": 4, "older": 3 },
"recentlyCreated": [
{ "keyName": "fresh", "ageHours": 0.5, "createdAt": "2025-01-31T12:00:00Z" }
],
"generatedAt": "2025-01-31T12:30:00Z"
}
密钥年龄分布:所有活动密钥的平均年龄、最旧/最新密钥标识、年龄段(最后24h/7d/30d/old)和最近创建的列表(最新优先,前10名)。只读。
命名空间使用情况摘要
curl http://localhost:3000/admin/namespace-usage -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalNamespaces": 3 },
"namespaces": [
{ "namespace": "prod", "keyCount": 5, "totalAllocated": 5000, "totalSpent": 2000, "totalRemaining": 3000, "totalCalls": 400, "utilizationPct": 40 },
{ "namespace": "staging", "keyCount": 2, "totalAllocated": 1000, "totalSpent": 200, "totalRemaining": 800, "totalCalls": 40, "utilizationPct": 20 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
每个命名空间使用指标:密钥计数、信用分配/支出/剩余、调用计数和利用率百分比。按支出排序(最高优先)。没有名称空间的键显示在“默认”下。只读。
审计总结
curl http://localhost:3000/admin/audit-summary -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalEvents": 142, "eventsLastHour": 18, "eventsLast24h": 95, "oldestEvent": "2025-01-14T08:00:00Z", "newestEvent": "2025-01-15T14:30:00Z" },
"eventsByType": [
{ "type": "gate.allow", "count": 80 },
{ "type": "gate.deny", "count": 25 },
{ "type": "key.created", "count": 12 }
],
"topActors": [
{ "actor": "pg_abc1...", "count": 60 },
{ "actor": "admin", "count": 30 }
],
"recentEvents": [
{ "id": 142, "timestamp": "2025-01-15T14:30:00Z", "type": "gate.allow", "actor": "pg_abc1...", "message": "Allowed: tool_a" }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
审计事件分析:包括每小时/每天计数的总事件、按频率排序的事件类型细分、前10个最活跃的参与者和20个最近的事件(最新事件优先)。只读。
集团绩效
curl http://localhost:3000/admin/group-performance -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": { "totalGroups": 2, "ungroupedKeys": 3 },
"groups": [
{
"groupId": "grp_abc123", "groupName": "prod-team", "description": "Production",
"keyCount": 5, "totalAllocated": 5000, "totalSpent": 2000, "totalRemaining": 3000,
"totalCalls": 400, "utilizationPct": 40,
"policy": { "allowedTools": ["tool_a"], "deniedTools": [], "rateLimitPerMin": 60 }
}
],
"generatedAt": "2025-01-15T14:30:00Z"
}
每组分析:关键计数、信用分配/支出/剩余、呼叫量和利用率百分比。包括组策略摘要(允许/拒绝的工具、速率限制)。按支出排序(最高优先)。还报告未分组的密钥计数。只读。
请求数量趋势
curl http://localhost:3000/admin/request-trends -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalRequests": 150, "totalAllowed": 130, "totalDenied": 20,
"totalCredits": 650, "avgDurationMs": 45,
"peakHour": { "hour": "2025-01-15T14:00:00Z", "total": 42 }
},
"hourly": [
{ "hour": "2025-01-15T12:00:00Z", "total": 35, "allowed": 30, "denied": 5, "credits": 150, "avgDurationMs": 40 },
{ "hour": "2025-01-15T13:00:00Z", "total": 42, "allowed": 38, "denied": 4, "credits": 190, "avgDurationMs": 50 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
每小时请求量时间序列:总/允许/拒绝计数、信用支出和每小时平均持续时间。包括高峰时段识别摘要。基于请求日志数据构建。按时间顺序排序。只读。
关键状态概述
curl http://localhost:3000/admin/key-status -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"counts": { "total": 20, "active": 15, "suspended": 2, "revoked": 2, "expired": 1 },
"needsAttention": [
{ "keyName": "low-balance", "issue": "low_credits", "detail": "5 credits remaining" },
{ "keyName": "trial-key", "issue": "expiring_soon", "detail": "Expires in 48 hours" }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
密钥状态仪表板:活动/暂停/撤销/过期计数,需要注意密钥。标记低信用(<=10)和接近到期(7天内)的活动密钥。只读。
Webhook健康
curl http://localhost:3000/admin/webhook-health -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"configured": true,
"status": "healthy",
"delivery": {
"totalDelivered": 142,
"totalFailed": 3,
"totalRetries": 5,
"pendingRetries": 0,
"deadLetterCount": 1,
"bufferedEvents": 0,
"paused": false,
"pausedAt": null,
"successRate": 97.93
},
"generatedAt": "2025-01-15T14:30:00Z"
}
Webhook交付运行状况概述。状态为 healthy, retrying, degraded (存在死信), paused,或 not_configured。包括成功率、等待重试、死信计数和缓冲事件。只读。
消费者洞察
curl http://localhost:3000/admin/consumer-insights -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalConsumers": 15,
"activeConsumers": 12,
"totalCreditsSpent": 4850,
"totalCalls": 970
},
"topSpenders": [
{ "name": "heavy-user", "totalSpent": 1200, "totalCalls": 240, "uniqueTools": 5 }
],
"mostActive": [
{ "name": "heavy-user", "totalCalls": 240, "totalSpent": 1200, "uniqueTools": 5 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
根据关键行为分析。按消费积分排名的前10名消费者,按通话次数排名的前10大最活跃消费者。每个条目都包括工具多样性(使用的独特工具)。摘要显示了总/活跃消费者和总支出。只读。
系统健康评分
curl http://localhost:3000/admin/system-health -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"score": 85,
"level": "healthy",
"components": {
"keyHealth": { "score": 90, "weight": 0.4, "detail": "2 suspended" },
"errorRate": { "score": 80, "weight": 0.35, "detail": "10% denial rate (5/50)" },
"creditUtilization": { "score": 85, "weight": 0.25, "detail": "45% utilized (4500/10000 credits)" }
},
"generatedAt": "2025-01-15T14:30:00Z"
}
综合系统健康评分0-100,包括加权组件细分。密钥健康状况(40%):对暂停/撤销/过期/低信用密钥进行处罚。错误率(35%):惩罚高拒绝率。信贷利用率(25%):10-80%为健康水平,80%以上为下降水平。级别:健康(>=80)、良好(>=60)、警告(>=40)、严重(<40)。只读。
工具采用
curl http://localhost:3000/admin/tool-adoption -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"tools": [
{
"tool": "search",
"uniqueConsumers": 8,
"adoptionRate": 80,
"totalCalls": 245,
"firstSeen": "2025-01-10T08:00:00Z",
"lastSeen": "2025-01-15T14:30:00Z"
},
{
"tool": "translate",
"uniqueConsumers": 3,
"adoptionRate": 30,
"totalCalls": 42,
"firstSeen": "2025-01-12T10:00:00Z",
"lastSeen": "2025-01-15T12:00:00Z"
}
],
"summary": {
"totalTools": 2,
"usedTools": 2,
"unusedTools": 0
},
"generatedAt": "2025-01-15T14:30:00Z"
}
每个工具的采用指标显示了正在使用哪些工具以及有多少消费者在使用这些工具。 uniqueConsumers 计算调用该工具的不同API键。 adoptionRate 是已使用该工具的活动密钥的百分比。按采用率降序排列,然后按总呼叫数排序。只读。
信贷效率
curl http://localhost:3000/admin/credit-efficiency -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalAllocated": 5000,
"totalSpent": 1200,
"totalRemaining": 3800,
"burnEfficiency": 24,
"wasteRatio": 76,
"activeKeys": 10
},
"overProvisioned": [
{ "name": "idle-whale", "credits": 950, "totalAllocated": 1000, "totalSpent": 50, "remainingPercent": 95 }
],
"underProvisioned": [
{ "name": "heavy-user", "credits": 3, "totalAllocated": 500, "totalSpent": 497, "remainingPercent": 1 }
],
"generatedAt": "2025-01-15T14:30:00Z"
}
信贷分配效率分析。 burnEfficiency 是实际花费的分配学分的百分比。 wasteRatio 是剩余未使用的百分比。超额配置的密钥剩余信用超过90%。配置不足的密钥有<=10个信用点或<=10%的剩余有效使用率。按紧急程度排序的每个类别的前10名。只读。
访问热图
curl http://localhost:3000/admin/access-heatmap -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"hourly": [
{
"hour": "2025-01-15T14:00:00.000Z",
"total": 45,
"uniqueConsumers": 8,
"tools": { "search": 30, "translate": 15 }
}
],
"summary": {
"totalRequests": 45,
"totalHours": 1,
"peakHour": { "hour": "2025-01-15T14:00:00.000Z", "total": 45 }
},
"generatedAt": "2025-01-15T14:30:00Z"
}
容量规划的每小时访问模式。每个bucket显示总请求、唯一消费者和每个工具的细分。高峰时段识别有助于发现使用高峰。只计算允许的请求。按时间顺序排序。只读。
关键流失分析
curl http://localhost:3000/admin/key-churn -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"summary": {
"totalKeys": 50,
"activeKeys": 40,
"revokedKeys": 5,
"suspendedKeys": 3,
"neverUsedKeys": 8,
"churnRate": 10,
"retentionRate": 90,
"avgCreditsPerKey": 250
},
"generatedAt": "2025-01-15T14:30:00Z"
}
显示API密钥库运行状况的密钥流失分析。 churnRate 是已撤销密钥的百分比。 retentionRate 反之亦然。 neverUsedKeys 计数活动键,总呼叫数为零。 avgCreditsPerKey 显示活动密钥的平均剩余积分。只读。
工具相关性
curl http://localhost:3000/admin/tool-correlation -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"pairs": [
{ "toolA": "search", "toolB": "translate", "sharedConsumers": 5, "strength": 50 },
{ "toolA": "search", "toolB": "summarize", "sharedConsumers": 3, "strength": 30 }
],
"summary": { "totalPairs": 2, "totalConsumers": 10 },
"generatedAt": "2025-01-15T14:30:00Z"
}
工具共现分析,显示哪些工具通常一起使用。 sharedConsumers 计算使用这两种工具的API密钥。 strength 是使用这双鞋的所有消费者的百分比。按共享消费者降序排列。帮助识别工具包和使用模式。只读。
消费者细分
curl http://localhost:3000/admin/consumer-segmentation -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"segments": [
{ "segment": "power", "count": 3, "totalCredits": 500, "totalSpent": 2400, "avgCallsPerKey": 35 },
{ "segment": "regular", "count": 8, "totalCredits": 1200, "totalSpent": 800, "avgCallsPerKey": 12 },
{ "segment": "casual", "count": 15, "totalCredits": 3000, "totalSpent": 150, "avgCallsPerKey": 2 },
{ "segment": "dormant", "count": 5, "totalCredits": 1000, "totalSpent": 0, "avgCallsPerKey": 0 }
],
"summary": { "totalConsumers": 31 },
"generatedAt": "2025-01-15T14:30:00Z"
}
根据使用情况将活跃的API关键消费者分类为细分市场: 力量 (20+个呼叫), 常规的 (5-19个电话), 随意的 (1-4个呼叫), 休眠的 (0个呼叫)。每个部分都包括汇总指标:计数、剩余总学分、总花费和每个密钥的平均呼叫数。不包括已撤销和已暂停的密钥。只读。
信用分配
curl http://localhost:3000/admin/credit-distribution -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"buckets": [
{ "range": "0-10", "count": 5, "totalCredits": 30 },
{ "range": "11-50", "count": 12, "totalCredits": 420 },
{ "range": "51-100", "count": 8, "totalCredits": 640 },
{ "range": "101-500", "count": 4, "totalCredits": 1200 },
{ "range": "1001+", "count": 2, "totalCredits": 5000 }
],
"summary": { "totalKeys": 31, "medianCredits": 50 },
"generatedAt": "2025-01-15T14:30:00Z"
}
活跃、未暂停密钥的信用余额柱状图。雄鹿:0-10、11-50、51-100、101-500、501-1000、1001+。仅返回非空桶。 medianCredits 是剩余余额的中位数。可用于定价分析和容量规划。只读。
响应时间分布
curl http://localhost:3000/admin/response-time-distribution -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"buckets": [
{ "range": "0-50ms", "count": 45, "percentage": 60 },
{ "range": "51-100ms", "count": 20, "percentage": 27 },
{ "range": "101-250ms", "count": 8, "percentage": 11 },
{ "range": "251-500ms", "count": 2, "percentage": 3 }
],
"summary": { "totalRequests": 75, "avgResponseTime": 62, "p50": 42, "p95": 180, "p99": 350 },
"generatedAt": "2025-01-15T14:30:00Z"
}
允许的工具调用的响应时间柱状图。Buckets:0-50ms、51-100ms、101-250ms、251-500ms、501-1000ms、1001ms+。包括百分位数指标(p50、p95、p99)和平均响应时间。仅返回非空桶。可用于SLA监控和性能优化。只读。
消费者终身价值
curl http://localhost:3000/admin/consumer-lifetime-value -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"consumers": [
{ "name": "enterprise-bot", "lifetimeValue": 2500, "totalCalls": 500, "avgSpendPerCall": 5, "toolsUsed": 8, "tier": "high" },
{ "name": "dev-team", "lifetimeValue": 450, "totalCalls": 90, "avgSpendPerCall": 5, "toolsUsed": 4, "tier": "medium" },
{ "name": "trial-user", "lifetimeValue": 5, "totalCalls": 1, "avgSpendPerCall": 5, "toolsUsed": 1, "tier": "low" }
],
"summary": { "totalConsumers": 15, "totalLifetimeValue": 3200, "avgLifetimeValue": 213 },
"generatedAt": "2025-01-15T14:30:00Z"
}
对活动密钥的使用情况进行按消费者价值分析。价值层次: 高 (已花费100+学分), 中等 (10–99), 低 (<10). toolsUsed 显示了工具的多样性。按终身价值排名的前20位消费者。零支出消费者被排除在名单之外。 avgLifetimeValue 使用所有活动密钥作为分母。只读。
工具收入排名
curl http://localhost:3000/admin/tool-revenue -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"tools": [
{ "tool": "code_review", "totalCredits": 1500, "callCount": 300, "avgCreditsPerCall": 5, "uniqueConsumers": 25, "percentage": 60 },
{ "tool": "generate_tests", "totalCredits": 750, "callCount": 150, "avgCreditsPerCall": 5, "uniqueConsumers": 18, "percentage": 30 },
{ "tool": "lint_check", "totalCredits": 250, "callCount": 50, "avgCreditsPerCall": 5, "uniqueConsumers": 12, "percentage": 10 }
],
"summary": { "totalTools": 3, "totalRevenue": 2500, "topTool": "code_review" },
"generatedAt": "2025-01-15T14:30:00Z"
}
根据允许的请求消耗的总积分对工具进行排名。每个工具条目都包括呼叫计数、每次呼叫的平均信用、唯一消费者计数和收入百分比。 topTool 是最高的收入来源。只计算允许的请求;被拒绝的请求被排除在外。按总学分降序排列。只读。
消费者保留队列
curl http://localhost:3000/admin/consumer-retention -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"cohorts": [
{ "period": "2025-01-15", "created": 10, "retained": 8, "retentionRate": 80, "avgSpend": 150 },
{ "period": "2025-01-14", "created": 5, "retained": 3, "retentionRate": 60, "avgSpend": 80 }
],
"summary": { "totalKeys": 15, "retainedKeys": 11, "overallRetentionRate": 73 },
"generatedAt": "2025-01-15T14:30:00Z"
}
按创建日期对活跃消费者进行分组(YYYY-MM-DD队列)。如果消费者至少有一次工具调用,则被“保留”。每个队列:创建计数、保留计数、保留率百分比和平均支出。不包括已撤销/暂停的密钥。队列将最新的排在第一位。只读。
错误分解
curl http://localhost:3000/admin/error-breakdown -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"errors": [
{ "reason": "insufficient_credits", "count": 45, "percentage": 75, "affectedConsumers": 12 },
{ "reason": "rate_limited", "count": 10, "percentage": 17, "affectedConsumers": 3 },
{ "reason": "acl_denied", "count": 5, "percentage": 8, "affectedConsumers": 2 }
],
"summary": { "totalDenied": 60, "totalAllowed": 940, "errorRate": 6 },
"generatedAt": "2025-01-15T14:30:00Z"
}
按拒绝原因对拒绝的请求进行分类,以进行根本原因分析。按原因:计数、总拒绝百分比和受影响的消费者计数。 errorRate 是被拒绝的请求总数的百分比。按计数降序排序。只读。
信贷利用率
curl http://localhost:3000/admin/credit-utilization -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"bands": [
{ "range": "0%", "count": 5, "percentage": 25 },
{ "range": "1-25%", "count": 8, "percentage": 40 },
{ "range": "26-50%", "count": 4, "percentage": 20 },
{ "range": "51-75%", "count": 2, "percentage": 10 },
{ "range": "76-99%", "count": 1, "percentage": 5 }
],
"summary": { "totalAllocated": 10000, "totalSpent": 3500, "overallUtilization": 35, "totalKeys": 20 },
"generatedAt": "2025-01-15T14:30:00Z"
}
显示在活动密钥中使用的已分配信用的百分比。利用率范围: 0% (未使用), 1-25%, 26-50%, 51-75%, 76-99%, 100% (完全消耗)。 totalAllocated =剩余学分+已用学分(原始分配)。不包括已撤销/暂停的密钥。只读。
命名空间收入
curl http://localhost:3000/admin/namespace-revenue -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"namespaces": [
{ "namespace": "team-alpha", "totalSpent": 1500, "totalCalls": 300, "keyCount": 5, "percentage": 60 },
{ "namespace": "team-beta", "totalSpent": 750, "totalCalls": 150, "keyCount": 3, "percentage": 30 },
{ "namespace": "default", "totalSpent": 250, "totalCalls": 50, "keyCount": 2, "percentage": 10 }
],
"summary": { "totalNamespaces": 3, "totalRevenue": 2500, "topNamespace": "team-alpha" },
"generatedAt": "2025-01-15T14:30:00Z"
}
按命名空间划分的收入明细。没有名称空间的键被分组为“默认”。每个命名空间:花费的总积分、呼叫计数、密钥计数和收入百分比。 topNamespace 是最高的收入来源。不包括已撤销/暂停的密钥。按支出降序排列。只读。
集团收入
curl http://localhost:3000/admin/group-revenue -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"groups": [
{ "group": "premium", "totalSpent": 2000, "totalCalls": 400, "keyCount": 8, "percentage": 65 },
{ "group": "free-tier", "totalSpent": 800, "totalCalls": 160, "keyCount": 12, "percentage": 26 },
{ "group": "ungrouped", "totalSpent": 280, "totalCalls": 56, "keyCount": 3, "percentage": 9 }
],
"summary": { "totalGroups": 3, "totalRevenue": 3080, "topGroup": "premium" },
"generatedAt": "2025-01-15T14:30:00Z"
}
按关键群体划分的收入明细。未分配给任何组的密钥显示为“未分组”。组ID被解析为人类可读的名称。每组:花费的总积分、呼叫数、密钥数和收入百分比。 topGroup 是最高的收入来源。不包括已撤销/暂停的密钥。按支出降序排列。只读。
峰值使用时间
curl http://localhost:3000/admin/peak-usage -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"hours": [
{ "hour": 9, "requests": 450, "allowed": 420, "denied": 30, "credits": 2100, "uniqueConsumers": 15, "percentage": 30 },
{ "hour": 14, "requests": 380, "allowed": 370, "denied": 10, "credits": 1850, "uniqueConsumers": 12, "percentage": 25 },
{ "hour": 22, "requests": 120, "allowed": 118, "denied": 2, "credits": 590, "uniqueConsumers": 5, "percentage": 8 }
],
"summary": { "totalRequests": 1500, "peakHour": 9, "peakRequests": 450 },
"generatedAt": "2025-01-15T14:30:00Z"
}
按小时(UTC)划分的交通模式。每小时:总请求数、允许/拒绝拆分、花费的积分、唯一消费者和流量百分比。 peakHour 确定容量规划的最繁忙时间。小时数为0-23(UTC),按升序排列。仅包括交通小时数。只读。
消费者活动
curl http://localhost:3000/admin/consumer-activity -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"consumers": [
{ "name": "alice", "totalCalls": 150, "totalSpent": 750, "creditsRemaining": 250, "lastActive": "2025-01-15T14:30:00Z", "status": "active" },
{ "name": "bob", "totalCalls": 0, "totalSpent": 0, "creditsRemaining": 500, "lastActive": null, "status": "inactive" }
],
"summary": { "totalConsumers": 2, "activeConsumers": 1, "inactiveConsumers": 1 },
"generatedAt": "2025-01-15T14:30:00Z"
}
每个消费者活动指标。显示每个活动密钥的呼叫计数、总支出、剩余积分、上次活动时间戳和活动/非活动状态。没有电话的消费者是“不活跃的”。不包括已撤销/暂停的密钥。按支出降序排列。只读。
工具流行度
curl http://localhost:3000/admin/tool-popularity -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"tools": [
{ "tool": "search", "totalCalls": 500, "totalCredits": 2500, "uniqueConsumers": 20, "percentage": 50 },
{ "tool": "generate", "totalCalls": 300, "totalCredits": 3000, "uniqueConsumers": 15, "percentage": 30 },
{ "tool": "translate", "totalCalls": 200, "totalCredits": 1000, "uniqueConsumers": 10, "percentage": 20 }
],
"summary": { "totalTools": 3, "totalCalls": 1000, "mostPopular": "search" },
"generatedAt": "2025-01-15T14:30:00Z"
}
工具使用流行度排名。每个工具:总通话次数、花费的信用额度、唯一消费者和通话百分比。只计算允许的(成功的)请求。 mostPopular 识别最常用的工具。按通话次数降序排列。只读。
信贷分配汇总
curl http://localhost:3000/admin/credit-allocation -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"tiers": [
{ "tier": "1-100", "count": 15, "totalCredits": 750, "percentage": 5.0 },
{ "tier": "101-500", "count": 30, "totalCredits": 9000, "percentage": 60.0 },
{ "tier": "501+", "count": 5, "totalCredits": 5250, "percentage": 35.0 }
],
"summary": { "totalKeys": 50, "totalAllocated": 15000, "totalRemaining": 12000, "totalSpent": 3000, "averageAllocation": 300 },
"generatedAt": "2025-01-15T14:30:00Z"
}
跨活动密钥的信用分配分布。根据计数、总学分和每层百分比将密钥分为分配层(1-100、101-500、501+)。摘要包括总密钥、总分配/剩余/已用学分和每个密钥的平均分配。不包括已撤销/暂停的密钥。只读。
每日摘要
curl http://localhost:3000/admin/daily-summary -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"days": [
{ "date": "2025-01-15", "requests": 150, "allowed": 140, "denied": 10, "creditsSpent": 700, "uniqueConsumers": 25, "uniqueTools": 8, "newKeys": 3 },
{ "date": "2025-01-14", "requests": 120, "allowed": 115, "denied": 5, "creditsSpent": 575, "uniqueConsumers": 20, "uniqueTools": 7, "newKeys": 1 }
],
"summary": { "totalDays": 2, "totalRequests": 270, "totalCreditsSpent": 1275, "averageRequestsPerDay": 135 },
"generatedAt": "2025-01-15T14:30:00Z"
}
用于趋势分析的每日活动汇总。每天:总请求数、允许/拒绝细分、花费的积分、唯一消费者、唯一工具和创建的新密钥。摘要包括总天数、总请求数、总学分和每天的平均请求数。按日期降序排列(最近的日期在前)。只读。
关键排名
curl http://localhost:3000/admin/key-ranking -H "X-Admin-Key: YOUR_ADMIN_KEY"
# Sort by calls: ?sortBy=totalCalls
# Sort by credits remaining: ?sortBy=creditsRemaining
{
"rankings": [
{ "rank": 1, "name": "power-user", "totalSpent": 500, "totalCalls": 100, "creditsRemaining": 500 },
{ "rank": 2, "name": "moderate-user", "totalSpent": 200, "totalCalls": 40, "creditsRemaining": 800 },
{ "rank": 3, "name": "light-user", "totalSpent": 50, "totalCalls": 10, "creditsRemaining": 950 }
],
"summary": { "totalKeys": 3, "sortedBy": "totalSpent" },
"generatedAt": "2025-01-15T14:30:00Z"
}
按可配置指标排名的关键排行榜。默认排序方式 totalSpent 下降。使用 ?sortBy=totalCalls 或 ?sortBy=creditsRemaining 对于替代排名。每个条目都包括排名号、姓名、花费、通话和剩余积分。不包括已撤销/暂停的密钥。只读。
每小时交通量
curl http://localhost:3000/admin/hourly-traffic -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"hours": [
{ "timestamp": "2025-01-15T14:00:00Z", "requests": 45, "allowed": 42, "denied": 3, "credits": 210, "uniqueConsumers": 12, "uniqueTools": 5 },
{ "timestamp": "2025-01-15T13:00:00Z", "requests": 30, "allowed": 28, "denied": 2, "credits": 140, "uniqueConsumers": 8, "uniqueTools": 4 }
],
"summary": { "totalRequests": 75, "totalCredits": 350, "busiestHour": "2025-01-15T14:00:00Z", "busiestHourRequests": 45 },
"generatedAt": "2025-01-15T14:30:00Z"
}
精细的每小时请求度量。每小时:总请求数、允许/拒绝细分、花费的积分、唯一消费者和唯一工具。摘要包括总计并确定最繁忙的时间。按时间戳降序排序(最新时间在前)。只读。
刀具误差率
curl http://localhost:3000/admin/tool-error-rate -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"tools": [
{ "tool": "translate", "totalRequests": 100, "allowed": 85, "denied": 15, "errorRate": 15 },
{ "tool": "search", "totalRequests": 200, "allowed": 190, "denied": 10, "errorRate": 5 },
{ "tool": "generate", "totalRequests": 150, "allowed": 150, "denied": 0, "errorRate": 0 }
],
"summary": { "totalTools": 3, "overallErrorRate": 5.56, "highestErrorTool": "translate" },
"generatedAt": "2025-01-15T14:30:00Z"
}
每工具错误/拒绝率分析。每个工具:总请求数、允许/拒绝计数和错误率百分比。摘要包括总工具、总体错误率,并确定了错误率最高的工具。按错误率降序排序。只读。
消费者支出速度
curl http://localhost:3000/admin/consumer-spend-velocity -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"consumers": [
{ "name": "power-user", "totalSpent": 500, "creditsRemaining": 500, "creditsPerHour": 25.5, "hoursUntilDepleted": 19.61 },
{ "name": "casual-user", "totalSpent": 50, "creditsRemaining": 950, "creditsPerHour": 2.1, "hoursUntilDepleted": 452.38 },
{ "name": "idle-user", "totalSpent": 0, "creditsRemaining": 100, "creditsPerHour": 0, "hoursUntilDepleted": null }
],
"summary": { "totalConsumers": 3, "fastestSpender": "power-user" },
"generatedAt": "2025-01-15T14:30:00Z"
}
按消费者支出速度分析。每位消费者:总花费、剩余积分、每小时积分率和预计消耗时间。零消费消费者 creditsPerHour: 0 和 hoursUntilDepleted: null.Summary确定了支出最快的人。不包括已撤销/暂停的密钥。按支出率降序排列。只读。
命名空间活动
curl http://localhost:3000/admin/namespace-activity -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"namespaces": [
{ "namespace": "production", "keyCount": 5, "totalSpent": 1200, "totalCalls": 240, "creditsRemaining": 3800 },
{ "namespace": "staging", "keyCount": 2, "totalSpent": 80, "totalCalls": 16, "creditsRemaining": 920 },
{ "namespace": "default", "keyCount": 1, "totalSpent": 0, "totalCalls": 0, "creditsRemaining": 100 }
],
"summary": { "totalNamespaces": 3, "topNamespace": "production" },
"generatedAt": "2025-01-15T14:30:00Z"
}
多租户可见性的每个命名空间活动细分。每个命名空间:密钥计数、总花费、总调用数、剩余积分。没有名称空间的键被分组为“默认”。摘要按支出标识顶级命名空间。不包括已撤销/暂停的密钥。按总花费降序排列。只读。
信贷消耗率
curl http://localhost:3000/admin/credit-burn-rate -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"burnRate": { "creditsPerHour": 45.5, "hoursUntilDepleted": 104.4, "utilizationPercent": 25 },
"summary": { "totalAllocated": 5000, "totalSpent": 1250, "totalRemaining": 3750, "activeKeys": 10 },
"generatedAt": "2025-01-15T14:30:00Z"
}
全系统信贷消耗率分析。显示总学分/小时消耗率、利用率百分比(已使用/已分配)以及所有学分耗尽前的估计小时数。摘要包括总分配密钥数、已花费密钥数、剩余密钥数和活动密钥数。零支出系统展示 creditsPerHour: 0 和 hoursUntilDepleted: null。不包括已撤销/暂停的密钥。只读。
消费者风险评分
curl http://localhost:3000/admin/consumer-risk-score -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"consumers": [
{ "name": "heavy-user", "riskScore": 80, "riskLevel": "critical", "creditsRemaining": 20, "totalSpent": 80, "utilizationPercent": 80 },
{ "name": "normal-user", "riskScore": 25, "riskLevel": "medium", "creditsRemaining": 150, "totalSpent": 50, "utilizationPercent": 25 },
{ "name": "idle-user", "riskScore": 0, "riskLevel": "low", "creditsRemaining": 100, "totalSpent": 0, "utilizationPercent": 0 }
],
"summary": { "totalConsumers": 3, "riskDistribution": { "low": 1, "medium": 1, "high": 0, "critical": 1 } },
"generatedAt": "2025-01-15T14:30:00Z"
}
基于信贷利用率的每位消费者风险评分。风险评分(0-100)对应于以下级别:低(0-24)、中(25-49)、高(50-74)、严重(75-100)。每位消费者:风险评分、风险等级、剩余信用、总支出、利用率。摘要包括风险分布计数。不包括已撤销/暂停的密钥。按riskScore降序排列。只读。
收入预测
curl http://localhost:3000/admin/revenue-forecast -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"forecast": { "nextHour": 45.5, "nextDay": 1092, "nextWeek": 7644, "nextMonth": 32760 },
"current": { "totalSpent": 1250, "totalRemaining": 48750, "creditsPerHour": 45.5, "activeKeys": 10 },
"generatedAt": "2025-01-15T14:30:00Z"
}
基于当前支出趋势的预计收入。对下一小时、一天、一周和一个月的预测是根据总学分/小时费率推断出来的,并以剩余总学分为上限。包括当前总数和活动密钥计数。零支出系统显示零预测。不包括已撤销/暂停的密钥。只读。
系统概述
curl http://localhost:3000/admin/system-overview -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"keys": { "total": 15, "active": 12, "revoked": 2, "suspended": 1 },
"credits": { "totalAllocated": 150000, "totalSpent": 45000, "totalRemaining": 105000, "utilizationPercent": 30 },
"activity": { "totalCalls": 3500, "uniqueTools": 8 },
"generatedAt": "2025-01-15T14:30:00Z"
}
整个系统的执行摘要。按状态(活动、撤销、暂停)统计密钥数。信贷总额与利用率百分比。活动指标,包括总通话次数和使用的独特工具。用于仪表板和监控集成的单一端点。只读。
关键健康概述
curl http://localhost:3000/admin/key-health-overview -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"keys": [
{ "name": "depleted-key", "credits": 0, "totalSpent": 1000, "totalCalls": 85, "utilizationPercent": 100, "status": "critical" },
{ "name": "active-key", "credits": 200, "totalSpent": 800, "totalCalls": 60, "utilizationPercent": 80, "status": "warning" },
{ "name": "healthy-key", "credits": 9000, "totalSpent": 1000, "totalCalls": 50, "utilizationPercent": 10, "status": "healthy" }
],
"summary": { "totalKeys": 3, "healthDistribution": { "healthy": 1, "warning": 1, "critical": 1 } },
"generatedAt": "2025-01-15T14:30:00Z"
}
按关键点进行全面健康检查。状态级别: critical (剩余0学分), warning (利用率≥75%), healthy (低于阈值)。摘要包括健康分布计数。按学分升序排列(最耗尽的先)。不包括已撤销/暂停的密钥。只读。
命名空间比较
curl http://localhost:3000/admin/namespace-comparison -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"namespaces": [
{ "namespace": "production", "keyCount": 5, "totalAllocated": 50000, "totalSpent": 12000, "totalCalls": 800, "creditsRemaining": 38000, "utilizationPercent": 24 },
{ "namespace": "staging", "keyCount": 3, "totalAllocated": 3000, "totalSpent": 500, "totalCalls": 50, "creditsRemaining": 2500, "utilizationPercent": 17 }
],
"summary": { "totalNamespaces": 2, "leader": "production" },
"generatedAt": "2025-01-15T14:30:00Z"
}
并排命名空间比较。每个命名空间:键计数、分配的总积分、花费的总次数、调用的总次数,剩余积分,利用率百分比。没有命名空间的键出现在 "default"摘要包括命名空间计数和前导命名空间(最高分配)。按总分配数降序排序。不包括已撤销/暂停的密钥。只读。
消费者增长
curl http://localhost:3000/admin/consumer-growth -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"consumers": [
{ "name": "enterprise-key", "ageHours": 720, "totalSpent": 4500, "creditsAllocated": 10000, "spendRate": 6.25 },
{ "name": "trial-key", "ageHours": 24, "totalSpent": 10, "creditsAllocated": 100, "spendRate": 0.42 }
],
"summary": { "totalConsumers": 2, "newConsumers24h": 1 },
"generatedAt": "2025-01-15T14:30:00Z"
}
每个密钥的消费者增长指标。每位消费者:自创建以来的年龄(小时)、花费的总积分、分配的原始积分(积分+总花费)、花费率(积分/小时)。摘要包括过去24小时内的活跃消费者总数和新增消费者。按信用分配降序排序。不包括已撤销/暂停的密钥。只读。
工具盈利能力
curl http://localhost:3000/admin/tool-profitability -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"tools": [
{ "tool": "search", "totalCalls": 150, "totalRevenue": 450, "avgRevenuePerCall": 3, "callerCount": 8 },
{ "tool": "translate", "totalCalls": 40, "totalRevenue": 120, "avgRevenuePerCall": 3, "callerCount": 3 }
],
"summary": { "totalRevenue": 570, "mostProfitable": "search", "leastProfitable": "translate" },
"generatedAt": "2025-01-15T14:30:00Z"
}
基于实际工具调用收入的每工具盈利能力分析。每个工具:总通话次数、总收入(花费的信用)、每次通话的平均收入、唯一通话次数。按总收入降序排列。摘要包括利润最高/最低的工具和所有工具的总收入。只读。
信用浪费分析
curl http://localhost:3000/admin/credit-waste -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"keys": [
{ "name": "unused-key", "creditsAllocated": 1000, "creditsUsed": 0, "creditsRemaining": 1000, "wastePercent": 100 },
{ "name": "active-key", "creditsAllocated": 500, "creditsUsed": 350, "creditsRemaining": 150, "wastePercent": 30 }
],
"summary": { "totalAllocated": 1500, "totalWasted": 1150, "averageWastePercent": 65 },
"generatedAt": "2025-01-15T14:30:00Z"
}
根据关键信用浪费分析,显示分配的信用与使用的信用。废物百分比=剩余/分配×100(100%=完全未使用,0%=完全利用)。摘要包括总分配学分、总浪费(剩余)和平均浪费百分比。按废物百分比降序排列(最大的废物排在第一位)。不包括已撤销/暂停的密钥。只读。
小组活动
curl http://localhost:3000/admin/group-activity -H "X-Admin-Key: YOUR_ADMIN_KEY"
{
"groups": [
{ "group": "production", "keyCount": 5, "totalSpent": 2500, "totalCalls": 180, "creditsRemaining": 7500 },
{ "group": "staging", "keyCount": 3, "totalSpent": 400, "totalCalls": 45, "creditsRemaining": 2600 }
],
"summary": { "totalGroups": 2, "topGroup": "production" },
"generatedAt": "2025-01-15T14:30:00Z"
}
按关键组划分的活动明细。每组:密钥计数、总花费、总呼叫数、剩余积分。未分组的按键显示在 "ungrouped"组ID被解析为人类可读的组名。按总花费降序排列。摘要包括团体计数和顶级支出团体。不包括已撤销/暂停的密钥。只读。
IP允许列表
将API密钥限制为特定的IP地址或CIDR范围:
# Set IP allowlist on a key (replaces existing list)
curl -X POST http://localhost:3402/keys/ip \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "ips": ["192.168.1.0/24", "10.0.0.5"]}'
# Clear allowlist (allow all IPs)
curl -X POST http://localhost:3402/keys/ip \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "ips": []}'
您还可以在密钥创建时设置分配列表:
curl -X POST http://localhost:3402/keys \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "prod-agent", "credits": 1000, "ipAllowlist": ["10.0.0.0/8"]}'
支持精确的IPv4匹配和CIDR表示法(/8, /16, /24, /32等等)。当分配列表为空时,允许所有IP。从中提取客户端IP X-Forwarded-For 标头或套接字远程地址。配置 trustedProxies 有关负载平衡器后面的精确IP提取(请参见 可信代理).
关键标签/元数据
将任意键值标记附加到API键以进行外部系统集成:
# Set tags (merge semantics — existing tags preserved, new ones added/updated)
curl -X POST http://localhost:3402/keys/tags \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "tags": {"team": "backend", "env": "production", "customer_id": "cus_123"}}'
# Remove a tag (set value to null)
curl -X POST http://localhost:3402/keys/tags \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"key": "pg_...", "tags": {"env": null}}'
# Search keys by tags
curl -X POST http://localhost:3402/keys/search \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"tags": {"team": "backend"}}'
# → { "keys": [...], "count": 3 }
标签也可以在密钥创建时设置:
curl -X POST http://localhost:3402/keys \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "backend-prod", "credits": 5000, "tags": {"team": "backend", "env": "production"}}'
限制:每个键最多50个标签,每个键/值最多100个字符。标签出现在 /balance 回复和关键列表。
使用情况分析
查询仪表板、报告和趋势分析的聚合使用数据:
# Get analytics for the last 24 hours (hourly buckets)
curl "http://localhost:3402/analytics?from=2026-02-25T00:00:00Z&to=2026-02-26T00:00:00Z&granularity=hourly" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# Daily granularity with top 5 consumers
curl "http://localhost:3402/analytics?granularity=daily&topN=5" \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
退货:
- 时间序列 --按时间窗口计费的通话次数、收取的点数和拒绝次数
- 工具故障 --按使用情况排序的每工具统计数据(通话、信用、平均成本)
- 顶级消费者 -前N个API密钥(按信用额度划分),每个密钥使用最多的工具
- 趋势 --当前与上一时期的百分比变化比较(通话、信用、拒绝)
- 总结 --总通话次数、积分、唯一密钥和唯一工具
查询参数: from (ISO日期), to (ISO日期), granularity (hourly 或 daily,默认值: hourly), topN (数字,默认值: 10).
提醒Webhooks
配置规则以在超过使用阈值时触发警报。警报通过webhooks传递,如下所示 alert.fired 管理员事件:
# Configure alert rules
curl -X POST http://localhost:3402/alerts \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"rules": [
{"type": "spending_threshold", "threshold": 80},
{"type": "credits_low", "threshold": 50},
{"type": "quota_warning", "threshold": 90},
{"type": "key_expiry_soon", "threshold": 86400},
{"type": "rate_limit_spike", "threshold": 10}
]}'
# Consume pending alerts (returns and clears queue)
curl http://localhost:3402/alerts \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
警报类型:
| 类型 | 阈值含义 | 火灾时 |
|---|---|---|
spending_threshold |
百分比(0-100) | 密钥已花费其初始信用的≥阈值% |
credits_low |
绝对学分 | Key的剩余学分降至阈值以下 |
quota_warning |
百分比(0–100) | Key的每日通话使用量超过配额的阈值% |
key_expiry_soon |
秒 | 密钥在阈值秒内过期 |
rate_limit_spike |
计数 | 密钥在5分钟内拒绝了≥阈值的速率限制 |
每个规则都有一个可选 cooldownSeconds (默认值:300)以防止警报风暴。每次闸门评估(工具调用)时都会自动检查警报。
启用webhooks时(--webhook-url),发出火灾警报 alert.fired 事件在 adminEvents 具有完整上下文(键、规则类型、当前值、阈值)的webhook有效负载。
团队管理
将API密钥分组到具有共享预算、配额和使用情况跟踪的团队中。团队在关卡级别执行预算和配额限制——如果一个密钥属于一个超过其预算或配额的团队,即使单个密钥还有剩余积分,工具调用也会被拒绝。
# Create a team
curl -X POST http://localhost:3402/teams \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"name": "Engineering", "budget": 10000, "tags": {"dept": "eng"}}'
# Assign an API key to a team
curl -X POST http://localhost:3402/teams/assign \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"teamId": "team_abc123...", "apiKey": "pg_abc123..."}'
# Set team quotas (daily/monthly limits)
curl -X POST http://localhost:3402/teams/update \
-H "Content-Type: application/json" \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-d '{"teamId": "team_abc123...", "quota": {"dailyCalls": 1000, "monthlyCalls": 25000, "dailyCredits": 5000, "monthlyCredits": 100000}}'
# View team usage with member breakdown
curl "http://localhost:3402/teams/usage?teamId=team_abc123..." \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
团队特点:
| 特性 | 描述 |
|---|---|
| 共享预算 | 所有团队成员共享积分(0=无限制) |
| 团队配额 | 每日/每月通话和信用额度(UTC自动重置) |
| 成员细分 | 团队内每个密钥的使用情况(密钥被屏蔽) |
| 标签/元数据 | 为部门、项目等附加键值对。 |
| 最多100个密钥 | 每个团队限制以防止滥用 |
| 闸门集成 | 每次工具调用时检查预算+配额 |
| 审计跟踪 | team.created、team.updated、team.deleted、team.key_assigned、team.key _removed事件 |
每个API密钥最多可以属于一个团队。团队预算和配额检查发生在单个密钥检查之后——两者都必须通过才能使工具调用成功。
速率限制响应标头
每 /mcp 当提供API密钥时,响应包括速率限制和信用信头:
X-RateLimit-Limit: 100 # Max calls per window
X-RateLimit-Remaining: 87 # Calls remaining in current window
X-RateLimit-Reset: 45 # Seconds until window resets
X-Credits-Remaining: 4500 # Credits remaining on the key
当一个工具有每个工具的速率限制时,标题会反映该工具的限制(而不是全局限制)。这些标头是CORS公开的,因此基于浏览器的代理可以读取它们。
健康检查+优雅关机
这 GET /health endpoint为负载平衡器和编排器提供公共(无需身份验证)健康检查:
curl http://localhost:3402/health
{
"status": "healthy",
"uptime": 3600,
"version": "2.6.0",
"inflight": 3,
"redis": { "connected": true, "pubsub": true },
"webhooks": { "pendingRetries": 0, "deadLetterCount": 2 }
}
| 字段 | 描述 |
|---|---|
status |
"healthy" 或 "draining" (在正常关机期间) |
uptime |
服务器启动后的秒数 |
version |
软件包版本 |
inflight |
飞行中的人数 /mcp 请求: |
redis |
Redis连接(仅在以下情况下存在 --redis-url 已设置) |
webhooks |
Webhook重试统计信息(仅在以下情况下显示 --webhook-url 已设置) |
在正常关机期间, /health 返回HTTP 503 "status": "draining",以及新 /mcp 请求被503拒绝。允许在服务器崩溃之前完成现有的飞行中请求。CLI使用 gracefulStop() 在SIGTERM/SIGINT上具有30秒的耗尽超时。
编程API:
// Graceful shutdown with custom timeout (default 30s)
await server.gracefulStop(15_000);
配置验证+试运行
启动服务器前验证配置文件:
# Validate a config file — exits 0 if valid, 1 if errors found
paygate-mcp validate --config paygate.json
错误输出:
✗ 2 error(s):
ERROR [port] Invalid port 99999. Must be 0–65535.
ERROR [redisUrl] Invalid redisUrl protocol "http:". Expected "redis://" or "rediss://".
⚠ 1 warning(s):
WARN [shadowMode] Shadow mode is enabled. Payment will not be enforced.
模拟运行模式启动服务器,从后端发现工具,打印定价表,然后退出:
paygate-mcp wrap --server "node my-server.js" --dry-run
── DRY RUN ──────────────────────────────────────
Discovered 3 tool(s):
────────────────────────────────────────────────────────────
Tool Credits/Call Rate Limit
────────────────────────────────────────────────────────────
search 5 30/min
generate 10 10/min
list_items 1 60/min
────────────────────────────────────────────────────────────
Dry run complete — shutting down.
编程API:
import { validateConfig, formatDiagnostics } from 'paygate-mcp';
const diags = validateConfig(myConfig);
if (diags.some(d => d.level === 'error')) {
console.error(formatDiagnostics(diags));
process.exit(1);
}
批处理工具调用
在一个请求中调用多个工具,并进行全计费或无计费:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call_batch",
"params": {
"calls": [
{ "name": "search", "arguments": { "q": "MCP servers" } },
{ "name": "translate", "arguments": { "text": "hello", "to": "es" } },
{ "name": "summarize", "arguments": { "url": "https://example.com" } }
]
}
}
答复:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"results": [
{ "tool": "search", "result": { "content": [...] }, "creditsCharged": 5 },
{ "tool": "translate", "result": { "content": [...] }, "creditsCharged": 3 },
{ "tool": "summarize", "result": { "content": [...] }, "creditsCharged": 2 }
],
"totalCreditsCharged": 10,
"remainingCredits": 90
}
}
主要特点:
- 要么全有要么全无 --所有调用在执行之前都经过预验证(身份验证、ACL、速率限制、信用、配额)。如果任何呼叫被拒绝,则整个批次都将被拒绝,并收取零信用。
- 综合定价 --总学分被原子性地检查和扣除。一批需要5+3+2=10学分的3个呼叫需要10个可用学分。
- 并行执行 --在关卡批准后,所有工具调用都会同时执行,以尽量减少延迟。
- 失败退款 --与
refundOnFailure启用后,下游出错的单个工具将获得退款。 - 多服务器支持 --在多服务器模式下使用前缀工具(例如。,
fs:read,github:search).
编程API:
import { Gate, BatchToolCall } from 'paygate-mcp';
const calls: BatchToolCall[] = [
{ name: 'search', arguments: { q: 'test' } },
{ name: 'translate', arguments: { text: 'hi' } },
];
const result = gate.evaluateBatch(apiKey, calls, clientIp);
if (!result.allAllowed) {
console.log(`Denied at index ${result.failedIndex}: ${result.reason}`);
} else {
console.log(`Charged ${result.totalCredits} credits for ${calls.length} calls`);
}
多租户命名空间
按租户隔离API密钥和使用数据。每个密钥都属于一个 namespace (默认值: "default").所有管理端点都支持租户范围视图的命名空间过滤。
在命名空间中创建密钥:
curl -X POST http://localhost:3402/keys \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "acme-agent", "credits": 1000, "namespace": "acme-corp"}'
列出按命名空间筛选的键:
curl http://localhost:3402/keys?namespace=acme-corp \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
列出所有具有统计信息的命名空间:
curl http://localhost:3402/namespaces \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
退货:
{
"namespaces": [
{ "namespace": "acme-corp", "keyCount": 3, "activeKeys": 2, "totalCredits": 2500, "totalSpent": 480 },
{ "namespace": "beta-inc", "keyCount": 1, "activeKeys": 1, "totalCredits": 500, "totalSpent": 120 }
],
"count": 2
}
命名空间筛选状态、使用情况和分析:
# Status filtered to one namespace
curl http://localhost:3402/status?namespace=acme-corp -H "X-Admin-Key: ..."
# Usage events filtered by namespace
curl http://localhost:3402/usage?namespace=acme-corp -H "X-Admin-Key: ..."
# Analytics filtered by namespace
curl "http://localhost:3402/analytics?namespace=acme-corp&from=2025-01-01" -H "X-Admin-Key: ..."
# Search keys by tag within a namespace
curl -X POST http://localhost:3402/keys/search \
-H "X-Admin-Key: ..." -H "Content-Type: application/json" \
-d '{"tags": {"env": "prod"}, "namespace": "acme-corp"}'
命名空间规则:
- 仅限字母数字+连字符,最多50个字符,不区分大小写(存储小写)
- 默认为
"default"如果遗漏或无效 - 旧密钥自动回填到
"default"状态文件加载 - 使用事件携带密钥的命名空间,用于跨领域分析
- 命名空间是隐式的——当一个键被分配给一个键时,会自动创建
范围令牌
从任何API密钥中发出短暂的、工具限制的令牌。通过作用域令牌,您可以在不公开父API密钥的情况下将狭窄的访问权限委托给代理或子进程。
创建作用域令牌(admin):
curl -X POST http://localhost:3402/tokens \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"key": "pg_parent_key_here",
"ttl": 300,
"allowedTools": ["search", "summarize"],
"label": "agent-session-42"
}'
退货:
{
"token": "pgt_eyJhcGl...signature",
"expiresAt": "2025-06-15T12:05:00.000Z",
"ttl": 300,
"parentKey": "my-agent",
"allowedTools": ["search", "summarize"],
"label": "agent-session-42",
"message": "Use as X-API-Key or Bearer token on /mcp"
}
使用/mcp上的令牌:
# As X-API-Key header
curl -X POST http://localhost:3402/mcp \
-H "X-API-Key: pgt_eyJhcGl...signature" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search","arguments":{"q":"hello"}}}'
# As Bearer token
curl -X POST http://localhost:3402/mcp \
-H "Authorization: Bearer pgt_eyJhcGl...signature" \
-H "Content-Type: application/json" \
-d '...'
令牌行为:
- 自足 --HMAC-SHA256签名,服务器端状态为零。对每个请求进行加密验证。
- 自动到期 --TTL默认为1小时,最多24小时。过期的代币会立即被拒绝。
- 工具ACL变窄 --如果
allowedTools如果设置了,则令牌只能调用这些工具(与父键的ACL相交)。 - 来自家长的积分 --工具调用从父密钥的信用余额中收取费用。
tools/list过滤 --当作用域令牌调用时tools/list,只返回允许的工具。- 批处理感知 —
tools/call_batch检查批处理中每个调用的作用域令牌ACL。 - 决议优先级 —
X-API-Key头球→pgt_范围令牌→ OAuth承载令牌。
令牌格式: pgt_<base64url(JSON payload)>.<base64url(HMAC-SHA256 signature)>
程序化使用:
import { ScopedTokenManager } from 'paygate-mcp';
const tokens = new ScopedTokenManager('your-signing-secret');
// Create
const token = tokens.create({
apiKey: 'pg_parent_key',
ttlSeconds: 300,
allowedTools: ['search'],
label: 'agent-42',
});
// Validate
const result = tokens.validate(token);
if (result.valid) {
console.log(result.payload.apiKey); // 'pg_parent_key'
console.log(result.payload.allowedTools); // ['search']
}
// Check if a string is a scoped token
ScopedTokenManager.isToken('pgt_...'); // true
ScopedTokenManager.isToken('pg_...'); // false
令牌撤销列表
在范围内的令牌过期之前撤销它们。一旦被撤销,令牌将立即被所有PayGate实例拒绝(在多实例部署中通过Redis发布/订阅同步)。
撤销令牌(管理员):
curl -X POST http://localhost:3402/tokens/revoke \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"token": "pgt_eyJhcGl...signature", "reason": "session ended"}'
退货:
{
"message": "Token revoked",
"fingerprint": "a1b2c3d4e5f6...",
"expiresAt": "2025-06-15T12:05:00.000Z",
"revokedAt": "2025-06-15T11:30:00.000Z"
}
列出已撤销的令牌(管理员):
curl http://localhost:3402/tokens/revoked \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
退货 { count, entries: [{ fingerprint, expiresAt, revokedAt, reason }] }.
撤销行为:
- O(1)查找 --SHA-256指纹存储在Map中,用于恒定时间拒绝检查。
- 自动清理 --一旦原始令牌自然过期(最多24小时),撤销条目就会被清除,因此列表永远不会无限增长。
- Redis同步 --在多实例部署中,撤销通过以下方式传播
token_revoked酒吧/酒吧活动。其他实例会立即将该条目添加到其本地吊销列表中。 - 审计跟踪 --每次撤销都记录为
token.revoked带有指纹和原因的审计事件。 - 签名验证 --只有此服务器签名的令牌才能被撤销(防止撤销任意字符串)。
程序化使用:
import { ScopedTokenManager } from 'paygate-mcp';
const tokens = new ScopedTokenManager('your-signing-secret');
const token = tokens.create({ apiKey: 'pg_key', ttlSeconds: 3600 });
// Revoke
const entry = tokens.revokeToken(token, 'session ended');
console.log(entry.fingerprint); // SHA-256 hex
// Validate — now returns { valid: false, reason: 'token_revoked' }
tokens.validate(token); // { valid: false, reason: 'token_revoked' }
// Check revocation list size
tokens.revocationList.size; // 1
// Clean up on shutdown
tokens.destroy();
基于使用情况的自动充值
当密钥余额降至阈值以下时,自动重新填充积分。防止高价值API消费者的服务中断。
配置自动充值(管理员):
curl -X POST http://localhost:3402/keys/auto-topup \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"key": "pg_abc123...", "threshold": 100, "amount": 500, "maxDaily": 10}'
退货:
{
"autoTopup": { "threshold": 100, "amount": 500, "maxDaily": 10 },
"message": "Auto-topup enabled: add 500 credits when balance drops below 100 (max 10/day)"
}
禁用自动充值:
curl -X POST http://localhost:3402/keys/auto-topup \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"key": "pg_abc123...", "disable": true}'
自动充值行为:
- 扣除后触发 --每次工具调用(或批处理)扣除学分后,关卡会检查学分是否低于阈值,并自动添加学分。
- 每日限额 —
maxDaily限制每个UTC日可以进行的自动充值次数。吃起来0无限制。 - 审计跟踪 --每次自动加满都会记录为
key.auto_topped_up审计事件。配置更改记录为key.auto_topup_configured. - Webhook事件 --两者皆有
key.auto_topup_configured和key.auto_topped_up事件通过webhooks发送。 - Redis同步 --在多实例部署中,自动充值积分通过Redis进行原子同步。
- 状态持久性 --自动充值配置和每日计数器保存在状态文件和Redis中。
程序化使用:
import { Gate } from 'paygate-mcp';
const gate = new Gate(config, 'state.json');
const record = gate.store.createKey('premium-client', 1000);
// Configure auto-topup
record.autoTopup = { threshold: 100, amount: 500, maxDaily: 5 };
gate.store.save();
// Hook for notifications
gate.onAutoTopup = (apiKey, amount, newBalance) => {
console.log(`Auto-topped up ${amount} credits → balance: ${newBalance}`);
};
// Gate.evaluate() automatically triggers auto-topup after credit deduction
const result = gate.evaluate(record.key, { name: 'expensive-tool' });
管理员API密钥管理
使用基于角色的权限管理多个管理员密钥。引导管理键(来自构造函数或CLI)始终是 super_admin.
角色:
| 角色 | 描述 |
|---|---|
super_admin |
完全访问权限,包括管理员密钥管理 |
admin |
所有API密钥和系统操作,但无法管理管理密钥 |
viewer |
只读访问状态、使用情况、分析、审计等。 |
创建管理员密钥(仅限super_admin):
curl -X POST http://localhost:3402/admin/keys \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "CI Bot", "role": "admin"}'
# Returns: { "key": "ak_...", "name": "CI Bot", "role": "admin", "createdAt": "..." }
列出管理员密钥(仅限super_admin):
curl http://localhost:3402/admin/keys \
-H "X-Admin-Key: $ADMIN_KEY"
# Returns masked keys with roles, status, and last used timestamps
撤销管理员密钥(仅限super_admin):
curl -X POST http://localhost:3402/admin/keys/revoke \
-H "X-Admin-Key: $ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"key": "ak_..."}'
行为:
- 的默认角色
POST /admin/keys是admin如果没有指定。 - 无法撤销您自己的管理员密钥(安全防护)。
- 无法撤销上次
super_admin钥匙(安全防护装置)。 viewer密钥可以访问所有只读端点(GET),但被拒绝写入操作(POST)。admin密钥可以创建/撤销/旋转API密钥、管理团队、令牌等,但不能管理管理密钥。- 管理密钥保存到单独的文件中(
*-admin.json)在州档案旁边。 - 所有操作都记录在审计跟踪中(
admin_key.created,admin_key.revoked). - 管理员密钥生命周期更改时会触发Webhook事件。
插件系统
使用插件API将自定义逻辑添加到PayGate。插件可以拦截关卡决策、转换定价、修改工具请求/响应、添加自定义HTTP端点以及挂接到服务器生命周期事件中。
import { PayGateServer, PayGatePlugin } from 'paygate-mcp';
// Define a plugin
const loggingPlugin: PayGatePlugin = {
name: 'request-logger',
version: '1.0.0',
// Gate hooks (sync — hot path)
beforeGate: (ctx) => {
// Return { allowed: false, reason: '...' } to short-circuit
// Return null to continue normal evaluation
if (ctx.toolName === 'dangerous_tool') {
return { allowed: false, reason: 'tool_disabled' };
}
return null;
},
afterGate: (ctx, decision) => {
// Modify the gate decision after evaluation
console.log(`${ctx.toolName}: ${decision.allowed ? 'allowed' : 'denied'}`);
return decision;
},
transformPrice: (toolName, basePrice, args) => {
// Return a number to override price, or null to keep base price
if (toolName === 'premium_search') return basePrice * 2;
return null;
},
onDeny: (ctx, reason) => {
// Called whenever a tool call is denied
console.log(`Denied: ${ctx.toolName} — ${reason}`);
},
// Tool hooks (async)
beforeToolCall: async (ctx) => {
// Modify the JSON-RPC request before forwarding
return { ...ctx.request, params: { ...ctx.request.params, audit: true } };
},
afterToolCall: async (ctx, response) => {
// Modify the JSON-RPC response before returning to client
return response;
},
// HTTP hook (async)
onRequest: (req, res) => {
// Add custom endpoints — return true if handled
if (req.url === '/custom/status') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ custom: true }));
return true;
}
return false;
},
// Lifecycle hooks (async)
onStart: async () => { console.log('Plugin started'); },
onStop: async () => { console.log('Plugin stopped'); },
};
// Register plugins with .use() (chainable)
const server = new PayGateServer({ ... });
server
.use(loggingPlugin)
.use(anotherPlugin);
await server.start();
吊钩类型:
| 钩子 | 同步/异步 | 描述 |
|---|---|---|
beforeGate |
同步 | 短路门评估。第一个非空结果获胜。 |
afterGate |
同步 | 修改闸门决策。级联(每个插件都看到之前的结果)。 |
transformPrice |
同步 | 覆盖工具定价。第一个非空数字获胜。 |
onDeny |
同步 | 拒绝通知。所有插件均已调用。 |
beforeToolCall |
Async | 转发前修改JSON-RPC请求。级联。 |
afterToolCall |
Async | 返回前修改JSON-RPC响应。级联。 |
onRequest |
Async | 添加自定义HTTP端点。第一 true return处理请求。 |
onStart |
Async | 在服务器启动后调用。注册顺序。 |
onStop |
Async | 在服务器停止之前调用。反向注册顺序。 |
错误隔离: 插件错误会被捕获并记录下来——崩溃的插件永远不会导致服务器停机。
列出已注册的插件(仅限管理员):
curl http://localhost:3402/plugins -H "X-Admin-Key: $ADMIN_KEY"
# { "count": 2, "plugins": [{ "name": "...", "version": "...", "hooks": ["beforeGate", ...] }] }
关键组(策略模板)
密钥组允许您定义可重复使用的策略模板,并将它们同时应用于多个API密钥。与团队(共享预算)不同,团队共享 政策:ACL、费率限制、定价覆盖、IP分配列表和配额。
创建组:
curl -X POST http://localhost:3402/groups \
-H "X-Admin-Key: $ADMIN_KEY" \
-d '{
"name": "free-tier",
"allowedTools": ["search", "read_file"],
"rateLimitPerMin": 30,
"ipAllowlist": ["10.0.0.0/8"],
"quota": { "dailyCallLimit": 100, "monthlyCallLimit": 1000, "dailyCreditLimit": 50, "monthlyCreditLimit": 200 },
"toolPricing": { "search": { "creditsPerCall": 2 } },
"tags": { "tier": "free" }
}'
# { "id": "grp_a1b2c3...", "name": "free-tier", ... }
将密钥分配给组:
curl -X POST http://localhost:3402/groups/assign \
-H "X-Admin-Key: $ADMIN_KEY" \
-d '{ "groupId": "grp_a1b2c3...", "key": "pgk_..." }'
策略解决规则:
| 政策 | 决议 |
|---|---|
allowedTools |
如果密钥非空,则获胜,否则分组 |
deniedTools |
两者结合(限制性最强) |
ipAllowlist |
两者的结合(添加剂) |
rateLimitPerMin |
如果设置了密钥,则获胜,否则分组 |
quota |
如果设置了密钥,则获胜,否则分组 |
toolPricing |
组覆盖全局配置 |
maxSpendingLimit |
组默认值(密钥可以通过以下方式覆盖 /limits) |
列出组:
curl http://localhost:3402/groups -H "X-Admin-Key: $ADMIN_KEY"
# [{ "id": "grp_...", "name": "free-tier", "memberCount": 5, ... }]
更新/删除/移除:
# Update group policies
curl -X POST http://localhost:3402/groups/update \
-H "X-Admin-Key: $ADMIN_KEY" \
-d '{ "id": "grp_...", "rateLimitPerMin": 60 }'
# Remove a key from its group
curl -X POST http://localhost:3402/groups/remove \
-H "X-Admin-Key: $ADMIN_KEY" \
-d '{ "key": "pgk_..." }'
# Delete a group (removes all assignments)
curl -X POST http://localhost:3402/groups/delete \
-H "X-Admin-Key: $ADMIN_KEY" \
-d '{ "id": "grp_..." }'
程序化使用:
import { PayGateServer, KeyGroupManager } from 'paygate-mcp';
const server = new PayGateServer({ ... });
const { port, adminKey } = await server.start();
// Access groups directly
const group = server.groups.createGroup({ name: 'enterprise', rateLimitPerMin: 1000 });
server.groups.assignKey(apiKey, group.id);
// Resolve effective policy for a key
const policy = server.groups.resolvePolicy(apiKey, keyRecord);
// { allowedTools, deniedTools, rateLimitPerMin, quota, ipAllowlist, toolPricing, maxSpendingLimit }
文件持久性: 使用时 --state-file,组定义和密钥分配会自动保存到 *-groups.json 主状态文件旁边的文件。组可以在重启后存活,而不需要Redis。
Redis同步: 跑步时 --redis-url,组定义和密钥分配额外持久化到Redis,并通过发布/订阅在实例之间同步。所有组CRUD操作和分配更改都实时传播到其他PayGate进程。
水平缩放(Redis)
为多进程部署启用Redis支持状态。多个PayGate实例通过Redis共享API密钥、信用和使用数据:
# Single instance with Redis persistence
npx paygate-mcp wrap --server "your-mcp-server" --redis-url "redis://localhost:6379"
# With password and database
npx paygate-mcp wrap --server "your-mcp-server" \
--redis-url "redis://:mypassword@redis.internal:6379/2"
或者在配置文件中:
{
"serverCommand": "your-mcp-server",
"redisUrl": "redis://localhost:6379"
}
架构:直写式缓存
PayGate使用直写缓存模式以获得最佳性能:
- 倒像 --从内存中的KeyStore提供服务(零延迟,无Redis往返)
- 写 --传播到Redis以实现跨进程共享状态
- 信用扣减 --使用Redis Lua脚本进行原子检查和扣除(防止跨进程的双重支出)
- 定期同步 --作为安全网,本地缓存每5秒从Redis刷新一次
- 发布/订阅通知 --关键突变和信用变化通过Redis PUBLISH/SUBSCRIBE实时传播到所有实例(亚毫秒延迟)
这意味着Gate.eevaluate()保持同步和快速,而信贷操作在整个车队中保持原子性。服务器自动将Redis挂钩连接到门上——每个使用事件和信用扣减都流向Redis,而无需任何代码更改。Pub/sub确保其他实例几乎立即看到更改(无需等待5秒)。
什么被同步
| 状态 | Redis密钥模式 | 同步方法 |
|---|---|---|
| API密钥 | pg:key:<keyId> (哈希) |
直写+发布/订阅+定期刷新 |
| 密钥注册表 | pg:keys (组) |
直写 |
| 信用扣减 | pg:key:<keyId> |
原子Lua脚本+发布/订阅广播 |
| 信用充值 | pg:key:<keyId> |
原子Lua脚本+发布/订阅广播 |
| 管理员突变 | pg:key:<keyId> (哈希) |
直写(所有管理端点) |
| 速率限制 | pg:rate:<key> (排序集) |
原子Lua(滑动窗口) |
| 使用事件 | pg:usage (列表) |
即发即弃RPUSH |
| 跨实例事件 | pg:events (发布/订阅) |
使用内联数据发布/订阅 |
部署模式
┌──────────────┐
│ Redis 7+ │
│ ┌────────┐ │
│ │pub/sub │ │
└──┴───┬────┴──┘
│
┌────────────┼────────────┐
│ │ │
┌─────┴─────┐ ┌───┴───┐ ┌─────┴─────┐
│ PayGate 1 │ │ PG 2 │ │ PayGate 3 │
│ (sub+pub) │ │ (sub) │ │ (sub+pub) │
└─────┬─────┘ └───┬───┘ └─────┬─────┘
│ │ │
┌─────┴────────────┴────────────┴─────┐
│ Load Balancer │
└──────────────────────────────────────┘
实时发布/订阅 --当一个实例创建/撤销密钥或更改信用时,它会向 pg:events 频道。所有其他实例都会立即收到它并更新其本地KeyStore,而无需等待5秒的同步。信用变化包括内联数据(信用、totalSpend、totalCalls),因此接收者完全跳过Redis的往返。每个实例都有一个唯一的ID用于自我消息过滤——没有回声循环。如果发布/订阅失败,则定期同步将继续作为回退。
管理员API同步 --所有管理HTTP端点(创建密钥、撤销、轮换、充值、设置ACL、过期、配额、标签、IP分配列表、支出限制)都写入Redis。备份和撤销使用原子Lua脚本;其他突变使用即发即弃 HSET 立即在实例之间传播更改。
分布式速率限制 --使用带有Lua脚本的Redis排序集,在所有实例上原子地执行速率限制。每次速率检查都会在一次往返中执行ZREMRANGEBYSCORE+ZCARD+ZADD,防止跨进程的突发旁路。如果Redis暂时不可用,则会打开(允许)。
持续使用审计跟踪 --使用事件被附加到Redis列表(RPUSH),创建了一个从任何实例可见的共享审计跟踪。事件在流程重启后仍然存在,可以从仪表板查询。最多100k个事件,具有自动修剪功能。
优雅的后退 --如果Redis暂时不可用,PayGate将回退到本地内存操作。重新连接时,状态会自动同步。
零依赖 --Redis客户端使用Node.js net.Socket 使用原始RESP协议编码。不 ioredis,没有 redis package——纯内置网络。
配置文件模式
从JSON文件而不是CLI标志加载所有设置:
npx paygate-mcp wrap --config paygate.json
示例 paygate.json:
{
"serverCommand": "npx",
"serverArgs": ["@modelcontextprotocol/server-filesystem", "/tmp"],
"port": 3402,
"defaultCreditsPerCall": 2,
"globalRateLimitPerMin": 30,
"webhookUrl": "https://billing.example.com/events",
"webhookFilters": [
{
"name": "production-alerts",
"events": ["key.created", "key.revoked", "alert.fired"],
"url": "https://alerts.example.com/webhook",
"keyPrefixes": ["pk_prod_"]
}
],
"refundOnFailure": true,
"stateFile": "~/.paygate/state.json",
"toolPricing": {
"premium_analyze": { "creditsPerCall": 10, "creditsPerKbInput": 5 }
},
"globalQuota": {
"dailyCallLimit": 1000,
"monthlyCreditLimit": 50000
},
"oauth": {
"accessTokenTtl": 3600,
"scopes": ["tools:*"]
},
"redisUrl": "redis://localhost:6379",
"importKeys": {
"pg_abc123def456": 500
}
}
当同时指定了CLI标志和配置文件值时,CLI标志会覆盖配置文件值。
配置热重新加载
从配置文件中重新加载定价、费率限制、Webhook、配额和行为标志,而无需重新启动服务器:
# Reload from the config file used at startup
curl -X POST http://localhost:3402/config/reload \
-H "X-Admin-Key: YOUR_ADMIN_KEY"
# One-time reload from a different config file
curl -X POST http://localhost:3402/config/reload \
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"configPath": "/path/to/updated-config.json"}'
热可重新加载字段 (立即生效):
defaultCreditsPerCall,toolPricing--价格变动globalRateLimitPerMin--利率限制调整shadowMode,refundOnFailure--行为标志freeMethods--自由方法列表globalQuota--每日/每月通话和信用额度webhookUrl,webhookSecret,webhookMaxRetries--webhook基础架构(已重建)alertRules--警报阈值和规则
不可重新加载的字段 (报告为跳过,需要重新启动):
serverCommand,serverArgs--后端MCP服务器进程port--监听端口oauth--OAuth 2.1配置
响应包括更改的字段、跳过的字段和任何验证警告:
{
"ok": true,
"changed": ["defaultCreditsPerCall", "globalRateLimitPerMin"],
"skipped": [],
"warnings": [],
"message": "Config reloaded: 2 fields updated"
}
在应用更改之前,配置文件会被验证——无效的配置会被拒绝,并显示详细的错误消息,应用的更改为零。
部署
一键部署
将PayGate部署到您首选的云平台:
提供:
https://render.com/deploy?repo=https://github.com/walker77/paygate-mcp
Fly.io:
fly launch --image ghcr.io/walker77/paygate-mcp:latest --name my-paygate
fly secrets set PAYGATE_ADMIN_KEY=your-admin-key PAYGATE_REMOTE_URL=https://your-mcp-server.com/mcp
码头工人
# Build the image
docker build -t paygate-mcp .
# Run with a remote MCP server
docker run -d \
-p 3000:3000 \
-v paygate-data:/data \
-e PAYGATE_REMOTE_URL="https://my-mcp-server.com/mcp" \
-e PAYGATE_ADMIN_KEY="your-admin-key" \
paygate-mcp
# Run with environment variables
docker run -d \
-p 3000:3000 \
-e PAYGATE_PORT=3000 \
-e PAYGATE_REMOTE_URL="https://api.example.com/mcp" \
-e PAYGATE_DEFAULT_CREDITS=5 \
-e PAYGATE_RATE_LIMIT=120 \
-e PAYGATE_WEBHOOK_URL="https://hooks.example.com/paygate" \
paygate-mcp
Docker Compose(带Redis)
# Set your MCP server URL and start
MCP_REMOTE_URL="https://my-mcp-server.com/mcp" docker-compose up -d
# View logs
docker-compose logs -f paygate
# Check health
curl http://localhost:3000/health
包括 docker-compose.yml 使用Redis启动PayGate,以实现水平扩展、状态持久性和分布式速率限制。
系统守护进程
# /etc/systemd/system/paygate-mcp.service
[Unit]
Description=PayGate MCP Proxy
After=network.target
[Service]
Type=simple
User=paygate
WorkingDirectory=/opt/paygate-mcp
ExecStart=/usr/bin/node dist/cli.js wrap \
--remote-url "https://my-mcp-server.com/mcp" \
--port 3000 \
--state-file /var/lib/paygate/state.json \
--audit-file /var/log/paygate/audit.jsonl
Restart=always
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
sudo systemctl enable paygate-mcp
sudo systemctl start paygate-mcp
sudo journalctl -u paygate-mcp -f
PM2
# Install globally
npm install -g paygate-mcp
# Start with PM2
pm2 start paygate-mcp -- wrap \
--remote-url "https://my-mcp-server.com/mcp" \
--port 3000 \
--state-file ./state.json
# Or use ecosystem file
pm2 start ecosystem.config.js
生产检查表
- []设置
--state-file用于跨重启进行持久存储 - []设置
--audit-file用于保留审计跟踪 - []配置
--webhook-url用于外部计费/警报 - []使用
--admin-key或设置PAYGATE_ADMIN_KEY(如果省略,则自动生成) - []启用Redis(
--redis-url)用于多实例部署 - []设置带有TLS终止的反向代理(nginx/caddy)
- []配置
--cors-origin适用于基于浏览器的客户端 - []监视器
/health带有正常运行时间检查器的端点 - []废料
/metrics使用Prometheus实现可观测性 - []定期备份状态文件(或使用Redis持久化)
负载测试
A. k6 负载测试脚本包含在生产基准测试中:
# Install k6
brew install k6 # macOS
# or: https://k6.io/docs/getting-started/installation
# Start server (example: echo backend)
npx paygate-mcp wrap -- echo '{"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"ok"}]}}' \
--port 3000 --credits-per-call 1
# Run with admin key (from server startup output)
K6_ADMIN_KEY=admin_xxxx k6 run load-test.js
# Custom VUs and duration
K6_ADMIN_KEY=admin_xxxx k6 run --vus 100 --duration 60s load-test.js
# Against remote deployment
K6_PAYGATE_URL=https://paygate.example.com K6_ADMIN_KEY=admin_xxxx k6 run load-test.js
情节:
- mcp流量 --模拟代理工具调用(斜坡0→50 VU超过10秒,持续30秒)
- admin_reads --仪表板/分析读数(5个恒定VU)
- 健康检查 --负载平衡器探头(10个需求/秒恒定速率)
阈值:
- p(95)响应时间<200ms
- p(99)响应时间<500ms
- 错误率<5%
- 请求速率>100请求/秒
错误代码
HTTP状态代码
| 代码 | 含义 | 何时 |
|---|---|---|
200 |
OK | 读取/更新操作成功 |
201 |
已创建 | 已创建密钥、团队、组或模板 |
401 |
未经授权 | 缺少或无效的管理员密钥 |
402 |
需要付款 | 工具调用积分不足 |
403 |
禁止 | IP不在列表中,ACL被拒绝 |
404 |
找不到 | 找不到密钥、模板、组或资源 |
405 |
方法不允许 | 端点的HTTP方法错误 |
409 |
冲突 | 别名重复,模板名称冲突 |
429 |
请求太多 | 超出速率限制 |
503 |
服务不可用 | 维护模式或服务器关闭 |
JSON-RPC错误代码(MCP/MCP端点)
| 代码 | 名称 | 描述 |
|---|---|---|
-32402 |
insufficient_credits |
API密钥剩余的信用为零 |
-32402 |
rate_limited |
请求率超过每个密钥或每个工具的限制 |
-32402 |
quota_exceeded |
超出每日/每月通话或信用额度 |
-32402 |
spending_limit_reached |
累计支出超过关键支出限额 |
-32402 |
key_suspended |
API密钥暂时挂起 |
-32402 |
key_expired |
API密钥TTL已过期 |
-32402 |
acl_denied |
工具不在密钥的ACL白名单中 |
-32402 |
ip_not_allowed |
客户端IP不在密钥的分配列表中 |
-32402 |
invalid_api_key |
X-API-Key标头无法识别 |
-32402 |
maintenance_mode |
服务器处于维护模式 |
-32003 |
circuit_breaker_open |
后端不可用,断路器打开 |
-32004 |
tool_timeout |
工具调用超出配置的超时时间 |
-32600 |
invalid_request |
JSON-RPC请求体格式错误 |
-32601 |
method_not_found |
未知MCP方法 |
Webhook事件类型
| 事件 | 触发器 |
|---|---|
key.created |
提供了新的API密钥 |
key.revoked |
API密钥被永久吊销 |
key.suspended |
API密钥暂时挂起 |
key.resumed |
已重新激活挂起的密钥 |
key.rotated |
API键旋转到新值 |
key.topup |
积分已添加到密钥 |
key.expired |
密钥TTL已过 |
key.expiry_warning |
密钥即将到期 |
credit.transfer |
积分在钥匙之间移动 |
credit.auto_topup |
自动加满已触发 |
usage |
批量工具调用事件 |
程序化API
import { PayGateServer } from 'paygate-mcp';
// Wrap a local server (stdio)
const server = new PayGateServer({
serverCommand: 'npx',
serverArgs: ['@modelcontextprotocol/server-filesystem', '/tmp'],
port: 3402,
defaultCreditsPerCall: 1,
toolPricing: {
'premium_analyze': { creditsPerCall: 10 }
},
});
const { port, adminKey } = await server.start();
// Multi-server mode
const multiServer = new PayGateServer(
{ serverCommand: '', port: 3402, defaultCreditsPerCall: 1 },
undefined, undefined, undefined, undefined,
[
{ prefix: 'fs', serverCommand: 'npx', serverArgs: ['@modelcontextprotocol/server-filesystem', '/tmp'] },
{ prefix: 'api', remoteUrl: 'https://my-mcp-server.example.com/mcp' },
]
);
// With Redis for horizontal scaling
const redisServer = new PayGateServer(
{ serverCommand: 'npx', serverArgs: ['my-mcp-server'], port: 3402, defaultCreditsPerCall: 1 },
undefined, undefined, undefined, undefined, undefined,
'redis://localhost:6379'
);
// Client SDK
import { PayGateClient } from 'paygate-mcp/client';
const client = new PayGateClient({
url: `http://localhost:${port}`,
apiKey: 'pg_...',
});
const tools = await client.listTools();
const result = await client.callTool('search', { query: 'hello' });
安全
- 加密API密钥生成(
pg_前缀,48个十六进制字符) - 列表端点中隐藏的密钥
- 仅整数点数(无浮点精度攻击)
- 1MB请求体限制
- 对所有端点进行输入净化
- 管理员密钥从未在响应中公开
- API密钥从未转发到远程服务器(HTTP传输)
- 速率限制是按密钥进行的,并发安全
- 条纹webhook签名验证(HMAC-SHA256,定时安全)
- Dashboard使用安全的DOM方法(textContent/createElement)——没有innerHTML
- 带有定时安全验证的Webhook HMAC-SHA256签名
- 状态输出中屏蔽的Webhook URL
- 使用整数算术强制执行支出限制(无浮动旁路)
- 按工具ACL执行(白名单+黑名单,经过净化的输入)
- 密钥过期,具有失败关闭行为(过期=拒绝)
- OAuth 2.1与PKCE(S256)——无隐式授权,无明文挑战
- OAuth令牌是不透明的十六进制字符串(没有JWT数据泄漏)
- 配额计数器在UTC边界处自动重置
- SSE会话自动过期(30分钟),最多1000个并发,每个会话最多3个SSE
- 具有保留策略的审核日志(环形缓冲区、基于年龄的清理)
- API密钥在审核事件中被屏蔽(仅前7个字符和后4个字符可见)
- 发现端点(/.knowledge/mcp payment、/pregicing)是公开的,但是只读的
- 团队预算强制执行整数运算(不绕过浮点数)
- 团队使用情况摘要中隐藏的密钥(仅前7个字符+后4个字符)
- 团队配额在UTC日/月边界重置原子
- Redis信用扣减使用Lua脚本进行原子检查和扣减(无双重支出)
- Redis速率限制使用Lua脚本进行原子检查和记录(无突发旁路)
- 通过URL中的密码支持Redis身份验证(Redis://:password@host:端口)
- 优雅的Redis回退——如果Redis断开连接,本地操作将继续
- Redis错误时速率限制器无法打开(允许请求,从不阻止网络问题)
- 通过唯一实例ID进行发布/订阅自消息过滤(无回声循环)
- 发布/订阅用户使用专用的Redis连接(Redis协议要求)
- Red在14次传球中进行了101次对抗性安全测试
经过测试
PayGate已针对官方发布的流行MCP服务器进行了集成测试 @modelcontextprotocol npm作用域。这些测试通过以下方式包装真实的MCP服务器 npx,通过PayGate代理执行工具调用,并验证身份验证门控、信用计费和速率限制是否端到端正确工作。
| MCP服务器 | 类型 | 测试 | 已验证的内容 |
|---|---|---|---|
@modelcontextprotocol/server-everything |
stdio | 4 | 工具发现、数学工具执行、信用扣减、信用封锁 |
@modelcontextprotocol/server-filesystem |
stdio | 4 | 文件写/读直通门、信用扣减、信用阻止 |
@modelcontextprotocol/server-memory |
stdio | 4 | 实体CRUD、知识图搜索、信用扣减、信用阻断 |
@modelcontextprotocol/server-sequential-thinking |
stdio | 4 | 顺序思维流、信用扣减、信用阻断 |
跨服务器测试 验证管理员端点(/health, /keys, /balance)无论包装的后端如何,都能以相同的方式工作。所有16个集成测试均已通过。
# Run integration tests (requires internet — downloads MCP servers via npx)
npx vitest run tests/real-mcp-servers.test.ts
当前限制
- HTTP传输没有响应大小限制 --来自远程服务器的大量响应按原样转发。
- Redis密钥元数据在写入时同步 --管理员突变立即写入Redis;pub/sub提供近乎即时的跨实例更新;周期同步(5s)是一个安全网。积分、利率限制和使用率始终是原子性的。
- 每个实例都有SSE会话 --每个PayGate实例管理自己的SSE连接(HTTP流不能序列化到Redis)。
路线图
- [x] 持久存储(
--state-file) - [x] 可流式HTTP传输(
--remote-url) - [x] Stripe webhook集成(
--stripe-secret) - [x] 客户自助余额查询(
/balance) - [x] 使用数据导出——JSON和CSV(
/usage) - [x] 管理员web仪表板(
/dashboard) - [x] 按关键支出限额(
/limits) - [x] Webhook事件(
--webhook-url) - [x] 失败退款(
--refund-on-failure) - [x] 配置文件模式(
--config) - [x] 每个工具ACL——每个密钥的白名单/黑名单工具
- [x] 每个工具的速率限制——每个工具的独立限制
- [x] 密钥过期(TTL)-自动导出API密钥
- [x] 多服务器模式——将N台MCP服务器封装在一个PayGate后面
- [x] 客户端SDK--
PayGateClient自动402重试 - [x] 使用配额——每个密钥的每日/每月通话和信用额度
- [x] 动态定价——按投入规模收费(
creditsPerKbInput) - [x] OAuth 2.1——PKCE、客户端注册、承载令牌、令牌刷新/撤销
- [x] SSE流式传输——具有会话管理的完整MCP流式HTTP传输
- [x] 审核日志-具有保留、查询API、CSV/JSON导出功能的结构化审核跟踪
- [x] 注册/发现--代理可发现定价(/.众所周知/mcp支付,/定价,工具/list_price)
- [x] Prometheus metrics-/metrics端点,带有计数器、仪表和正常运行时间
- [x] 密钥轮换-轮换保留信用、ACL、配额和开支限制的API密钥
- [x] 利率限制标头--x-RateLimit-*和x-Credits-Remaining on/mcp响应
- [x] Webhook签名——具有定时安全验证的HMAC-SHA256签名有效载荷
- [x] 管理员生命周期事件——密钥管理操作的Webhook通知
- [x] IP允许列表-将API密钥限制为特定的IP或CIDR范围
- [x] 关键标签/元数据——为外部系统集成附加关键值标签
- [x] 使用分析-时间系列分析API,包括工具细分、趋势和顶级消费者
- [x] 警报webhooks——可配置的阈值警报(支出、信用、配额、到期、利率限制)
- [x] 团队管理-使用共享预算、配额和使用情况跟踪对API密钥进行分组
- [x] 横向扩展——Redis支持的多进程部署状态
- [x] 批处理工具调用--
tools/call_batch全有或全无计费和并行执行 - [x] 多租户名称空间-通过名称空间过滤的端点按租户隔离API密钥和使用数据
- [x] 范围内的代币——短期
pgt_带有工具ACL缩窄、HMAC-SHA256签名、服务器端状态为零的令牌 - [x] 令牌撤销列表——在到期前通过O(1)查找、自动清理、Redis同步撤销作用域令牌
- [x] 基于使用情况的自动充值——当余额降至每日限额阈值以下时,自动充值积分
- [x] 管理员API密钥管理-具有基于角色权限的多个管理员密钥(super_Admin、Admin、viewer)
- [x] Webhook过滤器--按事件类型和键前缀将事件路由到多个目的地,并使用独立的重试队列
- [x] 信用转移-通过验证和审计跟踪在API密钥之间原子转移信用
- [x] 批量密钥操作——在一个请求中执行多个创建/备份/撤销操作,并对每个操作进行错误处理
- [x] 密钥导入/导出——导出密钥(JSON/CSV)以进行备份/迁移,导入时解决冲突(跳过、覆盖、错误模式)
- [x] Webhook事件回放——回放死信条目(全部或按索引),带有新的交付尝试和审计跟踪
需求
- Node.js>=18.0.0
- 零外部依赖
许可证
麻省理工学院