<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ToolMesh | Blog</title><description/><link>https://www.toolmesh.io/</link><language>de</language><item><title>Einen UniFi-Standort in einem Prompt gegen NetBox abgleichen</title><link>https://www.toolmesh.io/de/blog/unifi-network-to-netbox/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/unifi-network-to-netbox/</guid><description>NetBox ist nur dann eine verlässliche Quelle, wenn es noch zum Netz passt. So gleicht eine einzige natürlichsprachige Anweisung einen Live-UniFi-Controller gegen NetBox ab, schreibt nur die Unterschiede und beweist die langweilige, aber wichtige Eigenschaft: Wenn nichts gedriftet ist, ändert sie nichts.

</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine Quelle der Wahrheit bleibt nur so lange wahr, bis jemand das Netz anfasst. Tausch einen Access Point, lass DHCP eine neue Management-Adresse vergeben, häng in einem Hinterzimmer ein Gerät dazu — und der Controller hat sofort recht, während NetBox still und leise falsch liegt. Das fällt niemandem auf, der nicht jede Woche zehn Geräte von Hand vergleicht, also driftet die Dokumentation, und das Vertrauen in sie driftet mit.&lt;/p&gt;
&lt;p&gt;Die übliche Antwort ist ein Sync-Skript. Stattdessen sollte ein Satz genügen:&lt;/p&gt;
&lt;aside aria-label=&quot;Prompt&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Prompt&lt;/p&gt;&lt;div&gt;&lt;p&gt;Gleiche den HOME-Standort auf dem UniFi-Controller gegen NetBox ab. Lege Neues an, korrigiere geänderte Modelle oder verschobene Management-IPs, und lass korrekte Einträge in Ruhe.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Keine Pipeline. Kein ausbuchstabiertes Feld-Mapping. Wenn sich das Netz nächsten Monat ändert, läuft derselbe Satz erneut.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-darunter-passiert&quot;&gt;Was darunter passiert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der Agent spricht über ein Gateway mit zwei Backends: Er liest den Live-UniFi-Controller und liest und schreibt NetBox, und jeder Aufruf läuft über die auditierte, policy-gesicherte Oberfläche des Gateways statt über eine Shell oder ein gespeichertes Admin-Token. Im Code Mode ist es ein kurzes Skript, das das Modell selbst schreibt, und seine Form ist ein Vergleich, kein Massenimport:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;23by5njv&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;                           &lt;/span&gt;&lt;span&gt;// desc: &quot;HOME&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;live&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unifi_list_devices&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;live&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;MODEL_MAP&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; ?? &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;span&gt;// U7PG2 -&gt; &quot;UniFi AC Pro Gen2&quot;, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const [&lt;/span&gt;&lt;span&gt;nb&lt;/span&gt;&lt;span&gt;]  = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;netbox_list_devices&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{ name: &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;&lt;span&gt;nb&lt;/span&gt;&lt;span&gt;) {                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// new device -&gt; create&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;netbox_create_device&lt;/span&gt;&lt;span&gt;({ name: &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;, device_type: &lt;/span&gt;&lt;span&gt;typeId&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;), role: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP&lt;/span&gt;&lt;span&gt;, site: &lt;/span&gt;&lt;span&gt;LII&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;created&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;mgmtIp&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;nb&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ip&lt;/span&gt;&lt;span&gt;) {               &lt;/span&gt;&lt;span&gt;// moved address -&gt; update one field&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;netbox_update_device&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;nb&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, { primary_ip4: &lt;/span&gt;&lt;span&gt;ipId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ip&lt;/span&gt;&lt;span&gt;) });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;updated mgmt IP&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;mgmtIp&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;nb&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ip&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ok&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;);                            &lt;/span&gt;&lt;span&gt;// already matches -&gt; write nothing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Zwei Dinge darin lohnen den genaueren Blick, weil Abgleich schwieriger ist als Import.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die Modellcodes sind keine Produktnamen.&lt;/strong&gt; Um zu entscheiden, ob ein UniFi-Gerät schon zu seinem NetBox-Eintrag passt, muss der Vergleich das normalisieren, was der Controller meldet. UniFi liefert jedes Gerät als internen Code: &lt;code dir=&quot;auto&quot;&gt;U7PG2&lt;/code&gt; ist der UAP-AC-Pro (die &lt;code dir=&quot;auto&quot;&gt;7&lt;/code&gt; hat nichts mit Wi-Fi 7 zu tun), &lt;code dir=&quot;auto&quot;&gt;UAL6&lt;/code&gt; ein U6 Lite, &lt;code dir=&quot;auto&quot;&gt;U7NHD&lt;/code&gt; ein nanoHD, &lt;code dir=&quot;auto&quot;&gt;U6EXT&lt;/code&gt; ein U6 Extender, &lt;code dir=&quot;auto&quot;&gt;U7PRO&lt;/code&gt; tatsächlich ein U7 Pro, und &lt;code dir=&quot;auto&quot;&gt;US8P60&lt;/code&gt; der US-8-60W-Switch. Diese Übersetzungstabelle ist der Unterschied zwischen „dieser AP ist bereits korrekt” und einem Duplikat, das neben dem echten Gerät entsteht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;„Lass korrekte Einträge in Ruhe” ist die tragende Klausel.&lt;/strong&gt; Jeder Zweig oben ist ein Get-or-Create-or-Update. Ein passendes Gerät erzeugt einen Schreibvorgang von nichts. Genau das macht den Satz sicher genug, ihn planmäßig gegen ein NetBox laufen zu lassen, das bereits Daten enthält — statt eines einmaligen Imports, den man nie zu wiederholen wagt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-dieser-lauf-tatsächlich-getan-hat&quot;&gt;Was dieser Lauf tatsächlich getan hat&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Wir haben ihn gegen den Live-Controller laufen lassen. Hier das echte Ergebnis, kein konstruiertes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;reconcile HOME -&gt; NetBox (site LII)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Kueche               U7NHD    192.168.100.43    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Praxis               U7NHD    192.168.100.46    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Labor                U7PG2    192.168.100.41    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Buero                U7NHD    192.168.100.44    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Garage               U7PG2    192.168.100.42    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-U7-Pro Heizungsraum  U7PRO    192.168.100.154   ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-U6-Extender          U6EXT    192.168.100.199   ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Mobil                UAL6     192.168.100.47    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AP-Wohnzimmer           U7PG2    192.168.100.45    ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;UbSwi-01                US8P60   192.168.100.183   ok&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-- 10 checked, 10 matched, 0 written.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Neun Access Points über fünf Modelle und ein PoE-Switch, jedes Gerät bereits vorhanden, jede Management-IP noch passend, das IoT-VLAN und das Management-Prefix bereits angelegt. Nettoänderung an NetBox: null.&lt;/p&gt;
&lt;p&gt;Das ist die Antiklimax, die eigentlich der Punkt ist. Ein Agent, der nichts schreibt, wenn nichts gedriftet ist, ist genau die Eigenschaft, mit der man ihn auf ein CMDB richten kann, das einem wichtig ist, und ihn wieder und wieder laufen lässt. Man muss ihm nicht vertrauen, dass er die Daten nicht zerschießt. Man kann ihm beim Nichtstun zusehen.&lt;/p&gt;
&lt;p&gt;Der Drift-Fall ist der, der sich auszahlt. Wäre AP-Garage auf &lt;code dir=&quot;auto&quot;&gt;.142&lt;/code&gt; statt &lt;code dir=&quot;auto&quot;&gt;.42&lt;/code&gt; aufgetaucht, hätte der Lauf eine Zeile ausgegeben, &lt;code dir=&quot;auto&quot;&gt;updated mgmt IP AP-Garage 192.168.100.42 -&gt; 192.168.100.142&lt;/code&gt;, genau diesen einen Eintrag geschrieben und die anderen neun auf &lt;code dir=&quot;auto&quot;&gt;ok&lt;/code&gt; gelassen. Das Audit-Log zeigt exakt, welches Feld sich an welchem Gerät geändert hat, ausgeführt von welchem Konto — ohne dass man einen Diff durchlesen muss.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-definitionen-brauchen-dieselbe-sorgfalt&quot;&gt;Die Definitionen brauchen dieselbe Sorgfalt&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die Geräte abzugleichen hält das Inventar ehrlich. Die Device-Type-Definitionen dahinter prüft ein Name-und-IP-Lauf nicht, und sie driften auf ihre eigene Weise. Dieser Lauf war ein guter Moment, eine davon zu erwischen: Der U7 Pro im Heizungsraum war — korrekt — mit einem Device-Type verknüpft, dessen Slug passte, aber dieser Typ war noch als „AC Pro, 802.11ac” beschriftet. Das Gerät passte, also hätte der Abgleich es nicht markiert; das Label war schlicht falsch, denn Modellcode und die Wi-Fi-7-Firmware des Geräts sagen etwas anderes. Wir haben es in derselben Sitzung korrigiert. Eine Quelle der Wahrheit ist nur so gut wie die Definitionen, auf die sie zeigt, und die verdienen einen bewussten Blick statt einer Annahme.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;das-mache-ich-seit-jahren-mit-nornir&quot;&gt;„Das mache ich seit Jahren mit Nornir”&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Stimmt, und es funktioniert. Der Unterschied ist, dass es hier kein Skript zu pflegen gibt. Die Mapping-Tabelle lebt im Kontext des Modells, die Anweisung ist Klartext, und „gleich auch die Client-Liste ab” oder „lass die Gast-SSID aus” ist eine Änderung am Satz, nicht an einer Codebasis und ihren Tests. Wenn Ubiquiti in einem Controller-Update einen Modellcode umbenennt, korrigierst du eine Zeile eines Prompts.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;probier-es-gegen-deinen-eigenen-controller&quot;&gt;Probier es gegen deinen eigenen Controller&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die UniFi- und NetBox-Connectoren sind offen: &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL&lt;/a&gt;, eine YAML-Datei pro API, hinter einem Apache-2.0-Gateway. Klone es und richte es auf deinen eigenen Controller und dein eigenes NetBox. Wenn du es lieber als Managed-Instanz betreiben willst, sprich mit uns unter &lt;a href=&quot;mailto:vertrieb@dunkel.cloud&quot;&gt;vertrieb@dunkel.cloud&lt;/a&gt;. Fragen und Erfahrungsberichte sind in den &lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh/discussions&quot;&gt;GitHub Discussions&lt;/a&gt; willkommen.&lt;/p&gt;</content:encoded><category>NetBox</category><category>UniFi</category><category>DADL</category><category>MCP</category><category>Infrastructure</category></item><item><title>Tool Discovery für 4.800 MCP-Tools — ohne Vektordatenbank</title><link>https://www.toolmesh.io/de/blog/tool-discovery-without-a-vector-database/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/tool-discovery-without-a-vector-database/</guid><description>Ein einziger Discovery-Aufruf auf unserem Produktiv-Gateway lieferte ~320 KB TypeScript-Deklarationen — rund 80.000 Tokens, verbraucht bevor der Agent überhaupt etwas getan hatte. So haben wir Tool Discovery im Enterprise-Maßstab repariert: gestufte Ausgabe, 200 Zeilen BM25, keine Vektordatenbank.

</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Auf unserer ToolMesh-Produktivinstanz lieferte eine &lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt;-Anfrage nach allem, was mit NetBox zu tun hat, rund &lt;strong&gt;320 KB TypeScript-Deklarationen&lt;/strong&gt;. Das sind etwa 80.000 Tokens — für viele Modelle das halbe Kontextfenster, verbraucht bevor der Agent ein einziges Tool aufgerufen hat. Die Anfrage nach &lt;em&gt;allen&lt;/em&gt; Tools hätte eine Ausgabe in der Größenordnung von 2 MB erzeugt.&lt;/p&gt;
&lt;p&gt;Das hat niemand so entworfen. Es ist so gewachsen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;wie-ein-discovery-aufruf-auf-320-kb-kommt&quot;&gt;Wie ein Discovery-Aufruf auf 320 KB kommt&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh ist ein self-hosted MCP-Gateway, das &lt;a href=&quot;https://www.toolmesh.io/de/architecture/&quot;&gt;Code Mode&lt;/a&gt; spricht: Backends werden als flache JavaScript-Funktionen exponiert (&lt;code dir=&quot;auto&quot;&gt;toolmesh.netbox_list_devices(...)&lt;/code&gt;), und ein &lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt;-Meta-Tool liefert TypeScript-Signaturen, damit das Modell korrekte Aufrufe schreiben kann. Mit einer Handvoll Backends ist es genau richtig, jede passende Signatur vollständig zurückzugeben.&lt;/p&gt;
&lt;p&gt;Unsere Instanz ist längst keine Handvoll mehr. Sie betreibt &lt;strong&gt;49 Backends mit 4.767 Tools&lt;/strong&gt;: NetBox allein steuert 608 bei, zwei MikroTik-Switches je 297, zwei OPNsense-Firewalls je 292, GitHub 203, Cloudflare 200. Eine vollständige Signatur liegt im Schnitt bei ~530 Bytes — NetBox-List-Endpoints tragen ein Dutzend und mehr Filterparameter.&lt;/p&gt;
&lt;p&gt;Drei Effekte verstärken sich auf dieser Skala gegenseitig:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Volle Deklarationen sind der einzige Ausgabemodus.&lt;/strong&gt; Jeder Treffer wird mit kompletter Parameterliste gerendert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Das Such-Regex matcht Namen &lt;em&gt;und&lt;/em&gt; Beschreibungen.&lt;/strong&gt; Ein Pattern wie &lt;code dir=&quot;auto&quot;&gt;device&lt;/code&gt; fächert gleichzeitig über NetBox, UniFi, MikroTik und Shelly auf.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Instanz-Backends teilen sich Prefixe.&lt;/strong&gt; Die Suche nach &lt;code dir=&quot;auto&quot;&gt;mikrotik&lt;/code&gt; liefert beide Switches — 594 Deklarationen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eine völlig vernünftige Agenten-Anfrage — „zeig mir die NetBox-Tools” — sprengt damit das Kontextfenster.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-lösung-die-alle-erwarten&quot;&gt;Die Lösung, die alle erwarten&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die reflexhafte Antwort des Jahres 2026 lautet: Tool-Beschreibungen embedden, in eine Vektordatenbank legen, semantisch suchen. Wir betreiben dieses Muster an anderer Stelle, und dort verdient es sein Geld.&lt;/p&gt;
&lt;p&gt;Für dieses Problem haben wir bewusst Nein gesagt — aus drei Gründen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Der Korpus ist winzig und statisch.&lt;/strong&gt; ~4.800 kurze, gut benannte, gut beschriebene Dokumente, die sich nur bei einem Config-Reload ändern. Das ist ein In-Memory-Index, der in Millisekunden neu aufgebaut ist — kein Persistenzproblem. PostgreSQL/pgvector in ein Single-Binary-Go-Gateway zu holen, um fünftausend Strings zu durchsuchen, ist Infrastruktur außer jedem Verhältnis. Selbst der schlanke Weg — ein eingebettetes ONNX-Modell — schleppt eine native Runtime-Bibliothek mit, ein realer Packaging-Schmerz für Software, die andere selbst deployen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Das Vokabular ist bereits ausgerichtet.&lt;/strong&gt; Tool-Namen und -Beschreibungen sind für LLM-Konsum geschrieben. Lexikalisches Ranking hat exzellentes Material.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vor allem aber: Der Agent ist selbst die semantische Schicht.&lt;/strong&gt; Ein LLM, das eine kompakte, gerankte Trefferliste mit einer ehrlichen Statuszeile sieht, formuliert seine Anfrage in einem Zug selbst um. Es braucht keine perfekte Suche. Es braucht eine &lt;strong&gt;billige Iterationsschleife&lt;/strong&gt; und Feedback darüber, was es gerade sieht.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-wir-stattdessen-gebaut-haben&quot;&gt;Was wir stattdessen gebaut haben&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Drei Änderungen, alle in &lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh/pull/80&quot;&gt;ToolMesh v0.3.1+&lt;/a&gt;, null neue Dependencies.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;1-ausgabe-die-degradiert-statt-detoniert&quot;&gt;1. Ausgabe, die degradiert statt detoniert&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt; skaliert seinen Detailgrad jetzt mit der Treffermenge: bis 25 Treffer kommen &lt;strong&gt;volle TypeScript-Signaturen&lt;/strong&gt;, bis 250 &lt;strong&gt;Einzeiler-Zusammenfassungen&lt;/strong&gt;, bis 2.000 &lt;strong&gt;nur Namen&lt;/strong&gt;, darüber &lt;strong&gt;Zählungen pro Backend&lt;/strong&gt;. Ein &lt;code dir=&quot;auto&quot;&gt;detail&lt;/code&gt;-Parameter übersteuert die Automatik, und ein harter 50-KB-Cap sichert jede Stufe ab.&lt;/p&gt;
&lt;p&gt;Der frühere 2-MB-Worst-Case — gar kein Filter — antwortet jetzt mit etwa 1,5 KB:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ToolMesh tools — per-backend overview&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rest:netbox — 608 tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rest:mikrotik-sw-lii-labor-perlman — 297 tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rest:mikrotik-sw-mikrotik-10g — 297 tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;rest:opnsense_backup — 292 tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ── 4767 of 4767 tools matched — detail: overview (auto).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Refine: narrower pattern, query:&quot;&amp;#x3C;free text&gt;&quot; for ranked results,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;//         detail:&quot;full&quot;|&quot;summary&quot;|&quot;names&quot;|&quot;overview&quot;, limit:N.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dieser Footer ist die wichtigste Zeile des ganzen Features. &lt;strong&gt;Jede&lt;/strong&gt; Antwort sagt, wie viel vom Katalog gematcht hat, wie viel gezeigt wird und wie man verfeinert. Der Agent verwechselt eine gekürzte Sicht nie mit der ganzen Welt — und korrigiert sich im nächsten Aufruf selbst, statt zu raten.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-geranktes-freitext-suchen--bm25-in-200-zeilen-go&quot;&gt;2. Geranktes Freitext-Suchen — BM25 in ~200 Zeilen Go&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Regex-Patterns sind großartig für exakte Lookups (&lt;code dir=&quot;auto&quot;&gt;^netbox_list&lt;/code&gt;) und schlecht für Exploration. Der neue &lt;code dir=&quot;auto&quot;&gt;query&lt;/code&gt;-Parameter macht geranktes Freitext-Suchen:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;discover_tools({ query: &quot;create dns record for a zone&quot; })&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;liefert die Top 25 nach Relevanz — Cloudflare-, INWX- und Linode-DNS-Tools in gemischter Reihenfolge, ohne NetBox-Rauschen. Darunter liegt ein schlichter BM25-Index über Tool-Namen (geboostet), Beschreibungen und Parameternamen — etwa 200 Zeilen dependency-freies Go, pro Aufruf in Mikrosekunden neu aufgebaut. Weil Parameternamen mitindexiert sind, findet eine Query wie &lt;code dir=&quot;auto&quot;&gt;rack_id&lt;/code&gt; das Tool &lt;code dir=&quot;auto&quot;&gt;netbox_list_devices&lt;/code&gt;, obwohl „rack” im Tool-Namen nirgends vorkommt.&lt;/p&gt;
&lt;p&gt;BM25 ist fünfzig Jahre alte Information-Retrieval-Technik. Das ist keine Schwäche — bei dieser Korpusgröße ist es genau der Punkt.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-discovery-in-der-sandbox&quot;&gt;3. Discovery in der Sandbox&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Der größte strukturelle Gewinn: Agenten brauchen überhaupt keinen separaten Discovery-Roundtrip mehr. Innerhalb von &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt; stehen zwei lokale Helfer bereit:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// find → inspect → call, in ONE round trip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;hits&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;discover&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;move task to kanban bucket&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;describe&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;hits&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;hits&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;]({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;project_id: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, view_id: &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;, task_id: &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;, bucket_id: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;toolmesh.discover()&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;toolmesh.describe()&lt;/code&gt; laufen gegen den In-Memory-Index — kein Backend-Call, keine Kontextkosten über das hinaus, was der Code explizit zurückgibt, ausgenommen vom Call-Budget pro Ausführung und gefiltert nach der Autorisierung des Aufrufers wie jede andere Oberfläche auch. Discovery wird etwas, das der &lt;em&gt;Code&lt;/em&gt; tut — nicht etwas, das der &lt;em&gt;Kontext&lt;/em&gt; bezahlt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-der-live-test-in-zwanzig-minuten-fand&quot;&gt;Was der Live-Test in zwanzig Minuten fand&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Wir haben den Branch produktiv deployt und aus einer echten Agenten-Session heraus getestet. Zwei Bugs zeigten sich fast sofort — beide für Unit-Tests unsichtbar:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ein veraltetes Client-Schema machte aus &lt;code dir=&quot;auto&quot;&gt;limit&lt;/code&gt; einen String.&lt;/strong&gt; Der MCP-Client hatte das alte &lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt;-Schema gecacht und serialisierte den unbekannten Parameter &lt;code dir=&quot;auto&quot;&gt;limit: 5&lt;/code&gt; als String &lt;code dir=&quot;auto&quot;&gt;&quot;5&quot;&lt;/code&gt; — den der Server stillschweigend ignorierte. Clients, die man nicht kontrolliert, halten veraltete Schemas; agentenseitige Parameter akzeptieren jetzt auch numerische Strings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zusammenfassungen brachen bei „e.g.” ab.&lt;/strong&gt; Der Einzeiler-Summarizer schnitt am ersten Punkt-plus-Leerzeichen und produzierte &lt;code dir=&quot;auto&quot;&gt;Set device key properties (e.g.&lt;/code&gt; — ein Punkt beendet einen Satz jetzt nur noch, wenn ein Großbuchstabe folgt.&lt;/p&gt;
&lt;p&gt;Beides ist unglamourös. Beides ist der Unterschied zwischen einem Feature, das gut demonstriert, und einem, das den Kontakt mit echten Clients überlebt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;prior-art--und-was-sich-auf-skala-ändert&quot;&gt;Prior Art — und was sich auf Skala ändert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Progressive Disclosure für Tools ist nicht unsere Erfindung. Anthropics Beitrag zu &lt;a href=&quot;https://www.anthropic.com/engineering/code-execution-with-mcp&quot;&gt;Code Execution mit MCP&lt;/a&gt; beschreibt das bedarfsweise Laden von Tool-Definitionen; Claude Code lädt Tool-Schemas erst bei Bedarf; Cloudflares Code Mode hat das Muster „Code gegen Tools schreiben” populär gemacht. Das Pattern konvergiert zum Konsens.&lt;/p&gt;
&lt;p&gt;Was der Produktionsmaßstab hinzufügt, sind die Teile, die in Demos selten vorkommen: Ranking (weil 764 Kandidaten &lt;em&gt;irgendwo&lt;/em&gt; auf „dns” matchen), eine immer präsente Feedback-Zeile (weil Agenten gut verfeinern — aber nur, wenn man ihnen sagt, was sie gesehen haben), harte Output-Caps (weil irgendein Client immer nach allem fragt) und Discovery in der Sandbox (weil der billigste Kontext der ist, der nie ausgegeben wird).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;wie-es-weitergeht&quot;&gt;Wie es weitergeht&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Derselbe Index bekommt zwei weitere Konsumenten: einen &lt;strong&gt;Capability Index für verschachtelte Code-Mode-Backends&lt;/strong&gt; — MCP-Server, die selbst nur &lt;code dir=&quot;auto&quot;&gt;search&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;execute&lt;/code&gt; exponieren und deren Fähigkeiten ToolMesh bei der Registrierung sondiert und indexiert — und daraus generierte &lt;strong&gt;synthetische Tool-Beschreibungen&lt;/strong&gt; auf MCP-Ebene. Und falls reale Vokabular-Lücken es je rechtfertigen, lässt sich ein optionaler Embedding-Kanal hinter derselben &lt;code dir=&quot;auto&quot;&gt;query&lt;/code&gt;-API nachrüsten — erst messen, dann bauen.&lt;/p&gt;
&lt;p&gt;Die Implementierung ist Open Source (&lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh/pull/80&quot;&gt;PR #80&lt;/a&gt;, Apache 2.0). Die Tool-Definitionen, die sie durchsucht, kommen aus &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL&lt;/a&gt; — eine YAML-Datei pro API, über 25 fertige in der Registry.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wenn du ein MCP-Setup betreibst, das seiner Tool-Liste entwachsen ist: Wir würden wirklich gern hören, wie Discovery auf deiner Skala aussieht — &lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh/discussions&quot;&gt;GitHub Discussions&lt;/a&gt; oder &lt;a href=&quot;mailto:presse@dunkel.cloud&quot;&gt;presse@dunkel.cloud&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>MCP</category><category>Code Mode</category><category>Architecture</category></item><item><title>Von der Switch-Konfiguration zu NetBox in einem Prompt</title><link>https://www.toolmesh.io/de/blog/switch-config-to-netbox/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/switch-config-to-netbox/</guid><description>Deine NetBox sagt das eine, dein Switch das andere. So gleichst du beide mit einer einzigen Anweisung in natürlicher Sprache ab — statt mit einem Python-Skript, das du für immer pflegen musst.

</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h2 id=&quot;die-ausgangslage&quot;&gt;Die Ausgangslage&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Du betreibst NetBox als deine Single Source of Truth. Das funktioniert — bis es das nicht mehr tut.&lt;/p&gt;
&lt;p&gt;Letzten Dienstag hat jemand einen Switch in Rack B getauscht. Zwei VLANs hinzugefügt, ein paar Interfaces umbenannt, einen Uplink verschoben. NetBox weiß von all dem nichts. Jetzt ist dein IPAM still und heimlich falsch, deine Cable Map lügt, und die nächste Person, die sich für eine Change-Planung auf NetBox verlässt, wird einen schlechten Nachmittag haben.&lt;/p&gt;
&lt;p&gt;Die übliche Lösung ist ein Sync-Skript. Du schreibst ein paar hundert Zeilen, die die Live-Konfiguration ziehen, gegen NetBox diffen und die Deltas zurückschreiben. Es funktioniert. Dann liefert der Hersteller ein Firmware-Update, ein Interface-Namensschema ändert sich, du nimmst ein zweites Switch-Modell dazu — und jetzt pflegst du das Skript so sorgfältig wie das Netz, das es beschreibt.&lt;/p&gt;
&lt;p&gt;Es gibt eine andere Form dafür.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-anweisung&quot;&gt;Die Anweisung&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;So sieht die Aufgabe aus, wenn das Tooling die Konnektivität trägt und du die Absicht:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lies die Live-Konfiguration vom Switch &lt;code dir=&quot;auto&quot;&gt;perlman&lt;/code&gt;. Vergleiche seine Interfaces, IP-Adressen und VLANs mit dem, was NetBox für dieses Gerät hat. Nenn mir jeden Unterschied und aktualisiere dann NetBox so, dass es zum Switch passt — aber halt an und zeig mir alles, was nach einer Löschung aussieht, bevor du es entfernst.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das ist alles. Kein Skript. Morgen lautet die Anweisung „… und gleich noch den MikroTik in Rack B mit ab”, und nichts in deiner Codebase muss sich ändern — weil es keine Codebase gibt. Die Anweisung ist die Automatisierung, und sie ist bewusst Wegwerfware.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-darunter-tatsächlich-passiert&quot;&gt;Was darunter tatsächlich passiert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das ist keine Magie, und der Sinn dieser Serie ist, dass du genau sehen kannst, was läuft. Der Agent hat zwei Tool-Oberflächen vor sich, beide über einen einzigen ToolMesh-Endpoint bereitgestellt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;den MikroTik-Switch, beschrieben durch eine &lt;a href=&quot;https://www.toolmesh.io/de/dadl/&quot;&gt;DADL&lt;/a&gt;-Datei — rund dreißig Zeilen YAML machen aus seiner REST-API aufrufbare Tools wie &lt;code dir=&quot;auto&quot;&gt;export_config&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;list_interfaces&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;list_ip_addresses&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;NetBox, auf dieselbe Weise — &lt;code dir=&quot;auto&quot;&gt;netbox_get_device&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;netbox_create_interface&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;netbox_create_ip_address&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;netbox_update_*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Im Code Mode feuert das Modell nicht einen Tool-Call pro Round-Trip ab. Es schreibt ein kurzes Stück JavaScript, das serverseitig läuft und nur das Ergebnis zurückgibt:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// pull live state&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;live&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mikrotik_perlman_list_interfaces&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;liveIps&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mikrotik_perlman_list_ip_addresses&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// pull NetBox&apos;s view of the same device&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;netbox_get_device&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{ name: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;perlman&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;nbIfaces&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;netbox_list_interfaces&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{ device_id: &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// diff happens here, in code, not in the model&apos;s head&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;diff&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;live&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;liveIps&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;nbIfaces&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Eine Ausführung, ein Ergebnis zurück an das Modell. Ein Katalog aus achtzig NetBox-Tools plus den Switch-Tools würde rund 142.000 Tokens kosten, um ihn bei jedem Reasoning-Schritt zu annoncieren, wenn man sie alle als JSON-Schemas auflisten würde. Code Mode hält das näher an tausend, konstant, egal wie viele Backends du hinzufügst. Genau das ist der Unterschied zwischen „das ist nett in einer Demo” und „das kann ich gegen mein echtes Netz laufen lassen”.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-stellen-vor-denen-du-respekt-hättest--abgesichert&quot;&gt;Die Stellen, vor denen du Respekt hättest — abgesichert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Nichts wird stillschweigend gelöscht.&lt;/strong&gt; Die Anweisung sagte: halt an und zeig mir Löschungen — und das wird am Gate erzwungen, nicht bloß dem guten Willen des Agenten überlassen. Zwei Kern-Mechanismen sorgen dafür. Zuerst die Autorisierung: Über OpenFGA kann ein Agent &lt;code dir=&quot;auto&quot;&gt;netbox_create_*&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;netbox_update_*&lt;/code&gt; halten, aber niemals &lt;code dir=&quot;auto&quot;&gt;netbox_delete_*&lt;/code&gt; — die Lösch-Tools werden für ihn schlicht nie freigeschaltet. Und die &lt;code dir=&quot;auto&quot;&gt;ExecuteTool()&lt;/code&gt;-Pipeline führt vor jedem Call, der das Backend erreicht, ein Pre-Gate aus, in dem eine kurze harte Regel — schlichtes JavaScript — alles abweist, was auf &lt;code dir=&quot;auto&quot;&gt;netbox_delete_*&lt;/code&gt; passt. Die Pipeline ist fail-closed: Kann eine Regel nicht entscheiden, wird der Call abgelehnt, nicht durchgewinkt. Anlegen und Updates laufen durch; Löschungen werden am Gate abgewiesen, sodass der Agent dir die gefundenen Löschungen zeigt und keine davon ausführt. Das schreibst du einmal, und es gilt für jeden Prompt, den du je ausführst.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keine Credentials im Prompt.&lt;/strong&gt; Der API-Token des Switches und der NetBox-Token erreichen das Modell nie. Sie liegen in ToolMeshs Credential Store und werden zum Zeitpunkt des Calls injiziert. Das Modell orchestriert; ein Geheimnis sieht es nie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Du kannst beweisen, was passiert ist.&lt;/strong&gt; Jeder Call landet in einem strukturierten Audit-Log — welches Tool, welches Gerät, was sich geändert hat, wie lange es gedauert hat, Erfolg oder abgelehnt. Wenn in drei Wochen jemand fragt, warum das Interface &lt;code dir=&quot;auto&quot;&gt;sfp-sfpplus3&lt;/code&gt; umbenannt wurde, ist die Antwort eine Abfrage und kein archäologisches Projekt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-das-ist--und-was-nicht&quot;&gt;Was das ist — und was nicht&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Wenn deine Reaktion ist „Config-to-NetBox mache ich seit zehn Jahren mit Nornir” — ja, das tust du, und gut. Die Behauptung hier ist nicht, dass das mächtiger ist als ein eigens gebautes Skript. Sondern dass es kein Skript zu pflegen gibt. Die Abgleich-Logik ist nicht an einen Hersteller, ein Namensschema oder eine NetBox-Version genagelt. Die Anweisung passt sich der Situation in einfacher Sprache an; die Tools darunter sind in YAML deklariert, das du in Git diffen kannst. Wenn sich die Situation ändert, änderst du einen Satz, keine Pipeline.&lt;/p&gt;
&lt;p&gt;Das ist die ganze Wette: Netz-Zustand ändert sich ständig, also sollte die Schicht, die ihn abgleicht, der billige, wegwerfbare Teil sein — nicht der, den du babysittest.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;willst-du-es-in-deinem-eigenen-netz-ausprobieren&quot;&gt;Willst du es in deinem eigenen Netz ausprobieren?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die ehrliche Hürde hier ist das Setup: ToolMesh aufsetzen, die DADL für deinen Switch schreiben, NetBox verdrahten. Wenn genau diese Hürde dich aufhält, überspring sie. ToolMesh ist ein Angebot der &lt;a href=&quot;https://www.dunkel.cloud/&quot;&gt;Dunkel Cloud GmbH&lt;/a&gt;, und wir richten dir eine persönliche Instanz auf einer eigenen VM ein — du behältst die volle Kontrolle und deine eigenen Credentials, wir übernehmen nur die anfängliche Verdrahtung, damit du sie auf deine Hardware richten und sehen kannst, ob der Abgleich gegen deine Realität wirklich standhält.&lt;/p&gt;
&lt;p&gt;Dieses Angebot ist ernst gemeint, und es ist der schnellste Weg herauszufinden, ob das zu deiner Arbeitsweise passt.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Dies ist Beitrag 1 einer Serie über das Steuern von NetBox aus realer Infrastruktur: &lt;a href=&quot;https://dadl.ai/d/mikrotik&quot;&gt;MikroTik&lt;/a&gt;, OPNsense, &lt;a href=&quot;https://dadl.ai/d/xen-orchestra&quot;&gt;Xen Orchestra&lt;/a&gt;, &lt;a href=&quot;https://dadl.ai/d/hetzner-cloud&quot;&gt;Hetzner&lt;/a&gt;, vSphere und UniFi. Jeder einzelne ist ein echter Workflow aus unserem eigenen Stack, keine konstruierte Demo.&lt;/p&gt;
&lt;p&gt;ToolMesh ist Open Source (Apache 2.0). DADL ist eine offene Spezifikation (CC BY-SA 4.0) mit einer öffentlichen Registry unter &lt;a href=&quot;https://dadl.ai/&quot;&gt;dadl.ai&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>NetBox</category><category>MikroTik</category><category>DADL</category><category>MCP</category><category>Infrastructure</category></item><item><title>Die volle REST-API von Xen Orchestra 6.5 — 245 Tools aus einer DADL</title><link>https://www.toolmesh.io/de/blog/xen-orchestra-full-rest-api-in-one-dadl/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/xen-orchestra-full-rest-api-in-one-dadl/</guid><description>Xen Orchestra 6.4 hat seine REST-API stabilisiert, 6.5 hat PATCH-Updates und VM-Controller ergänzt. Vates liefert einen eigenen MCP-Server — 7 Tools, bewusst read-only. Wir haben einen anderen Schnitt gewählt: die gesamte 245-Endpoint-Oberfläche, lesend und schreibend, als eine DADL. Beide gehören in dieselbe Registry. Hier ist, warum.

</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Xen Orchestra hat die letzten beiden Releases darauf verwendet, seine REST-API zu etwas zu machen, auf dem man aufbauen kann. &lt;a href=&quot;https://xen-orchestra.com/blog/&quot;&gt;XO 6.4&lt;/a&gt; (April 2026) hat &lt;code dir=&quot;auto&quot;&gt;/rest/v0/&lt;/code&gt; als stabil markiert und fein granulares RBAC v2 ergänzt; 6.5 hat &lt;code dir=&quot;auto&quot;&gt;PATCH /vms/{id}&lt;/code&gt; für partielle VM-Updates und eine eigene &lt;code dir=&quot;auto&quot;&gt;/vm-controllers&lt;/code&gt;-Collection hinzugefügt. Im Februar hat Vates außerdem einen &lt;a href=&quot;https://xen-orchestra.com/blog/mcp-meets-xen-orchestra/&quot;&gt;eigenen MCP-Server&lt;/a&gt; mit XO 6.2 ausgeliefert — sieben Tools, bewusst read-only, damit Teams ihn vom ersten Tag an in der Produktion aktivieren können.&lt;/p&gt;
&lt;p&gt;Wir haben einen anderen Schnitt derselben API gewählt. Die DADL für Xen Orchestra deckt die &lt;strong&gt;gesamte 245-Endpoint-REST-Oberfläche&lt;/strong&gt; ab — lesend und schreibend — als eine YAML-Datei. Dieser Post ist das Build-Log und eine ehrliche Antwort auf die naheliegende Frage: Warum zwei MCP-Oberflächen für dasselbe Produkt?&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-die-rest-api-jetzt-abdeckt&quot;&gt;Was die REST-API jetzt abdeckt&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die XO REST-API ist längst keine dünne Leseschicht mehr. Ab 6.5 exponiert sie den vollständigen Objektgraphen — VMs (inklusive &lt;code dir=&quot;auto&quot;&gt;PATCH&lt;/code&gt;-Teilupdates und Snapshot-Revert), VM-Controller, VM-Templates, VM-/VDI-Snapshots, Hosts, Pools, Storage (SR/VDI/VBD), Netzwerk (VIF/PIF/PBD), Hardware-Passthrough (PCI/PGPU/SM) — dazu jede Lifecycle-Aktion: Power, Snapshot, Clone, Migration, Export/Import, Hotplug. Über den Objekten liegen die operativen Oberflächen: Tasks, Backups (Jobs, Logs, Repositories, Restore, Schedules), Echtzeit-Änderungsevents über Server-Sent Events, RBAC v2 (Users, Groups, ACL-Roles, ACL-Privileges) und Host-/Pool-Wartung (Rolling Reboot, Rolling Update, Emergency Shutdown).&lt;/p&gt;
&lt;p&gt;Das ist eine große API, und fast alles davon verändert Infrastruktur. Nichts von der Schreibseite ist über den eigenen MCP-Server erreichbar — by design, nicht aus Versehen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-zahlen&quot;&gt;Die Zahlen&lt;/h2&gt;&lt;/div&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;DADL (&lt;code dir=&quot;auto&quot;&gt;xen-orchestra.dadl&lt;/code&gt;)&lt;/th&gt;&lt;th&gt;&lt;code dir=&quot;auto&quot;&gt;@xen-orchestra/mcp&lt;/code&gt; (Vates, eigen)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tools&lt;/td&gt;&lt;td&gt;&lt;strong&gt;245&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Umfang&lt;/td&gt;&lt;td&gt;lesend &lt;strong&gt;und&lt;/strong&gt; schreibend&lt;/td&gt;&lt;td&gt;read-only by design&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Coverage&lt;/td&gt;&lt;td&gt;jedes REST-Objekt + Lifecycle-Aktion, Backups, RBAC v2, SSE-Events, SDN-Traffic-Rules, Dashboards, Auth-Tokens&lt;/td&gt;&lt;td&gt;Infrastruktur-Summary, Pools / Hosts / VMs auflisten und inspizieren, Pool-Dashboard, Dokumentationssuche&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Create / Start / Migration / Delete?&lt;/td&gt;&lt;td&gt;ja&lt;/td&gt;&lt;td&gt;nein — bewusst&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Verteilung&lt;/td&gt;&lt;td&gt;eine 245-Tool-YAML-Datei&lt;/td&gt;&lt;td&gt;Node-Server, mitgeliefert ab XO 6.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Einem neuen API-Release folgen&lt;/td&gt;&lt;td&gt;~30 Zeilen YAML pro Endpoint&lt;/td&gt;&lt;td&gt;kommt mit dem XO-Release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Governance-Schicht&lt;/td&gt;&lt;td&gt;Credentials, Autorisierung, Audit (über ToolMesh)&lt;/td&gt;&lt;td&gt;keine — lokal, in-process&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die lokale Validierung, ausgeführt aus dem Registry-Checkout:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt; cd dadl-registry &amp;#x26;&amp;#x26; npm run validate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✅ xen-orchestra.dadl — 245 tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Quelle auf GitHub: &lt;a href=&quot;https://github.com/DunkelCloud/dadl-registry/blob/main/xen-orchestra.dadl&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;dadl-registry/xen-orchestra.dadl&lt;/code&gt;&lt;/a&gt;. Live in der Registry unter &lt;a href=&quot;https://dadl.ai/d/xen-orchestra&quot;&gt;dadl.ai/d/xen-orchestra&lt;/a&gt;. Die DADL-Spezifikation selbst: &lt;a href=&quot;https://dadl.ai/spec/dadl-spec-v0.1.md&quot;&gt;dadl.ai/spec&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ein-durchgespieltes-beispiel-eine-vm-änderung-rückgängig-machbar&quot;&gt;Ein durchgespieltes Beispiel: eine VM-Änderung, rückgängig machbar&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der Sinn der Schreibseite ist, dass sie Infrastruktur tatsächlich verändert — sicher, mit Spur. Hier ist ein Round-Trip aus drei Calls: eine laufende VM finden, sie snapshotten, damit die Änderung umkehrbar ist, und sie dann patchen.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// 1. Find the VM by name (XO filter syntax, compact fields)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const [&lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt;] = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;xen_orchestra_list_vms&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name_label:web-fra-01&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fields: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;uuid,name_label,tags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// 2. Snapshot first, so the change is undoable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;xen_orchestra_snapshot_vm&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id: &lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;uuid&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name_label: &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;pre-change &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toISOString&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// 3. PATCH the live VM — tags is a hot field, applied while running (XO 6.5)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;xen_orchestra_update_vm&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id: &lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;uuid&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: [&lt;/span&gt;&lt;span&gt;...vm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;managed:toolmesh&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Drei Calls. Kein Glue-Code. Schritt 2 und 3 sind genau das, was ein read-only MCP-Server nicht kann — und die DADL übernimmt transparent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;die ungewöhnliche cookie-basierte Authentifizierung (der Token wird serverseitig als &lt;code dir=&quot;auto&quot;&gt;Cookie: authenticationToken=…&lt;/code&gt; injiziert — das Modell sieht ihn nie);&lt;/li&gt;
&lt;li&gt;das async-by-default-Aktionsmodell — die meisten Writes geben eine Task-Referenz zurück; &lt;code dir=&quot;auto&quot;&gt;sync&lt;/code&gt; setzt man nur für kurze Operationen, und für lange (Migration, Export) pollt man &lt;code dir=&quot;auto&quot;&gt;get_task&lt;/code&gt;, um HTTP-Client-Timeouts zu vermeiden;&lt;/li&gt;
&lt;li&gt;die Cold-vs-Hot-Field-Unterscheidung bei &lt;code dir=&quot;auto&quot;&gt;update_vm&lt;/code&gt; — &lt;code dir=&quot;auto&quot;&gt;memoryStaticMax&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;cpusStaticMax&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;secureBoot&lt;/code&gt; brauchen eine heruntergefahrene VM, während &lt;code dir=&quot;auto&quot;&gt;tags&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;nameLabel&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;cpus&lt;/code&gt; live greifen (das Beispiel nutzt &lt;code dir=&quot;auto&quot;&gt;tags&lt;/code&gt;, läuft also ohne Downtime);&lt;/li&gt;
&lt;li&gt;Retries bei transienten Fehlern und terminale Klassifizierung für &lt;code dir=&quot;auto&quot;&gt;404&lt;/code&gt; (“no such VM”) und RBAC-&lt;code dir=&quot;auto&quot;&gt;403&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dieselben Calls aus Claude oder jedem anderen Agenten. Kein Xen-Orchestra-spezifischer Code auf der Client-Seite.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;read-only-ist-ein-feature-keine-lücke&quot;&gt;Read-only ist ein Feature, keine Lücke&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das naheliegende Framing — “245 schlägt 7” — ist das falsche. Die beiden Oberflächen beantworten verschiedene Fragen.&lt;/p&gt;
&lt;p&gt;Der eigene MCP-Server von Vates ist &lt;em&gt;absichtlich&lt;/em&gt; read-only. Er läuft in-process, kommt mit XO mit, braucht keine externe Infrastruktur und kann nichts kaputt machen. Wenn die Frage lautet &lt;em&gt;“lass einen Assistenten meine Infrastruktur ansehen und Fragen dazu beantworten”&lt;/em&gt;, ist das die richtige Form, und man sollte ihn nutzen. Wir versuchen nicht, ihn zu ersetzen — die DADL enthält sogar ein &lt;code dir=&quot;auto&quot;&gt;get_mcp_status&lt;/code&gt;-Tool, das meldet, ob XOs eigener eingebauter MCP-Server aktiviert ist.&lt;/p&gt;
&lt;p&gt;Die DADL beantwortet eine andere Frage: &lt;em&gt;“lass einen Agenten meine Infrastruktur betreiben — erstellen, patchen, snapshotten, migrieren, sichern, RBAC provisionieren — ohne ihm rohe Admin-Credentials zu geben.”&lt;/em&gt; Das ergibt nur mit einer Kontrollschicht darunter Sinn. Über ToolMesh läuft jedes der 245 Tools hinter zentralisierten Credentials (der XO-Token erreicht das Modell nie), Autorisierung (ein Agent kann &lt;code dir=&quot;auto&quot;&gt;list_vms&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;snapshot_vm&lt;/code&gt; erhalten, aber nicht &lt;code dir=&quot;auto&quot;&gt;delete_sr&lt;/code&gt;) und einem Audit-Log (jeder Call protokolliert mit Was, Wann und Warum). Die Schreibseite ist der ganze Punkt, und die Governance-Schicht ist das, was die Schreibseite sicher exponierbar macht.&lt;/p&gt;
&lt;p&gt;Beide Definitionen liegen in derselben Registry. Sie sind Ergänzungen: read-only-Discovery in-process, vollständiges Lifecycle-Management über ein governtes Gateway.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;der-api-hinterherzukommen-ist-ein-yaml-diff&quot;&gt;Der API hinterherzukommen ist ein YAML-Diff&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;XO 6.4 hat RBAC v2 ergänzt; 6.5 hat &lt;code dir=&quot;auto&quot;&gt;PATCH /vms/{id}&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;/vm-controllers&lt;/code&gt; und einen REST-Snapshot-Revert-Endpoint hinzugefügt. Jedes davon in der DADL nachzuziehen ist dieselbe kleine Arbeitseinheit: &lt;code dir=&quot;auto&quot;&gt;xen-orchestra.dadl&lt;/code&gt; öffnen, den Tool-Block ergänzen (~30 Zeilen YAML pro Endpoint), &lt;code dir=&quot;auto&quot;&gt;npm run validate&lt;/code&gt; laufen lassen, einen PR aufmachen, das Diff reviewen, mergen. ToolMesh nimmt die neuen Tools beim nächsten Reload auf. Keine SDK-Änderungen, kein Release zum Schnüren, kein npm-Publish, kein “bitte upgraden” an die Nutzer.&lt;/p&gt;
&lt;p&gt;Zwei konkrete Beispiele aus dem aktuellen Release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6.5 hat &lt;code dir=&quot;auto&quot;&gt;POST /vms/{id}/actions/revert_snapshot&lt;/code&gt; für automatisierbaren Snapshot-Revert ausgeliefert. Die DADL führt ihn bereits als &lt;code dir=&quot;auto&quot;&gt;revert_vm_to_snapshot&lt;/code&gt;, annotiert mit &lt;em&gt;“requires XO 6.5+ (route returns 404 on older builds)”&lt;/em&gt; — gegen einen älteren Host bekommt der Agent also einen sauberen terminalen Fehler statt eines stillen Fehlschlags.&lt;/li&gt;
&lt;li&gt;6.5 legt außerdem die Grundlage für eine eigene &lt;em&gt;VM-Administrator&lt;/em&gt;-Rolle. Darauf muss man nicht warten: Die DADL exponiert die volle RBAC-v2-Oberfläche (&lt;code dir=&quot;auto&quot;&gt;create_acl_role&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;create_acl_privilege&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;attach_acl_role_to_user&lt;/code&gt;), sodass man heute schon eine least-privilege Operator-Rolle zusammenstellen und einem Agenten genau die Privilegien geben kann, die er haben soll — read auf &lt;code dir=&quot;auto&quot;&gt;vm&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;host&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;pool&lt;/code&gt;, mehr nicht.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das allgemeine Argument haben wir &lt;a href=&quot;https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/&quot;&gt;in einem früheren Post&lt;/a&gt; gemacht; XO ist die konkrete Fallstudie für eine schreiblastige API.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;das-context-window-argument&quot;&gt;Das Context-Window-Argument&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Es gibt einen zweiten Grund, warum die Tool-Zahl weniger zählt, als sie aussieht: &lt;strong&gt;Code Mode&lt;/strong&gt;. Statt alle 245 XO-Tool-Beschreibungen in das Context-Window des Modells zu injizieren, exponiert ToolMesh zwei Meta-Tools (&lt;code dir=&quot;auto&quot;&gt;list_tools&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt;). Das Modell entdeckt bei Bedarf, was verfügbar ist, und ruft flache Tool-Namen aus einer gesandboxten JavaScript-Runtime auf — &lt;code dir=&quot;auto&quot;&gt;toolmesh.xen_orchestra_list_vms&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;toolmesh.xen_orchestra_snapshot_vm&lt;/code&gt;, keinen verschachtelten Namespace.&lt;/p&gt;
&lt;p&gt;Die Token-Kosten sind ungefähr konstant: ~1 k Tokens Meta-Tool-Beschreibung, egal ob die Registry ein Backend mit 7 Tools hält oder 27 Backends mit 3.338. Ein 245-Tool-Backend fügt jeder Claude-Konversation, die Xen Orchestra nicht aktiv anfasst, null Tokens hinzu. Das ist auch der Grund, warum das JavaScript im Beispiel oben keine Illustration ist — es ist buchstäblich das, was das Modell schreibt, um die Tools aufzurufen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ehrliche-einschränkungen&quot;&gt;Ehrliche Einschränkungen&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die DADL ist kein universeller Gewinn. Echte Grenzen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Der SSE-Event-Stream ist halb deklarativ.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;open_events_stream&lt;/code&gt; gibt eine Subscription-ID zurück, und die DADL beschreibt den Subscribe-Handshake, aber der Server-Sent-Events-Stream selbst ist ein Streaming-Protokoll — DADL beschreibt REST, keine langlebigen Streams. Für das Pollen von Task-Status pollt &lt;code dir=&quot;auto&quot;&gt;get_task?wait=true&lt;/code&gt; sauber; für einen echten Echtzeit-Feed ist man am Rand dessen, was eine deklarative REST-Definition modelliert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VDIs lassen sich nicht über REST umbenennen.&lt;/strong&gt; Es gibt kein &lt;code dir=&quot;auto&quot;&gt;PATCH /vdis/{id}&lt;/code&gt; in der API — also auch kein &lt;code dir=&quot;auto&quot;&gt;update_vdi&lt;/code&gt;-Tool. Umbenennen geht über Tags oder den Abstieg zur JSON-RPC-API. Wir exponieren, was existiert; wir können nicht exponieren, was es nicht gibt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDN-Traffic-Rules brauchen ein Premium-Plugin.&lt;/strong&gt; Die vier Traffic-Rule-Tools (&lt;code dir=&quot;auto&quot;&gt;add&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;delete_network_traffic_rule&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;add&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;delete_vif_traffic_rule&lt;/code&gt;) steuern den SDN-Controller von XO — ein Plugin, das XOA Premium beiliegt und nicht Teil der dokumentierten Kern-REST-API ist. Ohne geladenes Plugin liefern die Routen &lt;code dir=&quot;auto&quot;&gt;404&lt;/code&gt;, der Agent bekommt also einen sauberen terminalen Fehler statt eines stillen No-ops. Die übrigen 241 Tools laufen gegen eine Standard-REST-API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Schreibseite braucht Privilegien.&lt;/strong&gt; Vollständige Coverage setzt einen Admin-User oder einen RBAC-v2-User mit den richtigen &lt;code dir=&quot;auto&quot;&gt;acl-privileges&lt;/code&gt; voraus. Wenn man nur &lt;em&gt;schauen&lt;/em&gt; will, ist der read-only-Server von Vates weniger Setup und ein kleinerer Blast-Radius — nimm ihn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jeder Call hüpft durch ToolMesh.&lt;/strong&gt; Für interaktiven Betrieb ist das unsichtbar; für High-Throughput-Batch-Jobs gegen XO ist der direkte REST-Aufruf schneller.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DADL ist gut in einer bestimmten Sache — eine REST-API-Oberfläche schnell für Agenten verfügbar zu machen, mit einer echten Kontrollschicht darunter. Bei Xen Orchestra ist diese Oberfläche zufällig 245 Endpoints überwiegend verändernder Operationen — genau der Fall, in dem sich eine Governance-Schicht auszahlt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-tatsächlich-anders-ist&quot;&gt;Was tatsächlich anders ist&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die substanzielle Frage ist nicht “DADL vs. der eigene MCP-Server” — ToolMesh betreibt beide, und sie koexistieren in derselben Registry. Die Frage ist: &lt;strong&gt;Was kostet es, einem Agenten die &lt;em&gt;Schreib&lt;/em&gt;-Seite einer API zu geben, sicher?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bei einem read-only-Server lautet die Antwort “gar nicht” — das ist der bewusste Trade. Bei einem handgeschriebenen Read-Write-Server kostet es einen Engineering-Zyklus pro Endpoint: SDK-Shapes, Handler, Tests, ein Release, ein npm-Publish, Nutzer-Upgrades, plus die Autorisierung und das Audit, die man selbst bauen muss. Bei einer DADL hinter ToolMesh kostet es einen PR mit einem YAML-Diff, und Credentials, Autorisierung und Audit kommen aus der Runtime.&lt;/p&gt;
&lt;p&gt;Das ist die Asymmetrie. Nicht “alle sollten den eigenen Server wegwerfen” — behalte ihn für read-only-Discovery. Nur: wenn ein Agent Xen Orchestra tatsächlich betreiben soll, ist die Arbeitseinheit ein YAML-Diff, und die Sicherheit liegt in der Schicht darunter statt im Weglassen der Schreib-Tools.&lt;/p&gt;</content:encoded><category>DADL</category><category>MCP</category><category>Xen Orchestra</category><category>Infrastructure</category></item><item><title>Anatomie einer Enterprise Tool Library</title><link>https://www.toolmesh.io/de/blog/anatomy-of-an-enterprise-tool-library/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/anatomy-of-an-enterprise-tool-library/</guid><description>Wie eine Enterprise Tool Library tatsächlich aufgebaut ist: die sechs Säulen, die fail-closed Request-Pipeline, und wie DADL und Code Mode eine einzige kontrollierte Schicht vor jeden MCP-Server oder jede REST-API setzen.

</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die meisten Teams laufen am selben Freitagnachmittag gegen dieselbe Wand. Eine Handvoll MCP-Server lief in der Entwicklung problemlos. Inzwischen sind es fünfzehn, die Hälfte davon hängt an Produktion, und niemand kann die einfachen Fragen beantworten — wer hat was aufgerufen, mit welchem Credential, gegen welche Policy, und wo ist das Log. Das Problem ist nicht ein einzelner Server. Das Problem ist, dass es darunter keine gemeinsame Schicht gibt.&lt;/p&gt;
&lt;p&gt;In diesem Artikel geht es um genau diese Schicht. Er beschreibt, wie eine &lt;strong&gt;Enterprise Tool Library&lt;/strong&gt; gebaut ist: die sechs Anliegen, die sie in einer Runtime vereinen muss, die fail-closed Pipeline, die jeder Tool-Call durchläuft, und die beiden Ideen — DADL und Code Mode — die das Ganze auf Dutzende Backends skalierbar machen, ohne den Kontext des Agenten aufzublähen. Die geschäftliche Einordnung auf Deutsch liefert der Schwester-Artikel auf &lt;a href=&quot;https://www.dunkel.cloud/blog/enterprise-tool-library/&quot;&gt;dunkel.cloud (DE)&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-eine-enterprise-tool-library-tatsächlich-ist&quot;&gt;Was eine Enterprise Tool Library tatsächlich ist&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der Begriff „MCP Gateway” wird für zwei sehr verschiedene Dinge verwendet. Das eine ist ein Passthrough-Proxy, der Tool-Calls an einen einzelnen Upstream-Server weiterreicht. Das andere ist eine kontrollierte Ausführungsschicht, die vor jedem Backend der Organisation sitzt. Nur das Zweite ist eine Enterprise Tool Library.&lt;/p&gt;
&lt;p&gt;Das unterscheidende Merkmal ist nicht die Anzahl der Backends. Es ist strukturell. Eine Library hat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eine Authentifizierungs- und Autorisierungsgrenze.&lt;/strong&gt; Jeder Tool-Call — egal welches Upstream-System er am Ende trifft — durchläuft dieselbe Identitätsprüfung und dieselbe Zugriffsentscheidung pro Tool. Eine einzige Quelle der Wahrheit für „wer darf was aufrufen”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eine kohärente Audit-Linie.&lt;/strong&gt; Jeder Call landet im selben Store, mit denselben Feldern, abfragbar mit einer SQL-Query. Nicht „Logs hier drüben, MCP-Server-Logs da drüben, ein CSV, das jemand letztes Quartal exportiert hat”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eine gemeinsame deklarative Beschreibungssprache.&lt;/strong&gt; REST-APIs, MCP-Server, interne Dienste — alle über dasselbe Definitionsformat zugänglich, sodass Policy, Retry, Pagination und Credential-Injection Runtime-Anliegen statt maßgeschneiderter Wrapper-Code sind.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ein konstanter Kontext-Footprint.&lt;/strong&gt; Das zwanzigste Backend hinzuzufügen verdoppelt nicht die Tokens, die der Agent mitschleppen muss. Die Kosten für „mehr Tools” trägt die Library, nicht jeder Prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein einzelner MCP-Server hat nichts davon. Ein Passthrough-Gateway hat bestenfalls die ersten zwei, und das auch nur für ein Backend gleichzeitig. Eine Enterprise Tool Library ist das, was entsteht, wenn diese vier Eigenschaften über die gesamte Tool-Oberfläche hinweg gelten.&lt;/p&gt;
&lt;p&gt;ToolMesh ist unsere Open-Source-Implementierung dieser Form. Der Rest dieses Artikels läuft durch, wie die Teile zusammenpassen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-sechs-säulen-als-mechanik&quot;&gt;Die sechs Säulen als Mechanik&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh ordnet die Arbeit in sechs Säulen. Jede löst ein konkretes Problem, lebt in einem bestimmten Paket und hat einen einzigen Config-Berührungspunkt.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;1-any-backend--zwei-eingangspfade-eine-runtime&quot;&gt;1. Any Backend — zwei Eingangspfade, eine Runtime&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Die Library muss vor allem stehen können, was die Organisation bereits betreibt. ToolMesh unterstützt zwei Eingangspfade in dieselbe Ausführungs-Pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP-Backends&lt;/strong&gt; umschließen bestehende MCP-Server via HTTP- oder STDIO-Transport. Wer schon einen funktionierenden Server hat, behält ihn; ToolMesh legt die Governance-Schicht drumherum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DADL-Backends&lt;/strong&gt; beschreiben REST-APIs deklarativ in YAML. Kein eigener Server-Code, keine separate Runtime — die Beschreibung &lt;em&gt;ist&lt;/em&gt; die Integration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beide Pfade registrieren sich über dasselbe interne &lt;code dir=&quot;auto&quot;&gt;backend.Register()&lt;/code&gt;-Interface und produzieren Tools, die für das Modell identisch aussehen. Der Backend-Typ wird zum Implementierungsdetail; die Sicherheitsgarantien hängen nicht davon ab. Konfiguration lebt in einer einzigen Datei:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;config/backends.yaml&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;backends&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github.dadl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cloudflare.dadl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;legacy-internal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;mcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;transport&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http://internal-mcp:8080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ein Backend hinzuzufügen heißt, eine Datei zu editieren — keinen Dienst zu bauen.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-code-mode--flache-tool-oberfläche-konstanter-kontext&quot;&gt;2. Code Mode — flache Tool-Oberfläche, konstanter Kontext&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Ein naives MCP-Setup gibt jede Tool-Definition direkt an das Modell. Bei einem Backend ist das in Ordnung. Bei zwanzig wird es ruinös: Dutzende Tool-Schemata, jedes mit eigenen Parametern und Beschreibungen, allesamt in den Kontext geladen, bevor der Agent die Frage des Nutzers überhaupt gelesen hat. Rund 50.000 Tokens an reinen Tool-Metadaten ist eine normale Beobachtung in der Praxis.&lt;/p&gt;
&lt;p&gt;ToolMesh umgeht das vollständig. Das Modell sieht zwei Meta-Tools — &lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt; — und ein kompaktes TypeScript-Interface, das die verfügbaren Funktionen beschreibt. Dieses Interface umfasst grob &lt;strong&gt;1.000 Tokens&lt;/strong&gt;, egal ob ein oder zwanzig Backends angeschlossen sind. Der Agent ruft &lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt; einmal auf, um die Typ-Signaturen zu sehen, und schreibt dann JavaScript dagegen:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;issues&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;github_list_issues&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;DunkelCloud&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repo: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ToolMesh&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;state: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;recent&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;issues&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span&gt; =&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;created_at&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &amp;#x3C; &lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;864e5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;recent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; ({ number: &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;, title: &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; }));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Der &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt;-Runner parst dieses JavaScript mit einem Go-AST-Walker, extrahiert jeden &lt;code dir=&quot;auto&quot;&gt;toolmesh.*&lt;/code&gt;-Aufruf und schickt ihn durch die normale Pipeline. Das Modell führt nie beliebigen Code gegen Ihre Infrastruktur aus — es produziert ein Skript, dessen Tool-Calls statisch extrahiert und einzeln autorisiert werden. Code Mode ist im Detail unter &lt;a href=&quot;https://www.toolmesh.io/de/code-mode/&quot;&gt;/de/code-mode/&lt;/a&gt; beschrieben.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-credential-store--laufzeit-injection-nie-im-prompt&quot;&gt;3. Credential Store — Laufzeit-Injection, nie im Prompt&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Das Anliegen, das die meisten Setups stillschweigend ignorieren. Eine typische MCP-Konfiguration legt API-Keys in Client-Configs, in Env-Vars auf Entwickler-Laptops oder — im schlimmsten Fall — direkt in den Modell-Kontext. Nichts davon rotiert gut, nichts davon auditiert gut, und jedes davon kann in ein Transkript lecken.&lt;/p&gt;
&lt;p&gt;ToolMesh referenziert Credentials per Namen in der DADL-Datei und löst sie serverseitig zur Ausführungszeit auf. Das Modell sieht das Tool-Interface und die gefilterte Antwort. Es sieht nie das Token. Die Credential-Schicht ist über &lt;code dir=&quot;auto&quot;&gt;credentials.Register()&lt;/code&gt; austauschbar:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stufe&lt;/th&gt;&lt;th&gt;Backend&lt;/th&gt;&lt;th&gt;Einsatz&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Embedded&lt;/td&gt;&lt;td&gt;Env-Vars (&lt;code dir=&quot;auto&quot;&gt;CREDENTIAL_*&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;Lokale Entwicklung, Single-Tenant&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Geplant&lt;/td&gt;&lt;td&gt;Infisical&lt;/td&gt;&lt;td&gt;Zentrales Secret-Management&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Geplant&lt;/td&gt;&lt;td&gt;HashiCorp Vault / OpenBao&lt;/td&gt;&lt;td&gt;Enterprise-Secret-Governance&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Das Embedded-Backend ist der Default und ist im Binary enthalten. Die gehosteten Backends sind über den Enterprise-Build-Tag geplant — das Registrierungs-Muster (inspiriert von Go’s &lt;code dir=&quot;auto&quot;&gt;database/sql&lt;/code&gt;-Treibern) ist bereits an Ort und Stelle, also erfordert das Hinzufügen eines Backends keinen Eingriff in den Executor.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;4-openfga--rebac-ehrlich-gegenüber-dem-default&quot;&gt;4. OpenFGA — ReBAC, ehrlich gegenüber dem Default&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Autorisierung in ToolMesh ist beziehungsbasiert, betrieben von OpenFGA. Das Modell ist &lt;code dir=&quot;auto&quot;&gt;user → plan → tool&lt;/code&gt;: Nutzer gehören zu Plänen, Pläne haben Tool-Berechtigungen, und der Executor fragt OpenFGA, ob der Aufrufer dieses spezifische Tool aufrufen darf, bevor irgendetwas läuft.&lt;/p&gt;
&lt;p&gt;Heute werden zwei Modi ausgeliefert:&lt;/p&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;code dir=&quot;auto&quot;&gt;OPENFGA_MODE&lt;/code&gt;&lt;/th&gt;&lt;th&gt;Verhalten&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;bypass&lt;/code&gt; (Default)&lt;/td&gt;&lt;td&gt;Keine Autorisierungs-Checks. Nur für Dev.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;restrict&lt;/code&gt;&lt;/td&gt;&lt;td&gt;OpenFGA bei jedem Tool-Call durchgesetzt. Produktion.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Der Default ist &lt;code dir=&quot;auto&quot;&gt;bypass&lt;/code&gt;, damit &lt;code dir=&quot;auto&quot;&gt;docker compose up&lt;/code&gt; eine lauffähige Instanz produziert, ohne jeden Mitwirkenden durch ein OpenFGA-Setup zu zwingen. &lt;strong&gt;Das ist eine bewusste DX-Entscheidung, keine Sicherheitsaussage.&lt;/strong&gt; Produktiv-Deployments wechseln auf &lt;code dir=&quot;auto&quot;&gt;restrict&lt;/code&gt; und führen &lt;code dir=&quot;auto&quot;&gt;./config/openfga/setup.sh&lt;/code&gt; aus, um das Modell zu seeden. Den Default auf bypass zu setzen ist ehrlich darüber, wo die Dev-Oberfläche beginnt; die Seite &lt;a href=&quot;https://www.toolmesh.io/de/authorization/&quot;&gt;Authorization&lt;/a&gt; dokumentiert die Produktions-Checkliste.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;5-output-gate--deterministisches-js-mit-wachstumsraum&quot;&gt;5. Output Gate — deterministisches JS, mit Wachstumsraum&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Nicht jede Response sollte das Modell unverändert erreichen. Kundendatensätze enthalten PII. Interne Systeme liefern Metadaten zurück, die der Agent nicht braucht. Fehlermeldungen leaken gelegentlich Infrastruktur-Details.&lt;/p&gt;
&lt;p&gt;Heute liefert ToolMesh &lt;strong&gt;Layer 1&lt;/strong&gt; des Gates aus: deterministische JavaScript-Policies, ausgeführt in der eingebetteten &lt;a href=&quot;https://github.com/dop251/goja&quot;&gt;goja&lt;/a&gt;-Engine. Eine Policy bekommt die Response und den Caller-Kontext und gibt einen gefilterten Payload oder eine Ablehnung zurück:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;policies/redact-pii.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onResponse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;callerClass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;trusted&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redactEmails&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;redactPhones&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Policies sind reviewbarer Code, der im Repo eingecheckt ist, keine Black-Box-Konfiguration. Das Gate sitzt auf einer austauschbaren Evaluator-Registry (&lt;code dir=&quot;auto&quot;&gt;gate.RegisterEvaluator()&lt;/code&gt;) — weitere Layer sind geplant, darunter LLM-basierte Inhaltsklassifikation für Compliance-Anwendungen. Heute liefern wir einen Layer aus. Wir tun nicht so, als wären es mehr. Siehe &lt;a href=&quot;https://www.toolmesh.io/de/output-gate/&quot;&gt;/de/output-gate/&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;6-audit--slog-und-sqlite-sql-abfragbar&quot;&gt;6. Audit — slog und SQLite, SQL-abfragbar&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Jeder Tool-Call wird aufgezeichnet: wer ihn aufgerufen hat, welches Tool, mit welchen Parametern, was das Ergebnis war, wie lange er gedauert hat und ob er erfolgreich war. ToolMesh liefert zwei Audit-Backends aus — Gos strukturiertes &lt;code dir=&quot;auto&quot;&gt;slog&lt;/code&gt; für log-orientierte Setups und einen Append-only-SQLite-Store für abfragbare Compliance-Audits.&lt;/p&gt;
&lt;p&gt;Wenn jemand fragt &lt;em&gt;„was hat dieser Agent letzten Dienstag zwischen 14:00 und 15:00 gemacht?”&lt;/em&gt;, ist die Antwort eine &lt;code dir=&quot;auto&quot;&gt;SELECT&lt;/code&gt;-Query — keine forensische Übung über fünf Log-Aggregatoren hinweg.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-fail-closed-request-pipeline&quot;&gt;Die fail-closed Request-Pipeline&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die Säulen sind wichtig, aber ihr Wert entsteht durch die Reihenfolge, in der sie laufen. Ein einzelner Tool-Call läuft diesen Weg:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;┌─────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  Client (Claude Desktop / ChatGPT / CLI / Hosted Agent)         │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└──────────────────────────────┬──────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 1. Authentication     │   OAuth 2.1 PKCE / API-Key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    → UserContext      │   → Identität feststeht&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 2. Authorization      │   OpenFGA: user × plan × tool&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    (fail closed)      │   → allowed oder DENY&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 3. Credential         │   Serverseitig aufgelöst,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    Injection          │   nie an das Modell exponiert&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 4. Output Gate (in)   │   Optionaler Pre-Execution-Check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    (fail closed)      │   → allowed oder REJECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 5. Execute            │   MCP-Server oder REST via DADL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                       │   → Rohe Response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 6. Output Gate (out)  │   PII-Redaktion, Shaping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                       │   → Gefilterte Response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌───────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ 7. Audit              │   Append-only, abfragbar&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                       │   → SQLite / slog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──────────┬────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Zurück an Client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Die Pipeline ist &lt;strong&gt;fail-closed&lt;/strong&gt;: Lehnt AuthZ ab, läuft nichts. Lehnt das Gate ab, läuft nichts. Schlägt die Credential-Auflösung fehl, läuft nichts. Der Default bei jeder Unsicherheit ist „nicht ausführen”. Das ist die Umkehrung dessen, was die meisten Ad-hoc-Setups tun, wo ein fehlender Check stillschweigend „weiter” bedeutet.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;callerclass--die-zweite-achse-die-sonst-niemand-hat&quot;&gt;CallerClass — die zweite Achse, die sonst niemand hat&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die meisten Gateways behandeln Autorisierung als eine einzige Achse: &lt;em&gt;wer ist der Nutzer?&lt;/em&gt; Das ist notwendig, aber nicht hinreichend. Derselbe Nutzer, mit derselben Frage, läuft auf einem ganz anderen Vertrauensniveau, wenn er in eine lokale Claude-Desktop-Session tippt, im Vergleich dazu, wenn ein hosted Agent den Call in seinem Namen als Teil eines geplanten Workflows macht.&lt;/p&gt;
&lt;p&gt;ToolMesh behandelt das als erstklassiges Konzept: &lt;strong&gt;CallerClass&lt;/strong&gt;, an jeden Request angehängt, mit drei Werten:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CallerClass&lt;/th&gt;&lt;th&gt;Typischer Ursprung&lt;/th&gt;&lt;th&gt;Typische Filterung&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;trusted&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lokale CLI, Entwickler-Laptop&lt;/td&gt;&lt;td&gt;Minimal — nur Credentials werden redigiert&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;standard&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Authentifizierter Nutzer über bekannten Client&lt;/td&gt;&lt;td&gt;PII-Redaktion, Schema-Shaping&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;untrusted&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hosted Agents, CI-Bots, Drittclients&lt;/td&gt;&lt;td&gt;Streng — keine Admin-Tools, aggressive Redaktion&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;CallerClass moduliert zwei Dinge gleichzeitig: welche Tools überhaupt erreichbar sind (ein &lt;code dir=&quot;auto&quot;&gt;untrusted&lt;/code&gt;-Aufrufer kann von &lt;code dir=&quot;auto&quot;&gt;admin&lt;/code&gt;-Tools ausgeschlossen werden, selbst wenn der Plan des Nutzers sie normalerweise zulassen würde) und was das Output Gate vor dem Modell redigiert. Dasselbe Backend, derselbe Nutzer, anderer Trust-Envelope — automatisch durchgesetzt.&lt;/p&gt;
&lt;p&gt;Das ist der Teil, den es in Passthrough-Gateways nicht gibt. Sie modellieren den Nutzer. Sie modellieren nicht „wer fragt im Namen des Nutzers”. Für Agenten-Infrastruktur liegt das echte Risiko vor allem auf dieser zweiten Achse.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;beispiel-aus-der-praxis-ein-backend-hinzufügen&quot;&gt;Beispiel aus der Praxis: ein Backend hinzufügen&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Den &lt;code dir=&quot;auto&quot;&gt;list_issues&lt;/code&gt;-Endpunkt von GitHub als kontrolliertes Tool hinzuzufügen, sieht in voller Länge so aus:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# github.dadl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;backend&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;base_url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://api.github.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bearer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;credential&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;github_token&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;# zur Laufzeit aufgelöst, nie im Prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retry_on&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;502&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;503&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retry_strategy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;max_retries&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;backoff&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;exponential&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;list_issues&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/repos/{owner}/{repo}/issues&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;access&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;# → über OpenFGA auf Plan-Berechtigungen gemappt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;List issues in a repository&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;owner&lt;/span&gt;&lt;span&gt;:    { &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;,  &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt;:     { &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;,  &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;:    { &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;per_page&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;integer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;pagination&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;strategy&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;link_header&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dreiundzwanzig Zeilen. Datei in die Registry legen, in &lt;code dir=&quot;auto&quot;&gt;backends.yaml&lt;/code&gt; referenzieren, neu starten. Was Sie kostenlos dazu bekommen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt; — OAuth oder API-Key am Eingang, Bearer-Token-Injection auf der Outbound-Seite, beides von der Runtime erledigt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authorization&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;access: read&lt;/code&gt; ordnet das Tool im OpenFGA-Modell ein; der Request wird vor der Ausführung abgelehnt, wenn der Plan des Aufrufers ihn nicht enthält.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credential-Isolation&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;github_token&lt;/code&gt; wird zur Ausführungszeit aus dem Credential Store geholt; das Modell sieht den Wert nie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retry und Pagination&lt;/strong&gt; — in der Beschreibung deklariert, von der Runtime ausgeführt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit&lt;/strong&gt; — jeder Call landet im Audit-Store mit Aufrufer, Parametern, Status, Latenz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output-Filterung&lt;/strong&gt; — das Gate läuft auf der Response, bevor das Modell sie sieht, und wendet die für die CallerClass passende Policy an.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nichts davon ist Wrapper-Code, den jemand speziell für GitHub geschrieben hat. Das ist, was die Runtime für jedes per DADL beschriebene Tool tut. Dieselbe Governance um einen handgerollten MCP-Server zu bauen, sind mehrere hundert Zeilen Boilerplate pro Backend — Arbeit, die die meisten Teams ungebaut ausliefern und später bereuen.&lt;/p&gt;
&lt;p&gt;Der Schwester-Artikel &lt;a href=&quot;https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/&quot;&gt;Stop Rebuilding REST API Wrappers for MCP&lt;/a&gt; geht tiefer auf das DADL-Format ein und darauf, was wegfällt, wenn man es einsetzt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;warum-der-kontext-footprint-konstant-bleibt&quot;&gt;Warum der Kontext-Footprint konstant bleibt&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die meisten Gateways skalieren linear mit der Anzahl der Backends — jeder neue Server fügt Tool-Definitionen hinzu, die in jedem Prompt mitfahren. Zwanzig Backends, zwanzig Schema-Bundles, fünfzigtausend Tokens, bevor der Nutzer überhaupt ein Wort getippt hat.&lt;/p&gt;
&lt;p&gt;Code Mode bricht diese Skalierung. Das Modell sieht &lt;code dir=&quot;auto&quot;&gt;discover_tools&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt; sowie ein kompaktes TypeScript-Interface, das auflistet, was verfügbar ist. Ein zusätzliches Backend lässt die Interface-Beschreibung wachsen, aber nicht den Overhead pro Request — der Agent schlägt Tools bei Bedarf nach, statt sie permanent mitzuschleppen.&lt;/p&gt;
&lt;p&gt;In der Praxis surft eine ToolMesh-Instanz vor der aktuellen öffentlichen &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL-Registry&lt;/a&gt; — 27 APIs, 3.338 einzelne Tools über GitHub, Cloudflare, GitLab, Stripe, Hetzner Cloud, Linode, NetBox, DeepL und andere — gegenüber dem Modell mit ungefähr denselben Kontext-Kosten wie ein einziger handgebauter MCP-Server mit einem Dutzend Tools. Genau dieses Verhältnis ist der ganze Punkt. Ohne es funktioniert die Library-Form überhaupt nicht.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;scope-und-ehrlichkeit-ausgeliefert-vs-geplant&quot;&gt;Scope und Ehrlichkeit: ausgeliefert vs. geplant&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh ist Early Stage. Ein Teil der Architektur ist ausgeliefert, ein Teil ist in Bewegung. Das explizit zu benennen ist nützlicher als ambitionierte Behauptungen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heute ausgeliefert:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alle sechs Säulen durch die fail-closed Pipeline verdrahtet&lt;/li&gt;
&lt;li&gt;Authentication (OAuth 2.1 PKCE, API-Keys, Multi-User via &lt;code dir=&quot;auto&quot;&gt;users.yaml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Authorization (OpenFGA, Modi &lt;code dir=&quot;auto&quot;&gt;bypass&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;restrict&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Credential Store mit eingebettetem Env-Var-Backend&lt;/li&gt;
&lt;li&gt;Output Gate Layer 1 (deterministische goja-JS-Policies)&lt;/li&gt;
&lt;li&gt;Audit via slog und SQLite&lt;/li&gt;
&lt;li&gt;MCP- und DADL-Backends, Registry-basiert&lt;/li&gt;
&lt;li&gt;Code Mode mit AST-extrahierten Tool-Calls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bewusste Entwickler-Defaults — für Produktion umschalten:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;OPENFGA_MODE=bypass&lt;/code&gt; (keine Autorisierung)&lt;/li&gt;
&lt;li&gt;Debug-Logging an&lt;/li&gt;
&lt;li&gt;HTTP+TLS-Reverse-Proxy davor angenommen für TLS-Terminierung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Diese Defaults sorgen dafür, dass &lt;code dir=&quot;auto&quot;&gt;docker compose up&lt;/code&gt; sauber in der Entwicklung läuft. Sie sind als nicht-produktionsreif dokumentiert. Die Seite &lt;a href=&quot;https://www.toolmesh.io/de/configuration/&quot;&gt;Configuration&lt;/a&gt; listet jede Variable und ihre Produktions-Empfehlung auf.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Geplant, registriert, aber noch nicht ausgeliefert:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infisical- und HashiCorp-Vault-Credential-Backends (Erweiterungspunkt existiert)&lt;/li&gt;
&lt;li&gt;Weitere Gate-Layer (LLM-basierte Klassifikation, Compliance-Filter)&lt;/li&gt;
&lt;li&gt;Erweiterte DADL-Registry-Abdeckung (Community-Beiträge willkommen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Diese als „geplant” zu bezeichnen ist das richtige Maß an Selbstvertrauen. Die Registrierungs-Mechanik steht; die Arbeit, sie anzubinden, liegt vor uns.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;backends-in-der-praxis&quot;&gt;Backends in der Praxis&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Dieser Artikel ist die architektonische Referenz. Die detaillierten Connector-Walkthroughs — wie man NetBox aus Cloud-APIs befüllt, wie man OPNsense hinter eine Tool-Schicht setzt, wie man den HashiCorp-Stack integriert — leben in eigenen Beiträgen. Die aktuellen Folgen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.toolmesh.io/de/blog/populating-netbox-from-real-infrastructure/&quot;&gt;Populating NetBox from Real Infrastructure with ToolMesh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Weitere folgen zu OPNsense, der HashiCorp-Suite und weiteren registry-getriebenen Integrationen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wer Infrastruktur betreibt, die ein gutes Worked Example abgäbe, beginnt am besten in der &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL-Registry&lt;/a&gt; — die meisten APIs mit OpenAPI-Spec können an einem Nachmittag zu DADL-Dateien werden.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;verwandte-themen&quot;&gt;Verwandte Themen&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Das Warum, auf Deutsch:&lt;/strong&gt; &lt;a href=&quot;https://www.dunkel.cloud/blog/enterprise-tool-library/&quot;&gt;dunkel.cloud — Enterprise Tool Library&lt;/a&gt; — geschäftliche Einordnung, keine Architektur&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Der Skalierungs-Trick:&lt;/strong&gt; &lt;a href=&quot;https://www.toolmesh.io/de/code-mode/&quot;&gt;/de/code-mode/&lt;/a&gt; — wie der Kontext-Footprint konstant bleibt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Protokoll-Frage:&lt;/strong&gt; &lt;a href=&quot;https://www.toolmesh.io/de/blog/why-mcp-gateways-alone-dont-solve-the-real-problem/&quot;&gt;Why MCP Gateways Alone Don’t Solve the Real Problem&lt;/a&gt; — Gateway vs. Description Layer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Beschreibungssprache:&lt;/strong&gt; &lt;a href=&quot;https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/&quot;&gt;Stop Rebuilding REST API Wrappers for MCP&lt;/a&gt; — was DADL ersetzt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Häufige Fragen:&lt;/strong&gt; &lt;a href=&quot;https://www.toolmesh.io/de/faq/&quot;&gt;/de/faq/&lt;/a&gt; — kurze Antworten zu MCP, DADL, ToolMesh&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quellcode:&lt;/strong&gt; &lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh&quot;&gt;GitHub — DunkelCloud/ToolMesh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connector-Format:&lt;/strong&gt; &lt;a href=&quot;https://dadl.ai&quot;&gt;dadl.ai&lt;/a&gt; — Registry und Spec&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;ausprobieren&quot;&gt;Ausprobieren&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der schnellste Weg von diesem Artikel zu einer laufenden Instanz:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hosted Demo.&lt;/strong&gt; &lt;a href=&quot;https://www.toolmesh.io/de/demo/&quot;&gt;Try the Demo&lt;/a&gt; — ein gemanagtes ToolMesh mit einem kuratierten Backend-Set, kein Setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Host-Quickstart.&lt;/strong&gt; Repo klonen, &lt;code dir=&quot;auto&quot;&gt;docker compose up&lt;/code&gt;, MCP-Client auf &lt;code dir=&quot;auto&quot;&gt;http://localhost:8080&lt;/code&gt; zeigen lassen. Der vollständige Walkthrough liegt unter &lt;a href=&quot;https://www.toolmesh.io/de/getting-started/&quot;&gt;Getting Started&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Eine Enterprise Tool Library ist keine Bibliothek von Tools. Sie ist die Schicht darunter, die „any backend” zu einer Eigenschaft der Runtime macht, statt zu einer Eigenschaft jedes einzelnen Wrappers. Die sechs Säulen, die fail-closed Pipeline und die CallerClass-Achse sind das, was einen Haufen MCP-Server in etwas verwandelt, das ein Unternehmen tatsächlich betreiben kann.&lt;/p&gt;</content:encoded><category>Architecture</category><category>MCP</category><category>DADL</category><category>Reference</category></item><item><title>DeepL v3 Customization Hub — in einer DADL abgedeckt</title><link>https://www.toolmesh.io/de/blog/deepl-v3-customization-hub-in-one-yaml-file/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/deepl-v3-customization-hub-in-one-yaml-file/</guid><description>DeepL hat gerade 13 neue REST-Endpoints ausgerollt — Style Rules, mehrsprachige Glossare, Translation Memory, /v3/languages, tag_handling v2. Der offizielle MCP-Server hat heute keinen davon. Wir haben alle in einer 38 KB großen DADL abgedeckt. Hier ist das Build-Log.

</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ende Mai hat DeepL den &lt;a href=&quot;https://www.deepl.com/en/customization-hub&quot;&gt;Customization Hub&lt;/a&gt; scharfgeschaltet — 13 neue REST-Endpoints für Style Rules, mehrsprachige Glossare, Translation Memory, die neu gestaltete &lt;code dir=&quot;auto&quot;&gt;/v3/languages&lt;/code&gt;-Ressource und einen optionalen &lt;code dir=&quot;auto&quot;&gt;tag_handling&lt;/code&gt; v2 Algorithmus. An dem Morgen, an dem wir unsere DADL dafür gemergt haben, exponierte der offizielle &lt;a href=&quot;https://github.com/DeepLcom/deepl-mcp-server&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;deepl-mcp-server&lt;/code&gt;&lt;/a&gt; immer noch neun Tools — alle v2 — und die Community-Alternative &lt;a href=&quot;https://github.com/NimbleBrainInc/mcp-deepl&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;mcp-deepl&lt;/code&gt;&lt;/a&gt; war im gleichen Stand, zuletzt released am 2026-05-09. Nicht, weil irgendjemand langsam wäre. Die Arbeitseinheit für API-Coverage ist auf beiden Seiten dieser Linie grundlegend verschieden, und das neue Release legt die Lücke deutlich offen. Dieser Post ist das Build-Log.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-das-neue-release-gebracht-hat&quot;&gt;Was das neue Release gebracht hat&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Customization Hub ist der Marketing-Name für eine ehrliche API-Erweiterung. DeepL erlaubt API-Konsumenten jetzt &lt;strong&gt;sprachspezifische Style-Profile&lt;/strong&gt; (etwa “Brand voice — DE”), &lt;strong&gt;mehrsprachige Glossare&lt;/strong&gt; (ein Glossar, viele &lt;code dir=&quot;auto&quot;&gt;source → target&lt;/code&gt;-Wörterbücher) und &lt;strong&gt;Translation Memories&lt;/strong&gt; (Wiederverwendung auf Segment-Ebene mit konfigurierbarem Match-Threshold) zu verwalten. &lt;code dir=&quot;auto&quot;&gt;/v2/translate&lt;/code&gt; akzeptiert drei neue Parameter — &lt;code dir=&quot;auto&quot;&gt;style_id&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;custom_instructions&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;translation_memory_id&lt;/code&gt; — und jeder davon hebt das Modell stillschweigend auf &lt;code dir=&quot;auto&quot;&gt;quality_optimized&lt;/code&gt;. Der neue &lt;code dir=&quot;auto&quot;&gt;/v3/languages&lt;/code&gt;-Endpoint ersetzt das alte &lt;code dir=&quot;auto&quot;&gt;/v2/languages&lt;/code&gt; und exponiert ressourcenbezogene Feature-Flags (Formality-Support, Glossary-Support, Style-Rules-Support, Voice). Schließlich liefert &lt;code dir=&quot;auto&quot;&gt;tag_handling_version: v2&lt;/code&gt; einen deutlich verbesserten Algorithmus zur HTML/XML-Strukturerhaltung — positionsunabhängige Übersetzung, besser erhaltenes Nesting.&lt;/p&gt;
&lt;p&gt;Das ist eine substanzielle Erweiterung. Nichts davon steckt heute im offiziellen MCP-Server.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-zahlen&quot;&gt;Die Zahlen&lt;/h2&gt;&lt;/div&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;DADL (&lt;code dir=&quot;auto&quot;&gt;deepl.dadl&lt;/code&gt;)&lt;/th&gt;&lt;th&gt;&lt;code dir=&quot;auto&quot;&gt;deepl-mcp-server&lt;/code&gt; (offiziell)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tools&lt;/td&gt;&lt;td&gt;&lt;strong&gt;27&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Coverage&lt;/td&gt;&lt;td&gt;Textübersetzung, Dokumentübersetzung, mehrsprachige v3-Glossare, Style Rules CRUD, Custom Instructions CRUD, TM-Listing, Write/Rephrase, &lt;code dir=&quot;auto&quot;&gt;/v3/languages&lt;/code&gt;, Usage&lt;/td&gt;&lt;td&gt;translate-text, rephrase-text, translate-document, list-glossaries, get-glossary-info, get-glossary-dictionary-entries, get-source-languages, get-target-languages, get-writing-styles&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Verteilung&lt;/td&gt;&lt;td&gt;38 KB YAML&lt;/td&gt;&lt;td&gt;Node.js-Server (TypeScript SDK, Build-Schritt, Runtime zum Hosten)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Neuen Endpoint hinzufügen&lt;/td&gt;&lt;td&gt;~30 Zeilen YAML&lt;/td&gt;&lt;td&gt;Tool-Definition + Request-Handler + Tests + Release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;v3 Customization Hub Coverage&lt;/td&gt;&lt;td&gt;vollständig&lt;/td&gt;&lt;td&gt;heute keine&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die lokale Validierung, ausgeführt aus dem Registry-Checkout:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt; cd dadl-registry &amp;#x26;&amp;#x26; npm run validate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✅ deepl.dadl — 27 tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Source auf GitHub: &lt;a href=&quot;https://github.com/DunkelCloud/dadl-registry/blob/main/deepl.dadl&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;dadl-registry/deepl.dadl&lt;/code&gt;&lt;/a&gt;. Gemergt in &lt;a href=&quot;https://github.com/DunkelCloud/dadl-registry/pull/34&quot;&gt;PR #34&lt;/a&gt;. Die DADL-Spec selbst: &lt;a href=&quot;https://dadl.ai/spec/dadl-spec-v0.1.md&quot;&gt;dadl.ai/spec&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ein-durchgespieltes-beispiel-style-rules-end-to-end&quot;&gt;Ein durchgespieltes Beispiel: Style Rules end-to-end&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das Interessante an Style Rules ist, dass sie tatsächlich greifen — &lt;code dir=&quot;auto&quot;&gt;custom_instructions&lt;/code&gt; schlagen sich im Modell-Output nieder. Hier der Round-Trip:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deepl_create_style_rule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Brand voice — DE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;language: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;de&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;custom_instructions:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ label: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Greeting&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,     prompt: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Begin every translation with &apos;Sehr geehrte Damen und Herren&apos;.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ label: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Product term&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, prompt: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Render &apos;ToolMesh&apos; verbatim, never translate.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;toolmesh&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deepl_translate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;The deployment of ToolMesh was successful.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;source_lang: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;EN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, target_lang: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;DE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;style_id: &lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;style_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// → &quot;Sehr geehrte Damen und Herren, die Bereitstellung von ToolMesh war erfolgreich.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Zwei Calls. Kein Glue-Code. Der erste trifft &lt;code dir=&quot;auto&quot;&gt;POST /v3/style_rules&lt;/code&gt;; der zweite referenziert das Ergebnis per &lt;code dir=&quot;auto&quot;&gt;style_id&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;POST /v2/translate&lt;/code&gt;. Die DADL behandelt transparent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;das ungewöhnliche &lt;code dir=&quot;auto&quot;&gt;DeepL-Auth-Key&lt;/code&gt;-Authorization-Schema (Custom-Prefix, serverseitige Credential-Injection — das Modell sieht den Key nie);&lt;/li&gt;
&lt;li&gt;die Casing-Falle bei Sprachcodes (UPPERCASE für &lt;code dir=&quot;auto&quot;&gt;translate&lt;/code&gt;, lowercase für Style Rules — beides korrekt typisiert);&lt;/li&gt;
&lt;li&gt;den stillen Model-Switch — &lt;code dir=&quot;auto&quot;&gt;style_id&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;custom_instructions&lt;/code&gt; oder &lt;code dir=&quot;auto&quot;&gt;translation_memory_id&lt;/code&gt; zu übergeben kippt &lt;code dir=&quot;auto&quot;&gt;model_type&lt;/code&gt; auf &lt;code dir=&quot;auto&quot;&gt;quality_optimized&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Retries auf &lt;code dir=&quot;auto&quot;&gt;429&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;529&lt;/code&gt; mit &lt;code dir=&quot;auto&quot;&gt;Retry-After&lt;/code&gt; und terminale Klassifizierung für &lt;code dir=&quot;auto&quot;&gt;400&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;401&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;403&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;456&lt;/code&gt; (der Free-Plan-Quota-Code ist &lt;code dir=&quot;auto&quot;&gt;456&lt;/code&gt;, nicht &lt;code dir=&quot;auto&quot;&gt;429&lt;/code&gt; — ein Footgun in handgeschriebenen Clients).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Derselbe Call aus Claude oder einem beliebigen anderen Agenten. Kein DeepL-spezifischer Code auf der Client-Seite.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;asymmetrie-in-der-wartung&quot;&gt;Asymmetrie in der Wartung&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das ist der Teil, der nicht im Tool-Count auftaucht, aber bestimmt, wie schnell eine Integration einer Upstream-API folgt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die v3-Endpoints zur DADL hinzufügen:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;deepl.dadl&lt;/code&gt; öffnen.&lt;/li&gt;
&lt;li&gt;Die neuen Tool-Blöcke ergänzen (~30 Zeilen YAML pro Endpoint).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;npm run validate&lt;/code&gt; — Output ist &lt;code dir=&quot;auto&quot;&gt;✅ deepl.dadl — 27 tools&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Einen PR aufmachen. Den YAML-Diff reviewen. Mergen.&lt;/li&gt;
&lt;li&gt;ToolMesh zieht die neuen Tools beim nächsten Reload. Nutzer sehen sie.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Dieselben Endpoints zu einem handgeschriebenen MCP-Server hinzufügen:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Das TypeScript SDK aktualisieren, um die neuen Request- und Response-Shapes abzubilden.&lt;/li&gt;
&lt;li&gt;Tool-Definitionen und Request-Handler hinzufügen (einer pro Endpoint).&lt;/li&gt;
&lt;li&gt;Tests schreiben oder erweitern.&lt;/li&gt;
&lt;li&gt;Release schneiden. Taggen. Auf npm publizieren.&lt;/li&gt;
&lt;li&gt;Nutzern sagen, dass sie upgraden sollen. Auf sie warten.&lt;/li&gt;
&lt;li&gt;Für das Python-SDK wiederholen, falls man eines pflegt. Für etwaige Downstream-Forks wiederholen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DADL kollabiert die Schritte 1, 2, 4, 5 und 6 zu “eine YAML-Datei editieren.” Der PR-Diff ist ein reviewbares Change-Set, kein Software-Release. Wir haben die allgemeine Version dieses Arguments &lt;a href=&quot;https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/&quot;&gt;in einem früheren Post&lt;/a&gt; gemacht; das DeepL-Release ist die konkrete Fallstudie.&lt;/p&gt;
&lt;p&gt;Die Kehrseite, die ausgesprochen gehört: &lt;strong&gt;Wenn man Verhalten braucht, das die Runtime nicht unterstützt, rettet einen die YAML-Datei nicht.&lt;/strong&gt; DADL ist deklarativ — es gibt keinen Escape-Hatch für Custom-Orchestration. Im DeepL-Fall ist der Dokumentübersetzungs-Flow (&lt;code dir=&quot;auto&quot;&gt;upload_document → check_document_status → download_document&lt;/code&gt;) rein sequenzielles REST und passt sauber. Eine protokoll-ebene Abweichung — etwa die WebSocket Voice API — würde es nicht.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;das-context-window-argument&quot;&gt;Das Context-Window-Argument&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der andere Grund, warum der Tool-Count weniger zählt, als es aussieht: &lt;strong&gt;Code Mode&lt;/strong&gt;. Statt jede vollständige Tool-Liste aller Backends ins Context-Window des Modells zu injizieren, exponiert ToolMesh zwei Meta-Tools (&lt;code dir=&quot;auto&quot;&gt;list_tools&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt;). Das Modell findet on demand heraus, was verfügbar ist, und ruft flache Tool-Namen aus einer sandboxed JavaScript-Runtime auf — &lt;code dir=&quot;auto&quot;&gt;toolmesh.deepl_translate&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;toolmesh.deepl_create_style_rule&lt;/code&gt;, nicht &lt;code dir=&quot;auto&quot;&gt;toolmesh.deepl.translate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Die Token-Kosten sind im Wesentlichen konstant: ~1 k Tokens Meta-Tool-Beschreibung, egal ob die Registry ein Backend mit 9 Tools oder 27 Backends mit 3.338 enthält. Tool-Count-getriebener Bloat verschwindet. Den v3 Customization Hub hinzuzufügen hat die DADL von 14 auf 27 Tools gebracht und null Tokens zu jeder Claude-Konversation hinzugefügt, die DeepL nicht aktiv anfasst.&lt;/p&gt;
&lt;p&gt;Im Code Mode ist das JavaScript im obigen Beispiel keine Illustration — es ist buchstäblich das, was das Modell schreibt, um die Tools aufzurufen. Deshalb liest es sich wie JavaScript und nicht wie JSON-Tool-Call-Payloads.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ehrliche-einschränkungen&quot;&gt;Ehrliche Einschränkungen&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die DADL ist kein vollständiger Coverage-Ersatz. Echte Limits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Voice-Übersetzung ist WebSocket-basiert.&lt;/strong&gt; DeepLs Echtzeit-Voice-Übersetzung ist ein bidirektionales Streaming-Protokoll. DADL beschreibt REST-APIs deklarativ; sie beschreibt keine Streaming-Protokolle. Dieser Endpoint ist nicht in unseren 27 Tools enthalten und wird es auch nicht — das ist Custom-Server-Terrain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Admin-API ist bewusst out-of-scope.&lt;/strong&gt; DeepL exponiert Admin-Endpoints (Org-Analytics, Developer-Key-Management). Wir haben diese DADL absichtlich auf nutzerseitige Übersetzungsoberflächen begrenzt. Admin-Endpoints haben ein anderes Bedrohungsmodell und gehören in ein separates, höher privilegiertes Backend — nicht ins selbe Paket wie das tägliche &lt;code dir=&quot;auto&quot;&gt;translate&lt;/code&gt;-Tool, das jedes Teammitglied benutzen könnte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Translation-Memory-Mutationen gehen nur über die Web-UI.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;/v3/translation_memories&lt;/code&gt; ist über die API per Mai 2026 nur lesbar — TMs werden in der DeepL Web-UI angelegt und editiert. Wir exponieren &lt;code dir=&quot;auto&quot;&gt;list_translation_memories&lt;/code&gt;; wir können keine Endpoints exponieren, die nicht existieren.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateful MCP-Clients sind ein legitimer Use-Case.&lt;/strong&gt; Wer Claude Desktop, Cursor oder Continue direkt fährt und einen lokalen MCP-Server ohne Governance-Layer dazwischen will, für den ist der offizielle &lt;code dir=&quot;auto&quot;&gt;deepl-mcp-server&lt;/code&gt; die richtige Form. Der DADL-via-ToolMesh-Ansatz setzt eine Runtime voraus, die Credentials, Authorization und Audit zentralisiert — und jemanden, der sie hosten will. Für einen einzelnen Entwickler ohne Governance-Anforderungen ist das Overhead, kein Wert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latenzkritische Pipelines.&lt;/strong&gt; Jeder Call geht durch ToolMesh. Bei interaktiver Übersetzung auf menschlichen Latenzen ist das unsichtbar; bei Batch-Pipelines mit hohem Durchsatz ist der direkte Aufruf der DeepL-Client-Library wahrscheinlich schneller.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DADL ist gut in genau einer Sache — REST-API-Oberfläche schnell für Agenten verfügbar machen, mit einer echten Control-Layer darunter. Es ist keine Silver Bullet und versucht nicht, jede Art von MCP-Server zu ersetzen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-tatsächlich-anders-ist&quot;&gt;Was tatsächlich anders ist&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die substanzielle Frage ist nicht “DADL vs MCP-Server” — dieses Framing ist falsch; ToolMesh fährt beides, und sie koexistieren in derselben Registry. Die substanzielle Frage ist: &lt;strong&gt;Was kostet es, einem Upstream-API-Release zu folgen?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Für einen handgeschriebenen Server kostet es einen Engineering-Zyklus: SDK-Änderungen, Tool-Definitionen, Handler, Tests, ein Release, ein npm-Publish, Nutzer-Upgrades. Deshalb hinken Community-MCP-Server schnellbewegten APIs typischerweise hinterher — nicht aus mangelndem Einsatz, sondern weil die Arbeit linear in Software-Releases ist, nicht in YAML-Zeilen.&lt;/p&gt;
&lt;p&gt;Für eine DADL kostet es einen PR mit einem YAML-Diff. DeepL hat Mitte Mai 13 neue Endpoints ausgeliefert. Wir haben die aktualisierte DADL am 21. Mai ausgeliefert — 14 alte Tools plus die 13 neuen, validiert, gemergt, live. Die Arbeit für die neuen Endpoints waren ein paar Stunden, der meiste Teil davon Lesen in DeepLs API-Referenz und Verhaltensverifikation gegen einen Free-Key. Den Rest hat die Runtime erledigt.&lt;/p&gt;
&lt;p&gt;Das ist die Asymmetrie. Nicht “alle sollten MCP-Server fallenlassen.” Nicht “DADL ist universell besser.” Nur: Wenn die Arbeitseinheit für API-Coverage ein YAML-Diff statt eines Software-Releases ist, folgt die Integration der Upstream-API schneller. Das zählt, wenn der Upstream einen Customization Hub ausliefert.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;→ Für die deutsche Geschäfts-Perspektive: &lt;a href=&quot;https://www.dunkel.cloud/de/blog/deepl-customization-hub-via-dadl/&quot;&gt;dunkel.cloud/de/blog/deepl-customization-hub-via-dadl&lt;/a&gt;&lt;/p&gt;</content:encoded><category>DADL</category><category>MCP</category><category>DeepL</category><category>Developer Experience</category></item><item><title>NetBox aus realer Infrastruktur befüllen mit ToolMesh</title><link>https://www.toolmesh.io/de/blog/populating-netbox-from-real-infrastructure/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/populating-netbox-from-real-infrastructure/</guid><description>Wie man mit ToolMesh-Konnektoren eine frische NetBox-Instanz aus Linode, Hetzner Cloud, Xen Orchestra und weiteren Quellen befüllt — mit einem vertrauensbildenden Ansatz vom Import bis zum Autopilot.

</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein typisches Szenario: drei Cloud-Provider, zwei Hypervisoren, eine Handvoll Edge-Standorte. Irgendwo um die 200 Geräte und VMs, Pi mal Daumen. Man startet &lt;a href=&quot;https://netbox.dev/&quot;&gt;NetBox&lt;/a&gt;, starrt auf das leere Dashboard und merkt, dass die eigentliche Arbeit noch nicht angefangen hat. Import-Skripte für fünf verschiedene APIs zu schreiben, ist eine Woche Arbeit, die niemand machen will — also bleibt NetBox leer, und die Tabellenkalkulation gewinnt wieder.&lt;/p&gt;
&lt;p&gt;Dieser Beitrag zeigt, wie man sich diese Woche spart. Wir gehen durch, wie man mit ToolMesh Live-Infrastrukturdaten aus mehreren Quellen abruft und über den NetBox-DADL-Konnektor in NetBox schreibt. Für den Business Case und das breitere „Warum” lies den Schwester-Artikel auf &lt;a href=&quot;https://dunkel.cloud/blog/populating-netbox-from-real-infrastructure&quot;&gt;dunkel.cloud&lt;/a&gt;. Hier geht es um das „Wie”.&lt;/p&gt;
&lt;aside aria-label=&quot;Auf der Suche nach dem NetBox-MCP-Server?&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Auf der Suche nach dem NetBox-MCP-Server?&lt;/p&gt;&lt;div&gt;&lt;p&gt;Setup, Beispiele und die einsatzbereite DADL-Definition: &lt;strong&gt;&lt;a href=&quot;https://www.toolmesh.io/de/integrations/netbox/&quot;&gt;NetBox MCP Server auf toolmesh.io&lt;/a&gt;&lt;/strong&gt;, oder die Rohdefinition unter &lt;strong&gt;&lt;a href=&quot;https://dadl.ai/d/netbox&quot;&gt;dadl.ai/d/netbox&lt;/a&gt;&lt;/strong&gt;. In ToolMesh einklinken und schon hat man einen NetBox-MCP-Server ohne eine Zeile eigenen Code.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;architektur-überblick&quot;&gt;Architektur-Überblick&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der Datenfluss:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Hetzner Cloud ───┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Linode        ───┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Xen Orchestra ───┼── ToolMesh ── NetBox DADL ── NetBox API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Unifi         ───┤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Tailscale     ───┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Jedes Quellsystem hat seine eigene API, seine eigene Authentifizierung und sein eigenes Datenmodell. ToolMesh fungiert als Gateway: Es authentifiziert sich gegen jede Quelle mit hinterlegten Credentials, normalisiert die Antworten und schreibt die Ergebnisse über die NetBox-DADL-Definition in NetBox.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.toolmesh.io/de/dadl/&quot;&gt;DADL&lt;/a&gt; (Declarative API Definition Language) ist ein YAML-basiertes Format, das REST-APIs als Tool-Definitionen beschreibt. Statt für jede API einen eigenen MCP-Server-Wrapper zu schreiben, beschreibt man Endpoints, Parameter und Authentifizierung in einer einzigen Datei. ToolMesh verwandelt diese Beschreibung zur Laufzeit in aufrufbare Tools — und erledigt Credential-Injection, Autorisierung und Audit-Logging automatisch. Die NetBox-DADL deckt den Großteil der NetBox-&lt;a href=&quot;https://docs.netbox.dev/en/stable/integrations/rest-api/&quot;&gt;REST-API&lt;/a&gt; ab; jede Quell-DADL deckt eine Cloud oder Appliance ab. Dazwischen sitzt kein eigener Glue-Code.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;mapping-quellobjekte-auf-netbox-objekte&quot;&gt;Mapping: Quellobjekte auf NetBox-Objekte&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die Kernaufgabe ist die Übersetzung zwischen Datenmodellen. Ein Hetzner-„Server” wird zu einem NetBox-„Device”. Eine Linode-„Instance” wird ebenfalls zu einem Device, aber die Feldnamen unterscheiden sich. So sieht das Mapping der wichtigsten Objekte aus:&lt;/p&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Quelle&lt;/th&gt;&lt;th&gt;Quellobjekt&lt;/th&gt;&lt;th&gt;NetBox-Objekt&lt;/th&gt;&lt;th&gt;Schlüsselfelder&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hetzner Cloud&lt;/td&gt;&lt;td&gt;Server&lt;/td&gt;&lt;td&gt;Device&lt;/td&gt;&lt;td&gt;name, server_type → device_type, datacenter → site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hetzner Cloud&lt;/td&gt;&lt;td&gt;Network&lt;/td&gt;&lt;td&gt;Prefix&lt;/td&gt;&lt;td&gt;ip_range → prefix, name → description&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Linode&lt;/td&gt;&lt;td&gt;Instance&lt;/td&gt;&lt;td&gt;Device&lt;/td&gt;&lt;td&gt;label → name, type → device_type, region → site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Linode&lt;/td&gt;&lt;td&gt;IPv4/IPv6&lt;/td&gt;&lt;td&gt;IP Address&lt;/td&gt;&lt;td&gt;address → address, linode_id → zugewiesenes Device&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Xen Orchestra&lt;/td&gt;&lt;td&gt;VM&lt;/td&gt;&lt;td&gt;Virtual Machine&lt;/td&gt;&lt;td&gt;name_label → name, power_state → status&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Xen Orchestra&lt;/td&gt;&lt;td&gt;Network&lt;/td&gt;&lt;td&gt;VLAN&lt;/td&gt;&lt;td&gt;name_label → name, MTU&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unifi&lt;/td&gt;&lt;td&gt;Device&lt;/td&gt;&lt;td&gt;Device&lt;/td&gt;&lt;td&gt;name, model → device_type, site → site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tailscale&lt;/td&gt;&lt;td&gt;Node&lt;/td&gt;&lt;td&gt;Device&lt;/td&gt;&lt;td&gt;hostname → name, addresses → IP Addresses&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Konkret sieht ein einzelner Hetzner-Server in der Antwort so aus:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;42891337&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;web-fra-01&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;server_type&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cx22&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;cores&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;memory&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;datacenter&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fsn1-dc14&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;location&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fsn1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; } },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;public_net&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;ipv4&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;ip&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;95.217.xx.xx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; } },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;running&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Nachdem ToolMesh das Objekt durch die NetBox-DADL geschickt hat, erzeugt dieses eine Quellobjekt drei verknüpfte NetBox-Records: eine &lt;code dir=&quot;auto&quot;&gt;Site&lt;/code&gt; (&lt;code dir=&quot;auto&quot;&gt;fsn1&lt;/code&gt;), einen &lt;code dir=&quot;auto&quot;&gt;DeviceType&lt;/code&gt; (&lt;code dir=&quot;auto&quot;&gt;cx22&lt;/code&gt;, 2 Cores, 4 GB) und ein &lt;code dir=&quot;auto&quot;&gt;Device&lt;/code&gt; (&lt;code dir=&quot;auto&quot;&gt;web-fra-01&lt;/code&gt;) mit angehängter primärer IP. &lt;code dir=&quot;auto&quot;&gt;Site&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;DeviceType&lt;/code&gt; werden einmal angelegt und bei jedem weiteren Hetzner-Server im selben Rechenzentrum wiederverwendet.&lt;/p&gt;
&lt;p&gt;Mappings sind nicht hartcodiert. Die Logik für die Feldübersetzung lebt in der Orchestrierungsschicht zwischen Quell-DADL und NetBox-DADL. Mappings lassen sich überschreiben, eigene Felder hinzufügen oder Objekte komplett überspringen — wenn die Server eine Rolle im Hostnamen kodieren (&lt;code dir=&quot;auto&quot;&gt;web-fra-01&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;db-fra-02&lt;/code&gt;), setzt eine kleine Transformation das &lt;code dir=&quot;auto&quot;&gt;device_role&lt;/code&gt; entsprechend. Abhängigkeiten werden automatisch aufgelöst: Voraussetzungs-Objekte werden vor dem Haupt-Record angelegt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;das-trust-escalation-modell&quot;&gt;Das Trust-Escalation-Modell&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloud-Inventar blind in eine produktive NetBox zu synchronisieren, ist zu Recht etwas, wovor man Respekt haben sollte. Der empfohlene Ansatz ist graduelles Vertrauen — mit null Risiko starten und mit wachsender Sicherheit eskalieren. Nichts davon ist ein eigens gebautes CLI; alles läuft als Prompt in natürlicher Sprache an Claude (oder einen beliebigen Agenten) mit angebundenem ToolMesh. Die folgenden Beispiele sind die tatsächlich verwendeten Prompts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1: Initial-Import (leere Datenbank).&lt;/strong&gt; Bevor Devices angelegt werden können, braucht NetBox ein minimales Grundgerüst: mindestens eine Site (Devices müssen einer zugeordnet sein), einen Manufacturer für Device Types und idealerweise einen Tenant zur organisatorischen Gruppierung. Man füttert Claude mit den Fakten zur eigenen Infrastruktur und lässt es einrichten:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Richte NetBox für meine Firma ein. Unser Tenant ist „Acme GmbH”. Ich betreibe Infrastruktur in zwei Regionen: Linode Frankfurt (&lt;code dir=&quot;auto&quot;&gt;eu-central&lt;/code&gt;) und Linode Amsterdam (&lt;code dir=&quot;auto&quot;&gt;nl-ams&lt;/code&gt;) — leg die als Sites unter einer Region namens „Europe” an. Der Manufacturer für alle Linode-Instanzen ist „Akamai/Linode”. Sobald das steht, importiere alle meine Linode-Instanzen als Devices, leg die passenden Device Types (g6-standard-2, g6-standard-4 usw.) direkt mit an und häng die öffentlichen IPv4- und IPv6-Adressen dran. NetBox ist leer, also kein Dry-Run nötig — mach es einfach und zeig mir am Ende eine Zusammenfassung.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude ruft die Linode-Tools auf, um Instanzen zu listen, und die NetBox-Tools, um Sites, Tenant, Manufacturer, Device Types, Devices und IPs in der richtigen Reihenfolge anzulegen. Die Zusammenfassung am Ende sagt, wie viele von jedem Objekttyp angelegt wurden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 2: Read-only-Diff.&lt;/strong&gt; Sobald NetBox Daten enthält, fragt der nächste Check, was sich ändern würde, ohne irgendetwas anzufassen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vergleiche meine aktuellen Linode-Instanzen mit dem, was in NetBox steht. Ändere nichts — sag mir nur in einfachen Worten, was die Unterschiede sind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die Antwort ist Prosa, kein Maschinen-Diff:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ich habe 23 Linode-Instanzen mit den 22 Devices in NetBox verglichen, die mit &lt;code dir=&quot;auto&quot;&gt;source=linode&lt;/code&gt; getaggt sind. Vier Unterschiede:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Neue Instanz&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;db-ams-04&lt;/code&gt; existiert bei Linode (Region &lt;code dir=&quot;auto&quot;&gt;nl-ams&lt;/code&gt;, Typ &lt;code dir=&quot;auto&quot;&gt;g6-standard-4&lt;/code&gt;, gestern angelegt), ist aber noch nicht in NetBox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP-Änderung&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;web-ams-01&lt;/code&gt; hat in NetBox eine primäre IPv4 (&lt;code dir=&quot;auto&quot;&gt;172.104.x.12&lt;/code&gt;), Linode meldet jetzt aber &lt;code dir=&quot;auto&quot;&gt;172.104.x.47&lt;/code&gt;. Sieht nach einem Rebuild aus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status-Drift&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;worker-ams-03&lt;/code&gt; ist in NetBox als &lt;code dir=&quot;auto&quot;&gt;active&lt;/code&gt; markiert, Linode meldet ihn aber als &lt;code dir=&quot;auto&quot;&gt;offline&lt;/code&gt; (vor 6 Tagen heruntergefahren).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fehlt an der Quelle&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;legacy-bastion-ams&lt;/code&gt; existiert in NetBox, ist bei Linode aber nicht mehr vorhanden. Wahrscheinlich außer Betrieb genommen — vor dem Anfassen lieber bestätigen lassen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Soll ich 1–3 anwenden und 4 zur Prüfung markieren?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An dieser Stelle wird der größte Teil des Vertrauens aufgebaut. Man sieht genau, was passieren würde, in einer Sprache, die man auf einen Blick auditieren kann.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 3: Reconcile mit Bestätigung.&lt;/strong&gt; Änderungen werden angewendet, mit einem Menschen in der Schleife bei allem Destruktiven:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mach mit 1, 2 und 3 weiter. Für alles, was ein Device löscht oder als außer Betrieb markiert, frag mich vorher.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anlegen und Updates passieren direkt; die Legacy-Bastion löst eine Rückfrage aus („Soll &lt;code dir=&quot;auto&quot;&gt;legacy-bastion-ams&lt;/code&gt; aus NetBox gelöscht oder auf &lt;code dir=&quot;auto&quot;&gt;decommissioning&lt;/code&gt; gesetzt und der Record behalten werden? [delete / decommission / skip]”), bevor etwas Unwiderrufliches geschieht. Destruktive Operationen erfordern immer eine explizite Bestätigung, auch wenn der Workflow später automatisiert läuft.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 4: Geplanter Sync.&lt;/strong&gt; Sobald das Mapping vertrauenswürdig ist, übergibt man den Workflow an einen geplanten Agenten:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hol jede Stunde den aktuellen Linode-Stand und gleich ihn mit NetBox ab. Neue Einträge und Feld-Updates wend direkt an. Für alles, was ein Device löschen oder seinen Status auf decommissioned setzen würde, öffne stattdessen ein Ticket in unserem Tracker — das prüfe ich manuell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ToolMesh führt den Prompt nach Zeitplan aus, der Agent macht dieselbe Arbeit wie im interaktiven Lauf, und destruktive Aktionen bleiben hinter einer Freigabe durch einen Menschen. Neue Server tauchen Minuten nach dem Provisionieren in NetBox auf. Jeder Tool-Call landet im Audit-Log, sodass sich später jederzeit nachvollziehen lässt, &lt;em&gt;was&lt;/em&gt; geändert wurde, &lt;em&gt;wann&lt;/em&gt; und &lt;em&gt;warum&lt;/em&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;wie-es-weitergeht&quot;&gt;Wie es weitergeht&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der &lt;a href=&quot;https://dadl.ai/d/netbox&quot;&gt;NetBox-DADL-Konnektor&lt;/a&gt; deckt den Großteil der NetBox-4.x-REST-API ab. Quell-Konnektoren für &lt;a href=&quot;https://dadl.ai/d/hetzner-cloud&quot;&gt;Hetzner Cloud&lt;/a&gt;, &lt;a href=&quot;https://dadl.ai/d/linode&quot;&gt;Linode&lt;/a&gt;, &lt;a href=&quot;https://dadl.ai/d/xen-orchestra&quot;&gt;Xen Orchestra&lt;/a&gt;, Unifi und &lt;a href=&quot;https://dadl.ai/d/tailscale&quot;&gt;Tailscale&lt;/a&gt; sind heute verfügbar. Falls die eigene Infrastruktur noch nicht abgedeckt ist, ist eine neue DADL-Datei eine Sache von Minuten, nicht Tagen — die &lt;a href=&quot;https://dadl.ai/browse&quot;&gt;DADL Registry&lt;/a&gt; auf bestehende Definitionen prüfen oder selbst auf &lt;a href=&quot;https://github.com/DunkelCloud/dadl-registry&quot;&gt;GitHub&lt;/a&gt; beitragen.&lt;/p&gt;
&lt;p&gt;Der eigentliche Gewinn kommt nach dem Import. Eine befüllte NetBox ist nicht nur Dokumentation — sie wird zum Substrat, über das ein KI-Agent argumentieren kann. „Welche Server in Falkenstein laufen auf Kernel 5.x und brauchen nächsten Dienstag ein Reboot-Fenster?” ist eine NetBox-Abfrage plus ein ToolMesh-Tool-Call, keine Woche Shell-Skripte. Genau deshalb starten wir hier: NetBox ist die Karte, ToolMesh ist die Art, wie Agenten sie sicher lesen und neu zeichnen.&lt;/p&gt;
&lt;p&gt;Für die strategische Sicht lies die vollständige Analyse auf &lt;a href=&quot;https://dunkel.cloud/blog/populating-netbox-from-real-infrastructure&quot;&gt;dunkel.cloud&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>NetBox</category><category>DADL</category><category>MCP</category><category>Tutorial</category><category>Infrastructure</category></item><item><title>ToolMesh — die fehlende Kontrollschicht für KI-Agenten</title><link>https://www.toolmesh.io/de/blog/introducing-toolmesh/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/introducing-toolmesh/</guid><description>KI-Agenten erreichen die Produktion schneller, als Governance hinterherkommt. ToolMesh ist die fehlende Kontrollschicht zwischen KI-Agenten und Unternehmenssystemen — sie steuert Tool-Calls und bindet jede API in Minuten an.

</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;KI-Agenten erreichen Produktivsysteme schneller, als Security und Governance hinterherkommen. Teams verbinden Agenten mit CRMs, Cloud-APIs, internen Datenbanken, Ticketsystemen und IoT-Geräten — aber die Infrastruktur zwischen Agent und Zielsystem hält sich nur mit Umgebungsvariablen und guten Vorsätzen zusammen.&lt;/p&gt;
&lt;p&gt;Das typische Setup sieht so aus: Ein MCP-Server hat direkten Zugriff auf API-Keys, jeder angebundene Agent erhält vollen Zugriff auf jedes Tool, und es existiert keinerlei Aufzeichnung darüber, was wann und von wem aufgerufen wurde. Für einen Prototyp reicht das. Für einen Agenten, der in derselben Session mit Stripe, dem HR-System und dem Cloud-Provider spricht, reicht es nicht.&lt;/p&gt;
&lt;p&gt;Im Unternehmenskontext verstärkt sich das Problem. Organisationen betreiben Dutzende Backend-Systeme über Teams und Abteilungen hinweg. Jedes braucht seine eigene Integration, seine eigenen Credentials, seine eigene Access-Policy. Ohne zentrale Kontrollschicht ist jede neue Agenten-Anbindung eine neue, unauditierte Vertrauensbeziehung — und die Angriffsfläche wächst mit jeder einzelnen.&lt;/p&gt;
&lt;p&gt;ToolMesh ist unsere Antwort auf diese Lücke.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-toolmesh-ist&quot;&gt;Was ToolMesh ist&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh ist die fehlende Kontrollschicht zwischen KI-Agenten und Unternehmenssystemen. Es sitzt zwischen KI-Agenten und Backend-Systemen und verwandelt unkontrollierte Tool-Calls in einen gesteuerten, auditierbaren Prozess — und bindet jede REST-API oder jeden MCP-Server in Minuten statt Monaten an.&lt;/p&gt;
&lt;p&gt;Jeder Tool-Call durchläuft eine strikte Pipeline: &lt;strong&gt;Auth → AuthZ → Credential Injection → Execution → Output Gate → Audit.&lt;/strong&gt; Wenn ein Schritt den Request nicht explizit zulässt, passiert nichts. Das Modell sieht niemals rohe Secrets. Jeder Call wird protokolliert. Outputs können gefiltert werden, bevor sie den Agenten erreichen.&lt;/p&gt;
&lt;p&gt;Es läuft als einzelnes Binary oder Docker-Container. Es ist Apache-2.0-lizenziert. Es gibt keine SaaS-Abhängigkeit.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-sechs-säulen&quot;&gt;Die sechs Säulen&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh ist um sechs Belange herum aufgebaut, die die meisten Agenten-Setups inkonsistent oder gar nicht behandeln.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;1-authentication&quot;&gt;1. Authentication&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh unterstützt OAuth 2.1 mit PKCE für interaktive Clients wie Claude Desktop, API-Keys für programmatischen Zugriff und Multi-User-Setups über eine &lt;code dir=&quot;auto&quot;&gt;users.yaml&lt;/code&gt;-Konfiguration. Jeder Request wird authentifiziert, bevor er in die Pipeline eintritt.&lt;/p&gt;
&lt;p&gt;Für einen schnellen Start genügt eine einzige Umgebungsvariable. Für die Produktion erhält man User-Identitäten mit Rollen, Plänen und Company-Kontext — ohne die Architektur zu ändern.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-authorization&quot;&gt;2. Authorization&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Zugriffskontrolle erfolgt pro Tool und pro User, betrieben von OpenFGA. DADL-Tools deklarieren ein &lt;code dir=&quot;auto&quot;&gt;access&lt;/code&gt;-Level — &lt;code dir=&quot;auto&quot;&gt;read&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;write&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;admin&lt;/code&gt; oder &lt;code dir=&quot;auto&quot;&gt;dangerous&lt;/code&gt; — und Policy-Dateien bilden diese Levels auf Rollen ab. Ist der Aufrufer für das konkrete Tool nicht autorisiert, wird der Request vor der Ausführung abgelehnt.&lt;/p&gt;
&lt;p&gt;ToolMesh verfolgt zusätzlich die CallerClass: welcher KI-Client den Request ausgelöst hat. Eine lokale Claude-Code-Session kann andere Berechtigungen haben als ein gehosteter Agent oder ein CI-Bot, die dieselbe API ansprechen. Gleiches Backend, unterschiedliche Vertrauensstufen, automatisch durchgesetzt.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;3-credential-store&quot;&gt;3. Credential Store&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Das ist der Aspekt, den die meisten Setups stillschweigend ignorieren. In einer typischen MCP-Konfiguration liegen API-Keys in Client-Configs oder Umgebungsvariablen — für das Modell sichtbar, über Maschinen verstreut, zentral nicht rotierbar.&lt;/p&gt;
&lt;p&gt;ToolMesh injiziert Credentials zur Laufzeit, serverseitig. Das Modell sieht das Tool-Interface und das gefilterte Ergebnis. Es sieht nie das Token, den Key oder das Session-Cookie. Credentials werden in der DADL-Datei per Name referenziert und zur Ausführungszeit aus dem Credential Store aufgelöst.&lt;/p&gt;
&lt;p&gt;Der Default-Store liest aus Umgebungsvariablen. Die Architektur unterstützt austauschbare Backends für zentralisiertes Secret-Management (geplant: Infisical, HashiCorp Vault).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;4-output-gate&quot;&gt;4. Output Gate&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Nicht jede API-Antwort sollte das Modell unverändert erreichen. Kundendatensätze können PII enthalten. Interne Systeme können Metadaten zurückgeben, die irrelevant oder sensibel sind. Fehlermeldungen können Infrastrukturdetails preisgeben.&lt;/p&gt;
&lt;p&gt;Das Output Gate führt JavaScript-Policies aus (über die goja-Engine), die Inputs vor der Ausführung validieren und Outputs anschließend filtern können. Anwendungsfälle reichen von PII-Redaktion über Compliance-Filterung bis hin zur kompletten Ablehnung gefährlicher Inputs. Policies sind überprüfbarer Code, keine Black Boxes.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;5-execution&quot;&gt;5. Execution&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh verbindet zwei Arten von Backends:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DADL-Backends&lt;/strong&gt; beschreiben REST-APIs deklarativ in YAML. Eine &lt;code dir=&quot;auto&quot;&gt;.dadl&lt;/code&gt;-Datei definiert Endpoints, Parameter, Authentifizierung, Error-Handling, Pagination und Retry-Logik. ToolMesh verwandelt diese Beschreibung zur Laufzeit in MCP-Tools — kein eigener Server-Code nötig. Die öffentliche &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL-Registry&lt;/a&gt; enthält derzeit Definitionen für 27 APIs mit 3.338 Tools für Provider wie GitHub, Cloudflare, GitLab, Stripe, DeepL, Hetzner Cloud und andere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MCP-Server-Backends&lt;/strong&gt; binden bestehende MCP-Server über HTTP- oder STDIO-Transport an. Wer bereits einen funktionierenden MCP-Server hat, lässt ihn von ToolMesh in dieselbe Authorization-, Credential- und Audit-Pipeline einhüllen.&lt;/p&gt;
&lt;p&gt;Beide Typen durchlaufen dieselbe Fail-closed-Pipeline. Der Backend-Typ ist ein Implementierungsdetail — die Sicherheitsgarantien sind dieselben.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;6-audit-trail&quot;&gt;6. Audit Trail&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Jeder Tool-Call wird aufgezeichnet: wer ihn aufgerufen hat, welches Tool, mit welchen Parametern, was das Ergebnis war, wie lange er gedauert hat und ob er erfolgreich war. ToolMesh bringt zwei Audit-Backends mit — strukturiertes Logging über &lt;code dir=&quot;auto&quot;&gt;slog&lt;/code&gt; für einfache Setups und einen append-only SQLite-Store für abfragbare Compliance-Audits.&lt;/p&gt;
&lt;p&gt;Wenn jemand fragt „Was hat dieser Agent letzten Dienstag eigentlich gemacht?”, lässt sich das mit einer SQL-Query beantworten statt mit einem Schulterzucken.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dadl-deklarieren-statt-programmieren&quot;&gt;DADL: deklarieren statt programmieren&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das Integrationsproblem im Agenten-Tooling ist nicht das Protokoll. Das hat MCP gelöst. Das Problem ist, dass jede neue API immer noch einen neuen MCP-Server erfordert — eine neue Codebasis, eine neue Runtime, eine neue Wartungslast. Die meisten Teams stoppen nach einer Handvoll Integrationen, weil die Kosten pro API zu hoch sind.&lt;/p&gt;
&lt;p&gt;DADL (Declarative API Description Language) verfolgt einen anderen Ansatz. Statt für jede API einen eigenen Server zu schreiben, beschreibt man die API in YAML:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;backend&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;deepl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;base_url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://api.deepl.com/v2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bearer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;credential&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;deepl_auth_key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;translate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/translate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;access&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Translate text into a target language&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;target_lang&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Das ist eine vollständige Tool-Definition. ToolMesh übernimmt zur Laufzeit Authentifizierung, Parameter-Mapping, Error-Handling, Retries und Credential-Injection.&lt;/p&gt;
&lt;p&gt;Weil DADL kompakt und deklarativ ist, können LLMs aus bestehender API-Dokumentation funktionierende Definitionen generieren. Die meisten der frühen Definitionen in der Registry wurden von Claude in unter einer Minute aus API-Docs erzeugt und anschließend reviewt und nachjustiert. Das Format ist AI-nativ gedacht: leicht für Maschinen zu produzieren, leicht für Menschen zu reviewen.&lt;/p&gt;
&lt;p&gt;Dazu haben wir einen eigenen Deep Dive geschrieben: &lt;a href=&quot;https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/&quot;&gt;Stop Rebuilding REST API Wrappers for MCP&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;code-mode-skalierung-die-sonst-nicht-funktioniert&quot;&gt;Code Mode: Skalierung, die sonst nicht funktioniert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;15 MCP-Server mit einem einzigen KI-Agenten verbinden? Ohne ToolMesh funktioniert das schlicht nicht — das Kontextfenster läuft voll, der Client streikt. Mit ToolMesh ist es kein Problem.&lt;/p&gt;
&lt;p&gt;Statt Hunderte einzelner MCP-Tools zu exponieren, exponiert ToolMesh zwei Meta-Tools: &lt;code dir=&quot;auto&quot;&gt;list_tools&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt;. Das Modell erhält eine kompakte TypeScript-Interface-Beschreibung (~1.000 Tokens statt 50.000+) und schreibt JavaScript dagegen. Ein einzelner Codeblock kann mehrere API-Calls in einem einzigen Roundtrip verketten.&lt;/p&gt;
&lt;p&gt;Das ist der Unterschied zwischen „funktioniert nicht” und „läuft einfach”.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;self-hosted-open-source&quot;&gt;Self-hosted, Open Source&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ToolMesh ist Apache-2.0-lizenziert. Das Binary ist self-contained — keine externen Abhängigkeiten für den Core-Funktionsumfang. &lt;code dir=&quot;auto&quot;&gt;docker compose up&lt;/code&gt; liefert eine laufende Instanz mit OAuth, Audit-Logging und einer Auswahl an DADL-Backends.&lt;/p&gt;
&lt;p&gt;Es gibt keine Cloud-Abhängigkeit. Deine Credentials, deine Audit-Logs, deine Policies — alles auf eigener Infrastruktur. Der Core ist Open Source und bleibt es.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;loslegen&quot;&gt;Loslegen&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Der schnellste Weg von null zu einem funktionierenden Setup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Repo klonen und &lt;code dir=&quot;auto&quot;&gt;docker compose up&lt;/code&gt; ausführen&lt;/li&gt;
&lt;li&gt;MCP-Client so konfigurieren, dass er auf ToolMesh zeigt&lt;/li&gt;
&lt;li&gt;Den ersten Tool-Call absetzen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Der &lt;a href=&quot;https://www.toolmesh.io/de/getting-started/&quot;&gt;Getting-Started-Guide&lt;/a&gt; führt das im Detail durch. Die &lt;a href=&quot;https://www.toolmesh.io/de/architecture/&quot;&gt;Architektur-Übersicht&lt;/a&gt; erklärt, wie die Pipeline arbeitet. Die &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL-Registry&lt;/a&gt; enthält gebrauchsfertige Definitionen für 27 APIs.&lt;/p&gt;
&lt;p&gt;ToolMesh liegt auf &lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh&quot;&gt;GitHub&lt;/a&gt;. Issues, Feedback und DADL-Beiträge sind willkommen.&lt;/p&gt;</content:encoded><category>announcement</category><category>ToolMesh</category><category>MCP</category><category>Security</category></item><item><title>Hört auf, REST-API-Wrapper für MCP nachzubauen</title><link>https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/dadl-the-end-of-mcp-server-boilerplate/</guid><description>Selbst ein abgespeckter MCP-Wrapper sind 90 Zeilen TypeScript. Produktions-Wrapper wachsen auf über 200 Zeilen. Dieselbe Integration in DADL braucht 40 Zeilen YAML — und der eigentliche Gewinn ist nicht die Zeilenzahl.

</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jeder REST-zu-MCP-Wrapper beginnt gleich. Man sucht sich eine API aus, öffnet die Doku und fängt an, Glue-Code zu schreiben. Authentifizierung, Parameter-Mapping, Error-Handling, Pagination, Retries, Response-Aufbereitung. Zweihundert Zeilen später hat man eine Integration. Dann fängt man bei der nächsten API von vorn an.&lt;/p&gt;
&lt;p&gt;Die eigentlichen Kosten sind nicht die 200 Zeilen. Es ist die Tatsache, dass man Execution Policy — Credential-Handling, Zugriffskontrolle, Audit Logging — um jeden einzelnen Wrapper herum neu implementiert. Diese Arbeit ist teuer, repetitiv und schwer zu skalieren.&lt;/p&gt;
&lt;p&gt;DADL geht einen anderen Weg: Statt für jede REST-API einen eigenen Wrapper zu schreiben, beschreibt man die API deklarativ. ToolMesh verwandelt diese Beschreibung in Tools und übernimmt die Laufzeitbelange — auch die, die die meisten Wrapper stillschweigend ignorieren: Credential-Isolation, Autorisierung und Audit Logging.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;der-wrapper-den-man-immer-wieder-neu-baut&quot;&gt;Der Wrapper, den man immer wieder neu baut&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Hier ist ein minimaler MCP-Server für einen einzelnen DeepL-Übersetzungs-Endpoint in TypeScript. Auf das Nötigste reduziert — keine Tests, keine Retries, keine Pagination, kein Rate Limiting:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { Server } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@modelcontextprotocol/sdk/server/index.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { StdioServerTransport } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@modelcontextprotocol/sdk/server/stdio.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CallToolRequestSchema,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ListToolsRequestSchema,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@modelcontextprotocol/sdk/types.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DEEPL_API_KEY&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;DEEPL_API_KEY required&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Server&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ name: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;deepl-mcp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, version: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.0.0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ capabilities: { tools: {} } }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRequestHandler&lt;/span&gt;&lt;span&gt;(ListToolsRequestSchema, &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tools: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;translate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Translate text into a target language. &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Supports up to 50 texts per request.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inputSchema: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;properties: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;items: { type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Array of texts to translate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;target_lang: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Target language code (EN-US, DE, FR ...)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;source_lang: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Source language code. Omit for auto-detect&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;formality: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enum: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;more&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;less&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;prefer_more&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;prefer_less&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;required: [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;target_lang&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRequestHandler&lt;/span&gt;&lt;span&gt;(CallToolRequestSchema, &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;translate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;Unknown tool: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const { &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;target_lang&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;source_lang&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;formality&lt;/span&gt;&lt;span&gt; } =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;arguments&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt; = { &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;target_lang&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (source_lang) body&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;source_lang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; source_lang;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (formality) body&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;formality&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; formality;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.deepl.com/v2/translate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;method: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Authorization: &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;DeepL-Auth-Key &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Content-Type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;application/json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body: &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(body)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ok&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content: [{ type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, text: &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;DeepL error &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; }],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;isError: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content: [{ type: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, text: &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(data, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;) }],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;transport&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;StdioServerTransport&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt;(transport);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Das sind &lt;strong&gt;90 Zeilen&lt;/strong&gt; für einen einzigen Endpoint — bereits auf das Minimum reduziert. Keine Retries. Kein Rate-Limit-Handling. Keine Pagination. Kein strukturiertes Error-Mapping. Und der API-Key liegt in einer Umgebungsvariable, wodurch Credentials oft ohne zentrale Governance über Client- und Server-Konfigurationen verstreut sind.&lt;/p&gt;
&lt;p&gt;Ein produktionsreifer Wrapper mit mehreren Endpoints, ordentlichem Error-Handling, Retry-Logik und Rate Limiting wächst leicht auf über &lt;strong&gt;200 Zeilen&lt;/strong&gt; — plus &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, Build-Schritt und ein Prozess, der laufen muss.&lt;/p&gt;
&lt;p&gt;Jetzt multipliziere das mit jeder API, die angebunden werden soll.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dieselbe-integration-in-dadl&quot;&gt;Dieselbe Integration in DADL&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Hier ist dasselbe DeepL-Übersetzungs-Tool in DADL beschrieben:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;backend&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;deepl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;base_url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://api.deepl.com/v2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;DeepL translation API&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;:                              &lt;/span&gt;&lt;span&gt;# ← credential injection handled by ToolMesh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bearer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;credential&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;deepl_auth_key&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;#   references a server-side secret, never exposed to the model&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;DeepL-Auth-Key &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;:                          &lt;/span&gt;&lt;span&gt;# ← retry and error handling for all tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retry_on&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;502&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;503&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;529&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retry_strategy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;max_retries&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;backoff&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;exponential&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;initial_delay&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;translate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;method&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/translate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;access&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;# ← access classification for authorization&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Translate text into a target language&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;:                        &lt;/span&gt;&lt;span&gt;# ← parameter mapping: type, location, validation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Array of texts to translate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;target_lang&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Target language code (EN-US, DE, FR)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;source_lang&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Source language. Omit for auto-detect&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;formality&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;default, more, less, prefer_more, prefer_less&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;40 Zeilen YAML.&lt;/strong&gt; Kein Code. Kein Build-Schritt. Keine eigene Server-Runtime, die gebaut und betrieben werden muss.&lt;/p&gt;
&lt;p&gt;Doch kürzer ist nicht der Punkt. Der Punkt ist, was zur Laufzeit passiert.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;der-control-layer-den-man-nicht-selbst-baut&quot;&gt;Der Control Layer, den man nicht selbst baut&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die meisten handgeschriebenen Wrapper konzentrieren sich auf eine Sache: eine API aufrufbar machen. Sie bekommen den Request raus und die Response zurück. Das ist notwendig, aber für den Produktionsbetrieb nicht ausreichend.&lt;/p&gt;
&lt;p&gt;Die schwierigeren Fragen sind: Wer darf dieses Tool aufrufen? Wo liegen die Credentials? Was passiert mit sensiblen Daten in der Response? Gibt es einen Audit Trail?&lt;/p&gt;
&lt;p&gt;Bei einem eigenen Wrapper werden diese Aspekte entweder nachträglich drangeschraubt oder stillschweigend ignoriert. Mit DADL und ToolMesh sind sie der Default:&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Concern&lt;/th&gt;&lt;th&gt;Custom MCP wrapper&lt;/th&gt;&lt;th&gt;DADL + ToolMesh&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Credentials&lt;/td&gt;&lt;td&gt;In der Client-Konfiguration, sichtbar für das Modell&lt;/td&gt;&lt;td&gt;Serverseitig zur Laufzeit injiziert, nie offengelegt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Autorisierung&lt;/td&gt;&lt;td&gt;Typischerweise keine — voller Zugriff für alle&lt;/td&gt;&lt;td&gt;Pro Tool, pro Benutzer Zugriffskontrolle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Audit Logging&lt;/td&gt;&lt;td&gt;Nicht eingebaut&lt;/td&gt;&lt;td&gt;Jeder Aufruf protokolliert und abfragbar&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Output Filtering&lt;/td&gt;&lt;td&gt;Nicht eingebaut&lt;/td&gt;&lt;td&gt;Policies können sensible Daten redigieren, bevor sie das Modell erreichen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Retries&lt;/td&gt;&lt;td&gt;Backoff-Logik selbst implementieren&lt;/td&gt;&lt;td&gt;Deklariert in &lt;code dir=&quot;auto&quot;&gt;retry_strategy&lt;/code&gt;, von der Runtime gehandhabt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagination&lt;/td&gt;&lt;td&gt;Cursor-/Offset-Logik selbst bauen&lt;/td&gt;&lt;td&gt;Konfiguriert via &lt;code dir=&quot;auto&quot;&gt;pagination.strategy&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Error-Handling&lt;/td&gt;&lt;td&gt;Responses manuell parsen&lt;/td&gt;&lt;td&gt;Strukturiert via &lt;code dir=&quot;auto&quot;&gt;errors.message_path&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Deployment&lt;/td&gt;&lt;td&gt;Bauen, paketieren, Prozess betreiben&lt;/td&gt;&lt;td&gt;Eine &lt;code dir=&quot;auto&quot;&gt;.dadl&lt;/code&gt;-Datei in ToolMesh ablegen&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;DADL beschreibt, was diese API ist. ToolMesh kümmert sich darum, wie Aufrufe an sie ausgeführt und kontrolliert werden. Diese Trennung ist die architektonische Verschiebung, auf die es ankommt — nicht nur die Zeilenzahl.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;du-schreibst-es-nicht--dein-llm-tut-es&quot;&gt;Du schreibst es nicht — dein LLM tut es&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;DADL wurde von Anfang an AI-native entworfen. Das Format ist kompakt, deklarativ und nah an der Struktur bestehender API-Spezifikationen.&lt;/p&gt;
&lt;p&gt;Das heißt: Man kann seinem LLM einen OpenAPI-Spec, eine Swagger-Definition oder sogar rohe API-Dokumentation geben und es bitten, daraus eine DADL-Datei zu erzeugen. In den meisten Fällen ist das Ergebnis im ersten Durchlauf brauchbar. Reviewen, Edge Cases anpassen, deployen.&lt;/p&gt;
&lt;p&gt;Im Vergleich dazu: ein LLM dazu bringen, einen kompletten MCP-Server zu generieren. Das Modell muss funktionierenden Code produzieren — Imports, Typdefinitionen, Error-Handling, Transport-Setup, Build-Konfiguration. Jede Zeile ist ein potenzieller Bug. Der Output muss getestet, debugged und manuell validiert werden, bevor er auch nur in die Nähe von Production kommt.&lt;/p&gt;
&lt;p&gt;Mit DADL produziert das LLM eine Datenstruktur. Stimmt ein Feld nicht, ändert man eine Zeile YAML. Fehlt ein Parameter, fügt man drei Zeilen hinzu. Wenn etwas bricht, ist es häufiger ein reviewbares Spec-Problem als eine undurchsichtige Runtime-Exception irgendwo in generiertem Integrationscode.&lt;/p&gt;
&lt;p&gt;Das ist der eigentliche Hebel. DADL ist nicht nur einfacher für Menschen zu schreiben. Es ist dramatisch einfacher für KI, korrekt zu erzeugen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;wie-das-skaliert&quot;&gt;Wie das skaliert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das DeepL-Beispiel oben deckt einen einzigen Endpoint ab. Echte APIs haben Dutzende.&lt;/p&gt;
&lt;p&gt;Die vollständige &lt;a href=&quot;https://dadl.ai&quot;&gt;DeepL-DADL-Definition&lt;/a&gt; deckt 13 Tools ab — Übersetzung, Dokumenten-Upload, Dokumenten-Status, Glossare, Textverbesserung, Sprachlisten, Usage-Tracking — in unter 500 Zeilen YAML. Die &lt;a href=&quot;https://dadl.ai&quot;&gt;GitHub-Definition&lt;/a&gt; deckt 202 Tools ab: Repositories, Issues, Pull Requests, Commits, Code-Suche und mehr. Das als handgeschriebenen MCP-Server zu bauen ist kein Wochenend-Projekt. Das ist ein Produkt.&lt;/p&gt;
&lt;p&gt;Aktuell enthält die &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL Registry&lt;/a&gt; 27 Backend-Definitionen mit 3.338 Tools über APIs wie GitHub, Cloudflare, Hetzner Cloud, Linode, GitLab und andere. Jede davon ist eine einzelne reviewbare YAML-Datei.&lt;/p&gt;
&lt;p&gt;Mit wachsender Anzahl an Tools kommt eine weitere Skalierungsfrage: Context-Window-Overhead. ToolMesh begegnet dem mit Code Mode, bei dem das Modell über zwei Meta-Tools arbeitet — &lt;code dir=&quot;auto&quot;&gt;list_tools&lt;/code&gt; und &lt;code dir=&quot;auto&quot;&gt;execute_code&lt;/code&gt; — anstatt Hunderte von Tool-Definitionen direkt im Kontext mitzuschleppen. Damit bleibt die Tool-Discovery effizient, egal wie viele Backends angebunden sind.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;was-dadl-nicht-tut&quot;&gt;Was DADL nicht tut&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;DADL ist ein deklaratives Format zur Beschreibung von REST-APIs. Es ist keine Workflow-Engine, keine General-Purpose-Programmiersprache und kein Ersatz für jede Art von MCP-Server.&lt;/p&gt;
&lt;p&gt;Wenn eine Integration eigene Business-Logik, komplexe mehrstufige Orchestrierung oder Nicht-REST-Protokolle braucht, ist ein eigener Server weiterhin die richtige Wahl. ToolMesh kann auch damit umgehen — es verbindet sowohl DADL-beschriebene Backends als auch bestehende MCP-Server.&lt;/p&gt;
&lt;p&gt;Aber für die große Klasse von Integrationen, die im Kern „eine REST-API mit den richtigen Auth-Daten und Parametern aufrufen” sind — und das sind die meisten — ist ein eigener Wrapper ein schlechter Default. Er dupliziert Infrastruktur-Aspekte, verteilt Kontroll-Logik über Codebases und erzeugt Wartungsaufwand, der keinen einzigartigen Mehrwert bringt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-verschiebung&quot;&gt;Die Verschiebung&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das MCP-Ökosystem hat das Protokoll-Problem gelöst. Clients und Hosts sprechen dieselbe Sprache.&lt;/p&gt;
&lt;p&gt;Aber Protokoll-Standardisierung hat Backend-Integration nicht günstig gemacht. Jede neue API bedeutet immer noch einen neuen Server, eine neue Codebase, eine neue Runtime, eine neue Wartungslast. Genau deshalb hören die meisten Teams nach einer Handvoll Integrationen auf, und der lange Schwanz nützlicher APIs bleibt nicht angebunden.&lt;/p&gt;
&lt;p&gt;DADL ändert die Arbeitseinheit. Statt „einen Server bauen” wird die Aufgabe „die API beschreiben.” Statt eines Software-Projekts pro Integration bekommt man eine reviewbare YAML-Datei pro Backend — ausgeführt über eine Runtime, die Sicherheit, Credentials und Governance zentral handhabt.&lt;/p&gt;
&lt;p&gt;Das ist nicht nur weniger Code. Es ist weniger Varianz, weniger Risiko und ein fundamental besserer Default, um KI-Agenten an reale Systeme anzubinden.&lt;/p&gt;
&lt;p&gt;Stöbere in der &lt;a href=&quot;https://dadl.ai&quot;&gt;DADL Registry&lt;/a&gt;, wirf einen Blick in die &lt;a href=&quot;https://www.toolmesh.io/de/getting-started/&quot;&gt;ToolMesh-Dokumentation&lt;/a&gt; oder den Quellcode auf &lt;a href=&quot;https://github.com/DunkelCloud/ToolMesh&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>DADL</category><category>MCP</category><category>Developer Experience</category></item><item><title>Warum MCP-Gateways allein das eigentliche Problem nicht lösen</title><link>https://www.toolmesh.io/de/blog/why-mcp-gateways-alone-dont-solve-the-real-problem/</link><guid isPermaLink="true">https://www.toolmesh.io/de/blog/why-mcp-gateways-alone-dont-solve-the-real-problem/</guid><description>Gateways sind notwendig für die sichere Ausführung von Agenten, aber sie lösen das eigentliche Skalierungsproblem nicht. Die MCP-Ära braucht eine Description-Schicht, die das Erstellen von Backends trivial macht.

</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;KI-Agenten, die Produktionssysteme berühren, brauchen zwei Dinge.&lt;/p&gt;
&lt;p&gt;Erstens brauchen sie eine &lt;strong&gt;sichere Ausführungsschicht&lt;/strong&gt;: Authentifizierung, Autorisierung, Credential-Isolation, Audit-Logging, Output-Kontrollen und eine Runtime, die fail-closed reagiert, wenn etwas nicht stimmt.&lt;/p&gt;
&lt;p&gt;Zweitens brauchen sie einen &lt;strong&gt;günstigen Weg, Backends bereitzustellen&lt;/strong&gt;: nicht nur ein oder zwei handgebaute Integrationen, sondern Dutzende oder Hunderte echter Systeme, die zu nutzbaren Tools werden, ohne dass jede API zu einem eigenen kleinen Softwareprojekt wird.&lt;/p&gt;
&lt;p&gt;Die meisten aktuellen MCP-Diskussionen drehen sich fast ausschließlich um das erste Problem.&lt;/p&gt;
&lt;p&gt;Das ist nachvollziehbar. Das erste Problem ist beängstigend. Wenn ein Agent Produktions-Tools aufrufen kann, ist der Blast Radius real. Credentials lecken. PII rutscht durch. Audit-Trails gehen verloren. Ein halluzinierter Aufruf kann zu einem echten Incident werden.&lt;/p&gt;
&lt;p&gt;Also ja, Gateways sind wichtig.&lt;/p&gt;
&lt;p&gt;Sie sind die fehlende Control Plane zwischen dem Modell und den Systemen, auf die es ankommt.&lt;/p&gt;
&lt;p&gt;Aber sie lösen das tiefere Skalierungsproblem &lt;strong&gt;nicht&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dieses Problem sitzt eine Schicht früher.&lt;/p&gt;
&lt;p&gt;Der eigentliche Engpass liegt nicht darin, wie wir Tool-Calls proxen.&lt;/p&gt;
&lt;p&gt;Der eigentliche Engpass ist, dass das Erstellen von Backends nach wie vor viel zu teuer ist.&lt;/p&gt;
&lt;p&gt;Deshalb lösen MCP-Gateways allein das eigentliche Problem nicht.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;mcp-hat-das-interface-problem-gelöst&quot;&gt;MCP hat das Interface-Problem gelöst&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;MCP ist wichtig, weil es dem Ökosystem einen gemeinsamen Weg gibt, Tools zu entdecken und aufzurufen. Das ist bereits ein großer Schritt nach vorn. Es beseitigt unmittelbar eine ganze Klasse von Integrationsschmerzen: Clients und Hosts brauchen kein eigenes Protokoll mehr für jeden Tool-Anbieter.&lt;/p&gt;
&lt;p&gt;Das ist echter Fortschritt.&lt;/p&gt;
&lt;p&gt;Aber es ist nur ein Teil des Stacks.&lt;/p&gt;
&lt;p&gt;Ein Protokollstandard ist nicht dasselbe wie ein skalierbares Integrationsmodell.&lt;/p&gt;
&lt;p&gt;HTTP hat nicht die Notwendigkeit beseitigt, APIs zu entwerfen.
OpenAPI hat nicht die Notwendigkeit beseitigt, Services zu bauen.
Kubernetes hat nicht die Notwendigkeit beseitigt, gute Anwendungen zu schreiben.&lt;/p&gt;
&lt;p&gt;Auf die gleiche Weise beseitigt MCP nicht die Arbeit, die nötig ist, um reale Systeme als nützliche, sichere und wartbare Tools verfügbar zu machen.&lt;/p&gt;
&lt;p&gt;Es standardisiert die Invocation.
Es macht Integrationen nicht günstig.&lt;/p&gt;
&lt;p&gt;Diese Unterscheidung lässt sich in frühen Demos leicht übersehen, weil die ersten paar Tools immer die einfachsten sind. Ein simpler GitHub-Wrapper. Ein leichtgewichtiges Stripe-Beispiel. Ein interner Endpoint, der zum Proof of Concept wird.&lt;/p&gt;
&lt;p&gt;Das reicht, damit das Protokoll wie die ganze Geschichte aussieht.&lt;/p&gt;
&lt;p&gt;Das ist es nicht.&lt;/p&gt;
&lt;p&gt;Der schwierige Teil beginnt, wenn sich die Frage ändert von &lt;em&gt;„Können wir ein Tool bereitstellen?”&lt;/em&gt; zu &lt;em&gt;„Können wir fünfzig Backends bereitstellen, ohne fünfzig kleine Softwareprodukte zu bauen?”&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;gateways-lösen-runtime-kontrolle-nicht-die-ökonomie-der-integration&quot;&gt;Gateways lösen Runtime-Kontrolle, nicht die Ökonomie der Integration&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ein ernstzunehmender MCP-Einsatz braucht eine Runtime, die zwischen Agenten und Backends sitzt.&lt;/p&gt;
&lt;p&gt;Diese Runtime sollte den Aufrufer verifizieren, Autorisierung durchsetzen, Credentials zur Laufzeit injizieren, jeden Aufruf protokollieren und Output-Kontrollen anwenden, bevor sensible Daten das Modell oder den Nutzer erreichen. Sie sollte fail-closed reagieren. Wenn eine Prüfung fehlschlägt, läuft nichts.&lt;/p&gt;
&lt;p&gt;Genau dafür ist ein Gateway da.&lt;/p&gt;
&lt;p&gt;Und genau hier passt ToolMesh hinein: eine selbst gehostete Ausführungsschicht zwischen Agenten und Infrastruktur, die Autorisierung, Secret-Injection, Audit-Logging und Output-Policies bei jedem Tool-Call durchsetzt. Diese Schicht ist nicht optional, wenn ein Agent Produktionssysteme berührt. Sie ist der Unterschied zwischen einer schicken Demo und einer Produktivarchitektur.&lt;/p&gt;
&lt;p&gt;Aber ein Gateway regelt nur das, was bereits existiert.&lt;/p&gt;
&lt;p&gt;Es kann Tool-Calls absichern.
Es kann Policy zentralisieren.
Es kann die Ausführung beobachtbar machen.&lt;/p&gt;
&lt;p&gt;Was es allein nicht kann, ist die Kostenstruktur zu ändern, mit der die Tools überhaupt erst gebaut werden.&lt;/p&gt;
&lt;p&gt;In diese Falle laufen viele Teams gerade hinein.&lt;/p&gt;
&lt;p&gt;Sie verbessern die Control-Schicht und gehen davon aus, dass das Skalierungsproblem gelöst sei.&lt;/p&gt;
&lt;p&gt;In Wirklichkeit haben sie den oberen Teil des Funnels abgesichert und den Engpass beim Erstellen unangetastet gelassen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;das-eigentliche-nm-problem-sitzt-vorgelagert&quot;&gt;Das eigentliche N×M-Problem sitzt vorgelagert&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Häufig wird das N×M-Problem in MCP als Kompatibilitätsproblem beschrieben: viele Clients, viele Backends, zu viele individuelle Paarungen.&lt;/p&gt;
&lt;p&gt;MCP reduziert einen Teil davon, was gut ist.&lt;/p&gt;
&lt;p&gt;Aber das schmerzhaftere N×M-Problem liegt vorgelagert.&lt;/p&gt;
&lt;p&gt;Es liegt in der wiederholten Arbeit, die nötig ist, um Backend für Backend für Backend bereitzustellen.&lt;/p&gt;
&lt;p&gt;Für jede API bauen Teams am Ende dasselbe Bündel an Themen immer wieder neu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auth-Handling&lt;/li&gt;
&lt;li&gt;Parameter-Mapping&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Retries&lt;/li&gt;
&lt;li&gt;Error-Normalisierung&lt;/li&gt;
&lt;li&gt;Schema-Shaping&lt;/li&gt;
&lt;li&gt;Deployment-Packaging&lt;/li&gt;
&lt;li&gt;Runtime-Ownership&lt;/li&gt;
&lt;li&gt;Wartung, wenn sich die API ändert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Manchmal steckt diese Arbeit in einem eigenen MCP-Server.
Manchmal wird sie zu einem dünnen Adapter.
Manchmal wird sie als „kleine Integration” getarnt.&lt;/p&gt;
&lt;p&gt;Aber es ist jedes Mal dasselbe Muster.&lt;/p&gt;
&lt;p&gt;Deshalb fühlen sich wrapper-lastige Ansätze am Anfang gut an und im Maßstab fürchterlich.&lt;/p&gt;
&lt;p&gt;Die erste Integration ist spannend.
Die fünfte ist handhabbar.
Die zwölfte wird zum Priorisierungsproblem.
Bei der zwanzigsten fangen Teams an, nur noch die Endpoints freizugeben, die sie zwingend brauchen.&lt;/p&gt;
&lt;p&gt;Alles andere landet im Backlog.&lt;/p&gt;
&lt;p&gt;Das Ergebnis ist bekannt: eine Landschaft aus halben Wrappern, lückenhafter Abdeckung, dupliziertem Boilerplate, mehreren Runtimes und einem Long Tail von APIs, die Agenten nie zur Verfügung stehen.&lt;/p&gt;
&lt;p&gt;Das ist kein Gateway-Versagen.
Es ist ein Versagen beim Backend-Erstellen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bessere-proxies-machen-das-erstellen-von-backends-nicht-trivial&quot;&gt;Bessere Proxies machen das Erstellen von Backends nicht trivial&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Das ist der Kernpunkt.&lt;/p&gt;
&lt;p&gt;Ein besserer Proxy kann Sicherheit, Konsistenz und Beobachtbarkeit verbessern.&lt;/p&gt;
&lt;p&gt;Er kann nicht verhindern, dass ein Wrapper ein Wrapper bleibt.&lt;/p&gt;
&lt;p&gt;Wenn jedes neue Backend immer noch mit &lt;em&gt;„jemand muss einen eigenen MCP-Server bauen und betreiben”&lt;/em&gt; beginnt, ist die Ökonomie weiterhin kaputt.&lt;/p&gt;
&lt;p&gt;Man kann ein wunderschön konstruiertes Gateway vor diese Welt setzen, und es wird die Produktionsreife absolut verbessern.&lt;/p&gt;
&lt;p&gt;Aber das System wird trotzdem schlecht skalieren, weil die Arbeitseinheit weiterhin zu teuer ist.&lt;/p&gt;
&lt;p&gt;Jedes zusätzliche Backend bedeutet immer noch mehr Code, mehr Packaging, mehr Deployment, mehr Ownership und mehr Oberfläche, die gewartet werden muss.&lt;/p&gt;
&lt;p&gt;Die eigentliche Frage lautet also nicht:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;„Wie setzen wir einen besseren Proxy vor MCP-Server?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Die eigentliche Frage lautet:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;„Wie machen wir das Bereitstellen eines Backends so günstig, dass der Long Tail nützlicher Systeme tatsächlich angebunden wird?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Das ist der Punkt, an dem sich die Diskussion verlagern muss.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dem-mcp-stack-fehlt-eine-description-schicht&quot;&gt;Dem MCP-Stack fehlt eine Description-Schicht&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Sobald man das Problem sauber trennt, wird die Architektur offensichtlich.&lt;/p&gt;
&lt;p&gt;Die MCP-Ära braucht drei Schichten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eine &lt;strong&gt;Protokoll-Schicht&lt;/strong&gt; für Discovery und Invocation&lt;/li&gt;
&lt;li&gt;eine &lt;strong&gt;Ausführungsschicht&lt;/strong&gt; für Governance und Runtime-Kontrolle&lt;/li&gt;
&lt;li&gt;eine &lt;strong&gt;Description-Schicht&lt;/strong&gt;, die Backends günstig bereitstellbar macht&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die erste Schicht ist MCP.
Die zweite Schicht ist das Gateway.
Die fehlende dritte Schicht ist dort, wo die meisten Ökosysteme noch unreif sind.&lt;/p&gt;
&lt;p&gt;Ohne diese dritte Schicht bleibt jedes Backend eine eigene Engineering-Übung.
Mit ihr wird das Bereitstellen von Backends zu einem deklarativen Problem.&lt;/p&gt;
&lt;p&gt;Und das ändert alles.&lt;/p&gt;
&lt;p&gt;Denn Descriptions skalieren anders als Code.&lt;/p&gt;
&lt;p&gt;Eine gute Description-Schicht verschiebt wiederkehrende Logik aus maßgeschneiderten Wrappern in gemeinsames Runtime-Verhalten. Sie macht aus dem Bereitstellen eines Backends statt eines handgebauten Servers ein kompaktes, prüfbares, deklaratives Artefakt.&lt;/p&gt;
&lt;p&gt;Das ist der architektonische Wandel, den das MCP-Ökosystem braucht, wenn es über eine Handvoll polierter Demos hinausgehen will.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dadl-ist-das-fehlende-stück&quot;&gt;DADL ist das fehlende Stück&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Genau hier kommt DADL ins Spiel.&lt;/p&gt;
&lt;p&gt;DADL, die Dunkel API Description Language, geht einen anderen Weg als die wrapper-zuerst-Integration. Statt für jede REST-API einen eigenen MCP-Server zu schreiben, wird das Backend deklarativ in YAML beschrieben, während die Runtime die Standardmechanik übernimmt, die sonst immer wieder neu gebaut würde: Authentifizierung, Pagination, Retries und Error-Mapping.&lt;/p&gt;
&lt;p&gt;Das ist nicht nur eine angenehmere Developer Experience.
Es ist ein anderes Kostenmodell.&lt;/p&gt;
&lt;p&gt;Ohne Description-Schicht ist die Standard-Arbeitseinheit: &lt;strong&gt;einen Server bauen&lt;/strong&gt;.
Mit einer Description-Schicht wird die Arbeitseinheit: &lt;strong&gt;das Backend beschreiben, es reviewen und die Runtime es sicher ausführen lassen&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Das ist eine radikal bessere Skalierungskurve.&lt;/p&gt;
&lt;p&gt;Es bedeutet, dass Teams mehr von der echten API-Oberfläche bereitstellen können, statt nach einer engen „good enough”-Auswahl zu stoppen.
Es bedeutet, dass sie nicht für jede Integration eine eigene Runtime, einen eigenen Dependency-Baum, ein Docker-Image und eine eigene Wartungslast brauchen.
Es bedeutet, dass gemeinsame Integrationslogik dort lebt, wo sie hingehört: in einer gemeinsamen Ausführungsumgebung.&lt;/p&gt;
&lt;p&gt;Und weil DADL bewusst kompakt und nahe an der Struktur bestehender API-Spezifikationen gehalten ist, öffnet es auch die Tür zu etwas noch Wichtigerem: moderne LLMs können aus einer vorhandenen API-Definition oft eine brauchbare erste Version generieren.&lt;/p&gt;
&lt;p&gt;Hier ändert sich die Kategorie wirklich.&lt;/p&gt;
&lt;p&gt;Denn sobald das Modell beim Generieren der Description helfen kann und die Runtime sie sicher ausführt, sinken die Kosten für das Anbinden eines neuen Backends um eine Größenordnung.&lt;/p&gt;
&lt;p&gt;Genau so beginnt man, den Long Tail zu erschließen.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;warum-das-der-openapi-moment-für-mcp-ist&quot;&gt;Warum das der OpenAPI-Moment für MCP ist&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Die beste Analogie hier ist nicht „noch ein Gateway” oder „noch ein Wrapper-Framework”.&lt;/p&gt;
&lt;p&gt;Es ist OpenAPI.&lt;/p&gt;
&lt;p&gt;OpenAPI hat HTTP nicht ersetzt. Es hat HTTP-Ökosysteme programmierbar gemacht. Es hat APIs auf eine Weise beschreibbar gemacht, die Tools, Docs, Code-Generatoren und Plattformen alle verstehen konnten.&lt;/p&gt;
&lt;p&gt;Diese Verschiebung war nicht glamourös, aber sie hat die Ökonomie der API-Arbeit verändert.&lt;/p&gt;
&lt;p&gt;Das MCP-Ökosystem braucht jetzt dieselbe Art von Verschiebung.&lt;/p&gt;
&lt;p&gt;MCP standardisiert bereits, wie Tools aufgerufen werden.
Was in vielen Architekturen noch fehlt, ist eine standardisierte Art, reale Backends zu beschreiben, sodass Tooling- und Runtime-Schichten die langweilige Arbeit einmal erledigen können, statt sie Teams für immer neu implementieren zu lassen.&lt;/p&gt;
&lt;p&gt;Deshalb versteht man DADL am besten als &lt;strong&gt;OpenAPI für die MCP-Ära&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nicht weil es MCP ersetzt.
Nicht weil es ein Gateway ersetzt.
Sondern weil es die fehlende Abstraktionsschicht zwischen rohen Backend-APIs und sicherer, steuerbarer Tool-Ausführung füllt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;warum-entwickler-sich-dafür-interessieren-sollten&quot;&gt;Warum Entwickler sich dafür interessieren sollten&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Für Entwickler geht es vor allem darum, der Integrationsmühsal zu entkommen.&lt;/p&gt;
&lt;p&gt;Der meiste Wrapper-Code ist kein differenzierendes Engineering. Es ist repetitive Anpassungsarbeit, die Zeit verschlingt, die Wartungslast ausdehnt und mehr Runtime-Wildwuchs als Wert erzeugt.&lt;/p&gt;
&lt;p&gt;Eine deklarative Backend-Schicht ändert das.&lt;/p&gt;
&lt;p&gt;Statt zum zehnten Mal dieselbe Auth- und Pagination-Logik zu schreiben, können Teams sich auf das konzentrieren, worauf es wirklich ankommt: Domänenverhalten, Workflows, Guardrails und die Produktlogik, die auf diesen Tools aufbaut.&lt;/p&gt;
&lt;p&gt;Ebenso wichtig: Niedrigere Integrationskosten erhöhen die API-Abdeckung.&lt;/p&gt;
&lt;p&gt;Das ist sehr relevant.&lt;/p&gt;
&lt;p&gt;Agenten-Systeme bleiben oft hinter ihrem Potenzial zurück, nicht weil das Modell schwach ist, sondern weil die verfügbare Tool-Oberfläche zu dünn ist. Das Backend unterstützt vielleicht fünfzig nützliche Operationen, aber nur sechs sind bereitgestellt, weil das Wrappen der übrigen zu teuer ist.&lt;/p&gt;
&lt;p&gt;Wenn das Erstellen von Backends günstig wird, kann die Tool-Schicht beginnen, dem tatsächlichen System zu ähneln statt den Budget-Beschränkungen des Integrations-Teams.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;warum-architekten-sich-dafür-interessieren-sollten&quot;&gt;Warum Architekten sich dafür interessieren sollten&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Für Architekten ist der Wert noch klarer.&lt;/p&gt;
&lt;p&gt;Ein Drei-Schichten-Modell trennt Verantwortlichkeiten auf die richtige Weise.&lt;/p&gt;
&lt;p&gt;MCP übernimmt die Kommunikation.
Das Gateway übernimmt Trust, Kontrolle und Auditierbarkeit.
Die Description-Schicht übernimmt die Backend-Skalierung.&lt;/p&gt;
&lt;p&gt;Das bedeutet, dass Policy nicht mehr davon abhängt, wie ein bestimmter Wrapper geschrieben wurde.
Credentials bleiben außerhalb des Modell-Kontextes.
Audit wird konsistent.
Sicherheit wird systemisch statt zufällig.&lt;/p&gt;
&lt;p&gt;Und neue Integrationen lassen sich hinzufügen, ohne jedes Mal einen neuen Snowflake-Service zu schaffen.&lt;/p&gt;
&lt;p&gt;Das ist die Art von Architektur, die Unternehmen tatsächlich wollen.&lt;/p&gt;
&lt;p&gt;Nicht einen Zoo halb gewarteter MCP-Server.
Nicht eine Zukunft, in der jedes neue Backend eine weitere Runtime bedeutet, die gepatcht und beobachtet werden muss.&lt;/p&gt;
&lt;p&gt;Sie wollen eine stabile Ausführungsschicht und einen günstigen Weg, mehr Systeme unter diese Schicht zu bringen.&lt;/p&gt;
&lt;p&gt;Genau deshalb reichen Gateways allein nicht aus.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;die-zukunft-ist-nicht-gateway-gegen-description-schicht&quot;&gt;Die Zukunft ist nicht Gateway gegen Description-Schicht&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Sie ist Gateway &lt;strong&gt;plus&lt;/strong&gt; Description-Schicht.&lt;/p&gt;
&lt;p&gt;Das ist keine Entweder-oder-Wahl.&lt;/p&gt;
&lt;p&gt;Man braucht MCP, weil das Ökosystem ein gemeinsames Protokoll braucht.
Man braucht ein Gateway, weil Produktions-Tool-Calls Governance brauchen.
Und man braucht eine Description-Schicht, weil sich keine Organisation leisten kann, das Bereitstellen von Backends über endlose handgebaute Wrapper zu skalieren.&lt;/p&gt;
&lt;p&gt;Das ist der Stack.&lt;/p&gt;
&lt;p&gt;MCP standardisiert die Invocation.
ToolMesh sichert die Ausführung.
DADL macht das Erstellen von Backends günstig genug, um zu skalieren.&lt;/p&gt;
&lt;p&gt;Sobald man das Problem so sieht, fällt es leichter, das Marktrauschen zu ignorieren.&lt;/p&gt;
&lt;p&gt;Die Gewinner in diesem Bereich werden nicht die Teams mit der hübschesten Proxy-Geschichte sein.
Es werden die Teams sein, die beide Seiten der Gleichung lösen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sichere Ausführung für reale Systeme&lt;/li&gt;
&lt;li&gt;triviales Erstellen für reale Backends&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;das-eigentliche-problem&quot;&gt;Das eigentliche Problem&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Also ja, baut das Gateway.
Es wird gebraucht.&lt;/p&gt;
&lt;p&gt;Aber verwechselt Runtime-Kontrolle nicht mit Integrations-Skalierung.&lt;/p&gt;
&lt;p&gt;Das eigentliche Problem ist nicht, dass MCP bessere Proxies braucht.
Das eigentliche Problem ist, dass das Ökosystem das Bereitstellen von Backends nach wie vor als individuelle Software-Arbeit behandelt, obwohl es eine deklarative Operation sein sollte.&lt;/p&gt;
&lt;p&gt;Solange das so bleibt, wird der Long Tail nützlicher Systeme abgehängt bleiben, und Agenten-Infrastruktur wird immer wieder gegen dieselbe Decke stoßen.&lt;/p&gt;
&lt;p&gt;Diese Decke bricht nicht, indem man härter proxt.&lt;/p&gt;
&lt;p&gt;Sie bricht, wenn das Erstellen von Backends trivial wird.&lt;/p&gt;
&lt;p&gt;Deshalb lösen MCP-Gateways allein das eigentliche Problem nicht.&lt;/p&gt;
&lt;p&gt;Und deshalb ist DADL wichtig.&lt;/p&gt;
&lt;p&gt;Nicht als Komfort-Feature.
Nicht als Sidecar-Format.
Sondern als die fehlende Description-Schicht, die sicheres Agenten-Tooling von handwerklicher Praxis in ein skalierbares System verwandelt.&lt;/p&gt;
&lt;p&gt;In diesem Sinne ist der eigentliche Durchbruch nicht nur sicherere Tool-Calls.&lt;/p&gt;
&lt;p&gt;Es ist, das Erstellen von Backends endlich günstig genug zu machen, damit die MCP-Ära skalieren kann.&lt;/p&gt;</content:encoded><category>AI</category><category>MCP</category><category>Architecture</category></item></channel></rss>