Die Werkzeugoberfläche für Agenten
Ein Agent kann über das Model Context Protocol durch BetterTranslator übersetzen. Es ist dieselbe Übersetzung, die das Fenster erzeugt, über dieselbe Factory und dieselben Sicherungen, und die Ergebnisse landen in derselben Chat-Historie.
Was es ist
Die Umsetzung ist das C#-Paket ModelContextProtocol 2.1.0. Der Server meldet sich als bettertranslator
und trägt Anweisungen, die der Agent beim Verbinden liest. Eine Agentenübersetzung wird nach Inhalt geleitet, zuerst JSON, dann Markdown, dann Fließtext, und wird Einheit für Einheit gesendet statt als eine Alles-oder-nichts-Generierung. Die gespeicherte Temperatur und die Daueranweisung aus dem erweiterten Panel reisen mit, dieselbe Prüfung läuft anschließend, und die Befunde des Zusammensetzens kommen als Hinweis an.
Zwei Transportwege
Beide registrieren dieselben zehn Werkzeuge über denselben Codepfad.
- Eine Pipe, die der Agent startet, über
bt mcp - Ein HTTP-Endpunkt, gehostet in der Anwendung, abgebildet auf
/mcp
Es gibt einen Verhaltensunterschied. Ein separat gestarteter Pipe-Server hat kein Fenster, mit dem er sprechen könnte, also meldet das Werkzeug, das einen Eintrag in der Oberfläche anzeigt, dass es kein Fenster gibt: show_in_gui
Die zehn Werkzeuge
Ein Test stellt sicher, dass die ausgelieferte Oberfläche genau aus diesen zehn Werkzeugen besteht und aus nichts sonst.
| Werkzeug | Was es tut |
|---|---|
| translate_text | Synchron. Nimmt den Text sowie eine Quell- und eine Zielsprache und antwortet mit dem Ergebnis, dem Modell, einer Tokenzahl, einer Dauer, einem etwaigen Hinweis und der Kennung des gespeicherten Eintrags. |
| translate_file | Asynchron. Antwortet mit einer Auftragskennung und dem Zustand eingereiht, und meldet einen Fehler noch vor dem Einreihen, wenn die Datei nicht existiert oder es für das Format keinen Leser gibt. |
| translate_batch | Asynchron. Antwortet mit einer Auftragskennung, dem Ordner und der Dateianzahl. Es werden nur die Dateien unmittelbar im Ordner genommen. |
| job_status | Das Abfragewerkzeug für beide asynchronen Aufträge. Antwortet mit dem Zustand, dem Fortschritt und einer Ergebniszeile je Datei. Idempotent. |
| job_cancel | Bereits geschriebene Dateien bleiben geschrieben, der Rest wird nicht übersetzt. Der Aufruf auf einem abgeschlossenen Auftrag ändert nichts. |
| list_languages | Keine Parameter. Antwortet mit dem Modell und einer Zeile je Sprache mit Code, Name, Endonym, Schrift, Laufrichtung, Verfügbarkeit und Begründung. |
| list_models | Keine Parameter. Antwortet mit Name, Datei, Pfad, Größe sowie den Flags installiert und ausgewählt je Modell. |
| select_model | Trifft über Name, Dateiname oder vollständigen Pfad zu. Die Wahl wird gespeichert und überdauert den Server, und ein laufendes Fenster übernimmt sie sofort. |
| show_in_gui | Das eine Werkzeug, das das Fenster braucht. Ohne Fenster gibt es einen Werkzeugfehler zurück, der genau das sagt. |
| get_entry | Liest eine gespeicherte Übersetzung anhand ihrer Kennung. Es gibt kein Werkzeug, das Einträge auflistet. Quelle und Ergebnis werden gekürzt, und die Kürzung nennt, wie viele Zeichen es insgesamt waren. |
Das Gedächtnis ist eine Option allein am Textwerkzeug und ist aus, solange es nicht angefordert wird. An den Werkzeugen für Datei oder Ordner existiert es nicht: use_memory
Jedes Werkzeug trägt eine Beschreibung, ein Eingabeschema, in dem jede Eigenschaft beschrieben ist, ein Ausgabeschema und Annotationen, sodass ein Agent über die Werkzeugliste des Protokolls hinaus keine Dokumentation braucht.
Auftragskennungen und Abfragen
Die Bezeichner zählen aufwärts ab job_0001
Es läuft ein Auftrag zur Zeit, ein eingereihter Auftrag wartet also auf den laufenden. Ein Auftrag endet als fehlgeschlagen, wenn er keine Ergebnisse erzeugt hat oder wenn jedes Ergebnis fehlgeschlagen ist, und sonst als erledigt. Die Zustände sind: queued running done failed cancelled
Womit jedes Werkzeug antwortet
Jede Antwort trägt eine maschinenlesbare Struktur in snake_case neben einem für Menschen lesbaren Markdown-Block. Ein Fehler setzt das Fehler-Flag mit einem schlichten Satz und ohne Struktur. Tabellen sind echte Markdown-Tabellen, und jede Zelle wird gekürzt, damit ein einziger langer Wert das Transkript nicht überflutet.
Einschalten
Der Endpunkt ist standardmäßig aus. Aktiviert bindet er Loopback: 127.0.0.1:8765
Die Einstellungen haben einen Abschnitt Agent mit dem Schalter, einer Statuszeile, der Adresse, dem Token und zwei kopierbaren Registrierungsbefehlen. Der Listener stoppt und startet wieder, ohne die Anwendung neu zu starten.
Registrieren
Über HTTP, bei laufender Anwendung:
claude mcp add --transport http bettertranslator http://127.0.0.1:8765/mcp
Ist ein Token gesetzt, hängen Sie den Authorization-Header an: --header "Authorization: Bearer <token>"
Über eine Pipe, ohne laufende Anwendung:
claude mcp add -s user bettertranslator -- "<path to>\cli\bt.exe" mcp
Der vollständige Pfad ist erforderlich, weil ein bloßer Name nur dort aufgelöst wird, wo die Datei im Suchpfad für ausführbare Dateien liegt, und ein Agent, der sie nicht findet, meldet eine geschlossene Verbindung statt einer fehlenden Datei. Ein Build legt eine Kopie neben die ausführbare Datei der Anwendung. Bei einem über eine JSON-Datei konfigurierten Client ist der Eintrag ein Server über Standardeingabe und -ausgabe, dessen Befehl dieser vollständige Pfad mit einem einzigen Argument ist.
Verweigerungen und das Netz
Der Start verweigert einen Port außerhalb des gültigen Bereichs und einen leeren Host. Er verweigert außerdem jede Bindung außerhalb von Loopback ohne Token, mit der Begründung, dass die Bindung an eine öffentliche Adresse den Rechner zum Netz hin öffnet. Der Name localhost zählt als Loopback.
Ist ein Token gesetzt, wird der Authorization-Header exakt verglichen und alles andere abgewiesen.
Zwei Einschränkungen gehören im selben Atemzug zu diesen Verweigerungen. Wenn eine Bindung außerhalb von Loopback bewusst konfiguriert ist, läuft der Verkehr über einfaches HTTP, weil der Host überhaupt keinen verschlüsselten Zweig hat. Und ein Dateiauftrag von einem Agenten ist auf keinen bestimmten Ordner beschränkt.
Eine tote Verbindung diagnostizieren
Die erste Zeile auf der Standardfehlerausgabe ist ein Banner:
bettertranslator mcp <version>, built <yyyy-MM-dd HH:mm>, from <path>
Eine Build-Zeit, die älter ist als Ihre letzte Änderung, bedeutet, dass der Agent eine veraltete Kopie ohne mcp-Befehl ausführt. Neu bauen, dann erneut verbinden.
Wohin die Ergebnisse gehen
Eine Agentensitzung erhält einen eigenen Chat, benannt nach dem ersten Element darin und anschließend umbenannt von dem Modell, das gerade übersetzt hat, mit einem Eintrag je Übersetzung. Ein offenes Fenster übernimmt die Zeile ohne Neustart.
Nur das Textwerkzeug liefert eine Eintragskennung zurück, und genau die verarbeiten der Eintragsleser und das Anzeigewerkzeug: entry_id