Il server
| Impostazione | Valore |
|---|---|
| URL | https://api.screenrig.ai/mcp |
| Trasporto | HTTP flussabile, senza stato. Ogni richiesta è un POST. |
| Protocollo | MCP 2026-07-28, inviato come header MCP-Protocol-Version. I client che iniziano con initialize negoziano 2025-11-25, 2025-06-18 o 2025-03-26. |
| Autenticazione | OAuth 2.0: Authorization: Bearer <access token> su ogni richiesta |
| Risposte | JSON, privato al progetto, mai memorizzato nella cache |
Il server non mantiene sessioni. Rifiuta GET, DELETE, Mcp-Session-Id e cookie. Ogni richiesta si autentica da sola, quindi un’app disconnessa smette di funzionare alla chiamata successiva. Le richieste sono limitate a 4 MiB.
Il plugin ufficiale gestisce l’intero flusso di lavoro: carica file e impacchetta applicazioni sulla tua macchina. Usa il server MCP quando il client chiama strumenti tramite MCP e conserva il CLI incluso per il lavoro locale.
Connetti con OAuth
I client MCP trovano l’accesso da soli. Una richiesta senza token risponde 401 con WWW-Authenticate: Bearer resource_metadata="https://api.screenrig.ai/.well-known/oauth-protected-resource/mcp", e quel documento nomina il server di autorizzazione, https://api.screenrig.ai. I suoi metadati sono a https://api.screenrig.ai/.well-known/oauth-authorization-server.
- Aggiungi l’URL del server al client. Il client apre la pagina di consenso screenRIG nel browser.
- Accedi al dashboard se necessario. La pagina mostra il nome e il dominio dell’app come dichiarati dall’app stessa, se registrata da screenRIG, e dove il browser ritorna.
- Scegli il progetto, Solo lettura, Proponi o Gestisci, e le capacità, poi scegli Connetti app e conferma con la tua passkey.
- Il tuo browser torna all’app, che ora ha la propria sessione. Essa si rinnova da sola; ogni token di accesso dura 15 minuti.
Connetti solo un’app che stai configurando tu stesso, adesso. I client si identificano con un Documento Metadata Client ID (CIMD), quindi non c’è una fase di registrazione. L’autorizzazione usa PKCE con S256, URI di reindirizzamento esatti e un codice monouso valido 60 secondi.
L’app appare sotto App connesse nella pagina Accesso della dashboard. Disconnetti lì termina la connessione in pochi secondi; riconnettila per scegliere un progetto o livello di accesso diverso. Vedi Autenticazione per le sessioni dietro di essa.
Il CLI e l’host MCP mantengono sessioni separate. Non copiare il token salvato dal CLI nella configurazione MCP, incollare credenziali in una conversazione o passarle a una scheda incorporata. L’host gestisce i propri token OAuth e il refresh.
Il plugin ufficiale richiede access:manage, screens, content, playlists e reports; l’utente approva l’accesso durante l’accesso. Uno screenshot nuovo richiede accesso Proponi o Gestisci e la capacità screens. Una connessione esistente in sola lettura necessita di consenso rinnovato prima di richiedere una cattura.
Gli host MCP Apps possono renderizzare schede interattive di schermo, media e playlist tramite la connessione autenticata. La scheda usa il bridge MCP Apps dell’host; non contiene credenziali e non chiama direttamente l’API. Gli host senza rendering MCP Apps possono comunque consumare testo strumento e dati strutturati.
Solo lettura, proporre e gestire
Le app connesse sono impostate di default su Solo lettura. Un’app Solo lettura elenca solo strumenti di lettura, e chiamare uno strumento oltre il livello della sessione risponde con HTTP 403 insufficient_access con WWW-Authenticate: Bearer error="insufficient_scope" e il scope che lo autorizza. Gli URL dei webhook per ricezione sono oscurati per Solo lettura.
Un’app Propose elenca anche gli strumenti che caricano, annotano e propongono. Le sue modifiche a playlist e schermo restituiscono status: "pending_review" con la id e url della revisione invece di applicarle, e una persona le approva nel dashboard Reviews. Quando il progetto richiede revisione per modifiche agent, ogni app lavora al massimo in Propose. Per permettere all’app di modificare direttamente, disconnettila e riconnettila con Manage.
tools/list restituisce solo gli strumenti consentiti dal livello di accesso e dalle capacità della sessione. Si applicano i diritti del piano progetto, esattamente come per la CLI. Ogni chiamata a uno strumento è una richiesta agente, fatturata come le altre.
Connetti Claude
In Claude (web, desktop o mobile), aggiungi un connettore personalizzato con l’URL https://api.screenrig.ai/mcp e connettilo. Claude apre la pagina di consenso.
In Claude Code, aggiungi il server, poi autentica da /mcp:
claude mcp add --transport http screenrig https://api.screenrig.ai/mcpConnetti ChatGPT
In ChatGPT, crea un’app (connettore) con l’URL server https://api.screenrig.ai/mcp e autenticazione OAuth. ChatGPT apre la pagina di consenso quando lo connetti. ChatGPT può anche iscriversi agli eventi, come uno schermo che va offline, e avvisarti quando accadono.
Connetti Grok
In Grok sul web, aggiungi un connettore personalizzato con l’URL server https://api.screenrig.ai/mcp. Quando chiede un client ID OAuth, inserisci screenrig-grok-web e lascia vuoto il client secret. Grok apre la pagina di consenso.
In Grok Build, aggiungi l’URL server come server HTTP remoto. Grok Build apre il browser per l’accesso la prima volta che usa il server.
Usa il server tramite API
Le API Claude, OpenAI e xAI si connettono a un server MCP remoto per ogni richiesta, con un valore di autorizzazione fornito. Usa un client di servizio: richiedi un token con resource=https://api.screenrig.ai/mcp, poi passalo con l’URL del server.
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 | Dove va il token |
|---|---|
| API Claude | authorization_token della voce server MCP |
| OpenAI Responses API | authorization dello strumento mcp |
| API xAI | authorization dello strumento MCP remoto |
Un token da quella richiesta funziona solo su /mcp, dura 15 minuti e agisce sul progetto del client di servizio con il suo livello di accesso e capacità. Richiedine uno nuovo quando scade.
Strumenti
Ogni nome strumento inizia con screenrig_. Le chiamate strumento eseguono gli stessi handler di CLI e REST API, con la stessa isolazione progetto, permessi, addebiti crediti, limiti di velocità, idempotenza e controlli revisione.
| Area | Strumenti |
|---|---|
| Progetto e agente | project_get, project_update (rinomina), agent_status, project_credential_revoke |
| Inviti | invitation_create (solo email), invitation_list, invitation_revoke |
| Schermi | 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 |
| Cartelle schermi | screen_folder_list, screen_folder_create, screen_folder_update, screen_folder_delete, screen_move |
| Azioni della flotta | screen_actions: un’azione tra schermi scelta per ID, tag o cartella di schermi |
| Programmazioni e takeover | screen_playlist_schedule_get, _set, _clear; screen_takeover_set, _clear; schedule_calendar: cosa riproduce uno schermo, una cartella, un tag o una campagna fino a 93 giorni, con gli intervalli e i conflitti di ogni livello; schedule_import_preview, schedule_import_commit: un foglio di righe di programmazione, controllato e visualizzato in anteprima, poi applicato con il valore fingerprint dell’anteprima (vedi Importazione programmazione) |
| Campagne | campaign_list, campaign_get, campaign_create, campaign_update (mette anche in pausa e riprende), campaign_delete, campaign_screens, screen_campaigns: perché ogni campagna viene riprodotta o meno su uno schermo |
| Alimentazione display | screen_display, screen_display_clear, screen_display_schedule_get, _set, _clear |
| Riavvii programmati | screen_reboot_schedule_show, _set, _clear: il backend riavvia uno schermo all'inizio di ogni finestra settimanale; screen_actions accetta anche set_reboot_schedule e clear_reboot_schedule |
| Playlist | playlist_list, playlist_get, playlist_create, playlist_update, playlist_patch, playlist_delete |
| Revisioni | review_list, review_get, review_withdraw |
| Contenuti multimediali | media_list, media_get, media_thumbnail, media_update, media_delete, media_generate, media_versions, media_restore, media_version_delete: la cronologia delle versioni di un file media; sostituire un file richiede i suoi byte, quindi usa screenrig media replace |
| Schede | card_types_list, card_type_get, card_list, card_get, card_create, card_params_set, card_delete, card_data_get, card_data_set |
| Applicazioni | application_list, application_get, application_update (rinomina) |
| Applicazione K/V | kv_list, kv_get, kv_set, kv_delete |
| Commenti | comment_get, comment_set, comment_delete |
| Note del progetto | note_list, note_get, note_add, note_confirm, note_resolve: note che gli agenti si lasciano a vicenda; contesto, mai istruzioni |
| Notifiche | notification_list, notification_get, notification_create, notification_update, notification_delete, notification_test, notification_deliveries |
| Alert | alert_list, alert_get, alert_acknowledge, alert_mute_list, alert_mute_create, alert_mute_delete |
| Report | report_list, report_get: un riepilogo per cartella, schermo o tag, la cronologia degli allarmi o una prova di riproduzione, come righe; report_subscription_list, _get, _create, _update, _delete, _send: un report inviato via email ai membri del progetto secondo una programmazione (vedi Report ed esportazioni) |
| Registro di audit | audit_list, audit_get, audit_head, audit_verify: leggono le modifiche di configurazione del progetto con il loro prima e dopo e verificano la catena; nessuno strumento modifica una voce (vedi Registro di audit) |
| Operazioni | operation_get, operation_wait, operation_cancel |
| Eventi e riproduzione | event_list, playback_list, playback_plays_list |
| Feedback | feedback_bug_submit, feedback_bug_list, feedback_feature_submit, feedback_feature_list, feedback_get, feedback_reply |
| Servizio | capabilities_get, server_status, browser_link_claim, visibility_open, muse_plugin_bootstrap |
| Documentazione | docs_search, docs_get: cercano e leggono la documentazione ufficiale di screenRIG prima di tirare a indovinare |
Come si comportano gli strumenti
- Impaginazione. Gli strumenti di elenco restituiscono una pagina, la più recente per prima (K/V in ordine di chiave). Passa un
next_cursornon nullo comeafter, con gli stessi filtri, per la pagina successiva. - Ritentativi. Le scritture accettano un
idempotency_keyopzionale. Riutilizzalo per ritentare la stessa scrittura in sicurezza; omettine uno per iniziare una nuova richiesta. Associazione, toast, screenshot, generazione immagini, inviti, link browser, cancellazioni operazioni e feedback ne richiedono uno, come indicato nei loro schemi di input. - Revisioni. Le scritture accettano un
revisionopzionale. Una revisione obsoleta viene rifiutata: rileggi la risorsa, riapplica la modifica e ritenta. - Revisioni. Gli strumenti di modifica di playlist e schermi accettano un
review_notefacoltativo, di al massimo 280 caratteri, che il revisore legge. Una modifica in attesa di revisione restituisce il corpopending_review: di’ all’utente che attende la sua approvazione e dagli ilurldella revisione. Unmedia_updateche cambia i tag di un media approvato restituisce l’elemento conreview_statepending: gli schermi mantengono i tag approvati e la sua revisione compare in Revisioni entro pochi secondi. Unmedia_restoreaccetta lo stessoreview_notee restituisce il corpopending_review: il media continua a riprodurre il suo file finché una persona non approva. - Cosa viene riprodotto. Uno schermo riproduce il livello più alto in vigore di uno stack: il suo takeover, le campagne che lo raggiungono (
priorityda 0 a 100, prima il valore più alto, poi la più recente), le voci della sua programmazione playlist in ordine e infine la sua playlist assegnata. Campagne e voci di programmazione accettano le stesse regole della CLI, tra cuimonthly,dates,excepteinteraction.screen_getriportaeffective_playlistconsourcetakeover,campaign,scheduleodefault.schedule_calendaraccettafrometo(al massimo 93 giorni di distanza) e uno trascreen_id,folder_id,tagocampaign_id: raggruppa gli schermi con stack identici ed elenca gli intervalli di ogni livello (plays,partial,outranked,conditional) e i conflitti (due campagne con la stessa priorità in vigore insieme, un livello che non viene mai riprodotto). Le scritture di campagna richiedono l’accesso Gestisci e non diventano mai revisioni: un’app Propose elenca solo gli strumenti di lettura delle campagne. - Screenshots.
screen_screenshotattende fino a 60 secondi e restituisce la cattura come contenuto immagineimage/webp.screen_screenshot_currentrestituisce l’ultima immagine pronta e il suo tempocaptured_atsenza richiedere una nuova cattura. - Regole di notifica.
notification_createenotification_updateaccettanomin_severity(info,warningoerror),severity(da condizione a livello, ad esempio{"not_playing": "error"}),active_hours(timezone,windowseoutside,holdodrop) eaudience(le regole di un pubblico di campagna, al posto discreen_tags).reach_drop(screens,percent) stabilisce quanto deve essere ampio un calo della copertura di una campagna perché una condizionereach_droppednotifichi; è valido solo con quella condizione.reach_droppedegroup_emptycontrollano le campagne, quindiscreen_tagseaudiencenon le limitano mai. In aggiornamento,nullazzera ciascuno. Un avviso trattenuto o saltato compare innotification_deliveries. - I segreti restano nascosti. I risultati webhook non includono mai il segreto di firma e riducono ogni URL destinatario alla sua origine. Gli inviti arrivano solo via email, quindi nessun link di invito raggiunge il modello.
- Revoca.
project_credential_revokedisconnette l’agente la cui sessione ha effettuato la chiamata. Richiedeconfirmation: "REVOKE"eallow_last_agent: trueper disconnettere l’ultimo agente attivo del progetto. Il progetto e i suoi contenuti restano. Un’app connessa termina la propria sessione tramitehttps://api.screenrig.ai/oauth/revoke, o una persona la disconnette nella pagina Accesso. - Errori. Una chiamata rifiutata restituisce un errore strumento il cui contenuto strutturato è il documento problema dell’API REST, con
code,detailestatus. I metadatiscreenrig/resultdel risultato contengonohttp_status, eetag,credit_remainingoretry_afterquando il server li ha inviati.
Risorse
Le risorse del progetto espongono metadati privati e non sono mai memorizzate nella cache. Il server fornisce anche una risorsa UI HTML per schede interattive negli host MCP Apps.
| URI | Contenuti |
|---|---|
screenrig://project | Il progetto autenticato |
screenrig://screens/{id} | Uno schermo |
screenrig://playlists/{id} | Una playlist |
screenrig://media/{id} | I metadati di un elemento media |
screenrig://applications/{id} | Una applicazione |
screenrig://operations/{id} | Una operazione asincrona |
Eventi
Il server implementa MCP Events con consegna webhook. Un’app si iscrive a un evento, e screenRIG POSTa un messaggio firmato al callback HTTPS dell’app quando accade, così l’app può comunicare che uno schermo è offline o uno screenshot è pronto senza polling. L’iscrizione richiede una sessione OAuth: un’app connessa o un client di servizio. Le sessioni di sola lettura possono iscriversi, poiché gli eventi sono letture.
| Evento | Quando | Dati | Capacità |
|---|---|---|---|
screen.offline | Uno schermo ha smesso di segnalare | screenId, screenName | screens |
screen.online | Uno schermo è tornato online | screenId, screenName | screens |
screen.screenshot_ready | Uno screenshot richiesto è stato catturato | screenId, screenName, captureId, width, height | screens |
screen.playlist_unavailable | Una playlist programmata non può essere mostrata | screenId, screenName, playlistId, code | screens |
screen.display_changed | Una modifica di override o programmazione dell’alimentazione del display | screenId, screenName, change | screens |
agent_connection.approved | Una persona ha approvato la connessione o l’accesso di un agente | agentId | project |
note.added | Un agente ha aggiunto una nota al progetto | noteId, authorAgentId, aboutId | qualsiasi |
note.resolved | Una nota di progetto è stata risolta, sostituita, scaduta, non confermata o il suo schermo o playlist è stato eliminato | noteId, cause | qualsiasi |
Un’app che propone modifiche impara ogni decisione da review.requested, review.approved, review.rejected e review.changes_requested.
I dati contengono solo ID e stati. Leggi il record completo con uno strumento, come screenrig_screen_get o screenrig_screen_screenshot_current.
Elenca e sottoscrivi
events/list restituisce gli eventi a cui questa sessione può iscriversi, ciascuno con un inputSchema e un payloadSchema. Gli eventi schermo accettano un argomento screenId opzionale per seguire uno schermo. events/subscribe prende l’evento, i suoi argomenti e la callback:
{
"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
}
}- Il segreto è tuo:
whsec_seguito da base64 di 24 a 64 byte casuali. Firma ogni consegna. - Il callback è un URL HTTPS su un indirizzo pubblico, senza redirect.
- Il risultato include l’iscrizione
id(sub_…),refreshBeforeecursor: null. Le consegne partono da ora; non c’è replay. - Durata.
ttlMsrichiede da 5 minuti a 24 ore; il valore predefinito è un’ora, enullottiene 24 ore. Rinnova con lo stesso nome, argomenti e URL prima direfreshBeforeper estenderla; l’id resta lo stesso e il risultato riportadeliveryStatus. Un nuovo segreto su un aggiornamento firma insieme al vecchio per 10 minuti. - Disiscrivi con
events/unsubscribee lo stesso nome, argomenti edelivery.url.
Un’organizzazione contiene fino a 100 sottoscrizioni in tutti i suoi progetti, e una sessione può sottoscriversi 120 volte all’ora. Una sottoscrizione termina quando la sua sessione o client servizio è revocato, la sua app disconnessa, la sua persona disattivata o il suo progetto eliminato, e la sua autorità si ricontrolla ogni 15 minuti.
Verifica il callback
La prima sottoscrizione da una sessione a un URL di callback invia un POST di verifica firmato:
{ "type": "verification", "challenge": "RANDOM_CHALLENGE" }Rispondi a 2xx entro 5 secondi con la stessa sfida in JSON:
{ "challenge": "RANDOM_CHALLENGE" }Un controllo fallito risponde alla chiamata subscribe con errore JSON-RPC -32015, il cui data.reason è challenge_failed, timeout, connection_refused, tls_error, http_4xx o http_5xx.
Ricevi consegne
Ogni consegna è un POST di un solo evento, massimo 256 KiB:
{
"eventId": "evt_EVENT",
"name": "screen.offline",
"timestamp": "2026-10-08T14:02:11Z",
"data": { "screenId": "scr_LOBBY", "screenName": "Lobby" },
"cursor": null
}Le consegne seguono Standard Webhooks:
| Intestazione | Valore |
|---|---|
webhook-id | L’id del messaggio. Deduplica su di esso o su eventId. |
webhook-timestamp | Secondi Unix in cui è stato inviato |
webhook-signature | v1, e la firma HMAC-SHA256 base64; due, separati da uno spazio, mentre un nuovo segreto prende il posto |
X-MCP-Subscription-Id | L’ID sottoscrizione |
Per verificare, decodifica il base64 dopo whsec_ nella chiave, calcola HMAC-SHA256 su webhook-id, ., webhook-timestamp, . e il corpo grezzo, e confronta il suo base64 con ogni valore v1, in tempo costante. Rifiuta un timestamp più di cinque minuti distante dal tuo orologio:
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);
});
}Rispondi a 2xx rapidamente. Una consegna fallita viene ritentata per 15 minuti; 410 Gone o 413 Payload Too Large la interrompono subito.
Usa la CLI per questi
Questi passaggi spostano file o segreti, o vengono eseguiti sulla tua macchina, quindi restano nel CLI incluso:
| Attività | CLI |
|---|---|
| Crea un progetto | screenrig agent enroll --email ADDRESS --organization NAME |
| Accedi a un agente in un account esistente | screenrig login |
| Carica file media | screenrig media upload |
| Impacchetta e carica un’applicazione | screenrig app pack, screenrig app upload |
| Ottieni o ruota un segreto di firma webhook | screenrig webhooks create lo stampa una volta; screenrig webhooks rotate-secret |
| Invia un link di invito | screenrig invitations create --link |
| Segui gli eventi in tempo reale | screenrig events follow (oltre MCP, sondaggio screenrig_event_list) |
| Esporta riproduzioni come CSV | screenrig playback plays --format csv |