Le serveur
| Paramètre | Valeur |
|---|---|
| URL | https://api.screenrig.ai/mcp |
| Transport | HTTP diffusible, sans état. Chaque requête est un POST. |
| Protocole | MCP 2026-07-28, envoyé comme en-tête MCP-Protocol-Version. Les clients commençant par initialize négocient 2025-11-25, 2025-06-18 ou 2025-03-26. |
| Authentification | OAuth 2.0 : Authorization: Bearer <access token> à chaque requête |
| Réponses | JSON, privé au projet, jamais mis en cache |
Le serveur ne conserve aucune session. Il refuse GET, DELETE, Mcp-Session-Id et les cookies. Chaque requête s’authentifie seule, donc une application déconnectée cesse de fonctionner à son prochain appel. Les requêtes sont limitées à 4 Mio.
Le plugin officiel couvre tout le flux de travail : il téléverse les fichiers et emballe les applications sur votre machine. Utilisez le serveur MCP lorsque votre client appelle des outils via MCP, et conservez le CLI intégré pour le travail local.
Connecter avec OAuth
Les clients MCP trouvent la connexion par eux-mêmes. Une requête sans jeton répond 401 avec WWW-Authenticate: Bearer resource_metadata="https://api.screenrig.ai/.well-known/oauth-protected-resource/mcp", et ce document nomme le serveur d’autorisation, https://api.screenrig.ai. Ses métadonnées sont à https://api.screenrig.ai/.well-known/oauth-authorization-server.
- Ajouter l’URL du serveur à votre client. Le client ouvre la page de consentement screenRIG dans votre navigateur.
- Connectez-vous au tableau de bord si nécessaire. La page affiche le nom et le domaine de l’application tels que déclarés, que screenRIG l’ait enregistrée ou non, et où votre navigateur revient.
- Choisissez le projet, Lecture seule, Proposer ou Gérer, ainsi que les capacités, puis choisissez Connecter l’app et confirmez avec votre clé d’accès.
- Votre navigateur revient à l’application, qui a maintenant sa propre session. Elle renouvelle cette session elle-même ; chaque jeton d’accès dure 15 minutes.
Connectez uniquement une application que vous configurez vous-même, maintenant. Les clients s’identifient avec un Document de métadonnées d’ID client (CIMD), donc il n’y a pas d’étape d’enregistrement. L’autorisation utilise PKCE avec S256, des URI de redirection exacts et un code à usage unique valable 60 secondes.
L’application apparaît sous Applications connectées dans la page Accès du tableau de bord. Déconnecter y met fin en quelques secondes ; reconnectez-la pour choisir un projet ou un niveau d’accès différent. Voir Authentification pour les sessions associées.
Le CLI et l’hôte MCP gardent des sessions séparées. Ne copiez pas le jeton sauvegardé du CLI dans la configuration MCP, ne collez pas les identifiants dans une conversation, ni ne les transmettez à une carte intégrée. L’hôte gère ses propres jetons OAuth et leur actualisation.
Le plugin officiel demande access:manage, screens, content, playlists et reports ; l’utilisateur approuve l’accès lors de la connexion. Une capture d’écran fraîche nécessite un accès Proposer ou Gérer et la capacité screens. Une connexion existante en lecture seule requiert un consentement renouvelé avant de demander une capture.
Les hôtes MCP Apps peuvent rendre des cartes interactives d’écran, média et liste de lecture via la connexion authentifiée. La carte utilise le pont MCP Apps de l’hôte ; elle ne contient aucune information d’identification et n’appelle pas l’API directement. Les hôtes sans rendu MCP Apps peuvent toujours consommer le texte d’outil et les données structurées.
Lecture seule, proposer et gérer
Les applications connectées sont par défaut en Lecture seule. Une application en Lecture seule liste uniquement les outils de lecture, et appeler un outil au-delà du niveau de session répond par HTTP 403 insufficient_access avec WWW-Authenticate: Bearer error="insufficient_scope" et le scope qui l’autorise. Les URL des récepteurs webhook sont masquées en Lecture seule.
Une app Propose liste aussi les outils qui téléversent, annotent et proposent. Ses changements de liste de lecture et d’écran retournent status: "pending_review" avec la revue id et url au lieu d’appliquer, et une personne les approuve dans le Revue du tableau de bord. Quand le projet exige une revue pour les changements d’agent, toutes les apps fonctionnent au plus à Propose. Pour laisser l’app faire des changements directement, déconnectez-la puis reconnectez-la avec Manage.
tools/list retourne uniquement les outils que le niveau d’accès et les capacités de la session permettent. Les droits du forfait du projet s’appliquent en plus, exactement comme pour le CLI. Chaque appel d’outil est une requête d’agent, facturée comme toute autre.
Connecter Claude
Dans Claude (web, bureau ou mobile), ajoutez un connecteur personnalisé avec l’URL https://api.screenrig.ai/mcp et connectez-le. Claude ouvre la page de consentement.
Dans Claude Code, ajoutez le serveur, puis authentifiez-vous depuis /mcp :
claude mcp add --transport http screenrig https://api.screenrig.ai/mcpConnecter ChatGPT
Dans ChatGPT, créez une app (connecteur) avec l’URL du serveur https://api.screenrig.ai/mcp et une authentification OAuth. ChatGPT ouvre la page de consentement lorsque vous le connectez. ChatGPT peut aussi s’abonner aux événements, comme un écran hors ligne, et vous informer lorsqu’ils se produisent.
Connecter Grok
Dans Grok sur le web, ajoutez un connecteur personnalisé avec l’URL du serveur https://api.screenrig.ai/mcp. Lorsqu’il demande un ID client OAuth, entrez screenrig-grok-web et laissez le secret client vide. Grok ouvre la page de consentement.
Dans Grok Build, ajoutez l’URL du serveur comme serveur HTTP distant. Grok Build ouvre la connexion du navigateur la première fois qu’il utilise le serveur.
Utilisez le serveur via une API
Les API Claude, OpenAI et xAI se connectent à un serveur MCP distant par requête, avec une valeur d’autorisation que vous fournissez. Utilisez un client de service : demandez un jeton avec resource=https://api.screenrig.ai/mcp, puis transmettez-le avec l’URL du serveur.
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| API | Où va le jeton |
|---|---|
| API Claude | authorization_token de l’entrée serveur MCP |
| API de réponses OpenAI | authorization de l’outil mcp |
| API xAI | authorization de l’outil MCP distant |
Un jeton issu de cette requête ne fonctionne que sur /mcp, dure 15 minutes et agit sur le projet du client de service avec son niveau d’accès et ses capacités. Demandez-en un nouveau à son expiration.
Outils
Chaque nom d’outil commence par screenrig_. Les appels d’outil exécutent les mêmes gestionnaires que le CLI et l’API REST, avec la même isolation de projet, autorisations, frais de crédits, limites de débit, idempotence et vérifications de révision.
| Zone | Outils |
|---|---|
| Projet et agent | project_get, project_update (renommer), agent_status, project_credential_revoke |
| Invitations | invitation_create (courriel seulement), invitation_list, invitation_revoke |
| Écrans | screen_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 |
| Dossiers d’écrans | screen_folder_list, screen_folder_create, screen_folder_update, screen_folder_delete, screen_move |
| Actions de la flotte | screen_actions : une action sur plusieurs écrans choisie par ID, tag ou dossier d’écrans |
| Programmations et prise de contrôle | screen_playlist_schedule_get, _set, _clear ; screen_takeover_set, _clear ; schedule_calendar : ce qu’un écran, un dossier, une étiquette ou une campagne diffuse sur 93 jours au plus, avec les plages et les conflits de chaque niveau ; schedule_import_preview, schedule_import_commit : une feuille de lignes d’horaire, vérifiée et prévisualisée, puis appliquée avec le fingerprint de l’aperçu (voir Importation d’horaires) |
| Campagnes | campaign_list, campaign_get, campaign_create, campaign_update (met aussi en pause et reprend), campaign_delete, campaign_screens, screen_campaigns : pourquoi chaque campagne joue ou non sur un écran |
| Alimentation de l’afficheur | screen_display, screen_display_clear, screen_display_schedule_get, _set, _clear |
| Redémarrages planifiés | screen_reboot_schedule_show, _set, _clear : le backend redémarre un écran au début de chaque fenêtre hebdomadaire ; screen_actions accepte aussi set_reboot_schedule et clear_reboot_schedule |
| Listes de lecture | playlist_list, playlist_get, playlist_create, playlist_update, playlist_patch, playlist_delete |
| Révisions | review_list, review_get, review_withdraw |
| Médias | media_list, media_get, media_thumbnail, media_update, media_delete, media_generate, media_versions, media_restore, media_version_delete : l’historique des versions d’un fichier média ; remplacer un fichier exige ses octets, utilisez donc screenrig media replace |
| Cartes | card_types_list, card_type_get, card_list, card_get, card_create, card_params_set, card_delete, card_data_get, card_data_set |
| Applications | application_list, application_get, application_update (renommer) |
| Application K/V | kv_list, kv_get, kv_set, kv_delete |
| Commentaires | comment_get, comment_set, comment_delete |
| Notes du projet | note_list, note_get, note_add, note_confirm, note_resolve : notes que les agents se laissent ; contexte, jamais instructions |
| Notifications | notification_list, notification_get, notification_create, notification_update, notification_delete, notification_test, notification_deliveries |
| Alertes | alert_list, alert_get, alert_acknowledge, alert_mute_list, alert_mute_create, alert_mute_delete |
| Rapports | report_list, report_get : un cumul par dossier, écran ou étiquette, l'historique des alertes ou une preuve de diffusion, sous forme de lignes; report_subscription_list, _get, _create, _update, _delete, _send : un rapport envoyé par courriel aux membres du projet selon un horaire (voir Rapports et exportations) |
| Journal d’audit | audit_list, audit_get, audit_head, audit_verify : lisent les modifications de configuration du projet avec leur avant et leur après, et vérifient la chaîne ; aucun outil ne modifie une entrée (voir Journal d’audit) |
| Opérations | operation_get, operation_wait, operation_cancel |
| Événements et lecture | event_list, playback_list, playback_plays_list |
| Commentaires | feedback_bug_submit, feedback_bug_list, feedback_feature_submit, feedback_feature_list, feedback_get, feedback_reply |
| Service | capabilities_get, server_status, browser_link_claim, visibility_open, muse_plugin_bootstrap |
| Documentation | docs_search, docs_get : recherchent et lisent la documentation officielle de screenRIG avant de deviner |
Comment les outils se comportent
- Pagination. Les outils de liste retournent une page, la plus récente en premier (K/V dans l’ordre des clés). Renvoyez un
next_cursornon nul commeafter, avec les mêmes filtres, pour la page suivante. - Nouvelles tentatives. Les écritures acceptent un
idempotency_keyoptionnel. Réutilisez-le pour retenter la même écriture en toute sécurité ; omettez-le pour démarrer une nouvelle requête. Le jumelage, les notifications toast, les captures d’écran, la génération d’images, les invitations, les liens de navigateur, les annulations d’opération et les retours d’information en requièrent un, et leurs schémas d’entrée l’indiquent. - Révisions. Les écritures acceptent un
revisionoptionnel. Une révision périmée est refusée : relisez la ressource, réappliquez la modification et retentez. - Révisions. Les outils de modification de playlist et d’écran acceptent un
review_notefacultatif, de 280 caractères au plus, que le réviseur lit. Une modification qui attend une révision renvoie le corpspending_review: dites à l’utilisateur qu’elle attend son approbation et donnez-lui leurlde la révision. Unmedia_updatequi change les étiquettes d’un média approuvé renvoie l’élément avecreview_statepending: les écrans gardent ses étiquettes approuvées, et sa révision apparaît dans Révisions en quelques secondes. Unmedia_restoreaccepte le mêmereview_noteet renvoie le corpspending_review: le média continue de diffuser son fichier jusqu’à ce qu’une personne approuve. - Ce qui joue. Un écran joue le niveau le plus haut qui est en vigueur dans une pile : sa prise de contrôle, les campagnes qui l’atteignent (
priorityde 0 à 100, la plus élevée d’abord, puis la plus récente), les entrées de son horaire de liste de lecture dans l’ordre, puis sa liste de lecture assignée. Les campagnes et les entrées d’horaire acceptent les mêmes règles que le CLI, dontmonthly,dates,exceptetinteraction.screen_getrapporteeffective_playlistavecsourcetakeover,campaign,scheduleoudefault.schedule_calendarprendfrometto(au plus 93 jours d’écart) et l’un descreen_id,folder_id,tagoucampaign_id: il regroupe les écrans à piles identiques et liste les plages de chaque niveau (plays,partial,outranked,conditional) et les conflits (deux campagnes de même priorité en vigueur en même temps, un niveau qui ne joue jamais). Les écritures de campagne nécessitent l’accès Gérer et ne deviennent jamais des révisions : une app Propose ne liste que les outils de lecture des campagnes. - Captures d’écran.
screen_screenshotattend jusqu’à 60 secondes et renvoie la capture comme contenu d’imageimage/webp.screen_screenshot_currentrenvoie la dernière image fixe prête et son tempscaptured_atsans demander une nouvelle capture. - Règles de notification.
notification_createetnotification_updateacceptentmin_severity(info,warningouerror),severity(condition vers niveau, comme{"not_playing": "error"}),active_hours(timezone,windowsetoutside,holdoudrop) etaudience(les règles d’une audience de campagne, au lieu descreen_tags).reach_drop(screens,percent) fixe l’ampleur d’une baisse de la portée d’une campagne qui déclenche un avis pour une conditionreach_dropped; il n’est valide qu’avec cette condition.reach_droppedetgroup_emptysurveillent des campagnes, doncscreen_tagsetaudiencene les limitent jamais. Lors d’une mise à jour,nullefface chacun. Un avis mis en attente ou ignoré apparaît dansnotification_deliveries. - Les secrets restent à l’écart. Les résultats du webhook ne contiennent jamais le secret de signature et réduisent chaque URL de récepteur à son origine. Les invitations se font uniquement par courriel, donc aucun lien d’invitation n’atteint le modèle.
- Révocation.
project_credential_revokedéconnecte l’agent dont la session a effectué l’appel. Cela requiertconfirmation: "REVOKE", etallow_last_agent: truepour déconnecter le dernier agent actif du projet. Le projet et son contenu restent. Une application connectée termine sa propre session viahttps://api.screenrig.ai/oauth/revoke, ou une personne la déconnecte sur la page Accès. - Erreurs. Un appel refusé renvoie une erreur d’outil dont le contenu structuré est le document de problème de l’API REST, avec
code,detailetstatus. Les métadonnéesscreenrig/resultdu résultat portenthttp_status, etetag,credit_remainingouretry_afterlorsque le serveur les a envoyées.
Ressources
Les ressources du projet exposent des métadonnées privées et ne sont jamais mises en cache. Le serveur fournit aussi une ressource UI HTML pour les cartes interactives dans les hôtes MCP Apps.
| URI | Contenus |
|---|---|
screenrig://project | Le projet authentifié |
screenrig://screens/{id} | Un écran |
screenrig://playlists/{id} | Une liste de lecture |
screenrig://media/{id} | Les métadonnées d’un élément média |
screenrig://applications/{id} | Une application |
screenrig://operations/{id} | Une opération asynchrone |
Événements
Le serveur implémente MCP Events avec livraison webhook. Une application s’abonne à un événement, et screenRIG POSTe un message signé au rappel HTTPS de l’application quand il se produit, pour que l’application puisse vous dire qu’un écran est hors ligne ou qu’une capture d’écran est prête sans sondage. L’abonnement nécessite une session OAuth : une application connectée ou un client de service. Les sessions en lecture seule peuvent s’abonner, car les événements sont des lectures.
| Événement | Quand | Données | Capacité |
|---|---|---|---|
screen.offline | Un écran a cessé de rapporter | screenId, screenName | screens |
screen.online | Un écran est revenu en ligne | screenId, screenName | screens |
screen.screenshot_ready | Une capture d’écran demandée a été prise | screenId, screenName, captureId, width, height | screens |
screen.playlist_unavailable | Une liste de lecture programmée ne peut pas être affichée | screenId, screenName, playlistId, code | screens |
screen.display_changed | Une modification de la programmation ou de la gestion de l’alimentation d’un afficheur | screenId, screenName, change | screens |
agent_connection.approved | Une personne a approuvé la connexion ou la connexion d’un agent | agentId | project |
note.added | Un agent a ajouté une note de projet | noteId, authorAgentId, aboutId | n’importe quel |
note.resolved | Une note de projet a été résolue, remplacée, expirée, non confirmée, ou son écran ou sa liste de lecture a été supprimé | noteId, cause | n’importe quel |
Une app qui propose des changements apprend chaque décision de review.requested, review.approved, review.rejected et review.changes_requested.
Les données ne contiennent que les identifiants et états. Lisez l’enregistrement complet avec un outil, tel que screenrig_screen_get ou screenrig_screen_screenshot_current.
Lister et s’abonner
events/list retourne les événements auxquels cette session peut s’abonner, chacun avec un inputSchema et un payloadSchema. Les événements d’écran prennent un argument screenId optionnel pour suivre un écran. events/subscribe prend l’événement, ses arguments et le rappel :
{
"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
}
}- Le secret est à vous :
whsec_suivi de base64 de 24 à 64 octets aléatoires. Il signe chaque livraison. - Le rappel est une URL HTTPS sur une adresse publique, sans redirections.
- Le résultat porte l’abonnement
id(sub_…),refreshBeforeetcursor: null. Les livraisons commencent maintenant ; il n’y a pas de relecture. - Durée de vie.
ttlMsdemande de 5 minutes à 24 heures ; la valeur par défaut est une heure, etnullobtient 24 heures. Abonnez-vous à nouveau avec le même nom, arguments et URL avantrefreshBeforepour prolonger ; l’ID reste le même, et le résultat indiquedeliveryStatus. Un nouveau secret lors d’un rafraîchissement signe avec l’ancien pendant 10 minutes. - Désabonnez-vous avec
events/unsubscribeet le même nom, arguments etdelivery.url.
Une organisation contient jusqu’à 100 abonnements, tous projets confondus, et une session peut s’abonner 120 fois par heure. Un abonnement se termine lorsque sa session ou son client de service est révoqué, son application est déconnectée, sa personne est désactivée ou son projet est supprimé, et son autorité est vérifiée toutes les 15 minutes.
Vérifier le rappel
La première souscription d’une session à une URL de rappel envoie un POST de vérification signé :
{ "type": "verification", "challenge": "RANDOM_CHALLENGE" }Répondez à 2xx dans les 5 secondes avec le même défi au format JSON :
{ "challenge": "RANDOM_CHALLENGE" }Une vérification échouée répond à l’appel subscribe avec une erreur JSON-RPC -32015, dont le data.reason est challenge_failed, timeout, connection_refused, tls_error, http_4xx ou http_5xx.
Recevoir les livraisons
Chaque livraison correspond à un POST d’un seul événement, d’au plus 256 KiB :
{
"eventId": "evt_EVENT",
"name": "screen.offline",
"timestamp": "2026-10-08T14:02:11Z",
"data": { "screenId": "scr_LOBBY", "screenName": "Lobby" },
"cursor": null
}Les livraisons suivent les Webhooks Standard :
| En-tête | Valeur |
|---|---|
webhook-id | L’identifiant du message. Évitez les doublons sur celui-ci ou sur eventId. |
webhook-timestamp | Secondes Unix lors de l’envoi |
webhook-signature | v1, et la signature HMAC-SHA256 en base64 ; deux, séparées par un espace, pendant qu’un nouveau secret prend le relais |
X-MCP-Subscription-Id | L’identifiant d’abonnement |
Pour vérifier, décodez le base64 après whsec_ dans la clé, calculez le HMAC-SHA256 sur webhook-id, ., webhook-timestamp, . et le corps brut, puis comparez son base64 avec chaque valeur v1, en temps constant. Rejetez un horodatage à plus de cinq minutes de votre horloge :
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);
});
}Répondez à 2xx rapidement. Une livraison échouée est retentée pendant 15 minutes ; 410 Gone ou 413 Payload Too Large l’arrête immédiatement.
Utilisez le CLI pour ceux-ci
Ces étapes déplacent des fichiers ou des secrets, ou s’exécutent sur votre machine, donc elles restent dans le CLI intégré :
| Tâche | CLI |
|---|---|
| Créer un projet | screenrig agent enroll --email ADDRESS --organization NAME |
| Connecter un agent à un compte existant | screenrig login |
| Téléverser des fichiers médias | screenrig media upload |
| Emballez et téléversez une application | screenrig app pack, screenrig app upload |
| Obtenir ou faire pivoter un secret de signature de webhook | screenrig webhooks create l’affiche une fois ; screenrig webhooks rotate-secret |
| Envoyer un lien d’invitation | screenrig invitations create --link |
| Suivre les événements en direct | screenrig events follow (sur MCP, sondage screenrig_event_list) |
| Exporter les lectures en CSV | screenrig playback plays --format csv |