protogrid

Search / net.gradetv/grade

GradeTV

R0· no sign-in

Public TV and radio catalogue with measured stream health, folders and M3U feeds for VLC.

v1.0.1 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality69needs work
Trust83of 100
Uptime, 30 days100%
Latency p50493 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "grade": {
      "type": "http",
      "url": "https://gradetv.net/mcp"
    }
  }
}
claude mcp add --transport http grade https://gradetv.net/mcp
[mcp_servers.grade]
url = "https://gradetv.net/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "grade": {
      "type": "remote",
      "url": "https://gradetv.net/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "grade": {
      "type": "http",
      "url": "https://gradetv.net/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=grade&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vZ3JhZGV0di5uZXQvbWNwIn0%3D"
}
{
  "servers": {
    "grade": {
      "type": "http",
      "url": "https://gradetv.net/mcp"
    }
  }
}
{
  "mcpServers": {
    "grade": {
      "httpUrl": "https://gradetv.net/mcp"
    }
  }
}
extensions:
  "grade":
    enabled: true
    name: "grade"
    type: streamable_http
    uri: "https://gradetv.net/mcp"
    timeout: 300

Quality 69 / 100needs work

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene86 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations41 of 41 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: list_countries (openWorldHint); list_tags (openWorldHint); search_channels (openWorldHint); …
  • pass
    tools.token_costabout 5,497 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes103 tool changes in 30 days
  • fail
    stability.rug_pull41 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

41 tools, about 5,497 tokens to load them all · tool set c91b29611650 · tools last changed 2026-10-16 · checked 2026-10-20 10:03 UTC

Tool changes

  • meadded

    The session account (the cookie that the MCP client passes on): the e-mail and the size of the account library. `user.id` is the account id, and the account owns the library when there is a session.

  • play_reportsadded

    The raw reports of a channel, with the address. Operator only (METRICS_TOKEN). Use it to investigate one channel. In the current reports, the `ip` field has an identifier calculated from the network and a secret value. The retention period is in `retention_days`. The public panel does not return this identifier.

  • play_reportsremoved

    Relatos crus de um canal, com endereço — só operador (METRICS_TOKEN). Use para investigar um canal específico. Nos relatos atuais, o campo `ip` contém um identificador calculado a partir da rede e de um valor secreto. O prazo de retenção está em `retention_days`. O painel público não devolve esse identificador.

  • contactchangeddescription, input schemameaning changed
    before

    Fale com quem faz o produto: dúvida, ou proposta de patrocínio/parceria/anúncio. Uma rota para dúvida e para proposta de patrocínio, parceria ou anúncio (`tipo`, com os espaços de `GET /api/partners`). 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.

    after · 8% of words in common

    Write to the people behind the product: a question, or a sponsorship/partnership/advertising proposal. One route for a question and for a sponsorship, partnership or ad proposal (`tipo`, with the placements of `GET /api/partners`). One message every 10 seconds per network: one that arrives sooner waits its turn and then goes out — no error. The message reaches the team by e-mail, with `email` as the reply address. For voice, send multipart/form-data: `dados` is this JSON (up to 32 KiB), and `audio` is one WebM, Ogg or M4A audio file (up to 2 MB). Audio can replace message. The browser records up to two minutes. Audio is attached to the owner's e-mail.

  • chat_sendchangedtitle, description, input schema, annotationsmeaning changed
    before

    Manda mensagem na sala de um canal por HTTP. Quem fala é o convidado (`X-Guest-Token`), o mesmo que o WebSocket reconhece; sem convidado, a sessão da conta.

    after · 14% of words in common

    Sends a message to the room of a channel by HTTP. The speaker is the guest (`X-Guest-Token`), the same one that the WebSocket recognizes; without a guest, the account session.

  • chat_historychangeddescription, input schemameaning changed
    before

    Últimas mensagens da sala de um canal (sem WebSocket).

    after · 6% of words in common

    The last messages in the room of a channel (without WebSocket).

  • delete_commentchangedtitle, description, input schema, annotationsmeaning changed
    before

    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.

    after · 10% of words in common

    Deletes a comment of the owner. The 404 is on purpose: the API does not confirm that a comment with that id exists when it is not yours.

  • post_commentchangedtitle, description, input schema, annotationsmeaning changed
    before

    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.

    after · 6% of words in common

    Comments on a channel (20 per hour at most per owner). Without `author`, the server makes a nickname that stays the same for the same owner, so the person does not get a different name for each message.

  • list_commentschangedtitle, description, input schema, annotationsmeaning changed
    before

    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.

    after · 9% of words in common

    The community comments about a channel. When the call has a credential, each of your comments has `mine: true`; this is how the interface knows what you can delete.

  • remove_favoritechangedtitle, description, input schema, annotationsmeaning changed
    before

    Desfavorita o canal e devolve o ponto ao contador público.

    after · 0% of words in common

    Removes the channel from the favorites and gives the point back to the public counter.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 83 / 100

no-repository
provenance55
liveness100
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-100% +updated-4d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://gradetv.net/mcp streamable-httpnoneyes100%493 ms2025-06-182026-10-20

Tools (41)

add_favoriteMarks a channel as a favorite. A repeat does not add up: the public counter counts people, not clicks.
add_itemAdds a channel to a tab. 40 channels at most per tab. The response tells the folder and the tab where the channel went, so the screen opens in the right place. The response has the whole updated library, so you do not need to reload `GET /api/library`.
api_indexread-onlyThe index of the whole API, with the languages and the HTML pages of each language.
channel_healthread-onlyThe community health of the channel: the success rate, the failure reasons and the affected environments. It tells 'the channel is off the air' from 'the channel is blocked in your country'. `geo` tells whether it is a regional restriction or a general failure (with the countries), `regions[]` has the success and the failure by country, `latency[]` has the opening speed measured at the hop by country, and `pra_voce` sums it up for the country of the caller. Without community reports (`POST /api/play-report`), the panel is empty.
chat_historyread-onlyThe last messages in the room of a channel (without WebSocket).
chat_sendSends a message to the room of a channel by HTTP. The speaker is the guest (`X-Guest-Token`), the same one that the WebSocket recognizes; without a guest, the account session.
clear_historydestructiveClears the whole history of the owner at once.
contactWrite to the people behind the product: a question, or a sponsorship/partnership/advertising proposal. One route for a question and for a sponsorship, partnership or ad proposal (`tipo`, with the placements of `GET /api/partners`). One message every 10 seconds per network: one that arrives sooner waits its turn and then goes out — no error. The message reaches the team by e-mail, with `email` as the reply address. For voice, send multipart/form-data: `dados` is this JSON (up to 32 KiB), and `audio` is one WebM, Ogg or M4A audio file (up to 2 MB). Audio can replace message. The browser records up to two minutes. Audio is attached to the owner's e-mail.
create_categoryCreates a personal folder (category). 8 folders at most per owner. The response has the whole updated library, so you do not need to reload `GET /api/library`.
create_groupCreates a tab in a folder. 12 tabs at most per folder. The response has the whole updated library, so you do not need to reload `GET /api/library`.
create_guestCreates a guest `ipt_…`. It asks for no e-mail and no other data. Keep the token: if you lose the token, you lose the library, unless an account already claimed it (`POST /api/auth/claim`). Then the account keeps what the token saved.
delete_commentdestructiveDeletes a comment of the owner. The 404 is on purpose: the API does not confirm that a comment with that id exists when it is not yours.
forget_watchdestructiveRemoves a channel from the owner's history.
georead-onlyThe country and the language suggested for the caller. When the edge detects no country, it suggests BR with `source: "fallback"`; `detected` tells what the edge saw.
get_channelread-onlyThe full record of a channel, with the streams that already point to our hop.
get_channel_guideread-onlyToday's TV guide of the channel (recorded by us): now, next and the list. It is available for the channels with a guide (`guide=1`) and is valid for up to two days. Check the date of the response; the channel record has the summary in `guide_now`.
get_historyread-onlyThe channels that the owner watched. It shows only the channels that are available in the catalog.
get_libraryread-onlyThe whole library of the owner: folders, tabs, channels and the feed URLs of each level.
get_programacaoread-onlyThe last TV guide available for the channel and up to 20 dates of its history.
get_programacao_diaread-onlyThe stored TV guide of a channel on one day.
healthread-onlyLiveness and the commit that is published now. The smoke test waits for its own deploy here.
legacy_streamread-onlyPublic metadata: the official site of the channel, the stream URL to copy into another player, and the legacy HTTP player. The legacy_url button opens http://legacy.gradetv.net/legacy?stream=ID, with no port in the address. The standalone page accepts lang=pt/en/es/fr/de/hu and theme=light/dark. Playlists go through the HTTPS hop, and the media comes directly from the origin. It does not remove an access refusal or a CORS requirement. It is one indexed read: it does not fetch the origin and does not write to the database.
list_citiesread-onlyThe cities that have a playable channel. You can filter them by country and by state.
list_commentsread-onlyThe community comments about a channel. When the call has a credential, each of your comments has `mine: true`; this is how the interface knows what you can delete.
list_countriesread-onlyThe countries in the catalog, with the playable count and the flag URL (`kind=radio` counts stations).
list_favoritesread-onlyThe favorites of the owner. It shows only the channels that are available in the catalog.
list_languagesread-onlyThe languages that have a playable channel, with the count of each language.
list_networksread-onlyThe networks and broadcasters that have a playable channel, with the count.
list_programacaoread-onlyChannels with a collected TV guide, up to 48 per page.
list_qualitiesread-onlyThe different qualities found in the catalog streams (for radio, the codec and the bitrate).
list_subdivisionsread-onlyThe states and provinces that have a playable channel.
list_tagsread-onlyThe tags of the playable radio stations, with the count, optionally by country.
meread-onlyThe session account (the cookie that the MCP client passes on): the e-mail and the size of the account library. `user.id` is the account id, and the account owns the library when there is a session.
play_reportsread-onlyThe raw reports of a channel, with the address. Operator only (METRICS_TOKEN). Use it to investigate one channel. In the current reports, the `ip` field has an identifier calculated from the network and a secret value. The retention period is in `retention_days`. The public panel does not return this identifier.
post_commentComments on a channel (20 per hour at most per owner). Without `author`, the server makes a nickname that stays the same for the same owner, so the person does not get a different name for each message.
producer_servicesread-onlyAuthorized broadcast offer on request: information and contacts for producers. It does not turn on streams; it only gives information and collects interest. To present a project, use contact.form_url in the browser, contact.email by e-mail, or POST /api/contact.
record_watchRecords a watched channel in the owner's history.
remove_favoritedestructiveRemoves the channel from the favorites and gives the point back to the public counter.
report_playReports whether a channel played (ok=true) or not (ok=false with code). The browser and the system come from the User-Agent, and the country comes from the request data; the body cannot change them. The first report of a result on a day returns 201. It counts once per owner, channel, day and result; a repeat returns 200 with `reason: ja_relatado_hoje`. The reports help to compare results in `GET /api/channels/:id/health`, but they do not confirm the cause of a failure.
search_channelsread-onlySearches public channels (filters: q, country, category, language, network, quality, playable; kind=radio for radio stations, tag for a radio tag; sort=score orders by the health that a third party measures, sort=votes by the radio votes; online=1 returns only channels seen online in the last 48 h). This is the main entry point of the product. The response changes with the browser, the system and the country of the caller: each channel has `social.your_fails`, the result for YOUR environment, so the response is `Cache-Control: private`.
tv_stateread-onlyChecks the activation of the TV network by the six-digit code.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "net.gradetv/grade",
  "icons": [
    {
      "src": "https://gradetv.net/icon-512.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    },
    {
      "src": "https://gradetv.net/icon.svg",
      "sizes": [
        "any"
      ],
      "mimeType": "image/svg+xml"
    }
  ],
  "title": "GradeTV",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://gradetv.net/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "1.0.1",
  "websiteUrl": "https://gradetv.net",
  "description": "Public TV and radio catalogue with measured stream health, folders and M3U feeds for VLC."
}