Skip to main content
Glama
Anshv784
by Anshv784

AgentGate

Ein kontrolliertes Tool-Call-Gateway für KI-Agenten, aufgebaut auf Terminal 3's ADK.

Gib einem LLM-Agenten einen API-Schlüssel und er kann alles aufrufen, alles ausgeben und alles leaken – und du erfährst es erst hinterher, aus den Logs, die er über sich selbst geschrieben hat.

AgentGate platziert eine hardware-isolierte Enklave zwischen dem Agenten und der Außenwelt. Der Agent benennt einen Endpunkt, keine URL. Er hält nie eine Zugangsberechtigung. Er sieht nie die persönlichen Daten des Nutzers. Und jeder Versuch, den er unternimmt – erlaubt oder verweigert – landet in einem Ledger, das er nicht bearbeiten kann.

Es wird als MCP-Server ausgeliefert, sodass jeder MCP-Client (Claude Code, Claude Desktop, Cursor, ein SDK-Agent) kontrollierte Tool-Aufrufe erhält, indem er einen Konfigurationseintrag hinzufügt. Kein Framework, kein Umschreiben.

  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

Es funktioniert. Hier ist der Beleg

npm run demo gegen das T3N-Testnetz – jeder Aufruf unten stammt vom org-geprägten Agenten:

🛑 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}

Echte E-Mails wurden zugestellt. Die Adresse und der Name des Empfängers wurden innerhalb der Enklave aus dem Profil des Dateneigentümers aufgelöst – sie erscheinen nirgendwo in der Eingabe des Agenten, im MCP-Transport, im Speicher des Vertrags oder im Ledger.

Die letzte Zeile ist die Deny-by-default-Antwortprojektion: resend-notify deklariert keine response_fields, sodass ein erfolgreicher Aufruf einen Statuscode und ein leeres Objekt zurückgibt. Selbst die Nachrichten-ID des Upstreams wird zurückgehalten.

Das Ledger danach:

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=[]

Marker-Namen werden aufgezeichnet. Marker-Werte standen nie zur Aufzeichnung zur Verfügung.

Related MCP server: Proofpane

Schnellstart

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

Füge zu einem beliebigen MCP-Client hinzu:

{ "mcpServers": {
    "agentgate": { "command": "npx", "args": ["tsx", "/path/to/agentgate/mcp/server.ts"] } } }

Hinzufügen eines Endpunkts

Eine Datei. Kein Rust, kein erneutes Bereitstellen des Vertrags.

// 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
  }
}

Dann npm run deploy. Es überspringt die Vertragsregistrierung, wenn das Wasm unverändert ist, sodass das Hinzufügen eines Endpunkts ~160 Credits statt ~1.850 kostet.

Warum das Design so geformt ist

Drei Entscheidungen stammen aus der Messung der Plattform, nicht aus dem Lesen darüber:

  • Ablehnungen geben Ok zurück, nie Err. Vertragsschreibvorgänge werden bei Fehlern zurückgerollt, sodass die Rückgabe von Err bei einer Richtlinienablehnung den Audit-Eintrag zurückrollen würde, der diese Ablehnung aufzeichnet – ein Agent könnte die Richtlinie wiederholt auslösen und keine Spur hinterlassen.

  • Antworten werden projiziert, nicht durchgereicht. http-with-placeholders schützt nur den ausgehenden Teil. Die Upstream-Antwort kehrt vollständig in WASM zurück, sodass ein Endpunkt, der seine Anfrage zurückspiegelt, die PII zurückgibt, die die Marker zurückgehalten haben. Demonstriert in docs/BUGS.md.

  • Der Vertrag setzt keinen Content-Type. Die Host-App fügt ihren eigenen hinzu, anstatt deinen zu ersetzen, was application/json,application/json erzeugt, das strenge Upstreams ablehnen – still, mit einem HTTP 200 und einem leeren Body. Siehe docs/BUGS.md#1.

Repo-Struktur

Pfad

Was

contract/

der TEE-Vertrag – policy.rs ist rein und nativ getestet, gateway.rs spricht mit dem Host

mcp/server.ts

MCP-Server – 3 Tools

scripts/deploy.ts

idempotentes Deployment; besitzt das contract_id-Ledger

scripts/doctor.ts

Pre-Flight-Gesundheitscheck

scripts/demo.ts

der oben gezeigte Lauf

agentgate.config.json

jeder Endpunkt und jede Berechtigung, deklarativ (2 Endpunkte, kontrastierende Richtlinien)

deployments.json

festgeschriebenes Ledger jeder jemals ausgegebenen contract_id

docs/BUGS.md

13 Befunde gegen die Plattform

docs/ARCHITECTURE.md

warum die Enklavengrenze dort liegt, wo sie liegt

docs/HANDOVER.md

Runbook für den, der das als Nächstes betreibt

contract-probe/

Wegwerf-Diagnose zur Kartierung der Platzhalteroberfläche – nicht ausgeliefert

Status

Gebaut und Ende-zu-Ende gegen das T3N-Testnetz mit @terminal3/t3n-sdk@5.2.0 verifiziert, mit dem vollständigen Drei-Identitäten-Ablauf:

Hauptakteur

Hält

Rolle im obigen Lauf

Tenant

eth-Schlüssel, finanziert

besitzt den Vertrag, versiegelt die Zugangsberechtigung, zählt die Richtlinie auf

Dateneigentümer

eigene DID + Profil

gewährt dem Agenten; die Marker werden gegen ihr Profil aufgelöst

Agent

ein undurchsichtiges Bearer-Token, sonst nichts

macht jeden oben gezeigten Aufruf

Der Signaturschlüssel des Agenten wurde innerhalb der TEE geprägt und hat sie nie verlassen. Er hält keinen API-Schlüssel, keine URL und keine persönlichen Daten und kann keinen Kernvertrag erreichen, um seine eigenen Berechtigungen einzusehen – doch er liefert eine personalisierte E-Mail an ein echtes Postfach.

Um dorthin zu gelangen, musste Terminal 3 die Agenten-DID von Hand finanzieren: Ein geprägter Agent startet bei null und ein Aufruf reserviert 10.000 Token, ohne Selbstbedienungs-Aufladung (docs/BUGS.md#10). Jeder Entwickler wird beim ersten Agenten darauf stoßen.

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