GradeTV
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Public TV and radio catalogue with measured stream health, folders and M3U feeds for VLC.
| Author | net.gradetv |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 1927 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"GradeTV": {
"url": "https://gradetv.net/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (41)
list_programacaoread-onlyChannels with a collected TV guide, up to 48 per page.
Parameters:
q— string — Search in the channel name across the whole collection, up to 80 characters.depois— string — Exclusive ID of the last row; use `proximo`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
get_programacaoread-onlyThe last TV guide available for the channel and up to 20 dates of its history.
Parameters:
slug(required) — string — The stored slug of the channel, from the collection.antes— string — Exclusive day to page through the earlier days; use `guia.proximo`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
get_programacao_diaread-onlyThe stored TV guide of a channel on one day.
Parameters:
slug(required) — string — The stored slug of the channel, from the collection.dia(required) — string — Collection day, YYYY-MM-DD.antes— string — Exclusive day to page through the earlier days; use `guia.proximo`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
api_indexread-onlyThe index of the whole API, with the languages and the HTML pages of each language.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
healthread-onlyLiveness and the commit that is published now. The smoke test waits for its own deploy here.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_countriesread-onlyThe countries in the catalog, with the playable count and the flag URL (`kind=radio` counts stations).
Parameters:
kind— string — `tv` (default) counts TV channels; `radio` counts radio stations; `all` counts both.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_tagsread-onlyThe tags of the playable radio stations, with the count, optionally by country.
Parameters:
limit— string — How many tags to return (100 at most).country— string — Limits to the stations of one country, ISO 3166-1 alpha-2.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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`.
Parameters:
q— string — Free text in the channel name and its aliases (full-text search).tag— string — Radio station tag (free vocabulary, for example `mpb` or `news`); see `GET /api/tags`.city— string — City, catalog code.kind— string — `tv` (default) is the TV catalog; `radio` is the radio stations; `all` is both. Without `kind`, radio never appears.sort— string — `score` orders by the health that a third party measures, best first; channels with no measurement go to the end. `votes` orders by the votes recorded for the station (radio). `name` is alphabetical order.guide— string — `1` returns only channels with a TV guide (EPG).online— string — `1` returns only channels that the source saw online in the 48 h before the last catalog reload (`health_ext.online`). When the catalog has not reloaded for more than 48 h, the filter returns no channel.country— string — Country of the channel, ISO 3166-1 alpha-2.network— string — Exact name of the network or broadcaster.quality— string — Exact quality of the stream.category— string — Category ID from the catalog.language— string — Language of the channel, ISO 639-3.playable— string — `0` also includes channels with no known usable stream.subdivision— string — State or province, catalog code.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_languagesread-onlyThe languages that have a playable channel, with the count of each language.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_networksread-onlyThe networks and broadcasters that have a playable channel, with the count.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_qualitiesread-onlyThe different qualities found in the catalog streams (for radio, the codec and the bitrate).
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_subdivisionsread-onlyThe states and provinces that have a playable channel.
Parameters:
country— string — Limits to one country, ISO 3166-1 alpha-2.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_citiesread-onlyThe cities that have a playable channel. You can filter them by country and by state.
Parameters:
country— string — Limits to one country, ISO 3166-1 alpha-2.subdivision— string — Limits to one state or province.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
get_channelread-onlyThe full record of a channel, with the streams that already point to our hop.
Parameters:
id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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`.
Parameters:
id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Hints: read-only no · destructive no · idempotent no · open-world not declared
get_libraryread-onlyThe whole library of the owner: folders, tabs, channels and the feed URLs of each level.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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`.
Parameters:
name(required) — string — Folder name, up to 40 characters.
Hints: read-only no · destructive no · idempotent no · open-world not declared
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`.
Parameters:
category_id(required) — string — Folder that receives the tab, `cat_…`.name(required) — string — Tab name, up to 40 characters.
Hints: read-only no · destructive no · idempotent no · open-world not declared
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`.
Parameters:
group_id(required) — string — Tab that receives the channel, `grp_…`.channel_id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.
Hints: read-only no · destructive no · idempotent no · open-world not declared
get_historyread-onlyThe channels that the owner watched. It shows only the channels that are available in the catalog.
Parameters:
limit— string — Items per page. A value above 50 becomes 50.offset— string — How many items to skip. Use `next_offset` from the previous response.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
record_watchRecords a watched channel in the owner's history.
Parameters:
channel_id(required) — string — The watched channel, for example `GloboNews.br`.
Hints: read-only no · destructive no · idempotent no · open-world not declared
forget_watchdestructiveRemoves a channel from the owner's history.
Parameters:
channel_id(required) — string — Channel to remove from the history, for example `GloboNews.br`.
Hints: read-only no · destructive yes · idempotent yes · open-world not declared
clear_historydestructiveClears the whole history of the owner at once.
Hints: read-only no · destructive yes · idempotent yes · open-world not declared
tv_stateread-onlyChecks the activation of the TV network by the six-digit code.
Parameters:
codigo(required) — string — The six digits shown on the TV screen. They are valid for ten minutes.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
id(required) — string — Public stream ID, including the old IDs for compatibility.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
lang— string — Language of the offer: pt, en, es, fr, de or hu. A missing or unknown value falls back to pt.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
channel_id(required) — string — The channel that you tried to watch.ok(required) — boolean — `true` when it played, `false` when it failed.code— string — Failure code, only when `ok` is `false`. A missing or unknown code counts as `outro`.
Hints: read-only no · destructive no · idempotent no · open-world not declared
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.
Parameters:
ok— string — `0` returns only the failures, which is the subset for an investigation.limit— string — Items per page. A value above 50 becomes 50.channel_id— string — Limits to one channel.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
list_favoritesread-onlyThe favorites of the owner. It shows only the channels that are available in the catalog.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
add_favoriteMarks a channel as a favorite. A repeat does not add up: the public counter counts people, not clicks.
Parameters:
channel_id(required) — string — Channel to mark as a favorite, for example `GloboNews.br`.
Hints: read-only no · destructive no · idempotent no · open-world not declared
remove_favoritedestructiveRemoves the channel from the favorites and gives the point back to the public counter.
Parameters:
channel_id(required) — string — Channel to remove from the favorites, for example `GloboNews.br`.
Hints: read-only no · destructive yes · idempotent yes · open-world not declared
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.
Parameters:
id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.body(required) — string — The comment text. The limit is in `max_length` of the list.author— string — Nickname to use; without it, the server makes a stable one.
Hints: read-only no · destructive no · idempotent no · open-world not declared
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.
Parameters:
id(required) — string — Comment ID, from `Comentario.id`.
Hints: read-only no · destructive yes · idempotent yes · open-world not declared
chat_historyread-onlyThe last messages in the room of a channel (without WebSocket).
Parameters:
channel_id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
channel_id(required) — string — Channel ID in the catalog, for example `GloboNews.br`.body(required) — string — The message text, within `max_length`.author— string — Nickname to use; without it, the server makes a stable one.
Hints: read-only no · destructive no · idempotent no · open-world not declared
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.
Hints: read-only yes · destructive no · idempotent yes · open-world not declared
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.
Parameters:
name(required) — string — What to call the person writing.email(required) — string — Where to reply.message(required) — string — What you want to say.fuso— string — Consulting: the IANA time zone, such as `America/New_York`.pais— string — Consulting: the country of the person asking.site— string — Website of who is proposing.tipo— string — Proposal: `patrocinio`, `parceria`, `anuncio` or `consultoria`. Turns on the fields below.prazo— string — Consulting: when to start (`agora`, `1_mes`, `1_3_meses` or `explorando`).espaco— array — Placement ids from `GET /api/partners`, up to 6.duracao— string — Exposure in days: `30`, `90` or `365`.empresa— string — Who is proposing, when it is a company.formato— string — Consulting: `projeto` (per scope), `mensal` (monthly) or `assessoria` (advisory).projeto— string — Consulting: the kind of project (`llm_privado`, `voz`, `dados_sensiveis`, `gpu`, `integracao` or `outro`).horarios— array — Consulting: up to 3 times for the call, `YYYY-MM-DDTHH:MM` in that time zone.whatsapp— string — Optional reply number with country code, such as +5561999999999.orcamento— string — Advertising: `ate_100`, `100_500`, `500_2000`, `2000_mais` or `a_combinar`. Consulting, in US dollars: `ate_2000`, `2000_5000`, `5000_10000`, `10000_mais` or `nao_sei`.pagamento— stringprefer_whatsapp— boolean — Request a WhatsApp reply. Requires whatsapp.
Hints: read-only no · destructive no · idempotent no · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.