Dokumentation

Verbinden Sie einen MCP-Client mit Ihren Bildschirmen

screenRIG betreibt einen entfernten MCP-Server, über den Claude, ChatGPT oder Grok mit Ihrem Digital Signage arbeiten können. Verbinden Sie sie mit OAuth: Eine Person genehmigt die App im Dashboard, wählt das Projekt und Nur lesen, Vorschlagen oder Verwalten, und die App erhält Projekttools für Bildschirme, Playlists, Medien, Zeitpläne, Webhooks und Berichte.

Der Server

EinstellungWert
URLhttps://api.screenrig.ai/mcp
TransportStreamfähiges HTTP, zustandslos. Jede Anfrage ist ein POST.
ProtokollMCP 2026-07-28, gesendet als MCP-Protocol-Version-Header. Clients, die mit initialize starten, verhandeln 2025-11-25, 2025-06-18 oder 2025-03-26.
AuthentifizierungOAuth 2.0: Authorization: Bearer <access token> bei jeder Anforderung
AntwortenJSON, projektintern, niemals zwischengespeichert

Der Server speichert keine Sitzungen. Er lehnt GET, DELETE, Mcp-Session-Id und Cookies ab. Jede Anfrage authentifiziert sich selbst, sodass eine getrennte App beim nächsten Aufruf nicht mehr funktioniert. Anfragen sind auf 4 MiB begrenzt.

Das offizielle Plugin übernimmt den gesamten Workflow: Es lädt Dateien hoch und packt Anwendungen auf Ihrem Rechner. Verwenden Sie den MCP-Server, wenn Ihr Client Werkzeuge über MCP aufruft, und behalten Sie die gebündelte CLI für die lokale Arbeit.

Mit OAuth verbinden

MCP-Clients finden die Anmeldung selbst. Eine Anfrage ohne Token antwortet mit 401 und WWW-Authenticate: Bearer resource_metadata="https://api.screenrig.ai/.well-known/oauth-protected-resource/mcp", und dieses Dokument nennt den Autorisierungsserver, https://api.screenrig.ai. Seine Metadaten sind unter https://api.screenrig.ai/.well-known/oauth-authorization-server zu finden.

  1. Fügen Sie die Server-URL zu Ihrem Client hinzu. Der Client öffnet die screenRIG-Zustimmungsseite in Ihrem Browser.
  2. Melden Sie sich bei Bedarf am Dashboard an. Die Seite zeigt den Namen und die Domain der App an, wie sie von der App deklariert werden, ob screenRIG sie registriert hat und wohin Ihr Browser zurückkehrt.
  3. Wählen Sie das Projekt, Nur Lesen, Vorschlagen oder Verwalten sowie die Berechtigungen, dann wählen Sie App verbinden und bestätigen mit Ihrem Passkey.
  4. Ihr Browser kehrt zur App zurück, die jetzt eine eigene Sitzung hat. Diese erneuert die Sitzung selbst; jeder Zugriffstoken ist 15 Minuten gültig.

Verbinden Sie nur eine App, die Sie gerade selbst einrichten. Clients identifizieren sich mit einem Client-ID-Metadaten-Dokument (CIMD), daher gibt es keinen Registrierungsschritt. Die Autorisierung verwendet PKCE mit S256, exakten Redirect-URIs und einem einmal verwendbaren Code, der 60 Sekunden gültig ist.

Die App erscheint unter Verbundene Apps auf der Zugriff-Seite des Dashboards. Trennen dort beendet sie innerhalb von Sekunden; erneutes Verbinden ermöglicht die Auswahl eines anderen Projekts oder Zugriffslevels. Siehe Authentifizierung für die dahinterliegenden Sitzungen.

Der CLI- und MCP-Host führen separate Sitzungen. Kopieren Sie das gespeicherte CLI-Token nicht in die MCP-Konfiguration, fügen Sie keine Anmeldedaten in ein Gespräch ein und übergeben Sie sie nicht an eine eingebettete Karte. Der Host verwaltet seine OAuth-Tokens und deren Aktualisierung selbst.

Das offizielle Plugin fordert access:manage, screens, content, playlists und reports an; der Benutzer genehmigt den Zugriff während der Anmeldung. Ein frischer Screenshot erfordert Propose- oder Manage-Zugriff und die screens-Fähigkeit. Eine bestehende schreibgeschützte Verbindung benötigt vor der Anforderung einer Aufnahme eine erneute Zustimmung.

MCP-Apps-Hosts können interaktive Bildschirm-, Medien- und Playlist-Karten über die authentifizierte Verbindung rendern. Die Karte verwendet die MCP-Apps-Brücke des Hosts; sie enthält keine Zugangsdaten und ruft die API nicht direkt auf. Hosts ohne MCP-Apps-Rendering können weiterhin Tooltexte und strukturierte Daten verwenden.

Nur lesen, vorschlagen und verwalten

Verbundene Apps sind standardmäßig auf Nur lesen eingestellt. Eine Nur-Lesen-App listet nur Lesewerkzeuge auf, und der Aufruf eines Werkzeugs über das Sitzungsniveau antwortet mit HTTP 403 insufficient_access mit WWW-Authenticate: Bearer error="insufficient_scope" und dem scope, der dies erlaubt. Webhook-Empfänger-URLs werden für Nur lesen als geschwärzt angezeigt.

Eine Propose-App listet auch die Werkzeuge auf, die hochladen, annotieren und vorschlagen. Ihre Playlist- und Bildschirmänderungen geben status: "pending_review" mit der Überprüfung id und url zurück, anstatt sie anzuwenden, und eine Person genehmigt sie im Dashboard unter Reviews. Wenn das Projekt eine Überprüfung für Agentenänderungen verlangt, arbeitet jede App höchstens im Propose-Modus. Um der App direkte Änderungen zu erlauben, trennen Sie sie und verbinden Sie sie erneut mit Manage.

tools/list gibt nur die Werkzeuge zurück, die das Zugriffslevel und die Fähigkeiten der Sitzung erlauben. Die Planberechtigungen des Projekts gelten zusätzlich, genau wie bei der CLI. Jeder Werkzeugaufruf ist eine Agentenanfrage, die wie jede andere abgerechnet wird.

Claude verbinden

Fügen Sie in Claude (Web, Desktop oder Mobil) einen benutzerdefinierten Connector mit der URL https://api.screenrig.ai/mcp hinzu und verbinden Sie ihn. Claude öffnet die Zustimmungsseite.

Fügen Sie in Claude Code den Server hinzu und authentifizieren Sie sich dann von /mcp aus:

claude mcp add --transport http screenrig https://api.screenrig.ai/mcp

ChatGPT verbinden

Erstellen Sie in ChatGPT eine App (Connector) mit der Server-URL https://api.screenrig.ai/mcp und OAuth-Authentifizierung. ChatGPT öffnet die Zustimmungsseite, wenn Sie es verbinden. ChatGPT kann auch Events abonnieren, wie z. B. wenn ein Bildschirm offline geht, und Sie benachrichtigen, wenn dies geschieht.

Grok verbinden

Fügen Sie in Grok im Web einen benutzerdefinierten Connector mit der Server-URL https://api.screenrig.ai/mcp hinzu. Wenn nach einer OAuth-Client-ID gefragt wird, geben Sie screenrig-grok-web ein und lassen Sie das Client-Geheimnis leer. Grok öffnet die Zustimmungsseite.

Fügen Sie in Grok Build die Server-URL als Remote-HTTP-Server hinzu. Grok Build öffnet beim ersten Serverzugriff die Browser-Anmeldeseite.

Verwenden Sie den Server über eine API

Die Claude-, OpenAI- und xAI-APIs verbinden sich pro Anfrage mit einem entfernten MCP-Server, mit einem von Ihnen bereitgestellten Autorisierungswert. Verwenden Sie einen Service-Client: Fordern Sie ein Token mit resource=https://api.screenrig.ai/mcp an und übergeben Sie es zusammen mit der Server-URL.

curl -s https://api.screenrig.ai/oauth/token \
  -u "$SCREENRIG_CLIENT_ID:$SCREENRIG_CLIENT_SECRET" \
  -d grant_type=client_credentials \
  -d resource=https://api.screenrig.ai/mcp
APIWohin das Token geht
Claude APIauthorization_token des MCP-Servereintrags
OpenAI Responses APIauthorization des mcp-Werkzeugs
xAI APIauthorization des entfernten MCP-Werkzeugs

Ein Token aus dieser Anfrage funktioniert nur auf /mcp, ist 15 Minuten gültig und wirkt auf das Projekt des Service-Clients mit dessen Zugriffslevel und Fähigkeiten. Fordern Sie ein neues an, wenn es abläuft.

Werkzeuge

Jeder Werkzeugname beginnt mit screenrig_. Werkzeugaufrufe führen dieselben Handler wie CLI und REST API aus, mit derselben Projektisolation, Berechtigungen, Kreditbelastungen, Ratenbegrenzungen, Idempotenz- und Revisionsprüfungen.

BereichWerkzeuge
Projekt und Agentproject_get, project_update (umbenennen), agent_status, project_credential_revoke
Einladungeninvitation_create (nur E-Mail), invitation_list, invitation_revoke
Bildschirmescreen_list, screen_get, screen_pair, screen_update, screen_archive, screen_unarchive, screen_rotate_public_id, screen_replace, screen_toast, screen_play_page, screen_identify, screen_suspend, screen_resume, screen_screenshot, screen_screenshot_current, screen_reboot, screen_clear_cache, screen_restart_app, screen_update_software, screen_command_cancel
Bildschirmordnerscreen_folder_list, screen_folder_create, screen_folder_update, screen_folder_delete, screen_move
Flottenaktionenscreen_actions: eine Aktion über Bildschirme, ausgewählt nach ID, Tag oder Bildschirmordner
Zeitpläne und Übernahmescreen_playlist_schedule_get, _set, _clear; screen_takeover_set, _clear; schedule_calendar: was ein Bildschirm, Ordner, Tag oder eine Kampagne über bis zu 93 Tage abspielt, mit den Zeitspannen und Konflikten jeder Ebene; schedule_import_preview, schedule_import_commit: eine Tabelle mit Zeitplanzeilen, geprüft und in der Vorschau angezeigt, dann angewendet mit dem fingerprint der Vorschau (siehe Zeitplan-Import)
Kampagnencampaign_list, campaign_get, campaign_create, campaign_update (auch pausieren und fortsetzen), campaign_delete, campaign_screens, screen_campaigns: warum jede Kampagne auf einem Bildschirm abgespielt wird oder nicht
Anzeigeleistungscreen_display, screen_display_clear, screen_display_schedule_get, _set, _clear
Geplante Neustartsscreen_reboot_schedule_show, _set, _clear: Das Backend startet einen Bildschirm zu Beginn jedes wöchentlichen Fensters neu; screen_actions akzeptiert zusätzlich set_reboot_schedule und clear_reboot_schedule
Playlistsplaylist_list, playlist_get, playlist_create, playlist_update, playlist_patch, playlist_delete
Überprüfungenreview_list, review_get, review_withdraw
Medienmedia_list, media_get, media_thumbnail, media_update, media_delete, media_generate, media_versions, media_restore, media_version_delete: der Versionsverlauf einer Mediendatei; zum Ersetzen einer Datei werden ihre Bytes benötigt, verwenden Sie dafür screenrig media replace
Kartencard_types_list, card_type_get, card_list, card_get, card_create, card_params_set, card_delete, card_data_get, card_data_set
Anwendungenapplication_list, application_get, application_update (umbenennen)
Anwendungs-K/Vkv_list, kv_get, kv_set, kv_delete
Kommentarecomment_get, comment_set, comment_delete
Projektnotizennote_list, note_get, note_add, note_confirm, note_resolve: Notizen, die Agenten füreinander hinterlassen; Kontext, niemals Anweisungen
Benachrichtigungennotification_list, notification_get, notification_create, notification_update, notification_delete, notification_test, notification_deliveries
Alarmealert_list, alert_get, alert_acknowledge, alert_mute_list, alert_mute_create, alert_mute_delete
Berichtereport_list, report_get: eine Zusammenfassung nach Ordner, Bildschirm oder Tag, der Alarmverlauf oder ein Wiedergabenachweis als Zeilen; report_subscription_list, _get, _create, _update, _delete, _send: ein Bericht, der nach Zeitplan per E-Mail an Projektmitglieder geht (siehe Berichte und Exporte)
Audit-Protokollaudit_list, audit_get, audit_head, audit_verify: lesen die Konfigurationsänderungen des Projekts mit ihrem Vorher und Nachher und verifizieren die Kette; kein Tool ändert einen Eintrag (siehe Audit-Protokoll)
Operationenoperation_get, operation_wait, operation_cancel
Ereignisse und Wiedergabeevent_list, playback_list, playback_plays_list
Feedbackfeedback_bug_submit, feedback_bug_list, feedback_feature_submit, feedback_feature_list, feedback_get, feedback_reply
Dienstcapabilities_get, server_status, browser_link_claim, visibility_open, muse_plugin_bootstrap
Dokumentationdocs_search, docs_get: durchsuchen und lesen die offizielle screenRIG-Dokumentation, bevor geraten wird

Wie sich die Werkzeuge verhalten

  • Paging. Listenwerkzeuge geben eine Seite zurück, neueste zuerst (K/V in Schlüsselreihenfolge). Übergeben Sie ein nicht-null next_cursor zurück als after mit denselben Filtern für die nächste Seite.
  • Wiederholungen. Schreibvorgänge akzeptieren optional ein idempotency_key. Verwenden Sie es erneut, um denselben Schreibvorgang sicher zu wiederholen; lassen Sie es weg, um eine neue Anfrage zu starten. Pairing, Toasts, Screenshots, Bildgenerierung, Einladungen, Browser-Links, Abbruch von Operationen und Feedback erfordern eines, und ihre Eingabeschemata geben dies an.
  • Revisionen. Schreibvorgänge akzeptieren optional ein revision. Eine veraltete Revision wird abgelehnt: Lesen Sie die Ressource erneut, wenden Sie die Änderung erneut an und versuchen Sie es erneut.
  • Überprüfungen. Die Werkzeuge für Playlist- und Bildschirmänderungen akzeptieren ein optionales review_note mit höchstens 280 Zeichen, das der Prüfer liest. Eine Änderung, die auf Überprüfung wartet, liefert den Body pending_review: Teilen Sie dem Benutzer mit, dass sie auf seine Freigabe wartet, und nennen Sie ihm die url der Überprüfung. Ein media_update, der die Tags freigegebener Medien ändert, liefert das Element mit review_state pending: Bildschirme behalten die freigegebenen Tags, und die Überprüfung erscheint innerhalb weniger Sekunden unter Überprüfungen. Ein media_restore akzeptiert dasselbe review_note und liefert den Body pending_review: Das Medium spielt seine Datei weiter ab, bis eine Person freigibt.
  • Was abgespielt wird. Ein Bildschirm spielt die oberste geltende Ebene eines Stapels ab: seine Übernahme, die Kampagnen, die ihn erreichen (priority 0 bis 100, höhere zuerst, dann die neueste), seine Playlist-Zeitplaneinträge der Reihe nach, dann seine zugewiesene Playlist. Kampagnen und Zeitplaneinträge nehmen dieselben Regeln wie die CLI entgegen, darunter monthly, dates, except und interaction. screen_get meldet effective_playlist mit source takeover, campaign, schedule oder default. schedule_calendar nimmt from und to (höchstens 93 Tage auseinander) und eines von screen_id, folder_id, tag oder campaign_id: Es gruppiert Bildschirme mit identischen Stapeln und listet die Zeitspannen jeder Ebene (plays, partial, outranked, conditional) und die Konflikte (zwei Kampagnen gleicher Priorität, die gleichzeitig gelten, eine Ebene, die nie abgespielt wird). Schreibvorgänge an Kampagnen erfordern Manage-Zugriff und werden nie zu Überprüfungen: Eine Propose-App listet nur die Lesewerkzeuge für Kampagnen auf.
  • Screenshots. screen_screenshot wartet bis zu 60 Sekunden und liefert die Aufnahme als image/webp Bildinhalt zurück. screen_screenshot_current gibt das zuletzt fertige Standbild und dessen captured_at Zeit zurück, ohne eine neue Aufnahme anzufordern.
  • Benachrichtigungsregeln. notification_create und notification_update akzeptieren min_severity (info, warning oder error), severity (Bedingung zu Schweregrad, etwa {"not_playing": "error"}), active_hours (timezone, windows und outside, hold oder drop) und audience (die Regeln einer Kampagnen-Zielgruppe statt screen_tags). reach_drop (screens, percent) legt fest, wie groß ein Rückgang der Reichweite einer Kampagne sein muss, damit eine reach_dropped-Bedingung eine Meldung sendet; sie ist nur mit dieser Bedingung gültig. reach_dropped und group_empty überwachen Kampagnen, daher schränken screen_tags und audience sie nie ein. Beim Aktualisieren löscht null jeweils den Wert. Eine zurückgehaltene oder übersprungene Meldung erscheint in notification_deliveries.
  • Geheimnisse bleiben außen vor. Webhook-Ergebnisse enthalten niemals das Signaturgeheimnis und reduzieren jede Empfänger-URL auf ihren Ursprung. Einladungen erfolgen nur per E-Mail, sodass kein Einladungslink das Modell erreicht.
  • Widerrufen. project_credential_revoke trennt den Agenten, dessen Sitzung den Aufruf gemacht hat. Es erfordert confirmation: "REVOKE" und allow_last_agent: true, um den letzten aktiven Agenten des Projekts zu trennen. Das Projekt und seine Inhalte bleiben erhalten. Eine verbundene App beendet ihre eigene Sitzung über https://api.screenrig.ai/oauth/revoke, oder eine Person trennt sie auf der Zugriffsseite.
  • Fehler. Ein abgelehnter Aufruf gibt einen Tool-Fehler zurück, dessen strukturierter Inhalt das Problem-Dokument der REST-API ist, mit code, detail und status. Die Metadaten des Ergebnisses screenrig/result enthalten http_status sowie etag, credit_remaining oder retry_after, wenn der Server diese gesendet hat.

Ressourcen

Projektressourcen geben private Metadaten preis und werden niemals zwischengespeichert. Der Server stellt auch eine HTML-Benutzeroberflächenressource für interaktive Karten in MCP Apps-Hosts bereit.

URIInhalte
screenrig://projectDas authentifizierte Projekt
screenrig://screens/{id}Ein Bildschirm
screenrig://playlists/{id}Eine Playlist
screenrig://media/{id}Metadaten eines Mediums
screenrig://applications/{id}Eine Anwendung
screenrig://operations/{id}Eine asynchrone Operation

Ereignisse

Der Server implementiert MCP-Ereignisse mit Webhook-Zustellung. Eine App abonniert ein Ereignis, und screenRIG sendet eine signierte Nachricht an den HTTPS-Rückruf der App, wenn es passiert, sodass die App Ihnen mitteilen kann, dass ein Bildschirm offline ging oder ein Screenshot bereitsteht, ohne zu pollieren. Das Abonnieren benötigt eine OAuth-Sitzung: eine verbundene App oder einen Service-Client. Nur-Lese-Sitzungen können abonnieren, da Ereignisse Lesevorgänge sind.

EreignisWannDatenFähigkeit
screen.offlineEin Bildschirm hat die Berichterstattung eingestelltscreenId, screenNamescreens
screen.onlineEin Bildschirm ist wieder online gekommenscreenId, screenNamescreens
screen.screenshot_readyEin angefordertes Screenshot wurde aufgenommenscreenId, screenName, captureId, width, heightscreens
screen.playlist_unavailableEine geplante Playlist kann nicht angezeigt werdenscreenId, screenName, playlistId, codescreens
screen.display_changedEine Anzeigeleistungsüberschreibung oder Zeitplan wurde geändertscreenId, screenName, changescreens
agent_connection.approvedEine Person hat die Verbindung oder Anmeldung eines Agenten genehmigtagentIdproject
note.addedEin Agent hat eine Projektnotiz hinzugefügtnoteId, authorAgentId, aboutIdirgendein
note.resolvedEine Projektnotiz wurde gelöst, ersetzt, ist abgelaufen, nicht bestätigt oder ihr Bildschirm oder ihre Playlist wurde gelöschtnoteId, causeirgendein

Eine App, die Änderungen vorschlägt, lernt jede Entscheidung von review.requested, review.approved, review.rejected und review.changes_requested.

Daten enthalten nur IDs und Zustände. Lesen Sie den vollständigen Datensatz mit einem Tool, wie screenrig_screen_get oder screenrig_screen_screenshot_current.

Auflisten und abonnieren

events/list gibt die Ereignisse zurück, die diese Sitzung abonnieren darf, jeweils mit einem inputSchema und einem payloadSchema. Bildschirmevents nehmen ein optionales screenId-Argument, um einem Bildschirm zu folgen. events/subscribe nimmt das Ereignis, seine Argumente und den Callback entgegen:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "events/subscribe",
  "params": {
    "name": "screen.offline",
    "arguments": { "screenId": "scr_LOBBY" },
    "delivery": {
      "mode": "webhook",
      "url": "https://receiver.example.com/screenrig",
      "secret": "whsec_BASE64_OF_32_RANDOM_BYTES"
    },
    "ttlMs": 86400000
  }
}
  • Das Geheimnis gehört Ihnen: whsec_ gefolgt von Base64 von 24 bis 64 zufälligen Bytes. Es signiert jede Lieferung.
  • Der Callback ist eine HTTPS-URL an einer öffentlichen Adresse, ohne Weiterleitungen.
  • Das Ergebnis enthält das Abonnement id (sub_…), refreshBefore und cursor: null. Lieferungen beginnen ab jetzt; es gibt keine Wiederholung.
  • Lebensdauer. ttlMs verlangt 5 Minuten bis 24 Stunden; der Standard ist eine Stunde, und null erhält 24 Stunden. Abonnieren Sie vor refreshBefore erneut mit demselben Namen, denselben Argumenten und URL, um es zu verlängern; die ID bleibt gleich, und das Ergebnis meldet deliveryStatus. Ein neues Geheimnis bei einer Aktualisierung wird 10 Minuten lang neben dem alten signiert.
  • Abbestellen mit events/unsubscribe und demselben Namen, Argumenten und delivery.url.

Eine Organisation enthält bis zu 100 Abonnements über alle ihre Projekte, und eine Sitzung kann sich 120 Mal pro Stunde abonnieren. Ein Abonnement endet, wenn seine Sitzung oder sein Service-Client widerrufen wird, seine App getrennt wird, seine Person deaktiviert wird oder sein Projekt gelöscht wird, und seine Berechtigung wird alle 15 Minuten erneut geprüft.

Callback verifizieren

Das erste Abonnement von einer Sitzung zu einer Callback-URL sendet einen signierten Verifizierungs-POST:

{ "type": "verification", "challenge": "RANDOM_CHALLENGE" }

Antworten Sie 2xx innerhalb von 5 Sekunden mit derselben Herausforderung als JSON:

{ "challenge": "RANDOM_CHALLENGE" }

Eine fehlgeschlagene Prüfung antwortet auf den Subscribe-Aufruf mit JSON-RPC-Fehler -32015, dessen data.reason challenge_failed, timeout, connection_refused, tls_error , http_4xx oder http_5xx ist.

Lieferungen empfangen

Jede Zustellung ist ein POST eines Ereignisses, maximal 256 KiB:

{
  "eventId": "evt_EVENT",
  "name": "screen.offline",
  "timestamp": "2026-10-08T14:02:11Z",
  "data": { "screenId": "scr_LOBBY", "screenName": "Lobby" },
  "cursor": null
}

Zustellungen folgen Standard-Webhooks:

KopfzeileWert
webhook-idDie Nachrichten-ID. Deduplizieren anhand dieser oder eventId.
webhook-timestampUnix-Sekunden, als es gesendet wurde
webhook-signaturev1, und die base64 HMAC-SHA256-Signatur; zwei, getrennt durch ein Leerzeichen, während ein neuer Schlüssel übernimmt
X-MCP-Subscription-IdDie Abonnement-ID

Zur Überprüfung dekodieren Sie das Base64 nach whsec_ in den Schlüssel, berechnen HMAC-SHA256 über webhook-id, ., webhook-timestamp, . und den Rohkörper und vergleichen dessen Base64 mit jedem v1,-Wert in konstanter Zeit. Lehnen Sie einen Zeitstempel ab, der mehr als fünf Minuten von Ihrer Uhr abweicht:

import { createHmac, timingSafeEqual } from "node:crypto";

export function verified(secret, headers, rawBody) {
  const key = Buffer.from(secret.slice("whsec_".length), "base64");
  const id = headers["webhook-id"];
  const timestamp = headers["webhook-timestamp"];
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
  const expected = createHmac("sha256", key).update(`${id}.${timestamp}.`).update(rawBody).digest();
  return headers["webhook-signature"].split(" ").some((entry) => {
    const [version, signature] = entry.split(",");
    const given = Buffer.from(signature ?? "", "base64");
    return version === "v1" && given.length === expected.length && timingSafeEqual(given, expected);
  });
}

Antworten Sie 2xx schnell. Eine fehlgeschlagene Zustellung wird 15 Minuten lang erneut versucht; 410 Gone oder 413 Payload Too Large stoppt sie sofort.

Verwenden Sie die CLI für diese

Diese Schritte verschieben Dateien oder Geheimnisse oder laufen auf Ihrem Gerät, sodass sie in der gebündelten CLI bleiben:

AufgabeCLI
Projekt erstellenscreenrig agent enroll --email ADDRESS --organization NAME
Einen Agenten bei einem bestehenden Konto anmeldenscreenrig login
Mediendateien hochladenscreenrig media upload
Anwendung packen und hochladenscreenrig app pack, screenrig app upload
Webhook-Signaturgeheimnis erhalten oder rotierenscreenrig webhooks create druckt ihn einmal; screenrig webhooks rotate-secret
Senden Sie einen Einladungslinkscreenrig invitations create --link
Verfolgen Sie Ereignisse livescreenrig events follow (über MCP, Abfrage screenrig_event_list)
Wiedergaben als CSV exportierenscreenrig playback plays --format csv