Skip to content
Back to Grade

Card snapshot

gradetv.net · 2026-10-03 03:59:09 UTC · d5bc04ddb1928880a88d5ceb9f0958070dd6ce05f1e8d53323f233dbb8a1ebc0

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "name": "Grade",
  "description": "Encontre TV e r\u00e1dio, abra um canal e guarde seus favoritos para voltar. Pastas e M3U para o VLC. Projetos de produtores com direitos sob consulta.",
  "url": "https://gradetv.net",
  "provider": {
    "organization": "Grade",
    "url": "https://gradetv.net",
    "email": "contato@gradetv.net"
  },
  "documentationUrl": "https://gradetv.net/llms.txt",
  "protocol": "mcp",
  "protocolUrl": "https://modelcontextprotocol.io",
  "interfaces": [
    {
      "transport": "streamable-http",
      "url": "https://gradetv.net/mcp"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "authentication": "none"
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/markdown"
  ],
  "skills": [
    {
      "id": "api_index",
      "name": "api_index",
      "description": "\u00cdndice auto-descrito da API inteira, com os idiomas e as p\u00e1ginas HTML de cada um.",
      "endpoint": "GET /api/"
    },
    {
      "id": "health",
      "name": "health",
      "description": "Liveness e o commit publicado agora \u2014 \u00e9 como o smoke espera o pr\u00f3prio deploy.",
      "endpoint": "GET /api/health"
    },
    {
      "id": "geo",
      "name": "geo",
      "description": "Pa\u00eds e idioma sugeridos para quem est\u00e1 chamando. Sem pa\u00eds detectado pela borda, sugere BR com `source: \"fallback\"`; `detected` diz o que a borda viu.",
      "endpoint": "GET /api/geo"
    },
    {
      "id": "list_countries",
      "name": "list_countries",
      "description": "Pa\u00edses do cat\u00e1logo com contagem playable e URL da bandeira (kind=radio conta esta\u00e7\u00f5es).",
      "endpoint": "GET /api/countries"
    },
    {
      "id": "list_tags",
      "name": "list_tags",
      "description": "Tags das esta\u00e7\u00f5es de r\u00e1dio toc\u00e1veis, com contagem; opcionalmente por pa\u00eds.",
      "endpoint": "GET /api/tags"
    },
    {
      "id": "search_channels",
      "name": "search_channels",
      "description": "Busca canais p\u00fablicos (filtros: q, country, category, language, network, quality, playable; kind=radio para esta\u00e7\u00f5es de r\u00e1dio, tag para tag de r\u00e1dio; sort=score ordena pela sa\u00fade medida por terceiro, sort=votes pelos votos da r\u00e1dio; online=1 s\u00f3 quem foi visto online nas \u00faltimas 48 h). \u00c9 a porta de entrada do produto. A resposta varia por navegador, sistema e pa\u00eds de quem pede \u2014 cada canal traz `social.your_fails`, o recorte do SEU ambiente \u2014 por isso ela \u00e9 `Cache-Control: private`.",
      "endpoint": "GET /api/channels"
    },
    {
      "id": "list_languages",
      "name": "list_languages",
      "description": "Idiomas que t\u00eam canal toc\u00e1vel, com a contagem de cada um.",
      "endpoint": "GET /api/languages"
    },
    {
      "id": "list_networks",
      "name": "list_networks",
      "description": "Redes e emissoras que t\u00eam canal toc\u00e1vel, com a contagem.",
      "endpoint": "GET /api/networks"
    },
    {
      "id": "list_qualities",
      "name": "list_qualities",
      "description": "Qualidades distintas encontradas nos streams do cat\u00e1logo (em r\u00e1dio, codec e bitrate).",
      "endpoint": "GET /api/qualities"
    },
    {
      "id": "list_subdivisions",
      "name": "list_subdivisions",
      "description": "Estados e prov\u00edncias que t\u00eam canal toc\u00e1vel.",
      "endpoint": "GET /api/subdivisions"
    },
    {
      "id": "list_cities",
      "name": "list_cities",
      "description": "Cidades que t\u00eam canal toc\u00e1vel, filtr\u00e1veis por pa\u00eds e por estado.",
      "endpoint": "GET /api/cities"
    },
    {
      "id": "get_channel",
      "name": "get_channel",
      "description": "Ficha completa de um canal, com os streams j\u00e1 apontando para o nosso hop.",
      "endpoint": "GET /api/channels/:id"
    },
    {
      "id": "get_channel_guide",
      "name": "get_channel_guide",
      "description": "Programa\u00e7\u00e3o de hoje do canal (grabada por n\u00f3s): agora, a seguir e a lista. Dispon\u00edvel nos canais com guia (`guide=1`), com validade de at\u00e9 dois dias. Confira a data da resposta; a ficha traz o resumo em `guide_now`.",
      "endpoint": "GET /api/channels/:id/guia"
    },
    {
      "id": "create_guest",
      "name": "create_guest",
      "description": "Cria guest ipt_\u2026 N\u00e3o pede e-mail nem nada. Guarde o token: perdeu o token, perdeu a biblioteca \u2014 a n\u00e3o ser que a conta j\u00e1 o tenha reivindicado (`POST /api/auth/claim`), e a\u00ed o que ele guardou est\u00e1 na conta.",
      "endpoint": "POST /api/guest"
    },
    {
      "id": "get_library",
      "name": "get_library",
      "description": "A galeria inteira do dono: pastas, sub-abas, canais e as URLs de feed de cada n\u00edvel.",
      "endpoint": "GET /api/library"
    },
    {
      "id": "create_category",
      "name": "create_category",
      "description": "Cria tab/categoria pessoal. Teto de 8 pastas por dono. A resposta traz a biblioteca inteira j\u00e1 atualizada \u2014 n\u00e3o precisa recarregar `GET /api/library` depois.",
      "endpoint": "POST /api/categories"
    },
    {
      "id": "create_group",
      "name": "create_group",
      "description": "Cria sub-aba numa categoria. Teto de 12 sub-abas por pasta. A resposta traz a biblioteca inteira j\u00e1 atualizada \u2014 n\u00e3o precisa recarregar `GET /api/library` depois.",
      "endpoint": "POST /api/groups"
    },
    {
      "id": "add_item",
      "name": "add_item",
      "description": "Adiciona canal \u00e0 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\u00e1 atualizada \u2014 n\u00e3o precisa recarregar `GET /api/library` depois.",
      "endpoint": "POST /api/items"
    },
    {
      "id": "get_history",
      "name": "get_history",
      "description": "Hist\u00f3rico de canais assistidos pelo dono. Exibe somente canais dispon\u00edveis no cat\u00e1logo.",
      "endpoint": "GET /api/history"
    },
    {
      "id": "record_watch",
      "name": "record_watch",
      "description": "Registra um canal assistido no hist\u00f3rico do dono.",
      "endpoint": "POST /api/history"
    },
    {
      "id": "forget_watch",
      "name": "forget_watch",
      "description": "Tira um canal do hist\u00f3rico do dono.",
      "endpoint": "DELETE /api/history/:channel_id"
    },
    {
      "id": "clear_history",
      "name": "clear_history",
      "description": "Limpa o hist\u00f3rico inteiro do dono, de uma vez.",
      "endpoint": "DELETE /api/history"
    },
    {
      "id": "legacy_stream",
      "name": "legacy_stream",
      "description": "Metadados p\u00fablicos: site oficial do canal, URL da transmiss\u00e3o para copiar em outro player e player legado HTTP. O bot\u00e3o legacy_url abre http://legacy.gradetv.net:8080/legacy?stream=ID. A p\u00e1gina isolada aceita lang=pt/en/es/fr/de e theme=light/dark. Playlists continuam pelo hop HTTPS e m\u00eddia direto da origem. N\u00e3o remove recusa de acesso nem exig\u00eancia CORS. Uma leitura indexada; n\u00e3o busca origem nem grava no D1.",
      "endpoint": "GET /api/legacy/:id"
    },
    {
      "id": "producer_services",
      "name": "producer_services",
      "description": "Oferta de transmiss\u00e3o autorizada sob consulta: informa\u00e7\u00f5es e contatos para produtores. N\u00e3o ativa streams. Somente informa\u00e7\u00f5es e capta\u00e7\u00e3o de interesse. N\u00e3o provisiona, n\u00e3o cobra e n\u00e3o ativa transmiss\u00e3o. Use contact.form_url no browser, contact.email por e-mail ou POST /api/contact para apresentar o projeto. O envio \u00e9 livre \u2014 sem captcha nem pagamento \u2014, uma mensagem a cada 10 s por rede.",
      "endpoint": "GET /api/producers"
    }
  ],
  "discovery": {
    "openapi": "https://gradetv.net/openapi.json",
    "llms": "https://gradetv.net/llms.txt",
    "okf": "https://gradetv.net/okf/index.md",
    "numbers": "https://gradetv.net/api/vitrine",
    "partnerships": "https://gradetv.net/api/partners",
    "api_catalog": "https://gradetv.net/.well-known/api-catalog",
    "x402": "https://gradetv.net/.well-known/x402",
    "pricing": "https://gradetv.net/pricing",
    "docs": "https://gradetv.net/docs"
  },
  "updated": "2026-10-03"
}