Documentação

Conecte um cliente MCP a suas telas

screenRIG roda um servidor MCP remoto que permite a Claude, ChatGPT ou Grok trabalhar com seu Digital Signage. Conecte-os com OAuth: uma pessoa aprova o app no dashboard, escolhe o projeto e Somente leitura, Propor ou Gerenciar, e o app obtém ferramentas do projeto para telas, playlists, mídias, programações, webhooks e relatórios.

O servidor

ConfiguraçãoValor
URLhttps://api.screenrig.ai/mcp
TransporteHTTP transmissível, sem estado. Cada requisição é um POST.
ProtocoloMCP 2026-07-28, enviado como o cabeçalho MCP-Protocol-Version. Clientes que começam com initialize negociam 2025-11-25, 2025-06-18 ou 2025-03-26.
AutenticaçãoOAuth 2.0: Authorization: Bearer <access token> em cada solicitação
RespostasJSON, privado ao projeto, nunca em cache

O servidor não mantém sessões. Recusa GET, DELETE, Mcp-Session-Id e cookies. Cada requisição autentica-se sozinha, então um app desconectado para de funcionar na próxima chamada. Requisições são limitadas a 4 MiB.

O plugin oficial mantém o fluxo completo: ele envia arquivos e empacota aplicativos na sua máquina. Use o servidor MCP quando seu cliente chamar ferramentas via MCP, e mantenha o CLI incluído para o trabalho local.

Conectar com OAuth

Clientes MCP encontram o login sozinhos. Uma solicitação sem token responde 401 com WWW-Authenticate: Bearer resource_metadata="https://api.screenrig.ai/.well-known/oauth-protected-resource/mcp", e esse documento nomeia o servidor de autorização, https://api.screenrig.ai. Seus metadados estão em https://api.screenrig.ai/.well-known/oauth-authorization-server.

  1. Adicione a URL do servidor ao seu cliente. O cliente abre a página de consentimento screenRIG no seu navegador.
  2. Faça login no dashboard se necessário. A página mostra o nome e domínio do aplicativo conforme declarado pelo app, se o screenRIG o registrou e para onde seu navegador retorna.
  3. Escolha o projeto, Somente leitura, Propor ou Gerenciar, e as capacidades, depois escolha Conectar app e confirme com sua passkey.
  4. Seu navegador retorna ao app, que agora tem sua própria sessão. Ele renova essa sessão sozinho; cada token de acesso dura 15 minutos.

Conecte apenas um aplicativo que você está configurando agora. Os clientes se identificam com um Documento de Metadados de ID do Cliente (CIMD), portanto não há etapa de registro. A autorização usa PKCE com S256, URIs de redirecionamento exatos e um código de uso único que dura 60 segundos.

O app aparece em Apps conectados na página Acesso do dashboard. Desconectar ali encerra em segundos; reconecte para escolher outro projeto ou nível de acesso. Veja Autenticação para as sessões por trás disso.

O host CLI e MCP mantêm sessões separadas. Não copie o token salvo do CLI para a configuração do MCP, cole credenciais em uma conversa ou as passe para um cartão incorporado. O host gerencia seus próprios tokens OAuth e atualização.

O plugin oficial solicita access:manage, screens, content, playlists e reports; o usuário aprova o acesso durante o login. Uma captura de tela nova requer acesso Propor ou Gerenciar e a capacidade screens. Uma conexão existente somente leitura precisa de consentimento renovado antes de solicitar uma captura.

Hosts de MCP Apps podem renderizar cartões interativos de tela, mídia e playlist pela conexão autenticada. O cartão usa a ponte MCP Apps do host; não contém credencial e não chama a API diretamente. Hosts sem renderização MCP Apps ainda podem consumir texto de ferramenta e dados estruturados.

Somente leitura, Propor e Gerenciar

Aplicativos conectados padrão para Somente leitura. Um aplicativo Somente leitura lista apenas ferramentas de leitura, e chamar uma ferramenta acima do nível da sessão responde HTTP 403 insufficient_access com WWW-Authenticate: Bearer error="insufficient_scope" e o scope que permite isso. URLs de receptor webhook aparecem como ocultos para Somente leitura.

Um app Propose também lista as ferramentas que enviam, anotam e propõem. Suas mudanças de playlist e tela retornam status: "pending_review" com a id e url da revisão em vez de aplicar, e uma pessoa as aprova no Reviews do dashboard. Quando o projeto requer revisão para mudanças de agente, todo app funciona no máximo em Propose. Para permitir que o app faça mudanças diretamente, desconecte-o e conecte-o novamente com Manage.

tools/list retorna apenas as ferramentas que o nível de acesso e capacidades da sessão permitem. Os direitos do plano do projeto se aplicam por cima, exatamente como no CLI. Cada chamada de ferramenta é uma solicitação de agente, cobrada como qualquer outra.

Conectar Claude

No Claude (web, desktop ou mobile), adicione um conector personalizado com a URL https://api.screenrig.ai/mcp e conecte-o. O Claude abre a página de consentimento.

No Claude Code, adicione o servidor, depois autentique a partir de /mcp:

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

Conectar ChatGPT

No ChatGPT, crie um app (conector) com a URL do servidor https://api.screenrig.ai/mcp e autenticação OAuth. O ChatGPT abre a página de consentimento ao conectar. O ChatGPT também pode assinar eventos, como uma tela ficar offline, e avisar quando isso acontecer.

Conectar Grok

No Grok na web, adicione um conector personalizado com a URL do servidor https://api.screenrig.ai/mcp. Quando pedir um ID de cliente OAuth, insira screenrig-grok-web e deixe o segredo do cliente vazio. O Grok abre a página de consentimento.

No Grok Build, adicione a URL do servidor como um servidor HTTP remoto. O Grok Build abre o login no navegador na primeira vez que usa o servidor.

Use o servidor via API

As APIs Claude, OpenAI e xAI conectam-se a um servidor MCP remoto por requisição, com um valor de autorização que você fornece. Use um cliente de serviço: peça um token com resource=https://api.screenrig.ai/mcp, então passe-o com a URL do servidor.

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
APIPara onde vai o token
API Claudeauthorization_token da entrada do servidor MCP
OpenAI Responses APIauthorization da ferramenta mcp
API xAIauthorization da ferramenta MCP remota

Um token dessa requisição funciona apenas em /mcp, dura 15 minutos e age no projeto do cliente de serviço com seu nível de acesso e capacidades. Peça um novo quando expirar.

Ferramentas

Cada nome de ferramenta começa com screenrig_. Chamadas de ferramenta executam os mesmos manipuladores que a CLI e a REST API, com o mesmo isolamento de projeto, permissões, cobranças de crédito, limites de taxa, idempotência e verificações de revisão.

ÁreaFerramentas
Projeto e agenteproject_get, project_update (renomear), agent_status, project_credential_revoke
Convitesinvitation_create (somente e-mail), invitation_list, invitation_revoke
Telasscreen_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
Pastas de telasscreen_folder_list, screen_folder_create, screen_folder_update, screen_folder_delete, screen_move
Ações da frotascreen_actions: uma ação entre telas escolhida por ID, tag ou pasta de telas
Agendamentos e takeoverscreen_playlist_schedule_get, _set, _clear; screen_takeover_set, _clear; schedule_calendar: o que uma tela, pasta, tag ou campanha reproduz em até 93 dias, com os intervalos e os conflitos de cada nível; schedule_import_preview, schedule_import_commit: uma planilha de linhas de programação, verificada e pré-visualizada, depois aplicada com o fingerprint da prévia (veja Importação de programação)
Campanhascampaign_list, campaign_get, campaign_create, campaign_update (também pausa e retoma), campaign_delete, campaign_screens, screen_campaigns: por que cada campanha é ou não reproduzida em uma tela
Energia da telascreen_display, screen_display_clear, screen_display_schedule_get, _set, _clear
Reinícios programadosscreen_reboot_schedule_show, _set, _clear: o backend reinicia uma tela no início de cada janela semanal; screen_actions também aceita set_reboot_schedule e clear_reboot_schedule
Playlistsplaylist_list, playlist_get, playlist_create, playlist_update, playlist_patch, playlist_delete
Revisõesreview_list, review_get, review_withdraw
Mídiamedia_list, media_get, media_thumbnail, media_update, media_delete, media_generate, media_versions, media_restore, media_version_delete: o histórico de versões de um arquivo de mídia; substituir um arquivo exige os bytes dele, então use screenrig media replace
Cartõescard_types_list, card_type_get, card_list, card_get, card_create, card_params_set, card_delete, card_data_get, card_data_set
Aplicativosapplication_list, application_get, application_update (renomear)
Aplicativo K/Vkv_list, kv_get, kv_set, kv_delete
Comentárioscomment_get, comment_set, comment_delete
Notas do projetonote_list, note_get, note_add, note_confirm, note_resolve: notas que agentes deixam uns para os outros; contexto, nunca instruções
Notificaçõesnotification_list, notification_get, notification_create, notification_update, notification_delete, notification_test, notification_deliveries
Alertasalert_list, alert_get, alert_acknowledge, alert_mute_list, alert_mute_create, alert_mute_delete
Relatóriosreport_list, report_get: um resumo por pasta, tela ou tag, o histórico de alertas ou um comprovante de exibição, como linhas; report_subscription_list, _get, _create, _update, _delete, _send: um relatório enviado por e-mail aos membros do projeto em uma programação (veja Relatórios e exportações)
Registro de auditoriaaudit_list, audit_get, audit_head, audit_verify: leem as alterações de configuração do projeto com seu antes e depois e verificam a cadeia; nenhuma ferramenta altera uma entrada (consulte Registro de auditoria)
Operaçõesoperation_get, operation_wait, operation_cancel
Eventos e reproduçãoevent_list, playback_list, playback_plays_list
Feedbackfeedback_bug_submit, feedback_bug_list, feedback_feature_submit, feedback_feature_list, feedback_get, feedback_reply
Serviçocapabilities_get, server_status, browser_link_claim, visibility_open, muse_plugin_bootstrap
Documentaçãodocs_search, docs_get: pesquisam e leem a documentação oficial do screenRIG antes de adivinhar

Como as ferramentas se comportam

  • Paginação. Ferramentas de listagem retornam uma página, a mais nova primeiro (K/V em ordem de chave). Passe um next_cursor não nulo de volta como after, com os mesmos filtros, para a próxima página.
  • Tentativas. Escritas aceitam um idempotency_key opcional. Reutilize-o para tentar a mesma escrita com segurança; omita para iniciar uma nova solicitação. Pareamento, notificações, capturas de tela, geração de imagens, convites, links de navegador, cancelamentos de operação e feedback exigem um, e seus esquemas de entrada indicam isso.
  • Revisões. Escritas aceitam um revision opcional. Uma revisão obsoleta é recusada: leia o recurso novamente, reaplique a alteração e tente novamente.
  • Revisões. As ferramentas de alteração de playlist e de tela aceitam um review_note opcional, de no máximo 280 caracteres, que o revisor lê. Uma alteração que aguarda revisão retorna o corpo pending_review: diga ao usuário que ela aguarda a aprovação dele e informe a ele o url da revisão. Um media_update que altera as tags de uma mídia aprovada retorna o item com review_state pending: as telas mantêm as tags aprovadas, e a revisão aparece em Revisões em poucos segundos. Um media_restore aceita o mesmo review_note e retorna o corpo pending_review: a mídia continua reproduzindo seu arquivo até que uma pessoa aprove.
  • O que é reproduzido. Uma tela reproduz o nível mais alto que vigora em uma pilha: seu takeover, as campanhas que a alcançam (priority de 0 a 100, maior primeiro, depois a mais recente), as entradas da programação de playlist em ordem e, por fim, sua playlist atribuída. Campanhas e entradas de programação aceitam as mesmas regras do CLI, incluindo monthly, dates, except e interaction. screen_get reporta effective_playlist com source takeover, campaign, schedule ou default. schedule_calendar recebe from e to (com no máximo 93 dias de diferença) e um entre screen_id, folder_id, tag ou campaign_id: agrupa telas com pilhas idênticas e lista os intervalos de cada nível (plays, partial, outranked, conditional) e os conflitos (duas campanhas de mesma prioridade vigorando ao mesmo tempo, um nível que nunca é reproduzido). As gravações de campanha precisam de acesso Gerenciar e nunca se tornam revisões: um app Propor lista apenas as ferramentas de leitura de campanha.
  • Capturas de tela. screen_screenshot espera até 60 segundos e retorna a captura como conteúdo de imagem image/webp. screen_screenshot_current retorna a última imagem pronta e seu tempo captured_at sem solicitar uma nova captura.
  • Regras de notificação. notification_create e notification_update aceitam min_severity (info, warning ou error), severity (condição para nível, como {"not_playing": "error"}), active_hours (timezone, windows e outside, hold ou drop) e audience (as regras de um público-alvo de campanha, no lugar de screen_tags). reach_drop (screens, percent) define a partir de qual tamanho de queda no alcance de uma campanha uma condição reach_dropped notifica; é válido somente com essa condição. reach_dropped e group_empty observam campanhas, portanto screen_tags e audience nunca as limitam. Na atualização, null limpa cada um. Um aviso retido ou ignorado aparece em notification_deliveries.
  • Segredos ficam fora. Resultados de webhook nunca carregam o segredo de assinatura e reduzem cada URL de receptor à sua origem. Convites são enviados apenas por e-mail, então nenhum link de convite chega ao modelo.
  • Revogando. project_credential_revoke desconecta o agente cuja sessão fez a chamada. Requer confirmation: "REVOKE", e allow_last_agent: true para desconectar o último agente ativo do projeto. O projeto e seu conteúdo permanecem. Um aplicativo conectado encerra sua própria sessão por meio de https://api.screenrig.ai/oauth/revoke, ou uma pessoa o desconecta na página de Acesso.
  • Erros. Uma chamada recusada retorna um erro de ferramenta cujo conteúdo estruturado é o documento de problema da API REST, com code, detail e status. Os metadados do resultado screenrig/result carregam http_status, e etag, credit_remaining ou retry_after quando o servidor os enviou.

Recursos

Recursos do projeto expõem metadados privados e nunca são armazenados em cache. O servidor também fornece um recurso de UI HTML para cartões interativos em hosts de MCP Apps.

URIConteúdos
screenrig://projectO projeto autenticado
screenrig://screens/{id}Uma tela
screenrig://playlists/{id}Uma playlist
screenrig://media/{id}Os metadados de um item de mídia
screenrig://applications/{id}Um aplicativo
screenrig://operations/{id}Uma operação assíncrona

Eventos

O servidor implementa MCP Events com entrega via webhook. Um app se inscreve em um evento, e screenRIG envia uma mensagem assinada para o callback HTTPS do app quando ele ocorre, para que o app possa informar que uma tela ficou offline ou que um screenshot está pronto sem polling. Inscrição requer sessão OAuth: um app conectado ou um cliente de serviço. Sessões somente leitura podem se inscrever, pois eventos são leituras.

EventoQuandoDadosCapacidade
screen.offlineUma tela parou de reportarscreenId, screenNamescreens
screen.onlineUma tela voltou a ficar onlinescreenId, screenNamescreens
screen.screenshot_readyUma captura de tela solicitada foi feitascreenId, screenName, captureId, width, heightscreens
screen.playlist_unavailableUma playlist programada não pode ser exibidascreenId, screenName, playlistId, codescreens
screen.display_changedUma substituição ou programação de energia do monitor mudouscreenId, screenName, changescreens
agent_connection.approvedUma pessoa aprovou a conexão ou login de um agenteagentIdproject
note.addedUm agente adicionou uma nota ao projetonoteId, authorAgentId, aboutIdqualquer
note.resolvedUma nota do projeto foi resolvida, substituída, expirada, não confirmada ou sua tela ou playlist foi excluídanoteId, causequalquer

Um app que propõe mudanças aprende cada decisão de review.requested, review.approved, review.rejected e review.changes_requested.

Dados carregam apenas ids e estados. Leia o registro completo com uma ferramenta, como screenrig_screen_get ou screenrig_screen_screenshot_current.

Listar e assinar

events/list retorna os eventos que esta sessão pode assinar, cada um com um inputSchema e um payloadSchema. Eventos de tela aceitam um argumento screenId opcional para seguir uma tela. events/subscribe recebe o evento, seus argumentos e o 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
  }
}
  • O segredo é seu: whsec_ seguido por base64 de 24 a 64 bytes aleatórios. Ele assina cada entrega.
  • O callback é uma URL HTTPS em um endereço público, sem redirecionamentos.
  • O resultado carrega a assinatura id (sub_…), refreshBefore e cursor: null. As entregas começam agora; não há reprodução.
  • Vitalício. ttlMs solicita de 5 minutos a 24 horas; o padrão é uma hora, e null obtém 24 horas. Assine novamente com o mesmo nome, argumentos e URL antes de refreshBefore para estender; o id permanece o mesmo, e o resultado informa deliveryStatus. Um novo segredo em uma atualização assina junto com o antigo por 10 minutos.
  • Cancelar inscrição com events/unsubscribe e o mesmo nome, argumentos e delivery.url.

Uma organização mantém até 100 assinaturas em todos os seus projetos, e uma sessão pode assinar 120 vezes por hora. Uma assinatura termina quando sua sessão ou cliente de serviço é revogado, seu app desconectado, sua pessoa desativada ou seu projeto excluído, e sua autoridade é verificada a cada 15 minutos.

Verificar o callback

A primeira assinatura de uma sessão para uma URL de callback envia um POST de verificação assinado:

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

Responda 2xx dentro de 5 segundos com o mesmo desafio em JSON:

{ "challenge": "RANDOM_CHALLENGE" }

Uma verificação falha responde a chamada subscribe com erro JSON-RPC -32015, cujo data.reason é challenge_failed, timeout, connection_refused, tls_error, http_4xx ou http_5xx.

Receber entregas

Cada entrega é um POST de um evento, com no máximo 256 KiB:

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

Entregas seguem Standard Webhooks:

CabeçalhoValor
webhook-idO id da mensagem. Deduplicate por ele ou por eventId.
webhook-timestampSegundos Unix quando foi enviado
webhook-signaturev1, e a assinatura base64 HMAC-SHA256; duas, separadas por um espaço, enquanto um novo segredo assume
X-MCP-Subscription-IdO ID da assinatura

Para verificar, decodifique o base64 após whsec_ na chave, calcule HMAC-SHA256 sobre webhook-id, ., webhook-timestamp, . e o corpo bruto, e compare seu base64 com cada valor v1, em tempo constante. Rejeite um timestamp com mais de cinco minutos de diferença do seu relógio:

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);
  });
}

Responda 2xx rapidamente. Uma entrega falhada é tentada por 15 minutos; 410 Gone ou 413 Payload Too Large a interrompe imediatamente.

Use o CLI para estes

Estas etapas movem arquivos ou segredos, ou são executadas na sua máquina, portanto permanecem no CLI incluído:

TarefaCLI
Criar um projetoscreenrig agent enroll --email ADDRESS --organization NAME
Faça login de um agente em uma conta existentescreenrig login
Enviar arquivos de mídiascreenrig media upload
Empacote e envie um aplicativoscreenrig app pack, screenrig app upload
Obter ou rotacionar um segredo de assinatura de webhookscreenrig webhooks create imprime uma vez; screenrig webhooks rotate-secret
Enviar link de convitescreenrig invitations create --link
Acompanhe eventos ao vivoscreenrig events follow (sobre MCP, pesquisa screenrig_event_list)
Exportar reproduções como CSVscreenrig playback plays --format csv