Zum Hauptinhalt springen
Connic

Invoice Processor als MCP-Tool bereitstellen

Connics Rechnungsvorlage als MCP-Tool bereitstellen, per Python aufrufen und die extrahierten Felder prüfen: vollständiges Client-Beispiel mit Testrechnung.

11. September 202610 Min. LesezeitAutor: Connic Engineering

Connic kann die vorhandene Vorlage Invoice Processor als MCP-Tool bereitstellen. Ein Client übergibt Rechnungstext, der Agent extrahiert die Felder und prüft die Berechnungen mit Python-Tools. Die Verbindung gibt das Ergebnis zurück. Dafür genügen die Agentendateien der Vorlage und eine verwaltete MCP-Server-Verbindung.

Die Agenten der Vorlage

Die Vorlage Invoice Processor aus Connic Awesome Agents enthält drei Agenten. invoice-extractor liest Rechnungstext und gibt Felder wie Lieferant, Währung, Rechnungspositionen und Gesamtbetrag zurück. Dafür nutzt er Python-Rechentools und ein Ausgabeschema für Rechnungen. invoice-validator prüft die extrahierten Beträge deterministisch. invoice-pipeline führt beide nacheinander aus und gibt die abschließende Zusammenfassung des Validators zurück.

Diese Anleitung stellt invoice-extractor bereit, damit der Aufrufer die extrahierten Rechnungsfelder erhält. Connic hostet den MCP-Endpoint und leitet den Tool-Aufruf an den bereitgestellten Agenten weiter. Der Python-Code unten dient als Client, der diesen Endpoint untersucht und aufruft. Der Artikel zu MCP-Servern und -Clients erklärt die Rollen im Protokoll.

1. Stelle die Rechnungsvorlage bereit

Verwende Python 3.10 oder neuer in einer aktivierten virtuellen Umgebung. Erstelle für dieses CLI-Deployment ein Connic-Projekt ohne verbundenes Git-Repository. Das Projekt benötigt Guthaben für die Ausführung der Agenten und ihre Modellaufrufe. Führe die folgenden Befehle in einem Verzeichnis aus, in dem invoice-mcp noch nicht existiert.

connic login öffnet das Connic-Dashboard im Browser. Erstelle dort einen Projekt-API-Schlüssel, kopiere das angezeigte Login-Token und füge es bei der Abfrage im Terminal ein. Das Token enthält die Projekt-ID und den API-Schlüssel. Falls sich der Browser nicht öffnet, rufe die URL aus der CLI-Ausgabe auf.

terminal
pip install connic-composer-sdk
connic init invoice-mcp --templates=invoice
cd invoice-mcp
pip install -r requirements.txt
connic login
connic deploy

Öffne die Deployment-URL aus der CLI-Ausgabe und warte, bis das Deployment erfolgreich abgeschlossen und aktiv ist. Ein abgeschlossener CLI-Befehl bedeutet zunächst, dass das Deployment eingereicht wurde. Mit den Standardeinstellungen führt Connic vor der Aktivierung die enthaltenen Tests aus. Falls der Build oder ein Test fehlschlägt, prüfe zuerst die Deployment-Logs. Der Schnellstart beschreibt Deployments per CLI und Git. Projekte mit verbundenem Git-Repository verwenden ihren konfigurierten Deployment-Branch.

2. Verknüpfe den Extraktor mit einer MCP-Server-Verbindung

Öffne invoice-extractor in der Umgebung mit dem aktiven Deployment. Wähle im Verbindungsdiagramm Add inbound connector, danach Create New Connector und MCP Server. Wähle Sync (Wait for Result), lass die Authentifizierung aktiviert und erstelle die Verbindung. Verknüpfe für dieses Beispiel nur den Extraktor.

Kopiere die Endpoint-URL und das Secret aus den Verbindungsdetails. Verwende die vollständige generierte URL einschließlich der Verbindungs-ID. Dieses Secret authentifiziert Aufrufe an der Verbindung. Das Projekt-Login-Token aus Schritt 1 ist ein separater Zugangsschlüssel. Der Endpoint akzeptiert einen Authorization: Bearer-Header oder X-Connic-Secret. Die Dokumentation zur MCP-Server-Verbindung beschreibt die Konfiguration.

Ein nativer oder serverseitiger MCP-Client muss entfernte HTTP-Verbindungen und einen eigenen Authentifizierungs-Header unterstützen, um diesen Endpoint zu nutzen. Die Verbindung verwendet ein gemeinsames Secret und bietet keine Anmeldung per OAuth. Browseranfragen mit einem Origin-Header werden abgewiesen. Der folgende Terminal-Client ruft die Verbindung direkt auf.

3. Ermittle invoice_extractor mit Python

Speichere den folgenden Code als mcp_invoice.py. Er verwendet die Python-Standardbibliothek und die von Connic unterstützte Protokollversion 2026-07-28. Jede Anfrage enthält Protokollmetadaten und passende HTTP-Header. Dieses Diagnoseskript liest die JSON-Antworten, die Connic für diese Methoden in der genannten Version zurückgibt. Ein allgemeiner MCP-Client muss auch andere Antwortformen verarbeiten können. Die Streamable-HTTP-Spezifikation legt die Anforderungen an den Transport fest.

mcp_invoice.py
import json
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen

endpoint = os.environ["MCP_ENDPOINT"]
secret = os.environ["MCP_SECRET"]
protocol_version = "2026-07-28"


def request(method, params, request_id):
    params = {
        **params,
        "_meta": {
            "io.modelcontextprotocol/protocolVersion": protocol_version,
            "io.modelcontextprotocol/clientInfo": {
                "name": "invoice-tutorial",
                "version": "1.0.0",
            },
            "io.modelcontextprotocol/clientCapabilities": {},
        },
    }
    headers = {
        "Authorization": f"Bearer {secret}",
        "Content-Type": "application/json",
        "Accept": "application/json, text/event-stream",
        "MCP-Protocol-Version": protocol_version,
        "Mcp-Method": method,
    }
    if method == "tools/call":
        headers["Mcp-Name"] = params["name"]
    body = {"jsonrpc": "2.0", "id": request_id,
            "method": method, "params": params}
    http_request = Request(endpoint, json.dumps(body).encode(), headers)
    try:
        with urlopen(http_request, timeout=310) as response:
            data = json.load(response)
    except HTTPError as error:
        raise RuntimeError(
            f"HTTP {error.code}: {error.read().decode()}"
        ) from error
    if "error" in data:
        raise RuntimeError(data["error"])
    result = data["result"]
    if result.get("isError"):
        raise RuntimeError(result["content"])
    return result


tools = request("tools/list", {}, 1)["tools"]
tool = next(tool for tool in tools if tool["name"] == "invoice_extractor")
print(json.dumps(tool, indent=2))

Die MCP-Tool-Methoden trennen das Ermitteln der Tools von ihrer Ausführung: tools/list beschreibt die verfügbaren Tools, tools/call ruft eines davon auf. Connic wandelt den Agentennamen invoice-extractor in invoice_extractor um. Die ausgegebene Tool-Definition enthält ein inputSchema mit dem Pflichtfeld message vom Typ String und einem optionalen Objekt payload.

Dieses Tool-Schema beschreibt die Anfrage an den Agenten. Das Rechnungsschema der Vorlage steuert dessen Ausgabe innerhalb von Connic. Die MCP-Verbindung veröffentlicht es weder als MCP-outputSchema noch gibt sie ein Feld structuredContent zurück.

4. Rufe das Tool mit einer Beispielrechnung auf

Hänge diesen Code an dieselbe Datei an. Er sendet eine fiktive Rechnung als payload.text. Connic übernimmt die Payload-Felder in die Agenteneingabe. Der Extraktor erhält deshalb message und text auf der obersten Ebene.

mcp_invoice.py (Fortsetzung)
invoice_text = (
    "Example Supplier, invoice INV-001. "
    "Issued 2026-09-11, due 2026-09-25. "
    "Consulting: 2 hours at EUR 100, line total EUR 200. "
    "Subtotal EUR 200. Tax 19%: EUR 38. Total EUR 238."
)
result = request("tools/call", {
    "name": "invoice_extractor",
    "arguments": {
        "message": "Extract the invoice fields and check the arithmetic.",
        "payload": {"text": invoice_text},
    },
}, 2)

invoice = json.loads(result["content"][0]["text"])
print(json.dumps(invoice, indent=2))
expected = {"currency": "EUR", "subtotal": 200, "tax_amount": 38, "total": 238}
for field, value in expected.items():
    if invoice.get(field) != value:
        raise ValueError(f"Unexpected {field}: {invoice.get(field)!r}")

Ersetze beide Platzhalter durch die Verbindungsdetails aus Schritt 2. Führe die Datei in einer Shell aus, die export unterstützt. Bewahre das Secret in der lokalen Umgebung auf und übernimm es weder in Quelldateien noch in geteilte Protokolle.

terminal
export MCP_ENDPOINT='<endpoint-url>'
export MCP_SECRET='<connection-secret>'
python mcp_invoice.py

Im Sync-Modus gibt die Verbindung das Ergebnis zurück, sobald der Agent fertig ist. Sie wartet höchstens fünf Minuten. Für den Extraktor gilt weiterhin sein eigenes Timeout von 45 Sekunden. Die Hilfsfunktion prüft HTTP-Fehler, JSON-RPC-Fehler und result.isError, bevor sie den Inhalt zurückgibt. Bei einer erfolgreichen Extraktion enthält result.content[0].text das Rechnungs-JSON als String. Der zweite Codeblock decodiert diesen String.

5. Prüfe die extrahierten Felder und den Ausführungs-Trace

Die Beispielrechnung lässt sich nachrechnen: Zwei Stunden zu je 100 EUR ergeben 200 EUR netto. Bei 19 % Steuer kommen 38 EUR hinzu, der Gesamtbetrag beträgt 238 EUR. Das Skript prüft diese Zahlenfelder und die Währung. Vergleiche auch den ausgegebenen Lieferanten, die Rechnungsnummer, die Datumsangaben und die Positionen mit der Eingabe. Die erwarteten Werte ergeben sich aus der Beispielrechnung. Ein KI-Modell übernimmt die Extraktion; prüfe deshalb die Ausgabe auch dann, wenn der Tool-Aufruf erfolgreich ist.

Öffne die Agentenausführung im Dashboard und prüfe die empfangene Eingabe, die Aufrufe der Rechentools, die Ausgabe und mögliche Fehler. Der Leitfaden zu Ausführungen und Traces erklärt die Ansicht. Falls das Beispiel fehlschlägt, hilft die Fehlerart bei der Eingrenzung:

  • HTTP 401 deutet auf ein Problem mit dem Verbindungs-Secret oder dem Authentifizierungs-Header hin.
  • Ein fehlendes Tool oder StopIteration bedeutet, dass die Tool-Liste invoice_extractor nicht enthält. Prüfe den Endpoint, den verknüpften Agenten und dessen Namen.
  • Prüfe bei einem Protokollfehler die Protokollversion, die Methoden-Header und die Metadaten der Anfrage gemeinsam.
  • isError: true meldet eine fehlgeschlagene Ausführung oder ein Timeout. Prüfe den zurückgegebenen Fehler und den Trace des Agenten.
  • Prüfe bei einem JSON-Decodierungsfehler oder einem unerwarteten Rechnungsfeld den zurückgegebenen Text und die Ausgabe des Extraktors.

Die Pipeline für eine Zusammenfassung der Prüfung

Verknüpfe invoice-pipeline, um ein zweites Tool namens invoice_pipeline bereitzustellen. Diese Sequenz extrahiert zuerst die Rechnungsfelder und führt danach den deterministischen Validator aus. Ihr Endergebnis fasst die Prüfung zusammen. Passe daher das Parsen und die Prüfungen im Client an dieses Ergebnis an. Der Validator meldet rechnerische Abweichungen. Er prüft nicht, ob ein Lieferant oder eine Rechnung echt ist.

Behalte Sync bei, wenn der Aufrufer das Ergebnis in derselben Anfrage benötigt. Im Inbound-Modus erhält er eine Ausführungs-ID, während der Agent im Hintergrund arbeitet. Für Anwendungen, die Rechnungstext über gewöhnliches HTTP senden, beschreibt die Anleitung zum Rechnungs-Webhook denselben Extraktor mit einer HTTP-Verbindung.

Stelle deinen Agenten als MCP-Tool bereit

Verknüpfe deinen Agenten mit einer MCP-Server-Verbindung, damit MCP-Clients ihn als Tool aufrufen können.

MCP-Verbindung einrichten

Häufig gestellte Fragen

Connics MCP-Server-Verbindung stellt den verknüpften Agenten als Tool bereit und liefert den Endpoint sowie das Authentifizierungs-Secret. Die Vorlage enthält den Agenten, Rechentools, Ausgabeschema, Middleware und Tests. Das Python-Beispiel in diesem Tutorial ist ein Client, der den verwalteten Endpoint aufruft.

Mit dem Feld mcp_servers nutzt ein Agent Tools externer MCP-Server. Damit andere Clients den Rechnungsagenten aufrufen können, muss er im Dashboard mit einer MCP-Server-Verbindung verknüpft werden.

Ja. Jeder mit der Verbindung verknüpfte Agent erscheint als Tool. Werden invoice-extractor und invoice-pipeline verknüpft, stehen invoice_extractor und invoice_pipeline bereit. Der Extraktor gibt die extrahierten Rechnungsfelder zurück, die Pipeline dagegen die abschließende Zusammenfassung der Prüfung.

Mehr aus dem Blog

Tutorial

Python-KI-Agenten ohne Kubernetes bereitstellen

Ein Python-KI-Agent lässt sich mit YAML, reinem Python, Tests als Deployment-Gate, Git und einer Managed Runtime in der EU ohne Kubernetes bereitstellen. Der Artikel enthält funktionsfähigen Code.

12. August 202612 Min. Lesezeit
Tutorial

KI-Agenten über Kafka-Topics auslösen

Eine eingehende Connic-Kafka-Verbindung auf einem Topic startet mit jeder Nachricht einen Agenten-Run. Kafka-Verbindung konfigurieren, Agenten verknüpfen, bereitstellen und Runs beobachten.

12. Juli 20268 Min. Lesezeit
Tutorial

So integrieren kleine Engineering-Teams einen KI-Agenten in SaaS

Ein praktikabler Weg zum ersten KI-Agenten im Produktivbetrieb: Aufgabe eingrenzen, per Konfiguration definieren, vorhandene Systeme anbinden und die Runtime verwalten lassen.

12. Juni 20269 Min. Lesezeit
Tutorial

KI-Agenten automatisch mit LLM Judges bewerten

Ein LLM Judge bewertet ausgewählte oder alle passenden Agenten-Runs nach festgelegten Kriterien. Score-Trends und Alerts machen Regressionen sichtbar.

29. März 202610 Min. Lesezeit
Tutorial

LangChain-KI-Agenten in den Produktivbetrieb migrieren

Ein funktionierender LangChain-Prototyp muss echten Traffic bewältigen. Bestehender Agenten-Code lässt sich ohne vollständige Neuentwicklung auf eine Plattform für den Produktivbetrieb migrieren.

23. März 202611 Min. Lesezeit
Tutorial

Datenbank, Retrieval oder Sessions: Speicher für Agenten im Vergleich

Connics Datenbank, Retrieval und persistente Sessions im Vergleich: passende Einsatzbereiche, gespeicherte Gesprächsverläufe, TTL und zugehörige Runs.

4. März 202612 Min. Lesezeit
Tutorial

Versteckte Kosten beim Self-Hosting von KI-Agenten

Ein Kubernetes-Deployment wirkt zunächst einfach. Der Artikel vergleicht die tatsächlichen Kosten selbst gehosteter KI-Agenten mit einer verwalteten Plattform.

18. Dezember 20257 Min. Lesezeit
Tutorial

KI-Agenten ohne ML-Team in SaaS integrieren

Kunden erwarten KI-Features, auch wenn das Produktteam keine ML-Engineers beschäftigt. Vorhandene Fähigkeiten reichen aus, um KI-Agenten zu veröffentlichen.

5. Dezember 20258 Min. Lesezeit
Tutorial

RAG-Tutorial für KI-Agenten: Retrieval mit Quellenangaben

Ein RAG-Agent für den Produktivbetrieb braucht abgegrenzte Retrieval-Namespaces, Read-only-Berechtigungen, Quellenangaben, eigene Tool-Wrapper und Regressionstests.

15. November 20259 Min. Lesezeit