AgentGate
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 hostEs 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: MCP Warden
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 aboveFü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
Okzurück, nieErr. Vertragsschreibvorgänge werden bei Fehlern zurückgerollt, sodass die Rückgabe vonErrbei 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-placeholdersschü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 indocs/BUGS.md.Der Vertrag setzt keinen
Content-Type. Die Host-App fügt ihren eigenen hinzu, anstatt deinen zu ersetzen, wasapplication/json,application/jsonerzeugt, das strenge Upstreams ablehnen – still, mit einem HTTP 200 und einem leeren Body. Siehedocs/BUGS.md#1.
Repo-Struktur
Pfad | Was |
| der TEE-Vertrag – |
| MCP-Server – 3 Tools |
| idempotentes Deployment; besitzt das |
| Pre-Flight-Gesundheitscheck |
| der oben gezeigte Lauf |
| jeder Endpunkt und jede Berechtigung, deklarativ (2 Endpunkte, kontrastierende Richtlinien) |
| festgeschriebenes Ledger jeder jemals ausgegebenen |
| 13 Befunde gegen die Plattform |
| warum die Enklavengrenze dort liegt, wo sie liegt |
| Runbook für den, der das als Nächstes betreibt |
| 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.
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