Skip to main content
Glama
Anshv784
by Anshv784

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 host

Funciona. 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: Proofpane

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 above

Añ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, nunca Err. Las escrituras del contrato se revierten en caso de error, por lo que devolver Err en 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-placeholders protege 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 en docs/BUGS.md.

  • El contrato no establece Content-Type. El host añade el suyo propio en lugar de reemplazar el tuyo, produciendo application/json,application/json, que los proveedores estrictos rechazan — silenciosamente, con un HTTP 200 y un cuerpo vacío. Ver docs/BUGS.md#1.

Estructura del repositorio

Ruta

Qué es

contract/

el contrato TEE — policy.rs es puro y probado nativamente, gateway.rs habla con el host

mcp/server.ts

servidor MCP — 3 herramientas

scripts/deploy.ts

despliegue idempotente; posee el libro de contabilidad contract_id

scripts/doctor.ts

comprobación de salud previa al vuelo

scripts/demo.ts

la ejecución mostrada arriba

agentgate.config.json

cada endpoint y concesión, declarativamente (2 endpoints, políticas contrastadas)

deployments.json

libro de contabilidad confirmado de cada contract_id emitido

docs/BUGS.md

13 hallazgos contra la plataforma

docs/ARCHITECTURE.md

por qué el límite del enclave está donde está

docs/HANDOVER.md

manual de operación para quien lo opere a continuación

contract-probe/

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.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

0Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides a trust and governance layer for AI agents, enabling secure API access, credential vaulting, paid execution with human approval, and automatic call resume.
    15
    2
  • A
    license
    B
    quality
    A
    maintenance
    A governance proxy for AI tools — every MCP/agent tool call is policy-gated, secret-redacted, and written to a hash-chained, offline-verifiable audit trail.
    13
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Bounded egress gateway & secret proxy for AI agents and applications, enabling safe credential injection into upstream requests while keeping raw secrets out of LLM prompt contexts.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Governed MCP gateway that lets AI agents call tools with policy enforcement, prompt-injection screening, a kill-switch, and tamper-evident signed audit logs.
    Apache 2.0

View all related MCP servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Anshv784/agentgate'

If you have feedback or need assistance with the MCP directory API, please join our Discord server