# Bau keinen Agenten. Bau die Agentenfabrik.

Einen KI-Agenten kann jeder an einem Wochenende bauen. Ein gutes Modell, ein paar Tools, ein anständiger System-Prompt — und man hat eine Demo, die im Montagsmeeting beeindruckt. Über [den Unterschied zwischen Modell und Agent](/de/blog/ai-model-vs-agent) und darüber, [wie Agenten in Produktion aussehen](/de/blog/ai-agents-2026), habe ich bereits geschrieben; den Teil wiederhole ich nicht.

Das echte Problem taucht bei der zweiten Frage auf, die die Wochenend-Demo nie berührt: Was passiert, wenn **zehn Teams** jeweils ihren eigenen Agenten wollen? Jedes mit Zugriff auf das CRM, auf Tickets, auf Datenbanken. Jedes mit eigenen API-Keys, eigenen Prompts, eigener Vorstellung davon, was „funktioniert" bedeutet. Ohne Antwort auf diese Frage bekommt man, was ich derzeit in vielen Unternehmen sehe: einen Haufen Pilot-Agenten, die nie in Produktion gehen, weil niemand sagen kann, wer worauf zugreifen darf, wie gut etwas tatsächlich funktioniert und was beim nächsten Release kaputtgeht.

Die Antwort darauf ist nicht „noch ein Agent", sondern eine **Agentenarchitektur** — die interne Fabrik, über die jedes Team governte, getestete Agenten mit kontrolliertem Zugriff auf die Unternehmenssysteme ausliefern kann. Dieser Artikel geht die vier Bausteine dieser Architektur durch und erklärt, warum man jeden davon braucht.

## Die zwei Schichten

Zuerst eine Klärung, denn hier verheddern sich die meisten Diskussionen: Der Agent, den der Nutzer sieht, und die Plattform darunter sind unterschiedliche Schichten mit unterschiedlichen Problemen.

Die Anwendungsschicht ist das, was man für einen konkreten Anwendungsfall baut: Orchestrierung mit Sub-Agenten, RAG über die relevanten Dokumente, Freigabe-Gates, an denen ein Mensch sensible Aktionen validiert. Es ist die Schicht, die auch wir in Kundenprojekten bauen — und über die 95 % aller Agenten-Artikel geschrieben werden.

Die Plattformschicht ist das, was dafür sorgt, dass der **zweite, fünfte und zehnte** Agent nicht bei null anfängt. Sie beantwortet drei Fragen, die die Anwendung allein nicht lösen kann: Wer darf auf welches System zugreifen, wie gut ist ein Agent, bevor man ihn ausliefert, und wie erfährt Team B, dass der Agent von Team A schon existiert.

<div class="article-figure">
<svg viewBox="0 0 900 470" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Zwei-Schichten-Architektur: die Anwendungsschicht mit Sub-Agenten, Anwendungs-RAG und Freigabe-Gates über der Plattformschicht mit Katalog und Evaluierungen, Gateway, MCP-Servern und geteiltem RAG, die vor den Unternehmenssystemen steht">
<text x="10" y="22" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="15px" font-weight="600" text-anchor="start">Zwei Schichten: der Agent und die Fabrik</text>
<rect x="10" y="40" width="880" height="120" rx="12" fill="#181d27" stroke="#2a3147" stroke-width="1"/>
<text x="30" y="66" fill="#7b8cff" font-family="DM Mono, ui-monospace, monospace" font-size="12px" font-weight="600" text-anchor="start">ANWENDUNGSSCHICHT — was der Nutzer sieht</text>
<rect x="30" y="82" width="270" height="60" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="165" y="108" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Sub-Agenten</text>
<text x="165" y="127" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Orchestrierung pro Task</text>
<rect x="315" y="82" width="270" height="60" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="450" y="108" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Anwendungs-RAG</text>
<text x="450" y="127" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Antworten aus Dokumenten</text>
<rect x="600" y="82" width="270" height="60" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="735" y="108" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Freigabe-Gates</text>
<text x="735" y="127" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">ein Mensch validiert Aktionen</text>
<line x1="450" y1="160" x2="450" y2="186" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="450,196 444,184 456,184" fill="#6b7a99"/>
<rect x="10" y="196" width="880" height="150" rx="12" fill="#181d27" stroke="#4fffb0" stroke-opacity="0.4" stroke-width="1"/>
<text x="30" y="222" fill="#4fffb0" font-family="DM Mono, ui-monospace, monospace" font-size="12px" font-weight="600" text-anchor="start">PLATTFORMSCHICHT — die Agentenfabrik</text>
<rect x="30" y="238" width="200" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="130" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Katalog + Evals</text>
<text x="130" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Register, Scores,</text>
<text x="130" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Regressionen pro Release</text>
<rect x="250" y="238" width="200" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="350" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Gateway</text>
<text x="350" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Auth, Rate Limiting,</text>
<text x="350" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">zentrales Logging</text>
<rect x="470" y="238" width="200" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="570" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">MCP-Server</text>
<text x="570" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Tools und Daten über ein</text>
<text x="570" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Standardprotokoll</text>
<rect x="690" y="238" width="180" height="88" rx="8" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="780" y="266" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Geteiltes RAG</text>
<text x="780" y="286" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Ingestion und Suche</text>
<text x="780" y="302" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">für alle Teams</text>
<line x1="450" y1="346" x2="450" y2="372" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="450,382 444,370 456,370" fill="#6b7a99"/>
<rect x="10" y="382" width="880" height="52" rx="12" fill="#181d27" stroke="#2a3147" stroke-width="1"/>
<text x="450" y="413" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13px" font-weight="400" text-anchor="middle">Unternehmenssysteme: CRM · Tickets · Dokumente · Datenbanken · interne APIs</text>
<text x="10" y="460" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="start">Die Teams bauen oben. Die Plattform garantiert unten: Zugriff, Qualität, Sichtbarkeit.</text>
</svg>
</div>

Der Rest des Artikels nimmt die untere Schicht Stück für Stück auseinander.

## Der Agentenkatalog: Register plus Evaluierungen, kein Wiki

Der erste Baustein klingt banal und ist der am meisten unterschätzte: ein **internes Agentenregister**. Jeder Agent hat einen Eintrag mit Beschreibung, den Tools, auf die er zugreifen darf, dem verantwortlichen Team und der aktuellen Version. Teams schauen hinein, bevor sie etwas Neues bauen — genau wie in ein Service-Register oder einen internen API-Katalog.

| Feld | Beispiel |
|---|---|
| Name | `support-triage-agent` |
| Beschreibung | Triagiert Support-Tickets und schlägt eine Antwort vor |
| Owner | Team Customer Platform |
| Version | 1.4.2 |
| Tools (über Gateway) | `crm.search` · `tickets.update` · `kb.retrieve` |
| Eval-Scores | Qualität 92 · Korrektheit 96 · Sicherheit 100 |
| Letzter Regressionslauf | bestanden · 27. August 2026 |

Der Unterschied zu einem Wiki sind die letzten beiden Zeilen. Ein Katalog ohne Evaluierungen ist eine Liste von Versprechen; ein Katalog mit Evaluierungen ist ein Vertrag. Zu jedem Agenten gehören **Testsets** — reale Eingabeszenarien mit erwarteten Ergebnissen — und Scores auf drei Achsen: Qualität (wie nützlich die Antworten sind), Korrektheit (wie viele Aussagen faktisch stimmen, wie viele Aktionen die richtigen sind) und Sicherheit (er lehnt ab, was er ablehnen muss, leakt keine Daten zwischen Kunden, handelt nicht außerhalb seines Mandats).

Die Regel, die alles zusammenhält: **Eine neue Version wird nicht in den Katalog veröffentlicht, wenn sie die Evaluierungen nicht besteht.** Einschließlich — vor allem — der alten Suite. Ein Agent, der mit v1.4 einen neuen Fall löst, aber drei Fälle kaputtmacht, die mit v1.3 funktionierten, wird nicht ausgeliefert. Das ist CI/CD, angewendet auf Agenten:

<div class="article-figure">
<svg viewBox="0 0 900 310" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Release-Pipeline für Agenten: eine neue Version durchläuft Evaluierungen und Schwellenwerte; besteht sie, wird sie in den Katalog veröffentlicht, sonst wird sie blockiert; bei jedem Release läuft auch die alte Suite als Regressionscheck">
<text x="10" y="22" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="15px" font-weight="600" text-anchor="start">CI/CD für Agenten: ohne Evals kommt nichts in den Katalog</text>
<rect x="10" y="58" width="190" height="96" rx="10" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="105" y="100" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Neue Version</text>
<text x="105" y="121" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">v1.4 des Support-Agenten</text>
<line x1="200" y1="106" x2="230" y2="106" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="240,106 228,100 228,112" fill="#6b7a99"/>
<rect x="240" y="58" width="210" height="96" rx="10" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="345" y="94" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Evaluierungen</text>
<text x="345" y="114" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Testsets,</text>
<text x="345" y="130" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">LLM-as-Judge</text>
<line x1="450" y1="106" x2="480" y2="106" stroke="#6b7a99" stroke-width="1.5"/>
<polygon points="490,106 478,100 478,112" fill="#6b7a99"/>
<rect x="490" y="58" width="200" height="96" rx="10" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="590" y="94" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="middle">Schwellenwerte</text>
<text x="590" y="114" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Qualität · Korrektheit</text>
<text x="590" y="130" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Sicherheit · keine Regressionen</text>
<line x1="690" y1="88" x2="722" y2="76" stroke="#4fffb0" stroke-opacity="0.7" stroke-width="1.5"/>
<polygon points="732,72 719,71 723,82" fill="#4fffb0" fill-opacity="0.8"/>
<line x1="690" y1="124" x2="722" y2="136" stroke="#ff6b6b" stroke-opacity="0.7" stroke-width="1.5"/>
<polygon points="732,140 723,130 719,141" fill="#ff6b6b" fill-opacity="0.8"/>
<rect x="732" y="46" width="158" height="52" rx="10" fill="#181d27" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<text x="811" y="68" fill="#4fffb0" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13px" font-weight="600" text-anchor="middle">✓ Im Katalog</text>
<text x="811" y="87" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">sichtbar für alle Teams</text>
<rect x="732" y="114" width="158" height="52" rx="10" fill="#181d27" stroke="#ff6b6b" stroke-opacity="0.5" stroke-width="1"/>
<text x="811" y="136" fill="#ff6b6b" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13px" font-weight="600" text-anchor="middle">✗ Blockiert</text>
<text x="811" y="155" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">zurück in die Entwicklung</text>
<path d="M 811 166 L 811 216 L 345 216 L 345 164" fill="none" stroke="#6b7a99" stroke-width="1" stroke-dasharray="5 4"/>
<polygon points="345,156 339,168 351,168" fill="#6b7a99"/>
<text x="578" y="236" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">bei jeder Version läuft die gesamte alte Suite erneut — Regressionen blockieren das Release</text>
<text x="10" y="290" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="start">Genau wie bei Code: Build → Tests → Gate. Nur sind die „Tests” bewertete Evaluierungen, keine binären Asserts.</text>
</svg>
</div>

Der nicht-deterministische Teil ist das einzig wirklich Neue. Ein Code-Test ist binär; eine Agentenantwort ist „gut genug" oder eben nicht. Deshalb kombinieren Evaluierungen exakte Checks (wurde das richtige Tool aufgerufen? wurde das Format eingehalten?) mit **LLM-as-Judge** — einem Modell, das die Antwort nach einer von Menschen geschriebenen Rubrik bewertet. Nicht perfekt, aber konsistent, günstig, und es läuft bei jedem Release — was ein menschliches Review nicht kann.

Auf AWS gibt es diesen Baustein als Service — die Evaluierungen in Amazon Bedrock AgentCore —, er lässt sich aber genauso gut als eigene Pipeline bauen: ein Satz Szenarien in Git, ein Job, der den Agenten durchlaufen lässt, und ein Judge, der bewertet. Entscheidend ist das Gate, nicht das Werkzeug.

## Das Gateway: ein einziger Ort, an dem Agenten die Welt berühren

Der zweite Baustein löst ein Rechenproblem. Drei Agenten, die direkt mit fünf Systemen sprechen, bedeuten fünfzehn Integrationen: fünfzehn Orte mit Credentials, fünfzehn Orte zum Auditieren, fünfzehn Implementierungen von Rate Limiting — meistens null. Jeder neue Agent multipliziert das Problem.

Das Gateway macht aus N × M ein N + M: Agenten sprechen mit einer einzigen Schicht, und diese Schicht weiß, **wer worauf zugreifen darf**.

<div class="article-figure">
<svg viewBox="0 0 900 400" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Vergleich: ohne Gateway verbinden sich drei Agenten direkt mit fünf Systemen über fünfzehn Integrationen; mit Gateway sprechen die Agenten mit einer einzigen Schicht, die Authentifizierung, Autorisierung, Rate Limiting und Logging zentralisiert">
<text x="10" y="22" fill="#eef2ff" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="15px" font-weight="600" text-anchor="start">Ohne Gateway vs. mit Gateway</text>
<rect x="10" y="40" width="430" height="310" rx="12" fill="#181d27" stroke="#ff6b6b" stroke-opacity="0.35" stroke-width="1"/>
<text x="30" y="68" fill="#ff6b6b" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="start">Ohne Gateway: N × M Verbindungen</text>
<text x="225" y="98" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">Agenten</text>
<line x1="105" y1="134" x2="79" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="157" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="235" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="313" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="105" y1="134" x2="391" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="79" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="157" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="235" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="313" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="225" y1="134" x2="391" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="79" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="157" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="235" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="313" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<line x1="345" y1="134" x2="391" y2="270" stroke="#ff6b6b" stroke-opacity="0.3" stroke-width="1"/>
<circle cx="105" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="225" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="345" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<rect x="47" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="79" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">CRM</text>
<rect x="125" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="157" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Tickets</text>
<rect x="203" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="235" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Docs</text>
<rect x="281" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="313" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">DB</text>
<rect x="359" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="391" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Lambda</text>
<text x="225" y="334" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">15 Integrationen · Credentials überall · Audit unmöglich</text>
<rect x="460" y="40" width="430" height="310" rx="12" fill="#181d27" stroke="#4fffb0" stroke-opacity="0.35" stroke-width="1"/>
<text x="480" y="68" fill="#4fffb0" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="13.5px" font-weight="600" text-anchor="start">Mit Gateway: N + M Verbindungen</text>
<text x="675" y="98" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">Agenten</text>
<circle cx="555" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="675" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<circle cx="795" cy="120" r="14" fill="#7b8cff" fill-opacity="0.85"/>
<line x1="555" y1="134" x2="601" y2="168" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="675" y1="134" x2="675" y2="168" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="795" y1="134" x2="749" y2="168" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<rect x="520" y="168" width="310" height="64" rx="8" fill="#1e2535" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<text x="675" y="194" fill="#4fffb0" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="14px" font-weight="600" text-anchor="middle">Gateway</text>
<text x="675" y="214" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11.5px" font-weight="400" text-anchor="middle">Authentifizierung · Autorisierung · Rate Limiting · Logging</text>
<line x1="529" y1="232" x2="529" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="607" y1="232" x2="607" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="685" y1="232" x2="685" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="763" y1="232" x2="763" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<line x1="830" y1="232" x2="841" y2="270" stroke="#4fffb0" stroke-opacity="0.5" stroke-width="1"/>
<rect x="497" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="529" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">CRM</text>
<rect x="575" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="607" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Tickets</text>
<rect x="653" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="685" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Docs</text>
<rect x="731" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="763" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">DB</text>
<rect x="809" y="270" width="64" height="34" rx="6" fill="#1e2535" stroke="#2a3147" stroke-width="1"/>
<text x="841" y="291" fill="#c8d3e8" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="11px" font-weight="400" text-anchor="middle">Lambda</text>
<text x="675" y="334" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="middle">8 Verbindungen · ein einziger Kontroll- und Audit-Punkt</text>
<text x="10" y="384" fill="#6b7a99" font-family="DM Sans, system-ui, -apple-system, sans-serif" font-size="12px" font-weight="400" text-anchor="start">Bonus: Eine bestehende API (REST, Lambda) wird am Gateway zum MCP-Tool, ohne Rewrite.</text>
</svg>
</div>

Konkret zentralisiert das Gateway vier Dinge, die sonst jedes Team schlecht und unterschiedlich nachbaut: **Authentifizierung** (Agenten bekommen Identitäten, keine in Prompts kopierten API-Keys), **Autorisierung** (der Support-Agent sieht Tickets, nicht Gehälter), **Rate Limiting** (ein Agent in einer Schleife bringt das CRM nicht in die Knie) und **Logging** (jeder Tool-Aufruf, mit der Identität des Agenten — die einzige Art, jemals „wer hat diesen Datensatz geändert?" zu beantworten).

Die zweite, weniger offensichtliche, in der Praxis aber enorme Funktion: Das Gateway **übersetzt bestehende APIs in MCP-Tools, ohne sie neu zu schreiben**. Es gibt eine interne REST-API oder eine Lambda-Funktion? Am Gateway beschrieben, wird sie zum Tool, das jeder kompatible Agent aufrufen kann. Auf AWS macht genau das AgentCore Gateway; dasselbe Muster lässt sich auch eigenständig bauen.

## MCP-Server: die Schicht, die die Tools tatsächlich bereitstellt

Unter dem Gateway sitzen die Server, die Tools und Daten tatsächlich bereitstellen: CRM, Tickets, Dokumente, Datenbanken. Über [MCP aus der Perspektive eines lokalen Setups](/de/blog/mcp-lm-studio) habe ich schon geschrieben; auf Enterprise-Ebene ist die Logik identisch, nur der Einsatz höher — MCP verhindert, dass die Plattform zu einem Haufen proprietärer Integrationen wird.

Weil das Protokoll ein Standard ist, kann der MCP-Server für Tickets, den ein Team schreibt, von jedem Agenten im Unternehmen genutzt werden — egal, mit welchem Framework der Agent gebaut ist. Und wenn die eigenen Vendoren selbst MCP-Server anbieten — immer häufiger —, stellt man sie hinter dasselbe Gateway, und sie bekommen dieselben Zugriffsregeln und denselben Audit-Trail wie die internen Tools. Das Paar Gateway + MCP macht aus „Integration" statt eines Drei-Wochen-Projekts einen Konfigurationseintrag.

## RAG: geteilt, nicht pro Agent neu erfunden

Der letzte Baustein ist der, den man schon kennt — mit einer Positionskorrektur. RAG taucht in beiden Schichten auf, aber jede baut etwas anderes: Die Anwendung entscheidet, *was gefragt wird und was mit der Antwort passiert*; die Plattform besitzt *die Leitungen* — Dokumenten-Ingestion, Indexierung, Embeddings und vor allem **berechtigungsbewusstes Filtern zum Zeitpunkt der Suche**. Wenn jedes Team seine eigene Ingestion-Pipeline baut, bekommt man fünf Indizes, die unterschiedlich schnell altern, und mindestens einen, der vertrauliche Dokumente an das falsche Publikum ausliefert. Retrieval ist Infrastruktur, wie die Datenbank; die Frage „welche Dokumente darf dieser Agent sehen" gehört der Plattform, nicht den guten Absichten jedes einzelnen Prompts.

## Warum man eine Agentenarchitektur braucht

Weil sich keines der obigen Probleme innerhalb eines Agenten lösen lässt. Man kann den besten Agenten der Welt schreiben und hat trotzdem keine Antwort auf „wer darf worauf zugreifen", „wie gut ist er vor dem Release" und „was geht beim nächsten kaputt" — das sind Eigenschaften des Systems um die Agenten herum, nicht eines einzelnen Agenten.

Und betrachtet man die vier Bausteine zusammen, fällt auf: Keiner davon handelt im engeren Sinne von KI. Der Katalog ist Governance. Die Evaluierungen sind QA. Das Gateway ist Security und Networking. Geteiltes RAG ist eine Datenplattform. Das Modell — der „KI"-Teil — ist eine Abhängigkeit, nicht das Produkt. Deshalb ist das ein Architekturproblem, kein Problem besserer Prompts.

Das ist, glaube ich, die nützlichste Linse für diesen Moment: Bei Agenten stehen wir dort, wo Software vor DevOps stand. Jeder kann einen schreiben; fast niemand hat die Pipeline, die ihn sicher ausliefert, misst und aussortiert, wenn er abbaut. Die Lücke zwischen Demo und Produktion ist kein besseres Modell — sondern die Architektur drumherum.

Und die praktische Reihenfolge, wenn man bei null anfängt, ist die umgekehrte des Enthusiasmus: zuerst ein Gateway mit einem einzigen MCP-Server dahinter und Logging auf jedem Aufruf. Dann ein Eval-Set für den ersten Agenten — selbst 30 Szenarien schlagen null. Der Katalog kommt als Drittes, wenn es etwas hineinzustellen gibt. Geteiltes RAG, wenn das zweite Team dieselben Dokumente braucht wie das erste.

Ein Agent, der in der Demo funktioniert, ist ein Wochenende. Eine Fabrik, über die zehn Teams Agenten ausliefern, ohne sich gegenseitig anzuzünden, ist eine Architektur. Wenn bei Ihnen das Erste existiert und das Zweite fehlt: [Sprechen wir](/contact).
