Jahresabschluss.io
ENAnmeldenRegistrieren →

Microsoft Agent Framework

Microsoft Agent Framework und Copilot Studio mit der Buchhaltung

Im Microsoft Agent Framework, dem Nachfolger von Semantic Kernel und AutoGen, verbinden Sie unseren MCP-Server mit MCPStreamableHTTPTool: url, die Kopfzeile in static_headers, eine feste Werkzeugliste in allowed_tools und approval_mode, damit Storno und Neubuchung erst nach Ihrer Zustimmung laufen. In Copilot Studio tragen Sie denselben Server im Assistenten für Model Context Protocol ein und schalten nicht benötigte Werkzeuge einzeln ab. Diese Seite zeigt den Python-Weg an einer Korrektur per Storno und sagt, wo Copilot Studio eine Rückfrage vor dem Buchen nicht dokumentiert.

Stand: 2026-10-19

Einordnung: Agent Framework, Semantic Kernel, AutoGen

Microsoft beschreibt das Agent Framework als direkten Nachfolger von Semantic Kernel und AutoGen, gebaut von denselben Teams, und bietet Leitfäden für den Umstieg von beiden. Es gibt Fassungen für Python und .NET, Go ist laut Übersicht noch in der öffentlichen Vorschau. Neue Projekte mit MCP beginnen Sie deshalb im Agent Framework.

Die Installation für Python ist pip install agent-framework. Fehlt auf einer schlanken Installation die MCP-Unterstützung, nennt die Dokumentation das Paket mcp als Nachinstallation.

Korrektur per Storno mit Freigabe

OpenAIChatClient liest laut Dokumentation OPENAI_API_KEY und OPENAI_CHAT_MODEL aus der Umgebung; der Buchhaltungsschlüssel kommt aus JAB_API_KEY:

import asyncio, os
from agent_framework import Agent, MCPStreamableHTTPTool, Message
from agent_framework.openai import OpenAIChatClient

LESEN = ["get_entity", "list_fiscal_years", "list_accounts",
         "list_journal_entries", "get_journal_entry"]
SCHREIBEN = ["storno_journal_entry", "create_journal_entry"]

async def main():
    async with Agent(
        client=OpenAIChatClient(),
        name="Korrekturen",
        instructions="Korrigiere Fehlbuchungen nur per Storno und Neubuchung. "
                     "Nenne vor jedem Aufruf Buchungsnummer, Konten und Betrag.",
        tools=MCPStreamableHTTPTool(
            name="buchhaltung",
            url="https://api.jahresabschluss.io/functions/v1/bookkeeping-mcp",
            static_headers={"Authorization": f"Bearer {os.environ['JAB_API_KEY']}"},
            allowed_tools=LESEN + SCHREIBEN,
            approval_mode={"always_require_approval": SCHREIBEN,
                           "never_require_approval": LESEN},
        ),
    ) as agent:
        session = agent.create_session()
        result = await agent.run("Buchung 1234 steht auf dem falschen Aufwandskonto. "
                                 "Bitte auf 4930 umbuchen.", session=session)
        while result.user_input_requests:
            antworten = []
            for anfrage in result.user_input_requests:
                if anfrage.function_call is None:
                    continue
                print(anfrage.function_call.name, anfrage.function_call.arguments)
                ok = await asyncio.to_thread(input, "Freigeben? (j/n) ")
                antworten.append(Message(role="user", contents=[
                    anfrage.to_function_approval_response(ok.strip().lower() == "j")]))
            result = await agent.run(antworten, session=session)
        print(result.text)

asyncio.run(main())

Was dabei geschieht

  • list_journal_entries und get_journal_entry: Der Agent findet die Buchung, im Beispiel die Nummer 1234, und liest Konten, Betrag und Steuerschlüssel.
  • storno_journal_entry mit id und reason: Der Lauf hält an, result.user_input_requests nennt Werkzeug und Argumente. Das Storno trägt das Datum der stornierten Buchung, außer booking_date nennt ein späteres im selben Geschäftsjahr.
  • create_journal_entry mit dem richtigen Konto: wieder eine Freigabe. Das Konto 4930 ist hier nur ein Beispiel; welches stimmt, hängt von Ihrem Kontenrahmen ab, den list_accounts liefert.
  • Gehört die Buchung zu einem Bankumsatz, storniert der Server dessen ganze Buchung und stellt den Umsatz wieder offen; neu gebucht wird er dann mit book_bank_transaction. Ein Ausgleich mit einer Rechnung wird vorher mit storno_payment zurückgenommen.

Namen in allowed_tools und approval_mode müssen laut Dokumentation den rohen Namen des Servers oder einen eindeutigen Namen mit Präfix treffen; sonst meldet das Framework einen Fehler, statt still zu raten.

Die Antwort auf eine Freigabe schicken Sie laut Dokumentation mit derselben AgentSession zurück, die den angehaltenen Aufruf kennt — deshalb erzeugt das Beispiel die Session einmal mit agent.create_session() und gibt sie jedem agent.run mit. Microsoft empfiehlt außerdem, alle Daten zu prüfen, die an entfernte MCP-Server gehen, und sie für Prüfzwecke zu protokollieren. Auf unserer Seite zeigt der Bereich „KI-Agent & API“ die API-Nutzung der letzten 30 Tage je Schlüssel: Zahl der Aufrufe, davon schreibende und fehlerhafte, den letzten Aufruf und die häufigsten Endpunkte.

Kopfzeilen: static_headers oder header_provider

static_headers sind feste Kopfzeilen, die nur an den Ursprung der konfigurierten url gehen und bei einer Weiterleitung auf einen anderen Ursprung entfernt werden. header_provider ist eine Funktion, die je Lauf Kopfzeilen liefert, etwa den passenden Schlüssel, wenn eine Anwendung mehrere Gesellschaften betreut. Die Dokumentation rät, Schlüssel über eine Closure oder static_headers zu führen, damit sie nie in Werkzeugargumente geraten.

Copilot Studio: derselbe Server ohne eigenen Code

  • Auf der Werkzeugseite des Agenten führen „Add a tool“, „New tool“ und „Model Context Protocol“ zum Assistenten. Pflichtfelder sind Servername, Beschreibung und Server-URL; als Anmeldung wählen Sie API key, Typ Header, Name X-API-Key. Unser Server nimmt den Schlüssel in X-API-Key ebenso an wie als Authorization: Bearer. Die Schritte im Einzelnen zeigt unsere Seite zur Buchhaltung mit Copilot.
  • Copilot Studio unterstützt laut Microsoft nur den Streamable-Transport, MCP setzt die generative Orchestrierung voraus, und der Zugriff unterliegt den Datenrichtlinien Ihrer Power Platform.
  • Auf der Einstellungsseite des Servers schalten Sie Allow all aus und einzelne Werkzeuge ab. Neue Werkzeuge des Servers sind danach standardmäßig aus.
  • Eine Rückfrage vor einzelnen MCP-Werkzeugen beschreibt die Dokumentation zum MCP-Assistenten nicht. Für Copilot Studio empfehlen wir deshalb einen Schlüssel nur mit Leserecht — der Server listet dann gar keine schreibenden Werkzeuge.

Grenzen: was in der App bleibt

  • Microsoft 365 Copilot meldet MCP-Plugins nicht mit einem Schlüssel je Gesellschaft an; dort passt der Weg derzeit nicht. Copilot Studio und das Agent Framework gehen.
  • Die Übermittlung an das Finanzamt geschieht in der App über den Freigabe-Link mit Ihrer PIN.
  • Der Server bucht nie in festgeschriebene Zeiträume, auch kein Storno. Liegt die Fehlbuchung in einem festgeschriebenen Monat, nimmt storno_journal_entry ein späteres booking_date im selben Geschäftsjahr an.
  • Bankanbindung, Einstellungen der Gesellschaft und Bankverbindungen der Geschäftspartner sind nicht Teil der API.

Rechtlicher Bezug: Storno statt Änderung

§ 146 Abs. 4 AO und § 239 Abs. 3 HGB verbieten, eine Buchung so zu verändern, dass der ursprüngliche Inhalt nicht mehr feststellbar ist. Deshalb gibt es kein Werkzeug zum Ändern einer gebuchten Zeile: Der Agent storniert, und die Gegenbuchung bleibt neben der ursprünglichen Buchung sichtbar. Ihre Kanzlei sieht beide im Journal; die Freigabe vor jedem Schritt dokumentiert, wer die Korrektur veranlasst hat.

Häufige Fragen

Ist das Microsoft Agent Framework der Nachfolger von Semantic Kernel?

Ja. Microsoft nennt es den direkten Nachfolger von Semantic Kernel und AutoGen, gebaut von denselben Teams, mit Leitfäden für den Umstieg.

Wie verbinde ich das Agent Framework mit einem entfernten MCP-Server?

Mit MCPStreamableHTTPTool aus agent_framework: name, url und die Kopfzeile in static_headers oder über header_provider.

Wie verlange ich eine Freigabe vor bestimmten Werkzeugen?

Mit approval_mode, zum Beispiel {"always_require_approval": [...], "never_require_approval": [...]}. Der Lauf liefert dann user_input_requests, die Sie mit to_function_approval_response beantworten.

Welche Kopfzeile nehme ich in Copilot Studio?

API key, Typ Header, Name X-API-Key, Wert jab_live_…. Unser Server nimmt den Schlüssel auch als Authorization: Bearer an.

Fragt Copilot Studio vor einer Buchung nach?

Die Dokumentation zum MCP-Assistenten beschreibt keine Rückfrage vor einzelnen Werkzeugen. Nutzen Sie dort einen Schlüssel nur mit Leserecht oder schalten Sie schreibende Werkzeuge ab.

Kann der Agent eine falsche Buchung löschen?

Nein. Gebuchte Sätze lassen sich nur stornieren, mit storno_journal_entry und Stornogrund. Das entspricht § 146 Abs. 4 AO und § 239 Abs. 3 HGB.

Vom selben Anbieter: Jahresabschluss nach HGB – der komplette Leitfaden auf jahresabschluss.io.