MCP-Server

grade

net.gradetv/grade
Kommunikation Medien & Inhalte Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Provides a public TV and radio catalog with stream metadata, schedules, stream health, favorites, playlists, and channel chat.

add_favorite
Add favorite
Favorita um canal. Repetir não soma: o contador público conta pessoas, não cliques.
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': 'Canal a favoritar, ex. `GloboNews.br`.'}}}
add_item
Add item
Adiciona canal à sub-aba. Teto de 40 canais por sub-aba. A resposta diz em que pasta e sub-aba o canal caiu, para a tela abrir no lugar certo. A resposta traz a biblioteca inteira já atualizada — não precisa recarregar `GET /api/library` depois.
Eingabeschema
{'type': 'object', 'required': ['group_id', 'channel_id'], 'properties': {'group_id': {'type': 'string', 'description': 'Sub-aba que recebe o canal, `grp_…`.'}, 'channel_id': {'type': 'string', 'description': 'ID do canal no catálogo, ex. `GloboNews.br`.'}}}
api_index
API index
Índice auto-descrito da API inteira, com os idiomas e as páginas HTML de cada um.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
billing
Billing
Preços e tetos. É o número EM VIGOR: leia daqui antes de gastar chamada, em vez de assumir o preço da documentação. Com credencial, também diz se o passe de chat de quem fala no chat (o convidado; sem ele, a conta) está ativo. `prices.abuso_24h_usd` é o preço da porta de UA vazio/curl, hoje desligada.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
channel_health
Channel health
Saúde comunitária do canal: taxa de sucesso, motivos de falha e ambientes afetados. É o que separa 'o canal está fora do ar' de 'o canal está bloqueado no seu país'. `geo` diz se é restrição regional ou falha geral (com os países), `regions[]` traz sucesso/falha por país, `latency[]` a velocidade de abertura medida no hop por país, e `pra_voce` resume tudo para o país de quem chama. Sem relato da comunidade (`POST /api/play-report`) o painel fica vazio.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'ID do canal no catálogo.'}}}
chat_history
Chat history
Últimas mensagens da sala de um canal (sem WebSocket).
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': 'ID do canal no catálogo.'}}}
chat_pass
Chat pass
Passe mensal do chat ($0.10 / 30 dias) do convidado que fala no chat. Sem pagamento → 402. Passe já válido devolve 200 sem cobrar de novo — dá para chamar antes de escrever, sem risco de pagar duas vezes. O passe é de quem fala no chat: o convidado de `X-Guest-Token` (é ele que o WebSocket reconhece no `hello`); sem convidado, a sessão da conta, que fala só por HTTP. Fica no registro global de compras (`direito`).
Eingabeschema
{'type': 'object', 'properties': {}}
chat_send
Chat send
Manda mensagem na sala de um canal por HTTP. Ler é grátis; escrever custa $0.10 por 30 dias. Sem passe válido a resposta é 402 com `accepts[]` — pague e repita a mesma chamada. Quem fala é o convidado (`X-Guest-Token`), o mesmo que o WebSocket reconhece; sem convidado, a sessão da conta.
Eingabeschema
{'type': 'object', 'required': ['channel_id', 'body'], 'properties': {'body': {'type': 'string', 'description': 'O texto da mensagem, dentro de `max_length`.'}, 'author': {'type': 'string', 'description': 'Apelido a usar; sem ele o servidor gera um estável.'}, 'channel_id': {'type': 'string', 'description': 'ID do canal no catálogo.'}}}
clear_history
Clear history
Limpa o histórico inteiro do dono, de uma vez.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
contact
Contact
Fale com quem faz o produto: dúvida, ou proposta de patrocínio/parceria/anúncio. Grátis, sem captcha nem pagamento; uma mensagem a cada 10 s por rede (a que chega antes espera a vez). Uma rota para dúvida e para proposta de patrocínio, parceria ou anúncio (`tipo`, com os espaços de `GET /api/partners`). Sem captcha, sem conta, sem pagamento. Uma mensagem a cada 10 segundos por rede: a que chega antes espera a vez e sai — sem erro. A mensagem chega à equipe por e-mail, com o `email` como endereço de resposta.
Eingabeschema
{'type': 'object', 'required': ['name', 'email', 'message'], 'properties': {'name': {'type': 'string', 'description': 'Como chamar quem escreve (alias `nome`).'}, 'site': {'type': 'string', 'description': 'Site de quem propõe.'}, 'tipo': {'enum': ['patrocinio', 'parceria', 'anuncio'], 'type': 'string', 'description': 'Proposta: `patrocinio`, `parceria` ou `anuncio`. Liga os campos abaixo.'}, 'email': {'type': 'string', 'description': 'Para onde responder.'}, 'espaco': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ids de placement de `GET /api/partners`, até 6.'}, 'duracao': {'enum': ['30', '90', '365'], 'type': 'string', 'description': 'Dias de exposição: `30`, `90` ou `365`.'}, 'empresa': {'type': 'string', 'description': 'Quem propõe, quando é empresa.'}, 'message': {'type': 'string', 'description': 'O que você quer dizer (alias `mensagem`).'}, 'orcamento': {'enum': ['ate_100', '100_500', '500_2000', '2000_mais', 'a_combinar'], 'type': 'string', 'description': '`ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`.'}, 'pagamento': {'enum': ['usdc', 'deposito', 'a_combinar'], 'type': 'string', 'description': '`usdc`, `deposito` ou `a_combinar`.'}}}
create_category
Create category
Cria tab/categoria pessoal. Teto de 8 pastas por dono. A resposta traz a biblioteca inteira já atualizada — não precisa recarregar `GET /api/library` depois.
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Nome da pasta, até 40 caracteres.'}}}
create_group
Create group
Cria sub-aba numa categoria. Teto de 12 sub-abas por pasta. A resposta traz a biblioteca inteira já atualizada — não precisa recarregar `GET /api/library` depois.
Eingabeschema
{'type': 'object', 'required': ['category_id', 'name'], 'properties': {'name': {'type': 'string', 'description': 'Nome da sub-aba, até 40 caracteres.'}, 'category_id': {'type': 'string', 'description': 'Pasta que vai receber a sub-aba, `cat_…`.'}}}
create_guest
Create guest
Cria guest ipt_… Não pede e-mail nem nada. Guarde o token: perdeu o token, perdeu a biblioteca — a não ser que a conta já o tenha reivindicado (`POST /api/auth/claim`), e aí o que ele guardou está na conta.
Eingabeschema
{'type': 'object', 'properties': {}}
delete_comment
Delete comment
Apaga um comentário do próprio dono. O 404 é de propósito: a API não confirma que existe um comentário com aquele id se ele não é seu.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'ID do comentário, vindo de `Comentario.id`.'}}}
forget_watch
Forget watch
Tira um canal do histórico do dono.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': 'Canal a remover do histórico, ex. `GloboNews.br`.'}}}
geo
Geo
País e idioma sugeridos para quem está chamando. Sem país detectado pela borda, sugere BR com `source: "fallback"`; `detected` diz o que a borda viu.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
get_channel
Get channel
Ficha completa de um canal, com os streams já apontando para o nosso hop.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'ID do canal no catálogo, ex. `GloboNews.br`.'}}}
get_channel_guide
Get channel guide
Programação de hoje do canal (grabada por nós): agora, a seguir e a lista. Disponível nos canais com guia (`guide=1`), com validade de até dois dias. Confira a data da resposta; a ficha traz o resumo em `guide_now`.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'ID do canal no catálogo.'}}}
get_history
Get history
Histórico de canais assistidos pelo dono. Exibe somente canais disponíveis no catálogo.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'string', 'default': 20, 'description': 'Itens por página. Acima de 50 é silenciosamente reduzido a 50.'}, 'offset': {'type': 'string', 'default': 0, 'description': 'Quantos itens pular. Use `next_offset` da resposta anterior.'}}}
get_library
Get library
A galeria inteira do dono: pastas, sub-abas, canais e as URLs de feed de cada nível.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
health
Health
Liveness e o commit publicado agora — é como o smoke espera o próprio deploy.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
legacy_stream
Legacy stream
Metadados públicos: site oficial do canal, URL da transmissão para copiar em outro player e player legado HTTP. O botão legacy_url abre http://legacy.gradetv.net:8080/legacy?stream=ID. A página isolada aceita lang=pt/en/es/fr/de e theme=light/dark. Playlists continuam pelo hop HTTPS e mídia direto da origem. Não remove recusa de acesso nem exigência CORS. Uma leitura indexada; não busca origem nem grava no D1.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'ID público do stream, incluindo compatibilidade de IDs antigos.'}}}
list_cities
List cities
Cidades que têm canal tocável, filtráveis por país e por estado.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'country': {'type': 'string', 'description': 'Restringe a um país, ISO 3166-1 alpha-2.'}, 'subdivision': {'type': 'string', 'description': 'Restringe a um estado/província.'}}}
list_comments
List comments
Comentários da comunidade sobre um canal. Com credencial na chamada, cada comentário seu vem com `mine: true` — é assim que a interface sabe o que dá para apagar.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'ID do canal no catálogo.'}}}
list_countries
List countries
Países do catálogo com contagem playable e URL da bandeira (kind=radio conta estações).
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'kind': {'enum': ['tv', 'radio', 'all'], 'type': 'string', 'default': 'tv', 'description': '`tv` (padrão) conta canais de TV; `radio` conta estações de rádio; `all` junta os dois.'}}}
list_favorites
List favorites
Favoritos do dono. Exibe somente canais disponíveis no catálogo.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
list_languages
List languages
Idiomas que têm canal tocável, com a contagem de cada um.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
list_networks
List networks
Redes e emissoras que têm canal tocável, com a contagem.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
list_qualities
List qualities
Qualidades distintas encontradas nos streams do catálogo (em rádio, codec e bitrate).
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
list_subdivisions
List subdivisions
Estados e províncias que têm canal tocável.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'country': {'type': 'string', 'description': 'Restringe a um país, ISO 3166-1 alpha-2.'}}}
list_tags
List tags
Tags das estações de rádio tocáveis, com contagem; opcionalmente por país.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'string', 'default': 40, 'description': 'Quantas tags devolver (teto 100).'}, 'country': {'type': 'string', 'description': 'Restringe às estações de um país, ISO 3166-1 alpha-2.'}}}
me
Me
Conta da sessão (cookie repassado pelo cliente MCP): e-mail e tamanho da biblioteca da conta. A conta é a da biblioteca de conta; `user.id` é o id da conta, e é ele o dono da galeria com sessão.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}}
play_reports
Play reports
Relatos crus de um canal, com endereço — só operador (METRICS_TOKEN). Use para investigar um canal específico. Existe separado do painel público justamente porque traz endereço. A linha some depois do prazo em `retention_days`, e `/api/channels/:id/health` nunca devolve IP.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'ok': {'enum': ['0'], 'type': 'string', 'description': '`0` traz só as falhas — é o recorte que interessa numa investigação.'}, 'limit': {'type': 'string', 'default': 20, 'description': 'Itens por página. Acima de 50 é silenciosamente reduzido a 50.'}, 'channel_id': {'type': 'string', 'description': 'Restringe a um canal.'}}}
post_comment
Post comment
Comenta num canal (teto de 20/hora por dono). Sem `author`, o apelido é gerado e fica estável para o mesmo dono — a pessoa não vira um nome diferente a cada mensagem.
Eingabeschema
{'type': 'object', 'required': ['id', 'body'], 'properties': {'id': {'type': 'string', 'description': 'ID do canal no catálogo.'}, 'body': {'type': 'string', 'description': 'O texto do comentário; o teto vem em `max_length` da listagem.'}, 'author': {'type': 'string', 'description': 'Apelido a usar; sem ele o servidor gera um estável.'}}}
pricing
Pricing
Current public prices and free allowances; no charge.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
producer_services
Producer services
Oferta de transmissão autorizada sob consulta: informações e contatos para produtores. Não ativa streams. Somente informações e captação de interesse. Não provisiona, não cobra e não ativa transmissão. Use contact.form_url no browser, contact.email por e-mail ou POST /api/contact para apresentar o projeto. O envio é livre — sem captcha nem pagamento —, uma mensagem a cada 10 s por rede.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'lang': {'enum': ['pt', 'en', 'es', 'fr', 'de', 'hu'], 'type': 'string', 'default': 'pt', 'description': 'Idioma da oferta: pt, en, es, fr, de ou hu; ausente ou desconhecido volta a pt.'}}}
record_watch
Record watch
Registra um canal assistido no histórico do dono.
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': 'Canal assistido, ex. `GloboNews.br`.'}}}
remove_favorite
Remove favorite
Desfavorita o canal e devolve o ponto ao contador público.
Destruktiv Idempotent
Eingabeschema
{'type': 'object', 'required': ['channel_id'], 'properties': {'channel_id': {'type': 'string', 'description': 'Canal a desfavoritar, ex. `GloboNews.br`.'}}}
report_play
Report play
Relata se um canal tocou (ok=true) ou não (ok=false + code). Navegador, SO e país saem do pedido, não do corpo. Conta uma vez por dono, por canal, por dia e por resultado; relatar de novo devolve 200 com `reason: ja_relatado_hoje`, e não é erro. Navegador e sistema saem do User-Agent e o país da borda — mandar isso no corpo não muda nada. Sem relato, o catálogo não aprende: é assim que `GET /api/channels/:id/health` sabe distinguir canal fora do ar de canal bloqueado para você.
Eingabeschema
{'type': 'object', 'required': ['channel_id', 'ok'], 'properties': {'ok': {'type': 'boolean', 'description': '`true` se tocou, `false` se falhou.'}, 'code': {'enum': ['cors', 'geo', 'sumiu', 'codec', 'playlist', 'sem_resposta', 'protocolo', 'sem_stream', 'outro'], 'type': 'string', 'description': 'Por que falhou; só quando `ok` é `false`.'}, 'channel_id': {'type': 'string', 'description': 'Canal que você tentou assistir.'}}}
search_channels
Search channels
Busca canais públicos (filtros: q, country, category, language, network, quality, playable; kind=radio para estações de rádio, tag para tag de rádio; sort=score ordena pela saúde medida por terceiro, sort=votes pelos votos da rádio; online=1 só quem foi visto online nas últimas 48 h). É a porta de entrada do produto. A resposta varia por navegador, sistema e país de quem pede — cada canal traz `social.your_fails`, o recorte do SEU ambiente — por isso ela é `Cache-Control: private`.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'properties': {'q': {'type': 'string', 'description': 'Texto livre no nome e nos apelidos do canal (busca full-text).'}, 'tag': {'type': 'string', 'description': 'Tag da estação de rádio (vocabulário livre, ex. `mpb`, `news`); veja `GET /api/tags`.'}, 'city': {'type': 'string', 'description': 'Cidade, código do catálogo.'}, 'kind': {'enum': ['tv', 'radio', 'all'], 'type': 'string', 'default': 'tv', 'description': '`tv` (padrão) é o catálogo de TV; `radio` são as estações de rádio; `all` junta os dois. Sem `kind`, rádio nunca aparece.'}, 'sort': {'enum': ['name', 'score', 'votes'], 'type': 'string', 'default': 'name', 'description': '`score` ordena pela saúde medida por terceiro, melhor primeiro; canal não medido vai para o fim. `votes` ordena pelos votos registrados para a estação (rádio). `name` é a ordem alfabética.'}, 'guide': {'enum': ['0', '1'], 'type': 'string', 'default': '0', 'description': '`1` traz só canal com grade de programação (EPG).'}, 'online': {'enum': ['0', '1'], 'type': 'string', 'default': '0', 'description': '`1` traz só canal visto online pela fonte nas 48 h anteriores à última recarga do catálogo (`health_ext.online`); com o catálogo parado há mais de 48 h o filtro não devolve ninguém.'}, 'country': {'type': 'string', 'description': 'País do canal, ISO 3166-1 alpha-2.'}, 'network': {'type': 'string', 'description': 'Nome exato da rede/emissora.'}, 'quality': {'type': 'string', 'description': 'Qualidade exata do stream.'}, 'category': {'type': 'string', 'description': 'ID de categoria do catálogo.'}, 'language': {'type': 'string', 'description': 'Idioma do canal, ISO 639-3.'}, 'playable': {'enum': ['0', '1'], 'type': 'string', 'default': '1', 'description': '`0` inclui canal sem stream utilizável conhecido.'}, 'subdivision': {'type': 'string', 'description': 'Estado/província, código do catálogo.'}}}
Geändert
pricing
29. September 2026 02:59
Geändert
contact
29. September 2026 02:59
Geändert
billing
29. September 2026 02:59
Geändert
me
29. September 2026 02:59
Geändert
chat_pass
29. September 2026 02:59
Geändert
chat_send
29. September 2026 02:59
Geändert
chat_history
29. September 2026 02:59
Geändert
delete_comment
29. September 2026 02:59
Geändert
post_comment
29. September 2026 02:59
Geändert
list_comments
29. September 2026 02:59
Geändert
remove_favorite
29. September 2026 02:59
Geändert
add_favorite
29. September 2026 02:59
Geändert
list_favorites
29. September 2026 02:59
Geändert
channel_health
29. September 2026 02:59
Geändert
play_reports
29. September 2026 02:59
Geändert
report_play
29. September 2026 02:59
Geändert
producer_services
29. September 2026 02:59
Geändert
legacy_stream
29. September 2026 02:59
Geändert
clear_history
29. September 2026 02:59
Geändert
forget_watch
29. September 2026 02:59
Geändert
record_watch
29. September 2026 02:59
Geändert
get_history
29. September 2026 02:59
Geändert
add_item
29. September 2026 02:59
Geändert
create_group
29. September 2026 02:59
Geändert
create_category
29. September 2026 02:59
Geändert
get_library
29. September 2026 02:59
Geändert
create_guest
29. September 2026 02:59
Geändert
get_channel_guide
29. September 2026 02:59
Geändert
get_channel
29. September 2026 02:59
Geändert
list_cities
29. September 2026 02:59