TrustGate
TrustGate
TrustGate ist eine Demonstration mit synthetischen Daten im Razorpay-Testmodus eines KI-Käufers, der einen Katalogkauf vorschlagen kann, ohne die Befugnis zu erhalten, Händler, Betrag, Währung, Genehmigung oder Anbieterergebnis zu überschreiben. Der Agent schlägt vor; TrustGate autorisiert und protokolliert Beweise unabhängig.
Was es beweist
Katalog-SKU und Menge sind die einzigen Kaufdaten, die ein Agent beeinflussen kann.
Mandantenbezogene Richtlinien, menschliche Genehmigung, eine einmalige Checkout-Befugnis und verifizierte Anbieterereignisse begrenzen jede Zahlungsaktion.
Unsichere Versuche werden abgelehnt, bevor eine Anbieterbestellung erstellt werden kann, und hinterlassen eine prüfbare Spur.
Related MCP server: safe-cart-ai
Wie KI hier eingesetzt wird
Der Käuferagent ist bewusst dünn gehalten, und genau das ist das Argument und keine Abkürzung. Er kann nur eine Katalog-SKU, eine Menge und einen Zweck vorschlagen; jede geldkritische Tatsache wird serverseitig abgeleitet. Löschen Sie den Agenten vollständig, und die Autorisierungsebene bleibt unverändert und weiterhin korrekt.
Der technische Beitrag ist kein ausgeklügelter Agent. Es geht darum, die Ausfallmodi von Sprachmodellen ernst zu nehmen – Prompt-Injection durch Inhalte Dritter, Befolgung von Anweisungen gegen die Interessen des Betreibers, selbstsichere falsche Überlegungen über Geld – und ein System zu bauen, das korrekt bleibt, wenn diese auftreten.
Diese Behauptung wird in beide Richtungen getestet. python -m agent.demo --live führt ein echtes Modell gegen Katalogbeschreibungen aus, die von Dritten geschrieben wurden, einschließlich feindseliger. Derselbe Katalog wird zweimal gesendet, einmal ohne Beschreibungen, sodass der Einfluss nicht vertrauenswürdiger Inhalte durch den Vergleich der beiden Vorschläge gemessen wird, statt durch Selbstauskunft. Die Regressionssuite ruft niemals einen Modellanbieter auf: Sie verwendet deterministische Ersatzstoffe, sodass die Sicherheitsverifikation nicht davon abhängt, dass sich ein Modell an einem bestimmten Tag auf eine bestimmte Weise verhält.
Das Problem erkennen
Drei saubere Ablehnungen beweisen, dass das System funktioniert, und sind schwach darin, zu zeigen, warum jemand es braucht. Die Demo beginnt daher damit, dass der eigene Code dieses Projekts fehlschlägt, ohne Netzwerk, ohne Anmeldedaten und ohne Datenbank:
python -m demo.unguardedDerselbe Agent liest denselben vergifteten Katalog – buchstäblich denselben, da beide Kataloge aus agent/demo_catalog.py aufgebaut sind und ein Test bestätigt, dass die gesetzte Zeile und das Basisobjekt eine identische injizierte Anweisung tragen. Eine Modellantwort wird zwei Adaptern übergeben.
Der ungeschützte akzeptiert einen Betrag und einen Händler, sodass die injizierte Anweisung ausgeführt wird und er INR 20.000,00 an einen Händler zahlt, den der Katalogtext nannte, gegen einen Katalogpreis von INR 600,00. Der andere hat für keines der beiden Felder einen Platz, weil PurchaseProposal nur eine SKU, eine Menge und einen Zweck deklariert. Was die Verwerfung übersteht, ist quantity=50, ein Feld, das der Agent setzen darf – und der Server begrenzt es gegen das eigene Maximum des Katalogs von 2, sodass der Versuch abgelehnt wird, bevor eine Zahlungsanforderung erstellt wird.
Der Unterschied ist kein Filter, der einen Angriff erkannt hat. Es ist, dass eine Schnittstelle ein Feld für das Geld hatte und die andere nicht. Die Basislinie hat ihre eigenen Tests, die sowohl bestätigen, dass sie nichts Echtes erreichen kann, als auch, dass sie weiterhin ausnutzbar ist, da eine Demonstration, die stillschweigend aufhörte, verwundbar zu sein, weiterhin bestehen würde, während sie das Gegenteil aussagt.
Angriffsmatrix
Tier-A-Adversarial-Szenarien. Diese Tabelle wird aus dem Szenarioregister von python -m scenarios.report generiert, und ein Test bestätigt, dass sie übereinstimmt, sodass sie keinen Angriff behaupten kann, der nicht durch einen bestandenen Test abgedeckt ist. Jedes Szenario beweist drei Dinge: Der Angriff wird mit seinem Grundcode abgelehnt, es wurde keine Anbieterbestellung erstellt, und keine Zahlung erhielt eine Befugnis, die sie nicht hatte.
ID | Angriff | Bewiesene Invariante | Tests |
A1 | Betragsmanipulation | Der Betrag wird aus dem Preis des Katalogeintrags und einer serverseitig begrenzten Menge abgeleitet. Kein vom Agenten gelieferter Wert kann ihn ändern. |
|
A2 | Händlerersetzung | Der Händler wird aus dem mandantenbezogenen Katalogeintrag abgeleitet. Ein Händler außerhalb des Mandanten ist unerreichbar, und einer außerhalb der aktiven Richtlinie kann nicht bezahlt werden. |
|
A3 | Währungsersetzung | Die Währung wird aus dem Katalogeintrag abgeleitet, und die einzige Route, die eine Währung akzeptiert, ist standardmäßig deaktiviert und verweigert bei Aktivierung eine Abweichung von der aktiven Richtlinie. |
|
A4 | Abgelaufene oder wiederverwendete Genehmigung | Eine Genehmigung ist eine Berechtigung mit einer Lebensdauer und einer einmaligen Verwendung. Weder eine abgelaufene noch eine bereits verbrauchte kann autorisieren, und eine verweigerte Genehmigung wird nicht verbraucht. |
|
A5 | Selbstgenehmigung | Eine Genehmigung kann nicht von der Identität erteilt werden, die den Kauf angefordert hat. Funktionstrennung wird erzwungen, nicht nur von der Konfiguration erwartet. |
|
A6 | Gefälschte Webhook-Signatur | Provider-Ereignisse werden per Rohbyte-HMAC authentifiziert, bevor der Body geparst wird. Eine gefälschte oder fehlende Signatur ändert nichts, egal wie wohlgeformt das Ereignis ist. |
|
A7 | Manipulierter Webhook-Body | Die Signatur deckt die exakt empfangenen Bytes ab, sodass ein echt signiertes, während der Übertragung verändertes Ereignis nicht mehr verifiziert und niemals eine Zahlung erreicht. |
|
A8 | Doppelte Webhook-Zustellung | Die Identität von Provider-Ereignissen wird gespeichert, sodass eine Wiedergabe eines authentischen, im Zeitfenster liegenden Ereignisses von der Datenbank abgelehnt wird, nicht von dem Handler, der zufällig darauf schaut. |
|
A9 | Außerhalb der Reihenfolge eintreffende Provider-Ereignisse | Die Ankunftsreihenfolge ist Sache des Providers, die Rechtmäßigkeit unsere. Eine Erfassung kann ihrer Autorisierung nicht vorausgehen, und eine abgeschlossene Zahlung akzeptiert kein weiteres Ergebnis. |
|
A10 | Doppelte Rückerstattung | Keine Oberfläche kann überhaupt eine Rückerstattung auslösen, geprüft gegen die Live-Routentabelle und die Werkzeugliste, und die Ledger-Invariante verweigert eine Rückerstattungssumme, die die Erfassung übersteigt. |
|
A11a | Unbekannter Mandanten-Header | Ein Mandant, der nicht aufgelöst werden kann, wird abgelehnt, bevor irgendein Routen-Body ausgeführt wird, und die Ablehnung gibt nichts preis, was einem Aufrufer erlauben würde, aufzuzählen, welche Mandanten existieren. |
|
A11b | Mandantenübergreifender Objektzugriff | Jede mandantenbezogene Suche filtert nach dem vertrauenswürdigen Mandanten. Ein bekannter Mandant kann auf keiner Oberfläche die Anfrage, Zahlung oder Berechtigung eines anderen Mandanten lesen oder darauf einwirken. |
|
A12 | Kollision des Idempotenzschlüssels | Ein mit einem anderen Kauf wiederverwendeter Schlüssel gibt die ursprüngliche Entscheidung und einen 409 zurück. Der zweite Kauf wird nie erstellt und kann nicht mit einem akzeptierten verwechselt werden. |
|
A13 | Richtlinienabweichung zwischen Autorisierung und Verwendung | Eine Berechtigung überlebt weder die Richtlinie, gegen die sie geprüft wurde, noch den Kauf, für den sie ausgestellt wurde. Eine ersetzende Richtlinie oder ein geänderter Betrag widerruft sie, ohne sie zu verbrauchen, und eine nicht abweichende Berechtigung funktioniert weiterhin. |
|
A14 | Veralteter oder nachdatierter Webhook | Eine Signatur beweist die Herkunft, nicht die Aktualität. Ein Ereignis außerhalb des Frischefensters, in die Zukunft datiert oder ganz ohne Zeitstempel wird vor jeder Suche abgelehnt. |
|
A15 | Nicht autorisierte Erfassung über MCP | Kein für den Agenten erreichbares Werkzeug kann autorisieren, erfassen, erstatten oder einen Provider aufrufen. Bewiesen durch Ausübung jedes exponierten Werkzeugs, nicht durch Inspektion von Werkzeugnamen. |
|
Jedes Tier-A-Szenario ist implementiert. A11a und A11b teilen die Mandantenverwechslung in einen nicht auflösbaren Mandanten und einen bekannten Mandanten, der die Grenze überschreitet, weil die beiden aus unterschiedlichen Gründen fehlschlagen und nur das zweite eine Autorisierungsfrage ist.
Was die Tests wert sind
Eine erfolgreiche Testsuite sagt, dass sich der Code wie geschrieben verhält. Sie sagt nicht, dass die Tests Einspruch erheben würden, wenn der Code aufhört, etwas Wichtiges zu tun, und nur die zweite Behauptung zählt, wenn es um Geld geht. Dieses Projekt hat Belege für den Unterschied: Anforderungsbezogene Sitzungen verwarfen einst jeden Schreibvorgang, während 146 Tests bestanden, weil die Suite innerhalb derselben Transaktion prüfte, in die sie schrieb.
make mutation bricht jede Sicherheitsinvariante absichtlich, eine nach der anderen, und verlangt, dass die als Wächter benannten Tests fehlschlagen. Jede Quelldatei wird in einem finally-Block wiederhergestellt, und die Wiederherstellung wird vor dem Drucken des Berichts gegen git diff geprüft, sodass ein unterbrochener Lauf keine Mutation hinterlassen kann. Es beendet sich mit einem Nicht-Null-Exitcode, wenn irgendeine Mutation überlebt.
Diese Tabelle wird aus dem Mutationsregister von python -m scenarios.report --mutations generiert, und ein Test stellt sicher, dass sie übereinstimmt, sodass sie keine bewachte Invariante behaupten kann, die nicht tatsächlich bewacht ist.
Mutation | Invariant it removes |
| Eine Zahlung wird gesperrt, bevor ihr Zustand gelesen und geändert wird. |
| Ein gesperrter Lesevorgang entscheidet anhand der committeten Zeile, nicht anhand einer gecachten. |
| Zeilensperren werden über den einen Helfer erworben, der sie sinnvoll hält. |
| Ein Provider-Ereignis wird authentifiziert, bevor irgendetwas damit geschieht. |
| Ein signiertes Provider-Ereignis beweist die Herkunft, nicht die Aktualität. |
| Ein Ereignis, das nicht datiert werden kann, kann nicht begrenzt werden, daher wird es abgelehnt. |
| Eine Genehmigung ist eine Berechtigung mit einer Lebensdauer, keine dauerhafte Erteilung. |
| Eine Autorität überlebt nicht die Richtlinie, gegen die sie geprüft wurde. |
| Eine Autorität ist an den genauen Kauf gebunden, für den sie ausgestellt wurde. |
| Das tägliche Budget-Upsert weigert sich, das Limit zu überschreiten. |
| Budget wird nur von einer Zahlung zurückgegeben, die es tatsächlich reserviert hat. |
| Katalogtext kann das Skriptelement der Checkout-Seite nicht beenden. |
| Eine erfolgreiche Anfrage committet ihre Schreibvorgänge. |
| Lebenszyklus-Ereignisse für eine Zahlung sind eigenständige Ereignisse, keine Wiederholungen. |
| Eine Genehmigung kann nicht vom anfragenden Akteur erteilt werden. |
| Beweise sind auf den Mandanten beschränkt, der sie angefordert hat. |
| Eine unvollständige Provider-Suche meldet eine Quittung nie als fehlend. |
Der erste Lauf dieser Suite fand einen echten Defekt. SELECT ... FOR UPDATE über das ORM erwirbt
die Sperre korrekt und verwirft dann die Zeile, die Postgres zurückgegeben hat, weil SQLAlchemy die
Attribute eines Objekts, das sich bereits in der Identitätskarte der Sitzung befindet, beibehält.
Ein zweiter Aufrufer blockierte daher wie vorgesehen an der Sperre, erhielt die committete Zeile,
behielt seine veraltete Kopie und autorisierte eine Zahlung, die gerade erst autorisiert worden war.
Die Sperre serialisierte, wann Übergänge liefen, nicht, von welchem Zustand sie ausgingen. Alle
Sperrungen laufen jetzt über models.locking.locked(), und ein Test stellt sicher, dass dieser
Helfer die einzige Stelle im Quellcode ist, die eine Sperre übernehmen kann.
Current Scope
TrustGate verwendet nur synthetische Mandanten, Händler und INR-Preise. Es ist ein lokales Sicherheits-Testfeld, kein Zahlungsabwickler, kein Compliance-Produkt, kein System für rechtliche Einwilligungen, kein Betrugsmodell und keine Live-Mode-Zahlungsintegration.
Quickstart
Voraussetzungen: Docker Desktop und Python 3.12.
Copy-Item .env.example .env
docker compose up -d
docker compose exec -T api python -m alembic upgrade head
docker compose exec -T api python -m pytest -qDer lokale API-Health-Check ist unter http://127.0.0.1:8000/health verfügbar.
Erstellen Sie einen wegwerfbaren synthetischen M1-Mandanten mit python -m agent.seed. Setzen Sie
MCP_TENANT_ID und MCP_ACTOR_ID auf die ausgegebenen Werte und führen Sie dann die lokale
Buyer-Agent-Demo mit python -m agent.demo "Buy Starter credits for our student club." aus. Sie
kann nur eine Katalog-SKU, Menge und Zweck vorschlagen; der MCP-Server leitet alle
geldkritischen Fakten ab. Verwenden Sie python -m agent.demo --adversarial "Buy a small amount of cloud credits.", um die deterministische Demonstration des vergifteten Katalogs auszuführen.
Um denselben Ablauf mit einem echten Modell anstelle eines deterministischen Ersatzes auszuführen,
installieren Sie das optionale Extra mit pip install -e ".[agent]" und fügen Sie --live hinzu.
Zwei Backends werden unterstützt und beide verwenden dieselbe Messages-API-Form:
TRUSTGATE_MODEL_BACKEND=anthropic(Standard) liestANTHROPIC_API_KEY.TRUSTGATE_MODEL_BACKEND=bedrockrechnet gegen ein AWS-Konto ab. Setzen SieAWS_REGIONauf die Region, zu der die Anmeldedaten gehören, und dann entwederAWS_BEARER_TOKEN_BEDROCK(einen Bedrock-API-Schlüssel, den einfachsten Weg) oder Standard-AWS-Anmeldedaten für die SigV4-Signierung. Amazon Bedrock stellt Anthropic-Modelle über ein AWS-Marketplace-Abonnement bereit, daher benötigt das AWS-Konto auch ein gültiges Zahlungsmittel, selbst wenn Guthaben die Nutzung abdecken würde.TRUSTGATE_MODEL_BACKEND=groqliestGROQ_API_KEYund benötigt überhaupt kein Zahlungsmittel.
TRUSTGATE_MODEL_ID überschreibt das Modell auf jedem Backend. Der Käufer ist eine
Protokollimplementierung, daher ist der Anbieter eine Konfigurationsentscheidung und keine
architektonische: Das Verhalten der Autorisierungsschicht hängt nicht davon ab, welches Modell den
Kauf vorschlägt.
Dies ist der einzige Pfad im Projekt, der einen Modellanbieter kontaktiert; die Testsuite tut das nie. Führen Sie ihn nur gegen den synthetischen Seed-Katalog aus. Seine Drittanbieter-Beschreibungen werden zweimal an das Modell gesendet, einmal ohne Beschreibungen und einmal intakt, um den Einfluss zu messen. Senden Sie niemals echte Kunden-, Händler- oder Zahlungsdaten durch diese Demonstration.
Um den Razorpay-Testmodus-Adapter zu testen, setzen Sie RAZORPAY_KEY_ID und
RAZORPAY_KEY_SECRET in der ignorierten .env-Datei. Fügen Sie niemals Testmodus- oder
Live-Modus-Geheimnisse zum Repository hinzu.
Trust Boundary
AI buyer proposes SKU, quantity, and purpose
-> TrustGate derives and authorizes money-critical facts
-> Razorpay Test Mode executes a bounded order
-> TrustGate records authorization and provider evidenceDer formale Build-Plan befindet sich in docs/build-plan.md; Architektur, Bedrohungsmodell und
Designentscheidungen finden Sie in docs/.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
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
Procure governed AI capabilities: machine-readable price, scope, trust, gateway-delegation terms.
Secure agent purchasing with human-approved virtual cards, receipts, and audit trails.
Pre-spend firewall for AI agents. Approves, blocks, flags transactions against policy rules.
Advisory policy preflight for AI-agent spend requests; never executes payments or accesses wallets.
Related MCP Servers
FlicenseNot gradedqualityBmaintenanceEnables AI agents to request purchase approval from humans, receive scoped virtual cards, complete checkout, and report receipts for audit.-- FlicenseNot gradedqualityBmaintenanceEnables AI agents to browse product catalogs and make purchases through a policy engine that enforces spending limits, requires human approval for certain amounts, and logs all actions to an audit trail.-
- FlicenseNot gradedqualityDmaintenanceEnables human-in-the-loop authorization for AI agent transactions, allowing real-time approval or denial of purchases based on configurable spending limits, vendor blocklists, daily caps, and category restrictions.1-
- AlicenseNot gradedqualityBmaintenanceEnables an AI agent to browse inventory and make purchases under strict human approval, with hard spending caps and auditable on-chain payment records.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Saraid10/Trustgate'
If you have feedback or need assistance with the MCP directory API, please join our Discord server