Skip to content

GradeTV

by gradetv.net · remote · no sign-in to list tools · v1.0.1 · published by net.gradetv

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

Deletes · 4Final · 1Changes · 19

41 tools: 4 can delete or cancel things, 1 do something that can't be undone, 19 change things and 17 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http grade https://gradetv.net/mcp

Findings

Matches of fixed checks, with the text they matched.

1 info
  • The description mentions "credential".

    Matched text

    description: "...ts about a channel. When the call has a credential, each of your comments has `mine: true`..."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

41 tools

Deletes or cancels 4Claude Code: deny
  • clear_historyClears the whole history of the owner at once.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Clears the whole history of the owner at once.

    Annotations the server declares

    • title: Clear the history
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
  • delete_commentDeletes a comment of the owner.No findings

    Why it is in this group

    • The name "delete_comment" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Delete a comment
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
  • forget_watchRemoves a channel from the owner's history.No findings

    Why it is in this group

    • The description's first verb is "remove": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Removes a channel from the owner's history.

    Annotations the server declares

    • title: Remove from the history
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
  • remove_favoriteRemoves the channel from the favorites and gives the point back to the public counter.No findings

    Why it is in this group

    • The name "remove_favorite" says "remove": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Removes the channel from the favorites and gives the point back to the public counter.

    Annotations the server declares

    • title: Remove a favorite
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
Can't be undone 1Claude Code: ask
  • chat_sendSends a message to the room of a channel by HTTP.No findings

    Why it is in this group

    • The name "chat_send" says "send": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Send a chat message
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
Changes things 19Claude Code: ask
  • add_favoriteMarks a channel as a favorite.No findings

    Why it is in this group

    • The name "add_favorite" says "add": a word for a change.
    Description, as the server wrote it
    Marks a channel as a favorite. A repeat does not add up: the public counter counts people, not clicks.

    Annotations the server declares

    • title: Add a favorite
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • add_itemAdds a channel to a tab.No findings

    Why it is in this group

    • The name "add_item" says "add": a word for a change.
    Description, as the server wrote it
    Adds 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`.

    Annotations the server declares

    • title: Add a channel to a tab
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • api_indexThe index of the whole API, with the languages and the HTML pages of each language.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The index of the whole API, with the languages and the HTML pages of each language.

    Annotations the server declares

    • title: API index
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • channel_healthThe community health of the channel: the success rate, the failure reasons and the affected environments.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The 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.

    Annotations the server declares

    • title: Channel health
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • chat_historyThe last messages in the room of a channel (without WebSocket).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The last messages in the room of a channel (without WebSocket).

    Annotations the server declares

    • title: Chat history
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • contactWrite to the people behind the product: a question, or a sponsorship/partnership/advertising proposal.No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Contact
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • create_categoryCreates a personal folder (category).No findings

    Why it is in this group

    • The name "create_category" says "create": a word for a change.
    Description, as the server wrote it
    Creates 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`.

    Annotations the server declares

    • title: Create a folder
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • create_groupCreates a tab in a folder.No findings

    Why it is in this group

    • The name "create_group" says "create": a word for a change.
    Description, as the server wrote it
    Creates 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`.

    Annotations the server declares

    • title: Create a tab
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • create_guestCreates a guest `ipt_…`.No findings

    Why it is in this group

    • The name "create_guest" says "create": a word for a change.
    Description, as the server wrote it
    Creates 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.

    Annotations the server declares

    • title: Create a guest
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • geoThe country and the language suggested for the caller.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The 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.

    Annotations the server declares

    • title: Suggested country and language
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • healthLiveness and the commit that is published now.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Liveness and the commit that is published now. The smoke test waits for its own deploy here.

    Annotations the server declares

    • title: Service health
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • legacy_streamPublic metadata: the official site of the channel, the stream URL to copy into another player, and the legacy HTTP player.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Public 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.

    Annotations the server declares

    • title: Legacy stream
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • meThe session account (the cookie that the MCP client passes on): the e-mail and the size of the account library.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Account
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • play_reportsThe raw reports of a channel, with the address.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Raw play reports
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • post_commentComments on a channel (20 per hour at most per owner).No findings

    Why it is in this group

    • The name "post_comment" says "post": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Post a comment
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • producer_servicesAuthorized broadcast offer on request: information and contacts for producers.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Authorized 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.

    Annotations the server declares

    • title: Services for producers
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • record_watchRecords a watched channel in the owner's history.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Records a watched channel in the owner's history.

    Annotations the server declares

    • title: Record a watched channel
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • report_playReports whether a channel played (ok=true) or not (ok=false with code).No findings

    Why it is in this group

    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    Description, as the server wrote it
    Reports 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.

    Annotations the server declares

    • title: Report a play
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
  • tv_stateChecks the activation of the TV network by the six-digit code.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Checks the activation of the TV network by the six-digit code.

    Annotations the server declares

    • title: TV network activation
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
Only reads 17Claude Code: allow
  • get_channelThe full record of a channel, with the streams that already point to our hop.No findings

    Why it is in this group

    • The name "get_channel" says "get": a word for reading.
    Description, as the server wrote it
    The full record of a channel, with the streams that already point to our hop.

    Annotations the server declares

    • title: Get a channel
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • get_channel_guideToday's TV guide of the channel (recorded by us): now, next and the list.No findings

    Why it is in this group

    • The name "get_channel_guide" says "get": a word for reading.
    Description, as the server wrote it
    Today'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`.

    Annotations the server declares

    • title: Today's channel guide
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • get_historyThe channels that the owner watched.No findings

    Why it is in this group

    • The name "get_history" says "get": a word for reading.
    Description, as the server wrote it
    The channels that the owner watched. It shows only the channels that are available in the catalog.

    Annotations the server declares

    • title: Watch history
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • get_libraryThe whole library of the owner: folders, tabs, channels and the feed URLs of each level.No findings

    Why it is in this group

    • The name "get_library" says "get": a word for reading.
    Description, as the server wrote it
    The whole library of the owner: folders, tabs, channels and the feed URLs of each level.

    Annotations the server declares

    • title: Library
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • get_programacaoThe last TV guide available for the channel and up to 20 dates of its history.No findings

    Why it is in this group

    • The name "get_programacao" says "get": a word for reading.
    Description, as the server wrote it
    The last TV guide available for the channel and up to 20 dates of its history.

    Annotations the server declares

    • title: Channel TV guide
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • get_programacao_diaThe stored TV guide of a channel on one day.No findings

    Why it is in this group

    • The name "get_programacao_dia" says "get": a word for reading.
    Description, as the server wrote it
    The stored TV guide of a channel on one day.

    Annotations the server declares

    • title: Channel TV guide for a day
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_citiesThe cities that have a playable channel.No findings

    Why it is in this group

    • The name "list_cities" says "list": a word for reading.
    Description, as the server wrote it
    The cities that have a playable channel. You can filter them by country and by state.

    Annotations the server declares

    • title: Cities
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_commentsThe community comments about a channel.1 finding

    Why it is in this group

    • The name "list_comments" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...ts about a channel. When the call has a credential, each of your comments has `mine: true`..."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Channel comments
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_countriesThe countries in the catalog, with the playable count and the flag URL (`kind=radio` counts stations).No findings

    Why it is in this group

    • The name "list_countries" says "list": a word for reading.
    Description, as the server wrote it
    The countries in the catalog, with the playable count and the flag URL (`kind=radio` counts stations).

    Annotations the server declares

    • title: Countries
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_favoritesThe favorites of the owner.No findings

    Why it is in this group

    • The name "list_favorites" says "list": a word for reading.
    Description, as the server wrote it
    The favorites of the owner. It shows only the channels that are available in the catalog.

    Annotations the server declares

    • title: Favorites
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_languagesThe languages that have a playable channel, with the count of each language.No findings

    Why it is in this group

    • The name "list_languages" says "list": a word for reading.
    Description, as the server wrote it
    The languages that have a playable channel, with the count of each language.

    Annotations the server declares

    • title: Languages
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_networksThe networks and broadcasters that have a playable channel, with the count.No findings

    Why it is in this group

    • The name "list_networks" says "list": a word for reading.
    Description, as the server wrote it
    The networks and broadcasters that have a playable channel, with the count.

    Annotations the server declares

    • title: Networks
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_programacaoChannels with a collected TV guide, up to 48 per page.No findings

    Why it is in this group

    • The name "list_programacao" says "list": a word for reading.
    Description, as the server wrote it
    Channels with a collected TV guide, up to 48 per page.

    Annotations the server declares

    • title: TV guide channels
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_qualitiesThe different qualities found in the catalog streams (for radio, the codec and the bitrate).No findings

    Why it is in this group

    • The name "list_qualities" says "list": a word for reading.
    Description, as the server wrote it
    The different qualities found in the catalog streams (for radio, the codec and the bitrate).

    Annotations the server declares

    • title: Stream qualities
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_subdivisionsThe states and provinces that have a playable channel.No findings

    Why it is in this group

    • The name "list_subdivisions" says "list": a word for reading.
    Description, as the server wrote it
    The states and provinces that have a playable channel.

    Annotations the server declares

    • title: States and provinces
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • list_tagsThe tags of the playable radio stations, with the count, optionally by country.No findings

    Why it is in this group

    • The name "list_tags" says "list": a word for reading.
    Description, as the server wrote it
    The tags of the playable radio stations, with the count, optionally by country.

    Annotations the server declares

    • title: Radio tags
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
  • search_channelsSearches 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 t…No findings

    Why it is in this group

    • The name "search_channels" says "search": a word for reading.
    Description, as the server wrote it
    Searches 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`.

    Annotations the server declares

    • title: Search channels
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http grade https://gradetv.net/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__grade__list_programacao",
      "mcp__grade__get_programacao",
      "mcp__grade__get_programacao_dia",
      "mcp__grade__list_countries",
      "mcp__grade__list_tags",
      "mcp__grade__search_channels",
      "mcp__grade__list_languages",
      "mcp__grade__list_networks",
      "mcp__grade__list_qualities",
      "mcp__grade__list_subdivisions",
      "mcp__grade__list_cities",
      "mcp__grade__get_channel",
      "mcp__grade__get_channel_guide",
      "mcp__grade__get_library",
      "mcp__grade__get_history",
      "mcp__grade__list_favorites",
      "mcp__grade__list_comments"
    ],
    "ask": [
      "mcp__grade__api_index",
      "mcp__grade__health",
      "mcp__grade__geo",
      "mcp__grade__create_guest",
      "mcp__grade__create_category",
      "mcp__grade__create_group",
      "mcp__grade__add_item",
      "mcp__grade__record_watch",
      "mcp__grade__tv_state",
      "mcp__grade__legacy_stream",
      "mcp__grade__producer_services",
      "mcp__grade__report_play",
      "mcp__grade__play_reports",
      "mcp__grade__channel_health",
      "mcp__grade__add_favorite",
      "mcp__grade__post_comment",
      "mcp__grade__chat_history",
      "mcp__grade__chat_send",
      "mcp__grade__me",
      "mcp__grade__contact"
    ],
    "deny": [
      "mcp__grade__forget_watch",
      "mcp__grade__clear_history",
      "mcp__grade__remove_favorite",
      "mcp__grade__delete_comment"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as grade. Review it before you use it.