Operationen

Die zehn MCP-Tools im Detail: was jedes einzelne liest — und was bewusst nicht zurückgegeben wird.

Alle zehn Tools sind als ReadOnly = true, Idempotent = true und Destructive = false markiert (MCP-Tool-Annotationen, die dem aufrufenden Client mitgeben, dass wiederholte Aufrufe risikolos sind). Kein Tool schreibt, löscht oder sendet — weder in der jobs-/mappings-Tabelle, noch in den Service-Bus-Queues, noch in einem Quell-/Zielsystem.


Jobs & Mappings (Table Storage)

Lesen ausschließlich aus den beiden Tabellen jobs/mappings, über dieselben In-Memory-Caches wie JobApi/MappingApi (IJobService.Jobs/IMappingService.Mappings — reine Query<T>()-Reads, kein Upsert/Delete im Codepfad).

ToolLiestLiest nicht
list_jobsAlle konfigurierten Jobs: Quelle/Ziel-Connection, Richtung, Priorität, Zeitplan, Mapping-Name, aus der jobs-TabelleKeine Connection-Credentials (nur der Name der Connection, nicht ihre Zugangsdaten)
get_jobEin einzelner Job anhand seines RowKey (Job-Name) — dieselben Felder wie list_jobsdito
list_mappingsAlle Feld-Mappings zwischen Quell- und Zielsystemen aus der mappings-TabelleKeine tatsächlichen Datensatz-Inhalte — nur die Mapping-Konfiguration (welches Feld auf welches Feld abgebildet wird), nicht produzierte/synchronisierte Daten
get_mappingEin einzelnes Mapping anhand seines Namens (der Mapping-Name, auf den ein Job verweist und unter dem list_mappings es auflistet)dito

Warum keine Credentials möglich sind: IConnectionService.GetConnector(name) liefert nur die IConnector-Instanz zurück, nicht das zugrunde liegende ConnectionSetting-Objekt. Felder wie ClientSecret, Password oder ApiKeyValue sind private Felder in den konkreten Connectoren und nicht Teil des IConnector-Interfaces — es gibt schlicht keinen Rückgabewert, über den sie herauskommen könnten.


Service Bus (Diagnose)

Reine Peek-/Status-Operationen über IServiceBusService. Die beiden Peek-Tools erzeugen den Empfänger ohne PeekLock und rufen ausschließlich receiver.PeekMessagesAsync(...) auf — es gibt im Codepfad kein ReceiveMessagesAsync, CompleteMessageAsync, DeadLetterMessageAsync oder AbandonMessageAsync. Auch SendMessageAsync (existiert auf IServiceBusService für GetChanges) ist von keinem MCP-Tool aus erreichbar.

ToolLiestLiest nicht
list_queue_statusesLaufzeit-Status (aktive/dead-letter/geplante Nachrichtenanzahl) aller Export-QueuesKeine einzelnen Nachrichten — nur Zähler
get_queue_statusLaufzeit-Status einer einzelnen Queue für eine Job-Prioritätdito
peek_queue_messagesSequenznummer, JobName, SourceKey, Enqueue-Zeitpunkt, Zustellversuche und BodySize (Größe des Nachrichteninhalts in Bytes) je NachrichtDen Nachrichteninhalt selbst (Body) nicht — siehe Kasten unten
peek_dead_letter_queue_messagesZusätzlich zu den obigen Feldern: DeadLetterReason, DeadLetterErrorDescription, ErrorMessage, ErrorTimeStamp, ErrorStackTrace, OperationIddito — auch hier nur BodySize, nie Body

Connector-Metadaten (echtes Ziel-/Quellsystem-Schema)

ToolLiestLiest nicht
list_connector_tablesTabellen-/Entitätsnamen einer Connection direkt aus den Metadaten des Zielsystems — zum Abgleich mit den in Jobs/Mappings konfigurierten NamenKeine tatsächlichen Datensätze aus der Tabelle — nur ihren Namen
get_connector_table_schemaSpalten-Metadaten (Typ, Nullable, maximale Länge, bei SQL-Dezimalspalten Precision/Scale, Primary Key) einer Tabelle/Entität — zum Validieren eines Mappings gegen das tatsächliche Schema, statt sich auf die Mapping-Konfiguration allein zu verlassenKeine tatsächlichen Datensätze/Zeilenwerte — nur die Spalten-Struktur

Beide Tools nehmen einen connectionName entgegen (den RowKey aus der connections-Tabelle — siehe Verbindungen, z. B. BC_Test oder CRM_Test) sowie einen tableName/Ressourcennamen. Für BC/NAV gibt es zusätzlich den apiPath (derselbe Wert wie TableMapping.SourcePath/TargetPath im Mapping), da beide Connectoren ihr Schema über einen versionierten OData-$metadata-Endpunkt beziehen. Bei BC ist er optional: leer bedeutet v2.0 (die Standard-API); Custom-APIs (z. B. publisher/gruppe/v1.0) brauchen ihren Pfad weiterhin. Bei den SQL-Connectoren hat apiPath eine andere Bedeutung, siehe unten.

Diese beiden Tools sind die einzigen mit OpenWorld = true — sie greifen tatsächlich auf das externe Quell-/Zielsystem der jeweiligen Connection zu, nicht nur auf die eigene DataBridge-Infrastruktur. Ungültige Connection-Namen liefern eine klare Meldung („Connection ‘…’ is not configured or not initialized") statt einer rohen KeyNotFoundException — es lässt sich also nicht durch Ausprobieren beliebiger Namen etwas über das System herausfinden, das über list_jobs/get_job nicht sowieso schon sichtbar wäre. Schlägt der Zugriff auf das Zielsystem fehl (falscher apiPath, unbekannte Tabelle, Host nicht erreichbar), enthält das Fehlerergebnis die Ursache, z. B. GET …/api/nope/v1.0/$metadata returned 404 Not Found — technisch als McpException, weil der MCP-SDK nur deren Message an den Client durchreicht (siehe Funktionsweise).

SQL-Connectoren: Schema über apiPath

Bei den SQL-Connectoren gibt apiPath das Schema an, in dem die Tabelle liegt — bei MySQL die Datenbank. Ohne apiPath wird das Standard-Schema der Verbindung verwendet (MSSQL SCHEMA_NAME(), MySQL DATABASE(), PostgreSQL current_schema(), Oracle der angemeldete Benutzer). Damit werden gleichnamige Tabellen in unterschiedlichen Schemas (z. B. dbo.Customers und archive.Customers) nicht vermischt.

ConnectorMetadatenquelleapiPath
MSSQLINFORMATION_SCHEMASchema, z. B. dbo
PostgreSQLINFORMATION_SCHEMASchema, z. B. public
MySQLINFORMATION_SCHEMADatenbank
OracleUSER_TAB_COLUMNS/USER_CONSTRAINTS, mit apiPath ALL_*-ViewsOwner/Schema, z. B. HR

Tabellen- und Schemaname werden groß-/kleinschreibungsunabhängig verglichen und als Parameter an die Datenbank übergeben. Die Metadaten werden je Connector-Instanz zwischengespeichert — Schemaänderungen an der Datenbank werden erst nach einem Neustart der Function App sichtbar.

SQL-Connectoren: Datentypen

Die Datentypen aus dem Datenbank-Katalog werden auf .NET-Typen abgebildet. Dabei werden Precision und Scale sowie bei MySQL der vollständige Spaltentyp (COLUMN_TYPE) berücksichtigt. Unbekannte Typen (z. B. json, xml, Array-Typen) erscheinen als String.

.NET-TypMSSQLPostgreSQLMySQLOracle
Guiduniqueidentifieruuid——
Booleanbitbooleantinyint(1)/boolean, bit(1)boolean (23ai)
Bytetinyint—tinyint unsigned—
Int16smallintsmallinttinyint, smallint, yearnumber(1–4,0)
Int32intintegerint, mediumint, smallint unsignednumber(5–9,0)
Int64bigintbigintbigint, int unsigned, bit(n>1)number(10–18,0)
Decimaldecimal, numeric, moneynumericdecimal, bigint unsignednumber mit Nachkommastellen, ab 19 Stellen oder ohne Angabe
Singlereal, float(1–24)realfloatbinary_float
Doublefloatdouble precisiondoublebinary_double, float
DateOnlydatedatedate—
DateTimedatetime, datetime2, smalldatetimetimestampdatetime, timestampdate, timestamp, timestamp with local time zone
DateTimeOffsetdatetimeoffsettimestamp with time zone—timestamp with time zone
TimeSpantimetime, intervaltimeinterval
Byte[]binary, varbinary, image, timestamp/rowversionbyteabinary, varbinary, blob-Typenblob, raw
StringZeichentypen, xmlZeichentypen, json/jsonbZeichentypen, jsonZeichentypen, clob, json

Besonderheiten:

  • MSSQL timestamp ist der alte Name von rowversion, eine binäre Zeilenversion und kein Datum — daher Byte[].
  • MySQL speichert BOOLEAN als tinyint(1); erst der vollständige Spaltentyp macht daraus Boolean. Vorzeichenlose Ganzzahlen erhalten den nächstgrößeren Typ, damit der Wertebereich passt. timestamp hat keinen Offset und wird daher DateTime.
  • Oracle kennt keine eigenen Ganzzahltypen; NUMBER(p,0) wird nach der Anzahl der Stellen auf Int16/Int32/Int64 abgebildet. DATE enthält immer eine Uhrzeit und wird daher DateTime, nicht DateOnly.
  • GUIDs, die als Text gespeichert sind (MySQL char(36), Oracle varchar2(36)), erscheinen als String.

Zusammenfassung: was über MCP grundsätzlich nicht möglich ist

  • Keine Schreib-, Lösch- oder Sende-Operation auf jobs/mappings/Service-Bus-Queues oder einem Ziel-/Quellsystem — es gibt für keines der zehn Tools einen Codepfad zu Upsert, Delete, SendMessageAsync, CompleteMessageAsync o. Ä.
  • Keine Connection-Credentials (Passwörter, Client-Secrets, API-Keys) — die sind strukturell nie Teil eines Rückgabewerts.
  • Kein tatsächlicher Nachrichteninhalt aus einer Service-Bus-Queue — nur dessen Byte-Größe.
  • Keine tatsächlichen Datensatz-Werte aus einem Ziel-/Quellsystem über die Connector-Tools — nur Tabellennamen und Spalten-Struktur, keine Zeilen.