Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,537Letters: 14Defects: 1,323counted 4 min ago
teppi

Server definition

Hash
sha256:7354d5f15a713c020c015676145c528ee5fdc53778f9539a9e625f27c0881f46
What it is
What a remote MCP server returned when asked what it offers: 42 tools

The blob, as servednamed by its sha256

{ "instructions": "Superfície de agente do Grade. Toda tool é uma chamada na API pública de https://gradetv.net. Catálogo e cota: https://gradetv.net/api/ · spec: https://gradetv.net/openapi.json. Cota estourada responde 402 com accepts[] (x402/USDC) — pague e repita a chamada.", "tools": [ { "description": "Favorita um canal. Repetir não soma: o contador público conta pessoas, não cliques.", "inputSchema": { "properties": { "channel_id": { "description": "Canal a favoritar, ex. `GloboNews.br`.", "type": "string" } }, "required": [ "channel_id" ], "type": "object" }, "name": "add_favorite", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "channel_id": { "description": "ID do canal no catálogo, ex. `GloboNews.br`.", "type": "string" }, "group_id": { "description": "Sub-aba que recebe o canal, `grp_…`.", "type": "string" } }, "required": [ "group_id", "channel_id" ], "type": "object" }, "name": "add_item", "outputSchema": null }, { "description": "Índice auto-descrito da API inteira, com os idiomas e as páginas HTML de cada um.", "inputSchema": { "properties": {}, "type": "object" }, "name": "api_index", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": {}, "type": "object" }, "name": "billing", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "id": { "description": "ID do canal no catálogo.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "channel_health", "outputSchema": null }, { "description": "Últimas mensagens da sala de um canal (sem WebSocket).", "inputSchema": { "properties": { "channel_id": { "description": "ID do canal no catálogo.", "type": "string" } }, "required": [ "channel_id" ], "type": "object" }, "name": "chat_history", "outputSchema": null }, { "description": "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`).", "inputSchema": { "properties": {}, "type": "object" }, "name": "chat_pass", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "author": { "description": "Apelido a usar; sem ele o servidor gera um estável.", "type": "string" }, "body": { "description": "O texto da mensagem, dentro de `max_length`.", "type": "string" }, "channel_id": { "description": "ID do canal no catálogo.", "type": "string" } }, "required": [ "channel_id", "body" ], "type": "object" }, "name": "chat_send", "outputSchema": null }, { "description": "Limpa o histórico inteiro do dono, de uma vez.", "inputSchema": { "properties": {}, "type": "object" }, "name": "clear_history", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "duracao": { "description": "Dias de exposição: `30`, `90` ou `365`.", "enum": [ "30", "90", "365" ], "type": "string" }, "email": { "description": "Para onde responder.", "type": "string" }, "empresa": { "description": "Quem propõe, quando é empresa.", "type": "string" }, "espaco": { "description": "Ids de placement de `GET /api/partners`, até 6.", "items": { "type": "string" }, "type": "array" }, "message": { "description": "O que você quer dizer (alias `mensagem`).", "type": "string" }, "name": { "description": "Como chamar quem escreve (alias `nome`).", "type": "string" }, "orcamento": { "description": "`ate_100`, `100_500`, `500_2000`, `2000_mais` ou `a_combinar`.", "enum": [ "ate_100", "100_500", "500_2000", "2000_mais", "a_combinar" ], "type": "string" }, "pagamento": { "description": "`usdc`, `deposito` ou `a_combinar`.", "enum": [ "usdc", "deposito", "a_combinar" ], "type": "string" }, "site": { "description": "Site de quem propõe.", "type": "string" }, "tipo": { "description": "Proposta: `patrocinio`, `parceria` ou `anuncio`. Liga os campos abaixo.", "enum": [ "patrocinio", "parceria", "anuncio" ], "type": "string" } }, "required": [ "name", "email", "message" ], "type": "object" }, "name": "contact", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "name": { "description": "Nome da pasta, até 40 caracteres.", "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "create_category", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "category_id": { "description": "Pasta que vai receber a sub-aba, `cat_…`.", "type": "string" }, "name": { "description": "Nome da sub-aba, até 40 caracteres.", "type": "string" } }, "required": [ "category_id", "name" ], "type": "object" }, "name": "create_group", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": {}, "type": "object" }, "name": "create_guest", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "id": { "description": "ID do comentário, vindo de `Comentario.id`.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "delete_comment", "outputSchema": null }, { "description": "Tira um canal do histórico do dono.", "inputSchema": { "properties": { "channel_id": { "description": "Canal a remover do histórico, ex. `GloboNews.br`.", "type": "string" } }, "required": [ "channel_id" ], "type": "object" }, "name": "forget_watch", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": {}, "type": "object" }, "name": "geo", "outputSchema": null }, { "description": "Ficha completa de um canal, com os streams já apontando para o nosso hop.", "inputSchema": { "properties": { "id": { "description": "ID do canal no catálogo, ex. `GloboNews.br`.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_channel", "outputSchema": null }, { "description": "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`.", "inputSchema": { "properties": { "id": { "description": "ID do canal no catálogo.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_channel_guide", "outputSchema": null }, { "description": "Histórico de canais assistidos pelo dono. Exibe somente canais disponíveis no catálogo.", "inputSchema": { "properties": { "limit": { "default": 20, "description": "Itens por página. Acima de 50 é silenciosamente reduzido a 50.", "type": "string" }, "offset": { "default": 0, "description": "Quantos itens pular. Use `next_offset` da resposta anterior.", "type": "string" } }, "type": "object" }, "name": "get_history", "outputSchema": null }, { "description": "A galeria inteira do dono: pastas, sub-abas, canais e as URLs de feed de cada nível.", "inputSchema": { "properties": {}, "type": "object" }, "name": "get_library", "outputSchema": null }, { "description": "Liveness e o commit publicado agora — é como o smoke espera o próprio deploy.", "inputSchema": { "properties": {}, "type": "object" }, "name": "health", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "id": { "description": "ID público do stream, incluindo compatibilidade de IDs antigos.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "legacy_stream", "outputSchema": null }, { "description": "Cidades que têm canal tocável, filtráveis por país e por estado.", "inputSchema": { "properties": { "country": { "description": "Restringe a um país, ISO 3166-1 alpha-2.", "type": "string" }, "subdivision": { "description": "Restringe a um estado/província.", "type": "string" } }, "type": "object" }, "name": "list_cities", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "id": { "description": "ID do canal no catálogo.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "list_comments", "outputSchema": null }, { "description": "Países do catálogo com contagem playable e URL da bandeira (kind=radio conta estações).", "inputSchema": { "properties": { "kind": { "default": "tv", "description": "`tv` (padrão) conta canais de TV; `radio` conta estações de rádio; `all` junta os dois.", "enum": [ "tv", "radio", "all" ], "type": "string" } }, "type": "object" }, "name": "list_countries", "outputSchema": null }, { "description": "Favoritos do dono. Exibe somente canais disponíveis no catálogo.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_favorites", "outputSchema": null }, { "description": "Idiomas que têm canal tocável, com a contagem de cada um.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_languages", "outputSchema": null }, { "description": "Redes e emissoras que têm canal tocável, com a contagem.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_networks", "outputSchema": null }, { "description": "Qualidades distintas encontradas nos streams do catálogo (em rádio, codec e bitrate).", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_qualities", "outputSchema": null }, { "description": "Estados e províncias que têm canal tocável.", "inputSchema": { "properties": { "country": { "description": "Restringe a um país, ISO 3166-1 alpha-2.", "type": "string" } }, "type": "object" }, "name": "list_subdivisions", "outputSchema": null }, { "description": "Tags das estações de rádio tocáveis, com contagem; opcionalmente por país.", "inputSchema": { "properties": { "country": { "description": "Restringe às estações de um país, ISO 3166-1 alpha-2.", "type": "string" }, "limit": { "default": 40, "description": "Quantas tags devolver (teto 100).", "type": "string" } }, "type": "object" }, "name": "list_tags", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": {}, "type": "object" }, "name": "me", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "channel_id": { "description": "Restringe a um canal.", "type": "string" }, "limit": { "default": 20, "description": "Itens por página. Acima de 50 é silenciosamente reduzido a 50.", "type": "string" }, "ok": { "description": "`0` traz só as falhas — é o recorte que interessa numa investigação.", "enum": [ "0" ], "type": "string" } }, "type": "object" }, "name": "play_reports", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "author": { "description": "Apelido a usar; sem ele o servidor gera um estável.", "type": "string" }, "body": { "description": "O texto do comentário; o teto vem em `max_length` da listagem.", "type": "string" }, "id": { "description": "ID do canal no catálogo.", "type": "string" } }, "required": [ "id", "body" ], "type": "object" }, "name": "post_comment", "outputSchema": null }, { "description": "Current public prices and free allowances; no charge.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "pricing", "outputSchema": null }, { "description": "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.", "inputSchema": { "properties": { "lang": { "default": "pt", "description": "Idioma da oferta: pt, en, es, fr, de ou hu; ausente ou desconhecido volta a pt.", "enum": [ "pt", "en", "es", "fr", "de", "hu" ], "type": "string" } }, "type": "object" }, "name": "producer_services", "outputSchema": null }, { "description": "Registra um canal assistido no histórico do dono.", "inputSchema": { "properties": { "channel_id": { "description": "Canal assistido, ex. `GloboNews.br`.", "type": "string" } }, "required": [ "channel_id" ], "type": "object" }, "name": "record_watch", "outputSchema": null }, { "description": "Desfavorita o canal e devolve o ponto ao contador público.", "inputSchema": { "properties": { "channel_id": { "description": "Canal a desfavoritar, ex. `GloboNews.br`.", "type": "string" } }, "required": [ "channel_id" ], "type": "object" }, "name": "remove_favorite", "outputSchema": null }, { "description": "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ê.", "inputSchema": { "properties": { "channel_id": { "description": "Canal que você tentou assistir.", "type": "string" }, "code": { "description": "Por que falhou; só quando `ok` é `false`.", "enum": [ "cors", "geo", "sumiu", "codec", "playlist", "sem_resposta", "protocolo", "sem_stream", "outro" ], "type": "string" }, "ok": { "description": "`true` se tocou, `false` se falhou.", "type": "boolean" } }, "required": [ "channel_id", "ok" ], "type": "object" }, "name": "report_play", "outputSchema": null }, { "description": "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`.", "inputSchema": { "properties": { "category": { "description": "ID de categoria do catálogo.", "type": "string" }, "city": { "description": "Cidade, código do catálogo.", "type": "string" }, "country": { "description": "País do canal, ISO 3166-1 alpha-2.", "type": "string" }, "guide": { "default": "0", "description": "`1` traz só canal com grade de programação (EPG).", "enum": [ "0", "1" ], "type": "string" }, "kind": { "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.", "enum": [ "tv", "radio", "all" ], "type": "string" }, "language": { "description": "Idioma do canal, ISO 639-3.", "type": "string" }, "network": { "description": "Nome exato da rede/emissora.", "type": "string" }, "online": { "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.", "enum": [ "0", "1" ], "type": "string" }, "playable": { "default": "1", "description": "`0` inclui canal sem stream utilizável conhecido.", "enum": [ "0", "1" ], "type": "string" }, "q": { "description": "Texto livre no nome e nos apelidos do canal (busca full-text).", "type": "string" }, "quality": { "description": "Qualidade exata do stream.", "type": "string" }, "sort": { "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.", "enum": [ "name", "score", "votes" ], "type": "string" }, "subdivision": { "description": "Estado/província, código do catálogo.", "type": "string" }, "tag": { "description": "Tag da estação de rádio (vocabulário livre, ex. `mpb`, `news`); veja `GET /api/tags`.", "type": "string" } }, "type": "object" }, "name": "search_channels", "outputSchema": null }, { "description": "Compra 30 dias para a rede da TV por 4,99 USDC; 402 x402, repetir com X-PAYMENT. Sem renovação automática. Responde 402 x402 na Base; repita a mesma chamada com X-PAYMENT. Usa o pagamento global e registra tentativa, liquidação e direito. Pagamento no celular libera a rede identificada pelo código. Repetir o comprovante não compra outro passe.", "inputSchema": { "properties": { "codigo": { "description": "Seis dígitos exibidos no aviso da TV; validade de dez minutos.", "type": "string" } }, "required": [ "codigo" ], "type": "object" }, "name": "tv_pass", "outputSchema": null }, { "description": "Consulta a ativação da rede da TV pelo código de seis dígitos.", "inputSchema": { "properties": { "codigo": { "description": "Seis dígitos exibidos no aviso da TV; validade de dez minutos.", "type": "string" } }, "required": [ "codigo" ], "type": "object" }, "name": "tv_state", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:7354d5f15a713c020c015676145c528ee5fdc53778f9539a9e625f27c0881f46 | sha256sum