governed-mcp-gateway
Cubiczan Agent Platform
Идентичность, деньги и доказательства для агентов, которые реально работают.
Три SKU, одно рабочее пространство. MCP-клиенты сохраняют Bearer-принципала через tools/call и SSE. Списание не может быть завершено без мандата, а сверх лимита — без второго ключа человека. Утверждение для совета директоров не может быть опечатано без агента, CHP-замка и хэшированного документа.

SKU | Порт | Репозиторий | Задача |
| Принципал на каждом вызове инструмента и SSE-кадре. Ротация учётных данных в vault. Списки разрешённых инструментов. | ||
| Предложение → мандат → контрассигнование → расчёт. Stripe по умолчанию; x402 — как рельса. | ||
| Утверждение → агент → замок → документ. Движки ASC 842 / 606 / 718. Доказательственный пакет с HMAC-цепочкой. |
Общие примитивы (packages/shared): CHP-шлюз, HMAC-реестр, HTTP/SSE-хелперы. Ноль зависимостей npm в рантайме. Stripe и x402 — это рельсы — тесты никогда не обращаются к живым сетям.
Быстрый старт
npm install
npm test
npm run gateway # :7474
npm run spend # :7475
npm run cfo # :7476Демонстрационные Bearer-ключи (также в .env.example):
Роль | Ключ |
Агент шлюза |
|
Человек шлюза |
|
Исследование шлюза (без |
|
Агент расходов |
|
Человек расходов |
|
CFO-агент |
|
CFO-человек |
|
Перегенерируйте карточки README из живых локальных API:
npm run shotsRelated MCP server: identity-aware-mcp-server
1. Управляемый MCP-шлюз
Продакшн-MCP теряет идентичность. listTools выполняется в потоке запроса; tools/call и SSE выполняются где-то ещё. Этот шлюз преобразует Bearer-учётные данные в Принципала, внедряет его в каждый JSON-RPC-вызов и повторяет его в каждом SSE-кадре. Именованные входы vault ротируются на месте — github_token остаётся github_token.



curl -sS -H "Authorization: Bearer mcp_agt_payops_demo" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"echo.ping","arguments":{"hello":"world"}}}' \
http://127.0.0.1:7474/mcpМетод | Путь | Что |
|
| JSON-RPC |
|
| SSE-уведомление с |
|
| Ротация vault только для человека; старый хэш умирает |
|
| Проверка секрета против текущего хэша |
2. Плоскость расходов и мандатов агента
Агенты предлагают. Мандаты авторизуют. Человек контрассигнует, когда сумма превышает автоматический лимит. Предлагающий агент не может контрассигновать сам себя. Расчёт — это рельса: событие счётчика Stripe по умолчанию, x402 payment-required, если вы об этом просите. Никаких вызовов блокчейна в этом MVP.



curl -sS -H "Authorization: Bearer spend_agt_payops_demo" \
-H "Content-Type: application/json" \
-d '{"agent":"agt_payops","merchant":{"name":"Stripe","url":"https://stripe.com","country":"US"},"total":"12.00","rationale":"tool meter"}' \
http://127.0.0.1:7475/v1/proposalsМетод | Путь | Что |
|
| Оператор создаёт покрытие в оставшихся центах |
|
| Предложение агента; полоса |
|
| Второй ключ человека; агенты отклоняются |
|
|
|
3. Аудируемая сеть CFO-агентов
Утверждение для совета директоров не завершено, пока у него нет агента, состояния LOCKED в CHP и хотя бы одного хэша исходного документа. Движки измеряют (ASC 842 lease rollforward, ASC 606 constrained POC, ASC 718 SBC). Они не определяют факты права. Расход токенов прикрепляется как источник в том же реестре с HMAC-цепочкой.



curl -sS -H "Authorization: Bearer cfo_agt_lease_demo" \
-H "Content-Type: application/json" \
-d '{"title":"AI spend is $12.00 this period","narrative":"Token ledger supports the board claim.","agentId":"agt_lease"}' \
http://127.0.0.1:7476/v1/claimsМетод | Путь | Что |
|
| Открыть утверждение |
|
| Прикрепить именованный источник; SHA-256 сохраняется |
|
| Замок человека → |
|
| Классификация ASC 842 + rollforward |
|
| Опечатать; |
Спецификации
Изменение OpenSpec: openspec/changes/ship-three-sku-platform/.
Лицензия
MIT
Available Tools
3 toolscontext.inspectA
Read the current session pack and schema token-tax report for the authenticated principal. Returns the bytes→tokens heuristic, session tool names, savedTokens versus the full allowlist, and (unless includeEstate=false) the estate including oversized flags. Does not admit tools and does not execute other tools. Call this before context.need to see what is already loaded. Fail-closed: requires the same principal as the session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | Optional session id; defaults to ses_<principalId> when omitted. | |
| includeEstate | No | When false, omit the full catalog estate and return only session tax. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses fail-closed authentication requirements, confirms no side effects ('Does not admit tools and does not execute other tools'), and specifies conditional output based on includeEstate. This is strong behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with no filler. The main purpose is front-loaded, followed by return details, exclusions, a direct usage pointer, and the auth requirement. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description explains the return contents, the conditional estate flag, the lack of side effects, and the auth constraint. It is nearly complete; only edge-case error behavior is not described, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some context by tying includeEstate to the estate report and showing how the returned data varies, but it largely restates what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read the current session pack and schema token-tax report.' It also explicitly differentiates itself by saying it 'does not admit tools and does not execute other tools,' and names context.need as the related sibling to compare against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Call this before context.need to see what is already loaded.' It also clarifies what the tool does not do, helping an agent avoid using it for admission or execution. It does not explicitly address echo.ping, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
context.needA
Admit extra tools or a named pack into this session (allow-by-need). Always intersected with the principal allowlist — fail-closed. Research cannot admit stripe.charge. Does not run the admitted tools; call tools/list afterwards to see the new pack, or context.inspect to see tax. sessionId defaults to ses_. Denied names are returned in denied[] and recorded on the ledger.
| Name | Required | Description | Default |
|---|---|---|---|
| pack | No | Named pack to admit (catalog, core, payments, research). Intersected with the allowlist. | |
| tools | No | Concrete tool names to admit (e.g. stripe.charge). Ignored when not allowlisted. | |
| sessionId | No | Optional session id; defaults to ses_<principalId> when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does so thoroughly: allowlist intersection, fail-closed behavior, the stripe.charge restriction for research, non-execution of admitted tools, denied[] output, ledger recording, and sessionId defaulting are all disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. The core purpose is front-loaded, followed by restrictions, post-conditions, defaults, and failure behavior, all in a compact, readable form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description explains key return behavior (denied[]) and points to tools/list and context.inspect for further observation. It does not specify the full success response shape, but the essential operational context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the fail-closed intersection, the specific research/stripe.charge restriction, and the denied[]/ledger behavior tied to the tools parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Admit extra tools or a named pack into this session (allow-by-need).' It clearly distinguishes what the tool does from the siblings context.inspect and echo.ping by framing it as an admission action rather than inspection or echo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when extra tools or a pack need to be admitted. It also provides follow-up guidance (tools/list, context.inspect), though it does not explicitly enumerate when not to use it or systematically contrast it with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
echo.pingA
Identity probe. Echoes the call arguments and the authenticated Principal the gateway injected onto this tools/call (id, kind, org). Use it to confirm Bearer identity survived onto the tool worker. Does not hit a network, mutate vault state, or charge. Idempotent except for an audit-ledger append. Not a substitute for context.inspect.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Optional ping payload echoed back in the result. Omit to send an empty ping. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool does not hit the network, mutate vault state, or charge, and that it is idempotent except for an audit-ledger append. This gives an agent a clear behavioral safety profile without needing structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with purpose, followed by usage guidance, side-effect transparency, and a sibling distinction. Every sentence earns its place and there is no redundant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema, the description is complete: it explains what is echoed, what authentication context is returned, when to use it, and what side effects to expect. An agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one optional parameter, message, and schema description coverage is 100%. The schema already explains that the message is echoed back and that omitting it sends an empty ping, so the description adds little beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Identity probe' and states precisely what the tool does: echoes call arguments and the authenticated Principal. It also distinguishes itself from the sibling context.inspect with the explicit 'Not a substitute for context.inspect' note, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit use case: 'Use it to confirm Bearer identity survived onto the tool worker.' It also provides a clear when-not-to-use signal by stating it is not a substitute for context.inspect, naming the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
context.inspect - First observed
context.need - First observed
echo.ping
TDQS
Scored across 3 tools
context.inspect is read-only session state, context.need is a mutating admission action, and echo.ping is an identity probe. The descriptions explicitly distinguish their purposes, so an agent should not confuse them.
All tool names follow a consistent namespace.action pattern: context.inspect, context.need, and echo.ping. Even though the namespaces differ, the lowercase dot-separated verb suffix style is uniform across the set.
Three tools is small but well-scoped for a governance gateway: inspect current state, request admission, and verify identity. Each tool provides a distinct, non-redundant operation that earns its place.
The core read and admit operations are covered, and built-in tools/list handles discovery, but there is no way to revoke, release, or reset previously admitted tools or packs. This creates a notable lifecycle gap for an over-admission scenario.
Maintenance
Related MCP Connectors
- gatewayOAuthai.sealgate
MCP gateway with runtime security policy, tool-call-level control, and audit of agent actions.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Security & DLP proxy for MCP: tool-poisoning scans, PII redaction on tool args/results. Beta.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.66MIT
- FlicenseNot gradedqualityDmaintenanceA production-ready MCP server that authenticates agents via OAuth 2.1 Bearer tokens, validates JWTs with JWKS, enforces tool-level scopes and roles, and logs the full delegation chain.-
- AlicenseNot gradedqualityCmaintenanceGoverned MCP server for bank-grade agent tool access with RBAC, PII redaction, rate limiting, and audit logging.MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that provides a security gateway for AI agents, enforcing allow/confirm/deny policies on tool calls and requiring human approval for risky operations, with full audit logging.-