AgentGate
AgentGate
Una puerta de enlace gobernada para llamadas de herramientas de agentes de IA, construida sobre el ADK de Terminal 3.
Dale a un agente de LLM una clave de API y podrá llamar a cualquier cosa, gastar cualquier cosa y filtrar cualquier cosa — y te enteras después, a partir de los registros que escribió sobre sí mismo.
AgentGate coloca un enclave aislado por hardware entre el agente y el mundo exterior. El agente nombra un endpoint, no una URL. Nunca tiene una credencial. Nunca ve los datos personales del usuario. Y cada intento que hace — permitido o denegado — cae en un libro de contabilidad que no puede editar.
Se distribuye como un servidor MCP, por lo que cualquier cliente MCP (Claude Code, Claude Desktop, Cursor, un agente SDK) obtiene llamadas de herramientas gobernadas añadiendo una entrada de configuración. Sin framework, sin reescritura.
MCP client (Claude / Cursor / your agent)
│ call_endpoint { endpoint: "resend", path: "/emails",
│ body: { to: ["{{profile.verified_contacts.email.value}}"] } }
▼
AgentGate MCP server ← holds the T3N session; the model holds nothing
│
▼
┌─ z:<tid>:agentgate — TEE contract (Rust → WASM, Intel TDX) ───────────────┐
│ 1. every {{…}} marker must be profile.* AND on this endpoint's allowlist │
│ 2. path must be one the tenant enumerated — exact match, no globs │
│ 3. credential read from the sealed z:<tid>:secrets map │
│ 4. host substitutes real PII inside the enclave (contract never sees it) │
│ 5. upstream response projected to declared fields only │
│ 6. ledger entry appended — for ALLOWED and DENIED alike │
└───────────────────────────────────────────────────────────────────────────┘
▼
api.resend.com ← reached only if the data owner's grant permits this hostFunciona. Aquí está el recibo
npm run demo contra la testnet T3N — cada llamada siguiente la realiza el agente emitido por la organización:
🛑 DENIED profile field outside the endpoint's allowlist ({{profile.ssn}})
marker rejected: 'ssn' is not in this endpoint's allowed_placeholders
🛑 DENIED marker reaching for another namespace ({{secret.resend_api_key}})
marker rejected: 'secret.resend_api_key' is not a profile marker
🛑 DENIED path the tenant never enumerated (/domains)
path rejected: '/domains' is not in this endpoint's allowed_paths
🛑 DENIED endpoint that does not exist (stripe)
unknown endpoint
── policy is per-ENDPOINT, not per-host ──────────────────────────────
'resend' and 'resend-notify' share a host AND a credential.
The same marker is allowed on one and refused on the other.
✅ ALLOWED {{profile.first_name}} via 'resend' (allowlisted there)
{"data":{"id":"d7299ce6-668f-47f2-8e22-8f3f96c0f255"},"status":200}
🛑 DENIED {{profile.first_name}} via 'resend-notify' (allowlist is empty)
marker rejected: 'first_name' is not in this endpoint's allowed_placeholders
✅ ALLOWED no markers via 'resend-notify' (allowed, returns nothing)
{"data":{},"status":200}Se entregaron correos electrónicos reales. La dirección y el nombre del destinatario se resolvieron dentro del enclave a partir del perfil del propietario de los datos — no aparecen en la entrada del agente, en el transporte MCP, en la memoria del contrato ni en el libro de contabilidad.
La última línea es la proyección de respuesta por defecto denegada: resend-notify declara sin response_fields, por lo que una llamada exitosa devuelve un código de estado y un objeto vacío. Incluso el id de mensaje del proveedor se retiene.
El libro de contabilidad después:
denied 0 resend/emails markers=["profile.ssn", …] 'ssn' not allowed here
denied 0 resend/emails markers=["secret.resend_api_key"] not a profile marker
denied 0 resend/domains markers=[] path not enumerated
denied 0 stripe/emails markers=[] unknown endpoint
ok 200 resend/emails markers=["first_name","last_name","verified_contacts.email.value"]
denied 0 resend-notify/emails markers=["profile.first_name", …] 'first_name' not allowed here
ok 200 resend-notify/emails markers=[]Se registran los nombres de los marcadores. Los valores de los marcadores nunca estuvieron disponibles para registrarse.
Related MCP server: MCP Warden
Inicio rápido
npm install
cp .env.example .env # add your T3N_API_KEY from terminal3.io/claim-page
npm run test # 9 native policy tests, no network, no credits
npm run build # Rust → wasm32-wasip2
npm run deploy # idempotent — safe to re-run
npm run doctor # pre-flight a deployment you didn't just create
npm run demo # the run shown aboveAñade a cualquier cliente MCP:
{ "mcpServers": {
"agentgate": { "command": "npx", "args": ["tsx", "/path/to/agentgate/mcp/server.ts"] } } }Añadir un endpoint
Un solo archivo. Sin Rust, sin redesplegar el contrato.
// agentgate.config.json
"endpoints": {
"stripe": {
"base": "https://api.stripe.com",
"secret_key": "stripe_api_key", // key in z:<tid>:secrets
"auth_header": "Authorization",
"auth_prefix": "Bearer ",
"allowed_paths": ["/v1/customers"], // exact match only
"allowed_placeholders": ["first_name", "verified_contacts.email.value"],
"response_fields": ["id"] // everything else is dropped
}
}Luego npm run deploy. Omite el registro del contrato cuando el wasm no ha cambiado, por lo que añadir un endpoint cuesta ~160 créditos en lugar de ~1.850.
Por qué el diseño tiene esta forma
Tres decisiones surgieron de medir la plataforma, no de leer sobre ella:
Las denegaciones devuelven
Ok, nuncaErr. Las escrituras del contrato se revierten en caso de error, por lo que devolverErren una denegación de política revertiría la entrada de auditoría que registra esa denegación — un agente podría activar la política repetidamente y no dejar rastro.Las respuestas se proyectan, no se pasan directamente.
http-with-placeholdersprotege solo la pierna saliente. La respuesta del proveedor regresa a WASM completa, por lo que un endpoint que hace eco de su solicitud devuelve la PII que los marcadores retuvieron. Demostrado endocs/BUGS.md.El contrato no establece
Content-Type. El host añade el suyo propio en lugar de reemplazar el tuyo, produciendoapplication/json,application/json, que los proveedores estrictos rechazan — silenciosamente, con un HTTP 200 y un cuerpo vacío. Verdocs/BUGS.md#1.
Estructura del repositorio
Ruta | Qué es |
| el contrato TEE — |
| servidor MCP — 3 herramientas |
| despliegue idempotente; posee el libro de contabilidad |
| comprobación de salud previa al vuelo |
| la ejecución mostrada arriba |
| cada endpoint y concesión, declarativamente (2 endpoints, políticas contrastadas) |
| libro de contabilidad confirmado de cada |
| 13 hallazgos contra la plataforma |
| por qué el límite del enclave está donde está |
| manual de operación para quien lo opere a continuación |
| diagnóstico desechable usado para mapear la superficie de marcadores — no se distribuye |
Estado
Construido y verificado de extremo a extremo contra la testnet T3N con @terminal3/t3n-sdk@5.2.0, ejecutando el flujo completo de tres identidades:
Principal | Tiene | Rol en la ejecución anterior |
Inquilino | clave eth, financiada | posee el contrato, sella la credencial, enumera la política |
Propietario de datos | su propio DID + perfil | concede al agente; los marcadores se resuelven contra su perfil |
Agente | un token portador opaco, nada más | hace cada llamada mostrada arriba |
La clave de firma del agente se acuñó dentro del TEE y nunca lo abandonó. No tiene clave de API, ni URL, ni datos personales, y no puede acceder a un contrato central para inspeccionar sus propias concesiones — sin embargo, entrega un correo electrónico personalizado a una bandeja de entrada real.
Llegar hasta ahí requirió que Terminal 3 financiara el DID del agente manualmente: un agente acuñado comienza en cero y una llamada reserva 10.000 tokens, sin recarga de autoservicio (docs/BUGS.md#10). Todo desarrollador se encontrará con eso en su primer agente.
This server cannot be deployed
Maintenance
Related MCP Connectors
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
- FullmaktOAuthai.fullmakt
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
Zero-trust gateway for AI agents: score tool calls, verify agent cards, enforce policy, audit.
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI agents to make authenticated API calls and run commands with secrets injected, while keeping credentials completely hidden from the model, with policy enforcement, grants, and audit logging.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to reach upstream MCP tool servers through a central policy gateway that authenticates each agent, enforces least-privilege and default-deny rules, and applies response obligations such as redaction, inference stripping, PII masking, and truncation. It also records every decision in a tamper-evident, hash-chained audit log that can be verified later.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to securely reach enterprise tools and other agents through a governed gateway with pinned tool definitions, delegated authorization, content inspection, human approval, and signed audit trails.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to call backend tools under per-agent policy, deciding which tools each agent can see, what arguments it may pass, how often it may call, and which writes wait for human approval. It also redacts secrets and PII from tool results, fences untrusted output against injection, and records every call in a hash-chained audit log.25 npmMIT