Konnektoren
Wie Konnektoren und Verbindungen Agents einen begrenzten Zugriff auf externe Tools ermöglichen.
Ein Konnektor verknüpft ein Projekt mit einem externen Tool oder Dienst. Der Agent ruft ihn als Tool auf. Beeuni vermittelt jeden Aufruf, sodass die Sandbox niemals die Zugangsdaten des Konnektors enthält.
Die meisten Konnektoren deklarieren Sie in beeuni.yaml. Eine Übersicht
über jedes Feld finden Sie in der Manifestreferenz. Beeuni deklariert
Kanal- und Computerkonnektoren, wenn Sie eine Chatplattform oder einen Computer
verbinden.
Konnektor durchsuchen und hinzufügen
Öffnen Sie Connectors, um den verwalteten Katalog zu durchsuchen. Die Standardliste enthält Toolkits verwalteter Anbieter, die mit einer vom Anbieter verwalteten Authentifizierung oder einer aktivierten benutzerdefinierten Authentifizierungskonfiguration verbunden werden können. Eine bestehende Verbindung in Ihrem Projekt ist dafür nicht erforderlich. Ein Toolkit, das eine nicht verifizierte benutzerdefinierte OAuth-Konfiguration benötigt, bleibt verborgen, bis diese Konfiguration verifiziert werden kann.
Aktivieren Sie für direkte Quellen Connectors API Discover in den Feature-Flags des Projekts und wählen Sie anschließend auf derselben Seite API / MCP aus. Das Aktivieren des Flags ersetzt nicht den verwalteten Standard. Der direkte Katalog gruppiert veröffentlichte OpenAPI-, MCP-, GraphQL-, Postman- und andere API-Oberflächen. Wählen Sie eine Karte aus, wählen Sie eine veröffentlichte Oberfläche und schließen Sie deren Verbindungsformular ab. Oberflächen, die nur Dokumentation enthalten, öffnen die Dokumentation des Anbieters; sie werden nicht als sofort verbindbare Vorlage angeboten. Verwenden Sie Add → Manual für eine rohe API oder ein Schema, das der Katalog nicht enthält. Die direkte Suche funktioniert auch ohne einen konfigurierten verwalteten Anbieter.
Konnektoren, Verbindungen und Konten
Ein Konnektor ist das zugriffsorientierte Paket für den Agenten: eine deklarierte Fähigkeit (welche Aktionen, wie der Dienst erreicht wird). Er ist keine Rolle und enthält keine Beeuni-Berechtigung: Ein Agent erreicht einen Konnektor nur, wenn sein Manifest-Grant den Slug aufführt und das Rollenurteil den Aufruf zulässt. Siehe Ein Vokabular, zwei Bindungen. Ein Konnektor enthält:
- einen im Projekt eindeutigen Slug
- einen Anzeigenamen
- eine Anbieter-App
- Konnektor-Richtlinien
Eine Verbindung ist ein Konto — eine autorisierte Identität — für den
Konnektor: eine Zugangsdaten, ein OAuth-Grant oder ein API-Schlüssel. Ein
Konnektor kann mehrere Konten nebeneinander enthalten. Jedes Konto verwendet
die Richtlinien des Konnektors. Das owner_type jedes Kontos bestimmt, wer einen
Aufruf als dieses Konto ausführen darf:
project— ein gemeinsam genutztes Konto. Es ist für alle erreichbar, denen der Konnektor gewährt wurde, für Menschen oder Dienstkonten (Agent, Trigger).member— ein privates Konto, das einem Projektmitglied (owner_id) gehört. Es ist nur für dieses Mitglied und nur in einer privaten Sitzung erreichbar. Ein Dienstkonto (ein Agent oder ein unbeaufsichtigt handelnder Trigger) kann niemals als privates Konto eines Mitglieds ausführen.
Mehrere Konnektoren können auf dieselbe Anbieter-App verweisen. Verwenden Sie separate Konnektoren, wenn eine App unterschiedliche Richtlinien benötigt.
Konto hinzufügen
Öffnen Sie den Konnektor unter Customize → Connectors. Der Tab Accounts listet alle Konten, die Sie verwenden oder verwalten können, in einer Liste auf. Jede Karte zeigt, wer das Konto verwenden kann: Only you, Everyone in project oder die Gruppen und Personen, mit denen es geteilt ist.
Wählen Sie Add account, geben Sie dem Konto einen Namen und wählen Sie Who can use it:
- Only you — ein privates Konto. Jedes Mitglied kann eines hinzufügen.
- Everyone in the project — ein gemeinsam genutztes Konto.
- Specific people or groups — ein gemeinsam genutztes Konto, beschränkt auf die ausgewählten Personen, Gruppen und Agenten.
Die beiden gemeinsam genutzten Optionen benötigen project.connector.connections.manage. Für
Specific people or groups schreibt Beeuni die Grants, bevor Sie das Konto
autorisieren, sodass das Konto niemals eine Zugangsdaten enthält, während es
dem gesamten Projekt offensteht. Ein Kontoname muss neu sein: Ein Name, den ein
Konto desselben Eigentümers bereits verwendet, wird abgelehnt.
Wenn ein Agent ein Konto benötigt, stellt er eine Connect-Karte im Chat ein. Die Karte öffnet denselben Dialog, wobei der vom Agenten vorgeschlagene Name bereits eingetragen und die angeforderte Zielgruppe vorausgewählt ist. Beeuni erstellt ein neues Konto, autorisiert ein bestehendes niemals erneut und teilt dem Agenten den Namen des neuen Kontos mit, damit er Aufrufe als dieses Konto ausführen kann.
Auswählen, wer ein gemeinsam genutztes Konto verwenden darf
Ein gemeinsam genutztes Konto kann zunächst von allen im Projekt verwendet werden, bis Sie den Zugriff einschränken. Wählen Sie auf der Kontokarte Share aus. Der Dialog entspricht dem für Agenten verwendeten Dialog Grant access. Er listet auf, wer das Konto derzeit verwenden kann, und Sie fügen Folgendes hinzu:
- Everyone in the project — die Standardeinstellung.
- Groups — jedes Mitglied jeder ausgewählten Gruppe.
- People — jeweils ein Mitglied. Wählen Sie nur sich selbst aus, um das Konto auf sich zu beschränken.
- Agents — jede Sitzung dieses Agenten, einschließlich Triggern und geteilten Sitzungen. Jeder, der den Agenten ausführen kann, kann das Konto über ihn verwenden.
Bis Sie Save auswählen, ändert sich nichts. Wenn Sie die letzte Gruppe oder Person entfernen, kann das Konto wieder von allen verwendet werden; der Dialog zeigt das Ergebnis an, bevor Sie speichern.
Für ein eingeschränktes Konto gelten die Regeln für private Konten, wobei die Zielgruppe an die Stelle des Eigentümers tritt:
- Eine Person in der Zielgruppe kann es verwenden, und zwar nur in einer privaten Sitzung.
- Ein Agent in der Zielgruppe kann es in jeder seiner Sitzungen verwenden.
- Jeder andere Agent und jeder Trigger eines anderen Agenten verwendet es nie.
- Eine Sitzung, die es bindet, kann nicht geteilt werden, es sei denn, das Konto ist mit dem Agenten dieser Sitzung selbst geteilt.
- Nur eine Person kann ändern, wer ein Konto verwenden darf. Eine Agentensitzung
erhält
403.
Eine Person außerhalb der Zielgruppe sieht das Konto nicht. Eine Person, die die Verbindungen des Projekts verwaltet, sieht es weiterhin mit dem Hinweis Not shared with you, damit sie ändern kann, wer es verwenden darf.
Eigenes privates Konto teilen
Ihr eigenes Konto Only you verfügt ebenfalls über eine Schaltfläche Share. Durch das Teilen wird es zu einem gemeinsam genutzten Konto für die ausgewählten Personen und Gruppen (Sie bleiben dabei, sofern Sie sich nicht selbst entfernen) oder für alle im Projekt. Ab diesem Zeitpunkt ist es ein gemeinsam genutztes Konto: Personen, die die Verbindungen des Projekts verwalten, können es ebenfalls verwalten.
- Das Teilen benötigt
project.connector.connections.manage, dieselbe Berechtigung wie das Hinzufügen eines gemeinsam genutzten Kontos. Ohne diese Berechtigung ist die Schaltfläche deaktiviert und erklärt den Grund. - Beeuni schreibt zuerst die Grants und wandelt das Konto in einer einzigen Aktualisierung in ein gemeinsam genutztes Konto um, sodass es zwischenzeitlich niemals dem gesamten Projekt offensteht.
- Ein gemeinsam genutztes Konto mit demselben Namen auf dem Konnektor blockiert
den Vorgang (
409): Benennen Sie zuerst eines um.
POST /projects/{projectId}/connections/{connectionId}/share
{"principals": [{"principal_type": "group", "principal_id": "<group-id>"}]}
Eine leere principals-Liste teilt das Konto mit allen. Über die CLI:
beeuni connectors connections share <connection-id> --group <group-id>
(auch --user <email|id>, wiederholbar, oder --everyone).
Jeder Zielgruppeneintrag ist eine connection-Objektzuweisung im Grant-Speicher:
POST /accounts/{accountId}/iam/assignments
{"principal_type": "group", "principal_id": "<group-id>",
"role_key": "agent-user", "scope_type": "project", "scope_id": "<project-id>",
"object_type": "connection", "object_id": "<connection-id>"}
DELETE /accounts/{accountId}/iam/assignments/{assignmentId}
Über die CLI führen dieselben Schreibvorgänge zu:
beeuni access grant --group <group-id> --connection <connection-id>
beeuni access grant --everyone --connection <connection-id>
beeuni access revoke <assignment-id>
beeuni connectors connections ls # the WHO CAN USE column
principal_typeistuser,groupoderproject(alle im Projekt;principal_idist die Projekt-ID).- Das Gewähren oder Entziehen eines einzelnen Zugriffs benötigt
project.connector.connections.manage. - Nur ein gemeinsam genutztes Konto kann über diese Grants eingeschränkt werden.
Ein privates Konto oder eine ID, die keine Verbindung in diesem Projekt ist,
antwortet mit
404; teilen Sie Ihr eigenes privates Konto stattdessen über die oben genannte Routeshare. GET /projects/{projectId}/connectionsgibt die Grants jedes gemeinsam genutzten Kontos inshared_withzurück undusable: falsefür ein Konto, das der Aufrufer nur zur Verwaltung sieht. Die Sitzungsauswahl bietet nur verwendbare Konten an.
Als welche Identität ein Konto agiert
Der label eines Kontos ist ein vor der Autorisierung gewählter Name. Er gibt nicht an,
welcher Login verwendet wurde. Das tut connected_as: die E-Mail-Adresse, der Login oder der Anzeigename,
den der Anbieter für das autorisierte Konto meldet.
- Beeuni liest ihn, wenn eine verwaltete Autorisierung abgeschlossen wird: zuerst den Anzeigenamen des verbundenen
Kontos, dann das „Wer bin ich“-Tool des Toolkits (Gmail, Google
Calendar, Google Drive, Linear, GitHub, Slack, Notion, Outlook, Microsoft
Teams, HubSpot, Jira, Asana, Figma, Airtable, Salesforce, Trello, Dropbox,
Calendly). Google Docs und Google Sheets stellen kein solches Tool bereit, daher bleibt ihr
connected_asnull. - Ein Konto, das weiterhin ein Standardlabel trägt (
Private connection,Project connectionoder den Namen des Connectors), wird auf diese Identität umbenannt. Ein von jemandem gewähltes Label wird niemals ersetzt. - Die Verbindungsseite zeigt sofort „Verbunden als …“, sobald das Konto geladen ist, sodass ein mit einem persönlichen Login autorisiertes gemeinsames Konto sofort sichtbar ist.
connected_aswird bei jeder Verbindung (GET /projects/{projectId}/connections), in der Kontoliste, inbeeuni connectors accounts <slug>undbeeuni connectors connections ls(der SpalteCONNECTED AS) sowie in den Kontozeilen unter Anpassen → Connectors angezeigt.
Konto umbenennen
Benenne ein Konto um, ohne es erneut zu autorisieren:
PUT /projects/{projectId}/connections/{connectionId}/label {"label": "Support inbox"}
beeuni connectors connections rename <connection-id> Support inbox
Öffne im Dashboard den Connector und wähle in der Kontenzeile ⋯ → Umbenennen.
Nur das Label wird geändert. Das autorisierte Konto, sein Besitzer, sein Standardattribut
und der Anbieterstatus bleiben unverändert. Es gelten dieselben Voraussetzungen wie beim
Trennen: dein eigenes privates Konto oder project.connector.connections.manage
bei einem gemeinsamen Konto.
Eine Umbenennung wird mit 400 für me, project oder ein UUID-ähnliches Label abgelehnt,
weil --account diese vor Labels auflöst. Sie wird mit 409 abgelehnt, wenn
bereits ein anderes Konto desselben Besitzers dieses Label trägt; der Vergleich
achtet nicht auf Groß- und Kleinschreibung.
Ein anderes Konto verbinden
Ein Verbindungslink für einen Slot, der bereits ein aktives Konto enthält, autorisiert es nicht erneut. Der Anbieter verwendet das Konto wieder, und die Verbindungsseite zeigt Bereits verbunden. Wenn du einen anderen Login verwenden möchtest, füge im Connector ein neues Konto hinzu, mache es zum Standardkonto und trenne anschließend das alte Konto.
Ein Aufruf ohne Angabe eines Kontos wird zuerst zum eigenen privaten Standardkonto des Aufrufers aufgelöst,
dann zum gemeinsamen Standardkonto des Projekts. Jedes Aufrufergebnis gibt an, als welches Konto es ausgeführt wurde (account: { connection_id, label, owner_type }), sodass das Transkript immer die Identität des verwendeten Tool-Aufrufs zeigt.
Liste mit GET /connectors/projects/{projectId}/connectors/{slug}/accounts die Konten auf, als die ein Connector aufgerufen werden kann, das Standardkonto zuerst.
Anbieter
Ein Connector verwendet einen Anbietertyp:
- composio — verwaltetes OAuth für unterstützte SaaS-Apps
- pipedream — veraltetes verwaltetes OAuth, nur für Rollbacks beibehalten
- openapi, postman, graphql, http — direkte API-Connectoren
- mcp — ein entfernter MCP-Server über HTTP oder SSE
- channel — eine Verbindung zu einer Chatplattform
- computer — der verbundene Computer jedes Mitglieds ist jeweils ein Konto
Siehe Slack und Channels und Computer für die verwalteten Anbieterabläufe.
Verfügbarkeit von Apps
Der Connector-Katalog zeigt die Apps, die derzeit verbunden werden können. Einige Apps benötigen eine zusätzliche Authentifizierungskonfiguration und erscheinen erst, wenn diese abgeschlossen ist.
Authentifizierung und Richtlinien
Eine Verbindung authentifiziert sich über:
- Verwaltetes OAuth, eine Channel-Installation oder einen nativen OAuth2-Grant
- einen über das Dashboard eingegebenen API-Schlüssel oder Token
Beeuni verschlüsselt Verbindungsdaten und löst sie serverseitig für jeden Tool-Aufruf auf. Der Agent fordert eine Aktion an. Beeuni fügt die Zugangsdaten hinzu, prüft den Agent-Grant und die Connector-Verbindungsrichtlinie, ruft die externe API auf und gibt das Ergebnis zurück.
Connector-Richtlinien gehören zum Connector. Eine Verbindung kann sie nicht überschreiben. Projektschutzvorgaben gelten zusätzlich zu den Connector-Verbindungsrichtlinien.
Standardmäßig wird eine nicht zugeordnete Connector-Aktion ohne Genehmigung ausgeführt. Setze
policy.default_mode: risk, um für nicht zugeordnete Schreib- und
Destruktivaktionen eine Genehmigung zu verlangen. Setze sensitive: true, damit require_approval zum
Standard für nicht zugeordnete Aktionen des Connectors wird, einschließlich Lesevorgängen. Explizite Projekt- oder Connector-Verbindungsregeln haben weiterhin Vorrang.
Einen gesteuerten Aufruf genehmigen
require_approval erstellt eine Entscheidung für einen einzelnen Connector-Aufruf. Der Connector
gibt 202 pending_approval mit approval_url, approval_summary und
execution_id zurück. Eine HTTP-Anfrage bleibt dabei nicht offen.
Teile approval_url mit beliebigen Teammitgliedern. Die URL identifiziert die Anfrage, gewährt aber keine Berechtigung. Die Seite erfordert ein angemeldetes Beeuni-Konto. Beeuni prüft anschließend, ob das Konto im Projekt auf Aktionen zugreifen und sie genehmigen kann.
Die Genehmigungsseite zeigt die redigierten Parameter, die der Connector erhält.
Ein Aufrufer kann approval_context hinzufügen (CLI: --reason), um die Auswirkung zu beschreiben.
Verwende dies, wenn die Parameter nur Verweise sind: gmail.send_draft erhält eine
Entwurfs-ID, daher gibt der Agent Empfänger, Betreff und Text an. Die Seite zeigt
diesen Text als Beschreibung des Agents, nicht als verifiziert. Die Parameter bleiben
der Nachweis. Beeuni sendet approval_context niemals an den Anbieter.
Genehmige oder lehne den Aufruf einmalig ab. Füge der Entscheidung optional eine Nachricht hinzu. Die Nachricht wird zusammen mit der Entscheidung an den Agenten zurückgesendet, sodass eine Ablehnung angeben kann, was stattdessen zu tun ist.
Jeder ausstehende Aufruf erscheint außerdem unter Überprüfung → Deine Aufmerksamkeit für das Projekt. Öffne Überprüfung über die Seitenleiste; die Anzahl zeigt, wie viele Elemente auf dich warten. Ein Aufruf wird in derselben Genehmigungsansicht wie über seinen Genehmigungslink geöffnet, sodass du vor der Entscheidung den Connector, die Parameter und die Beschreibung des Agents siehst.
Wenn der Aufruf aus einer Slack- oder Teams-Sitzung stammt, postet Beeuni eine Genehmigungskarte im betreffenden Thread. Auf der Karte stehen die Beschreibung des Agents, die Parameter und Approve / Deny. In Slack öffnet Reply… ein Feld für eine Nachricht an den Agent; in Teams ist das Nachrichtenfeld direkt in der Karte eingebettet. Entscheiden dürfen nur ein Projektmanager oder die Person, die die Sitzung gestartet hat. Eine Entscheidung an beliebiger Stelle (im Thread, in Beeuni oder auf der Genehmigungsseite) ersetzt die Schaltflächen der Karte durch das Ergebnis, und der Agent fährt im selben Thread fort. Beeuni übermittelt die Entscheidung über einen dauerhaften Callback zurück an die Sitzung. Eine Genehmigung gilt nur für den exakten Anfrage-Digest. Bei geändertem Empfänger, Betreff, Text, Kanal, URL oder anderen Parametern ist eine neue Entscheidung erforderlich.
Öffne den Audit-Bereich der Sitzung, um dieselbe Parameteransicht zu verwenden. Historische Einträge bleiben schreibgeschützt. Es gibt keine sitzungsweite Genehmigungsoption. Verwende eine explizite always_run-Richtlinie nur, wenn eine Connector-Aktion unbeaufsichtigt ausgeführt werden muss.
Mit OAuth verbinden
Projektseite „Connectors“ öffnen
Öffne das Projekt. Wähle Connectors und dann die App aus.
Kontobereich auswählen
Wähle Project für ein gemeinsames Konto, auf das alle zugreifen können, denen der Connector gewährt wurde. Wähle User für ein privates Konto, das dir gehört und nur für dich zugänglich ist, und zwar nur in einer privaten Sitzung.
Autorisierung abschließen
Schließe den OAuth-Ablauf ab. Beeuni speichert das verbundene Konto als Verbindung.
Einen MCP-Server mit OAuth 2.1 verbinden
Beeuni implementiert die MCP-Autorisierungsspezifikation. Öffne den Connector, wähle Add credential und dann den Tab OAuth 2.0. Beeuni prüft den Server und liest dessen Metadaten aus:
- Die nicht authentifizierte Prüfung gibt
401mitWWW-Authenticate: Bearer resource_metadata="…"zurück. - Beeuni liest die Metadaten der geschützten Ressource (RFC 9728) unter dieser URL oder unter
/.well-known/oauth-protected-resourceaus. - Beeuni liest die Metadaten des Autorisierungsservers (RFC 8414 oder OpenID-Connect-Erkennung) für den ersten Autorisierungsserver aus, den die Ressource angibt.
Wenn dieser Server registration_endpoint bekannt gibt, registriert Beeuni sich als OAuth-Client (RFC 7591) und zeigt eine Schaltfläche an: Connect <server>. Du musst keine Anwendung erstellen und keine Client-ID oder kein Secret kopieren. Beeuni führt dann Authorization Code mit PKCE (S256) aus und bindet das Token über den Parameter resource (RFC 8707) an den Server.
Registriere diese Redirect-URI, wenn ein Server sie im Voraus benötigt:
https://api.beeuni.ai/v1/connectors/oauth2/callback
Wenn der Server Endpunkte, aber kein registration_endpoint veröffentlicht, trägt Beeuni die Autorisierungs-URL, die Token-URL und die Scopes vorausgefüllt ein. Gib die Client-ID einer Anwendung ein, die du bei diesem Anbieter erstellst. Wenn der Server keine Metadaten veröffentlicht, gib alle Felder ein.
Beeuni hält die MCP-Sitzung aufrecht: Bei Bedarf führt es initialize und notifications/initialized aus und sendet bei späteren Aufrufen Mcp-Session-Id. Ein Server, der ohne Sitzung antwortet, bekommt den Handshake nie zu sehen.
Beeuni bindet jede Verbindung an den Autorisierungsserver, der sie ausgestellt hat. Wenn der Callback einen Parameter iss (RFC 9207) enthält, weist Beeuni ihn zurück, sofern er nicht mit dem gespeicherten Aussteller übereinstimmt – ein von einem anderen Server ausgestellter Code wird abgelehnt, bevor er eingelöst wird.
Über die CLI autorisieren
Das Dashboard ist eine Möglichkeit, diesen Ablauf auszuführen, aber nicht die einzige. Deklariere den Connector in beeuni.yaml und autorisiere ihn dann in einem Terminal oder einer Agent-Sitzung:
connectors:
- slug: read-ai
name: Read AI
provider: mcp
url: 'https://api.read.ai/mcp'
auth:
type: bearer
beeuni connectors authorize read-ai --json
Der Befehl erstellt die Verbindung, führt die Erkennungskette aus, registriert Beeuni als Client, wenn der Server RFC 7591 unterstützt, und gibt die URL zur Genehmigung zurück:
{
"connection_id": "7b1a16b2-...",
"registered": true,
"scopes": ["openid", "offline_access", "mcp:execute", "meeting:read"],
"authorization_url": "https://authn.read.ai/oauth2/auth?response_type=code&...",
"expires_at": "2026-08-19T14:48:26.345Z"
}
Ein Agent gibt authorization_url an die Person zurück, mit der er arbeitet. Nach der Genehmigung bestätigt der Agent:
beeuni connectors authorize read-ai --status
Der Befehl wird mit einem von null verschiedenen Exit-Code beendet, solange der Status error lautet. Verwende --scope, um die angeforderten Berechtigungen einzugrenzen. Verwende --client-id und --client-secret für einen Server, der keine dynamische Clientregistrierung unterstützt.
Sobald die Autorisierung abgeschlossen ist, ruft Beeuni den Tool-Katalog des Connectors erneut ab. So verlässt der Connector den Status error ohne manuelle Synchronisierung.
Eine direkte API mit OAuth2 verbinden
Direkte Connectoren unterstützen:
- Client Credentials
- Authorization Code mit PKCE
- Geräteautorisierung
- dynamische Clientregistrierung (RFC 7591)
Gib für Client Credentials die Token-URL, die Client-ID, die Scopes und das Client-Secret ein. Du kannst client_secret_basic, client_secret_post, client_secret_jwt oder private_key_jwt zur Authentifizierung am Token-Endpunkt verwenden.
Gib für Authorization Code die Autorisierungs-URL und die Token-URL ein. Gib für die Geräteautorisierung die URL für die Geräteautorisierung und die Token-URL ein. Eine RFC-8414-Erkennungs-URL kann diese Endpunkte bereitstellen.
Beeuni verschlüsselt die OAuth2-Konfiguration und die Tokens. Es erneuert Zugriffstokens vor ihrem Ablauf und speichert jedes rotierte Refresh-Token. Wenn du die Verbindung widerrufst, wird der nächste Connector-Aufruf blockiert.
Verwende für Microsoft Graph:
https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
https://graph.microsoft.com/.default
Verwende für direkte SharePoint-REST-Aufrufe den SharePoint-Ressourcen-Scope:
https://{tenant}.sharepoint.com/.default
Mit einem API-Schlüssel verbinden
Connector deklarieren
connectors:
- slug: stripe-read
name: Stripe read access
provider: openapi
spec: 'https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json'
auth:
type: bearer
policies:
- match: 'get_*'
action: always_run
- match: '*'
action: blockDas Manifest akzeptiert aus Gründen der Abwärtskompatibilität weiterhin einen Schlüssel authorization_strategy. Beeuni ignoriert ihn: Lege den Besitzer (gemeinsam oder privat) stattdessen pro Verbindung fest, wenn du die Anmeldedaten hinzufügst.
Änderungsanfrage zusammenführen
Beeuni liest das Manifest aus dem Standardbranch. Der Connector wird aktiv, sobald die Änderungsanfrage zusammengeführt wurde.
Verbindung hinzufügen
Öffne den Connector und lege seine Anmeldedaten fest. Beeuni speichert den Wert verschlüsselt. Der Wert wird nicht in das Manifest geschrieben.
Einem Agent Zugriff gewähren
Füge den Connector-Slug zum Feld connectors des Agents hinzu:
agents:
release-bot:
connectors: [stripe-read]
Lässt du connectors weg, erhält der Agent none. Führe die Änderung zusammen, bevor sie wirksam wird.
connectors_required ist veraltet. Das Manifest akzeptiert es weiterhin, aber es wird an keiner Stelle ausgelesen: Eine Sitzung wird beim Erstellen niemals abgelehnt, weil für einen Connector kein nutzbares Konto vorhanden ist. Eine Ablehnung beim Erstellen einer Sitzung wegen eines fehlenden Connectors war in der Praxis nicht erreichbar – für einen nur privaten Connector gab es kein gemeinsames Konto, das angeboten werden konnte, sodass die anfragende Person nichts gegen die Ablehnung unternehmen konnte. Die Prüfung erfolgt jetzt beim Aufruf des Connectors: Ein Agent mit Zugriff auf stripe-read kann seinen Turn sofort starten; abgelehnt wird nur ein Aufruf, der den Connector tatsächlich benötigt (siehe Wenn ein Aufruf abgelehnt wird) – mit einem Lösungsvorschlag.
Konto auswählen
Es gibt zwei unabhängige Möglichkeiten, das Konto für einen Aufruf auszuwählen: eines für die gesamte Sitzung festlegen oder eines für einen einzelnen Aufruf angeben.
Sitzungsweiten Standard festlegen
Eine Sitzung kann das Standardkonto des Connectors für alle Aufrufe überschreiben:
{
"connector_bindings": {
"stripe-read": {
"connection_id": "00000000-0000-4000-8000-000000000000"
}
}
}
Der Bindungsschlüssel ist der Connector-Slug. Der Wert ist ein Konto (eine Verbindung), auf das die aufrufende Person dieser Sitzung zugreifen darf.
Verwende GET /projects/{projectId}/sessions/{sessionId}/scope, um die effektive Bindung auszulesen. Verwende PUT für denselben Pfad, um sie zu ersetzen. Die Änderung gilt ab dem nächsten Tool-Aufruf, ohne dass die Sitzung neu gestartet werden muss.
Konto für einen einzelnen Aufruf angeben
Liste die Konten auf, über die ein Connector aufgerufen werden kann – das Standardkonto zuerst – mit:
GET /connectors/projects/{projectId}/connectors/{slug}/accounts
{
"connector": "stripe-read",
"accounts": [
{ "connection_id": "...", "label": "Shared workspace", "owner_type": "project", "is_default": true, "connected_as": "billing@example.com" },
{ "connection_id": "...", "label": "My Stripe", "owner_type": "member", "is_default": false, "connected_as": null }
]
}
Nennen Sie dann ein Konto im Aufruf – anhand der Verbindungs-ID oder des Labels (ohne Beachtung der Groß-/Kleinschreibung) – oder mit den beiden Auswahlwörtern me (Ihr eigenes standardmäßiges privates Konto) und project (das standardmäßige gemeinsam genutzte Konto des Projekts):
beeuni connectors call stripe-read get_balance '{}' --account me
beeuni connectors call stripe-read get_balance '{}' --account "Shared workspace"
Wird in einem Aufruf kein Konto angegeben, wird zuerst das eigene standardmäßige private Konto des Aufrufenden verwendet, danach das standardmäßige gemeinsam genutzte Konto des Projekts – unverändert gegenüber dem Verhalten, bevor ein Connector mehrere Konten haben konnte. Ein angegebenes Konto, das nicht aufgelöst werden kann, wird abgelehnt und niemals stillschweigend durch ein anderes ersetzt (siehe Wann ein Aufruf abgelehnt wird). Jedes erfolgreiche Aufrufergebnis gibt an, mit welchem Konto es ausgeführt wurde: account: { connection_id, label, owner_type }.
Einen Connector in einer Sitzung verwenden
Verwenden Sie innerhalb einer Sitzung die Connector CLI:
beeuni connectors ls
beeuni connectors accounts stripe-read
beeuni connectors call stripe-read <action> '<json-args>' [--account <id|label|me|project>]
connectors listet die Connectoren im Geltungsbereich auf. accounts listet die Konten auf, mit denen dieser Aufrufende stripe-read aufrufen darf – zuerst das Standardkonto, innerhalb jeder Gruppe gemeinsam genutzte Konten vor privaten. call führt eine Aktion aus, mit dem angegebenen --account oder, falls keines angegeben ist, mit derselben Standardauflösung wie zuvor, bevor ein Connector mehrere Konten haben konnte.
Große Ergebnisse
Ein Listen- oder Suchaufruf kann mehr zurückgeben, als ein Modell lesen kann: Eine Toolausgabe über ~50 KB wird abgeschnitten. Speichern Sie das Ergebnis in einer Datei und verarbeiten Sie es mit Code:
beeuni connectors call linear graphql.issues '{"first":250}' --out /workspace/output/issues.json
# → { "ok": true, "account": …, "saved_to": "/workspace/output/issues.json",
# "bytes": 93037, "shape": { "issues": { "nodes": "array(250) of {id,title,…}",
# "pageInfo": { "hasNextPage": true, "endCursor": "…" } } } }
jq '.data.issues.nodes[] | {id, title}' /workspace/output/issues.json
--out schreibt das vollständige JSON-Ergebnis und erstellt dabei übergeordnete Verzeichnisse. Stdout erhält den Aufruf-Umschlag ohne data sowie saved_to, bytes und shape: die Übersicht von data (Schlüssel, Array-Längen und jedes pageInfo). Der Exit-Code bleibt unverändert.
Dateien anhängen
Ein Aufruf enthält niemals Dateibytes in seinen Argumenten. Stellen Sie die Datei bereit und fügen Sie dann ihre Referenz in die Argumente ein. Das Gateway liest die Bytes serverseitig und schreibt sie in die Anfrage.
beeuni connectors call microsoft-graph.sendmail @mail.json \
--attach /workspace/artifacts/report.pdf
--attach stellt die Datei bereit und fügt eine Referenz zum Anlagen-Array der Aktion hinzu. Das Array ist im Eingabeschema der Aktion zu finden: attachments für den Email-Kanal, body.message.attachments für Microsoft Graph sendMail. Verwenden Sie --attach-path body.message.attachments als Namen, wenn das Schema ungewöhnlich ist.
Große JSON-Argumente gehören in eine Datei (@mail.json) oder auf stdin (-).
Wenn Sie eine Datei selbst einfügen möchten, stellen Sie sie zuerst bereit:
beeuni connectors upload /workspace/artifacts/report.pdf --connector microsoft-graph
# → { "attachment_id": "…", "ref": { "$beeuni_attachment": "…" }, … }
Fügen Sie ref an beliebiger Stelle in die Argumente ein. Das Gateway ersetzt sie anhand ihrer Position:
Position von ref |
Ersetzt durch |
|---|---|
| Ein Element eines Anlagen-Arrays, dessen Elemente Objekte sind | Das Anlagenelement des Anbieters. Das Schema des Elements bestimmt die Form: Microsoft Graph fileAttachment (name + contentBytes oder @odata.type), Postmark (Name + Content), Mailjet (Filename + Base64Content), SendGrid und Resend (filename + content), Brevo (name + content). Jede andere Elementform wird mit attachment_item_shape_unknown abgelehnt. |
Ein Zeichenfolgenfeld, z. B. contentBytes oder eine GitHub-Datei content |
Die Base64-Darstellung der Datei. |
attachments[] des Email-Kanals |
Eine signierte Download-URL für den Email-Anbieter. |
Regeln:
- Dateien müssen aus
/workspace/output,/workspace/artifacts,/workspace/reportsoder/workspace/deliverablesstammen. Symbolische Links und Hardlinks werden abgelehnt. Kopieren Sie die Datei zuerst dorthin. - Ein Aufruf kann bis zu 20 Dateien mit insgesamt 25 MiB enthalten. Die Upstream-API kann ein niedrigeres Limit festlegen: Microsoft Graph gibt 3 MB als größte Datei an, die eine einzelne
sendMail-Anfrage anhängen kann. - Eine bereitgestellte Datei ist nur für die Sitzung verfügbar, in der sie bereitgestellt wurde, kann einmal verwendet werden und wird nach 24 Stunden gelöscht. Bei einem fehlgeschlagenen Aufruf kann sie erneut verwendet werden.
- Der Audit-Datensatz, die Genehmigungsvorschau und das Modell sehen nur die Referenz, niemals die Bytes. In einer Upstream-Fehlermeldung, die die Datei wiedergibt, wird die Base64-Darstellung entfernt.
- Verwaltete Connectoren akzeptieren keine bereitgestellten Dateien (
connector_attachments_unsupported).
Der MCP-Server bietet denselben Ablauf: call nimmt attachment_files (und optional attachment_path) entgegen, und upload_attachment gibt ein ref zurück. Das SDK-Äquivalent lautet connectors.uploadAttachment(bytes, { filename, contentType, connector }), which returns ref.
Aufrufergebnisse
POST /connectors/projects/{projectId}/call gibt ein einzelnes JSON-Objekt zurück. Diese Felder sind bei allen Bindings identisch (OpenAPI, HTTP, MCP, GraphQL, composio, pipedream, Computer):
| Feld | Bei | Wert |
|---|---|---|
data |
200 | Die unveränderte rohe Upstream-Antwort. |
output |
200 | Die Payload ohne den Umschlag des Bindings: composio data.result, MCP result.structuredContent ?? result.content, GraphQL data.data. Fehlt, wenn sie data entspricht (OpenAPI-, HTTP-, Postman-, Kanal-, pipedream- und Computeraufrufe), sodass der Body die Payload nur einmal enthält: Lesen Sie output ?? data. Das SDK ergänzt sie. |
binding |
200, 500, 429, 503 | Das Binding, das den Aufruf ausgeführt hat: openapi, http, mcp, graphql, composio, pipedream, pipedream_proxy, postman, tunnel. null bei einem Fehler, bevor die Aktion aufgelöst wurde. |
upstream_status |
200, 500, 429, 503 | Der Upstream-HTTP-Status. null, wenn kein Upstream geantwortet hat (bei einem Timeout, einer abgelehnten Anfrage oder einem Computer). composio und pipedream melden einen Anbieterfehler innerhalb einer 200-Antwort; dafür setzt Beeuni 502 (400 bei einer abgelehnten Linear-Abfrage, 429 bei einer Ratenbegrenzung). |
upstream_error |
200 | Wird angegeben, wenn der Upstream einen Fehler innerhalb einer 2xx-Antwort gemeldet hat: ein MCP-Toolergebnis mit isError: true oder einem JSON-RPC-Fehler oder GraphQL errors ohne Daten. Der Aufruf gilt dennoch als ausgeführt: ok bleibt true. |
retry_after_seconds |
429, 503 | Das Retry-After des Upstreams in Sekunden, sofern eines mitgesendet wurde. Die Antwort enthält außerdem den Retry-After-Header. |
Der HTTP-Status eines fehlgeschlagenen Aufrufs:
-
Ein Upstream-
429antwortet mit429. Ein Upstream-503antwortet mit503. Warten Sieretry_after_seconds(oder warten Sie mit exponentiellem Backoff) und versuchen Sie es erneut. -
Andere Upstream-Fehler antworten mit
500; die Ursache steht inreason. -
Eine Upstream-Antwort mit mehr als 64 MiB wird mit
500undreason: "upstream_response_too_large: …"beantwortet. Beeuni beendet das Lesen am Limit. Fordern Sie eine kleinere Seite oder einen Filter an. -
Ein Upstream, der nicht innerhalb der Frist antwortet, wird mit
500undreason: "upstream_timeout: …"beantwortet. Die Frist beträgt standardmäßig 60 Sekunden. Legen Sie für den Client ein höheres Timeout fest, damit das Gateway immer zuerst antwortet.
Ein Connector-Aufruf ist nicht idempotent. Beeuni dedupliziert wiederholte Aufrufe nicht. Nach upstream_timeout oder einem clientseitigen Abbruch kann der Aufruf beim Upstream ausgeführt worden sein: Prüfen Sie die Auswirkungen, bevor Sie einen Schreibvorgang wiederholen (etwa eine gesendete E-Mail oder einen erstellten Datensatz).
Typisierte Aufrufe aus Code
beeuni connectors types schreibt für jede aufrufbare Aktion eine TypeScript-Deklarationsdatei. Jede Aktion erhält ihren Argumenttyp aus ihrem Eingabeschema und ihren Ergebnistyp aus ihrem Ausgabeschema. Der Ergebnistyp beschreibt das Feld output des Aufrufs.
beeuni connectors types --out src/beeuni-connectors.d.ts
beeuni connectors types --connector linear,github --out src/beeuni-connectors.d.ts
Binden Sie die Datei in Ihre tsconfig.json ein. Rufen Sie dann über callAction auf:
import { createBeeuni } from '@beeuni/sdk';
const connectors = createBeeuni({ backendUrl, getToken }).project(projectId).connectors;
const result = await connectors.callAction('linear', 'list_issues', { team: 'CORE' });
if (result.ok) console.log(result.output?.issues.length);
Der Connector-Handle liest dieselbe Datei, und run gibt die typisierte Ausgabe selbst zurück oder löst einen typisierten Fehler aus (siehe Connectoren aus Code):
const issues = await createBeeuni({ backendUrl, getToken })
.project(projectId)
.connector('linear')
.run('list_issues', { team: 'CORE' });
callAction(slug, action, args, options) sendet dieselbe Anfrage wie call('<slug>.<action>', args, options) und gibt dasselbe Ergebnis zurück. Nur die Typen unterscheiden sich: Ein fehlendes oder unbekanntes Argument führt zu einem Kompilierungsfehler, und output hat den generierten Typ. Eine Aktion, die nicht in der Datei enthalten ist, akzeptiert ein beliebiges Objekt und gibt output: unknown zurück.
- OpenAPI-, HTTP-, MCP- und GraphQL-Connectoren veröffentlichen ein Ausgabeschema, wenn ihre Quelle eines deklariert. Das Ergebnis einer GraphQL-Abfrage wird als Objekt typisiert.
- Verwaltete Connectoren veröffentlichen kein Ausgabeschema. Ihr Ergebnis ist
unknown. Die CLI benennt sie danach, wenn sie die Datei schreibt. - Jeder
$defs-Eintrag wird zu einem benannten Typ (BeeuniConnectorDef<n>_<name>), sodass ein rekursives Schema endlich bleibt. Ein Schema, das nicht kompiliert werden kann (eine Union, die sich selbst enthält), oder dessen Typen für eine Aktion 256 KB überschreiten, wird zuunknown. - Führen Sie den Befehl erneut aus, nachdem Sie einen Connector hinzugefügt haben oder eine neue Version synchronisiert wurde.
- Der Katalog gibt Ausgabeschemas nur auf Anfrage zurück:
GET /connectors/projects/{projectId}/catalog?include_output_schemas=truefügt jeder AktionoutputSchemahinzu (null, wenn keines gespeichert ist).
Wenn ein Aufruf abgelehnt wird
Ein abgelehnter Aufruf antwortet mit { ok: false, status: "denied", reason, hint }. reason ist ein stabiler Code; hint gibt an, was zu tun ist.
reason |
HTTP | Bedeutung | Ebenfalls im Body |
|---|---|---|---|
connector_not_assigned |
403 | Die connectors:-Berechtigung des laufenden Agenten in beeuni.yaml umfasst diesen Connector nicht. |
agent, granted (die Liste oder "all"), manifest_revision und manifest_commit (das Manifest, aus dem die Berechtigung stammt). |
connector_not_connected |
403 | Für diesen Aufruf ist kein nutzbares Konto vorhanden. Entweder hat der Connector für diesen Aufrufer überhaupt kein Konto (keine gespeicherten Zugangsdaten oder die App wurde nie autorisiert — beeuni connectors ls zeigt sie als needs_auth), oder --account hat eines angegeben, das nicht aufgelöst werden konnte. |
connect_url — ein gehosteter Link zur Autorisierung eines Kontos, wenn der Aufrufer eines erstellen kann — wenn nichts verbunden ist. requested_account und available_accounts — der Name, der nicht aufgelöst werden konnte, und die Namen, die aufgelöst wurden — wenn --account eines angegeben hat. |
connector_disabled |
403 | Der Connector ist deklariert, aber deaktiviert. | — |
connector_not_found |
404 | Im Projekt ist kein Connector mit diesem Slug deklariert. | — |
action_not_found |
404 | Der Connector verfügt über keine solche Aktion. | — |
connect_url ist die vollständige Abhilfe für einen nicht verbundenen Connector: Eine Sitzung wird für diesen niemals im Voraus abgelehnt (siehe Einem Agenten Zugriff gewähren), daher enthält die Ablehnung selbst die Lösung. Der Agent zeigt den Link unverändert an; das Web-Transkript rendert ihn als Connect-Schaltfläche mit einem Klick. Der Link autorisiert standardmäßig ein privates Konto für die Person, die ihn öffnet — das Verbinden eines gemeinsam genutzten Kontos ist eine ausdrückliche Auswahl (beeuni connectors connect stripe-read --owner project, abhängig von project.connector.write).
Der Channel-Connector, der eine Sitzung erstellt hat (Slack, Teams, E-Mail), kann von dieser Sitzung aus immer aufgerufen werden, unabhängig davon, was die Berechtigung des Agenten besagt. So kann der Agent immer in dem Thread berichten, aus dem er angefordert wurde.
Die Berechtigung einer Sitzung folgt beeuni.yaml: Eine Änderung an der connectors: des laufenden Agenten (einschließlich beeuni connectors add --apply) wird beim nächsten Aufruf wirksam. Die Berechtigung vermerkt, aus welchem Manifest-Blob und welchem Commit sie stammt; ein Lesevorgang, der sie aus demselben Blob ersetzen würde, wird zuvor durch einen zweiten Lesevorgang bestätigt, und ein Lesevorgang aus einem älteren Commit ersetzt sie niemals.
Slack und Microsoft Teams werden über das Dashboard auf dieselbe Weise wie OAuth-Apps verbunden. Beim Verbinden von Slack wird für Sie ein channel-Connector in beeuni.yaml geschrieben. Siehe Slack & Channels.