Zum Inhalt springen
MCP-Server eingebautWie das funktioniert

HTTP-API des BI-Feeds

Der BI-Feed ist nicht nur für Tableau da. Er ist ein gewöhnlicher, lesender HTTP-Endpunkt – und der einzige zugesagte Weg, Daten aus dem Lakehouse programmatisch abzuholen, ohne die Governance zu umgehen.

Auf dieser Seite

Der zugesagte Weg

Der BI-Feed trägt eine eigene Vertragsversion und bleibt stabil. Die übrigen Pfade unter /api/agent/ gehören zur Konsole – wenn Sie einen davon brauchen, sprechen wir darüber.

Grundlagen

PunktWert
Basishttps://<host>/api/agent/tableau/
Vertragsversion1 – steht in der Antwort von /info und steigt nur bei einer inkompatiblen Änderung.
AnmeldungBearer. Ein Keycloak-Zugriffstoken des Realms mit Publikum (aud) agent. Anderes Publikum: 401.
MethodenNur GET auf die Datenendpunkte. Der Feed nimmt kein SQL entgegen.
ZwischenspeicherJede Antwort trägt Cache-Control: no-store.
ProtokollierungEin WORM-Eintrag je abgerufener Seite und je Schemaauskunft – ohne Zeilenwerte, aber mit Zielobjekt und Seitenparametern.

Der Feed ist ab Werk aus

Eine Datenausleitung wird bewusst eingeschaltet: Bis die Administration den Schalter unter Daten → BI-Anbindung umlegt, antwortet der Feed mit 403.

Die Endpunkte

EndpunktWofürWer
GET /tableau/infoSelbstauskunft: Endpunkte, Grenzen, Anmeldung, JSONPath auf die Datensätze.Jeder angemeldete Nutzer
GET /tableau/schemaSpalten eines Objekts mit Trino-Typ, Tableau-Typ und der Projektion, mit der umgewandelt wird.Jeder, der das Objekt sehen darf
GET /tableau/rowsEine Seite Daten, als JSON oder CSV.Jeder, der das Objekt sehen darf
GET /tableau/settingsStand des Schalters, der Zeilenobergrenze und der Katalog-Allowlist.Plattform-Administration
PUT /tableau/settingsDiese Einstellungen ändern. Auditiert.Plattform-Administration

Spalten eines Objekts abfragen

Der Schema-Endpunkt sagt, was von einem Objekt überhaupt ausgeliefert werden kann. Spalten mit Typen, die das Zielwerkzeug nicht kennt, werden ausgelassen statt geraten – sie stehen in unsupportedColumns. Das Feld recommendedOrderBy nennt eine brauchbare Sortierspalte für das Blättern.

curl -sS \
  -H "Authorization: Bearer $TOKEN" \
  "https://lakehouse.example.invalid/api/agent/tableau/schema\
?catalog=iceberg&schema=produkte&table=produkte" | jq .

Daten seitenweise holen

# Erste Seite. Ab der zweiten ist orderBy Pflicht – deshalb gleich setzen.
curl -sS \
  -H "Authorization: Bearer $TOKEN" \
  "https://lakehouse.example.invalid/api/agent/tableau/rows\
?catalog=iceberg&schema=produkte&table=produkte\
&limit=1000&offset=0&orderBy=artikelnummer" | jq '.meta, .data[0]'

# Als CSV, etwa zum Weiterreichen an ein Skript
curl -sS \
  -H "Authorization: Bearer $TOKEN" \
  "https://lakehouse.example.invalid/api/agent/tableau/rows\
?catalog=iceberg&schema=produkte&table=produkte\
&limit=1000&orderBy=artikelnummer&format=csv" > produkte.csv

Parameter von /tableau/rows

ParameterPflichtBedeutung
catalog, schema, tablejaDas Objekt – Tabelle oder Sicht.
limitneinZeilen je Seite. Standard 10 000, harte Obergrenze 50 000, per Einstellung weiter senkbar.
offsetneinErste Zeile der Seite.
orderByab offset > 0spalte, spalte:desc, mehrere komma-getrennt, oder * für alle Spalten.
formatneinjson (Standard) oder csv.

Ohne orderBy wird ab der zweiten Seite nicht etwa unsortiert geliefert, sondern gar nicht: 400 order_required. OFFSET ohne ORDER BY ist in einer parallelen Engine nicht stabil – eine Seite könnte Zeilen doppelt bringen und andere auslassen, ohne dass irgendwo ein Fehler auftritt.

Antwortform

Die Datensätze liegen unter data – das ist der JSONPath, den auch Tableau liest. Daneben steht meta als Selbstauskunft der Seite; wer nur die Zeilen will, ignoriert es.

GET /tableau/rows (gekürzt)
{
  "data": [
    { "artikelnummer": "A-1001", "bezeichnung": "Rohrschelle 20 mm", "lagerbestand": 412 }
  ],
  "meta": {
    "object": { "catalog": "iceberg", "schema": "produkte", "table": "produkte" },
    "columns": [
      { "name": "artikelnummer", "tableauType": "string" },
      { "name": "lagerbestand", "tableauType": "int" }
    ],
    "unsupportedColumns": [],
    "limit": 1000,
    "offset": 0,
    "rowCount": 1000,
    "hasMore": true,
    "order": ["artikelnummer"],
    "orderAll": false,
    "deterministicPaging": true
  }
}

hasMore kommt ohne Zählabfrage aus

Es wird aus rowCount === limit abgeleitet. Eine Schleife, die darauf prüft, liegt immer richtig – die letzte Seite kann dabei einmal leer ausfallen.

Fehlercodes

AntwortBedeutungAbhilfe
401Kein oder abgelaufenes Token, oder falsches Publikum.Token erneuern; aud muss agent sein.
403 bridge_disabledDer Feed ist ausgeschaltet.Administration: Konsole → BI-Anbindung.
403 catalog_not_allowedKatalog steht nicht auf der Allowlist.Administration: Freigaben pflegen.
404 not_foundObjekt existiert nicht – oder ist für Sie nicht sichtbar.Rechte in Trino prüfen. Beides sieht absichtlich gleich aus, damit die Antwort nichts über fremde Objekte verrät.
400 order_requiredBlättern ohne Sortierschlüssel.orderBy setzen.
400 invalid_pagelimit, offset oder orderBy unzulässig.Grenzen beachten – limit wird nicht stillschweigend gekürzt.
400 query_errorTrino konnte die Abfrage nicht ausführen.Meldung lesen; meist ein exotisch typisiertes Feld. Sicht mit umgewandelter Spalte anlegen.
422 no_deliverable_columnsKeine Spalte des Objekts ist auslieferbar.Sicht mit umgewandelten Spalten anlegen.
502 upstream_errorTrino oder der Tokentausch war nicht erreichbar.Betrieb prüfen. Einzelheiten stehen im Dienstprotokoll, nicht in der Antwort.

Wie Sie an ein Token kommen

Der Feed stellt keine eigenen Token aus – er prüft die des Realms. Für einen einmaligen Abruf reicht ein Zugriffstoken aus der angemeldeten Sitzung. Für geplante Abrufe legt die Administration einen eigenen öffentlichen Client im Realm an und lässt das aufrufende Werkzeug den Authorization-Code-Fluss mit PKCE durchlaufen; der Client braucht einen Audience-Mapper auf agent. Die Adressen der Autorisierungs- und Token-Endpunkte nennt GET /tableau/info.

Ein Token trägt eine Identität

Auch hier gibt es kein Dienstkonto: Ein Token führt die Rechte einer Person – und deren Namen in jedem Audit-Eintrag.

Stand: Diese Seite beschreibt lavalake 0.16.0. Produkt und Dokumentation liegen in getrennten Repositories – im Zweifel gilt, was die Konsole zeigt.

Etwas fehlt?

Wenn diese Seiten Ihre Frage nicht beantworten, zeigen wir die Plattform in einer halben Stunde an Ihrem Fall.

Demo vereinbaren