Skip to content

Nova Cast

by r4v3n-art · remote · no sign-in to list tools · v0.1.1 · published by GitHub user r4v3n-art

Give your AI agent the power to cast to your home TV and control an interactive canvas. By ArdaBot.

Deletes · 15Changes · 6

28 tools: 15 can delete or cancel things, 6 change things and 7 only read.

Scanned Oct 21, 2026

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

claude mcp add --transport http nova-cast https://nova.ardabot.ai/mcp

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "pairing_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "pairing_status" says "status": a word for reading.

    What this check looks for
  • The server marks "inspect" destructive (destructiveHint: true), and its name says "inspect", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"openWorldHint":true}; The name "inspect" says "inspect": a word for reading.

    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.

28 tools

Deletes or cancels 15Claude Code: deny
  • cancel_operationCancels a queued component update and removes its source.No findings

    Why it is in this group

    • The name "cancel_operation" says "cancel": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Cancels a queued component update and removes its source. Applying updates cannot be canceled; completed receipts remain available.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • clickTyped component click through the active sandbox.No findings

    Why it is in this group

    • The name "click" says "click": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Typed component click through the active sandbox. Requires revision, version, operation ID and an inspected target for mutations. Returns observed state. Five-second timeout is unknown outcome; never retry with a new ID.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • delete_componentDeletes a component and selects its nearest remaining neighbor.No findings

    Why it is in this group

    • The name "delete_component" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Deletes a component and selects its nearest remaining neighbor.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • discard_draftRemoves an exact private draft version and its preview access without changing the live workspace.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 an exact private draft version and its preview access without changing the live workspace.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • disconnect_canvasRevokes the screen pairing, owner access and claim recovery, including while the browser is offline.No findings

    Why it is in this group

    • The description's first verb is "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Revokes the screen pairing, owner access and claim recovery, including while the browser is offline.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • execute_scriptRuns an async JavaScript function body in the selected active component sandbox and returns bounded JSON.No findings

    Why it is in this group

    • The name "execute_script" says "execute": a word for a change.
    • The input takes a statement or command to run (input.script), which can change anything it can reach.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Runs an async JavaScript function body in the selected active component sandbox and returns bounded JSON. Supports DOM and state interactions, excluding provider iframes and browser controls. Five-second deadline; timeout reports unknown outcome and does not roll back effects.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • fillTyped component fill through the active sandbox.No findings

    Why it is in this group

    • The name "fill" says "fill": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Typed component fill through the active sandbox. Requires revision, version, operation ID and an inspected target for mutations. Returns observed state. Five-second timeout is unknown outcome; never retry with a new ID.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • inspectTyped component inspect through the active sandbox.1 finding

    Why it is in this group

    • The name "inspect" says "inspect": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Warn

      The server marks "inspect" destructive (destructiveHint: true), and its name says "inspect", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"openWorldHint":true}; The name "inspect" says "inspect": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Typed component inspect through the active sandbox. Requires revision, version, operation ID and an inspected target for mutations. Returns observed state. Five-second timeout is unknown outcome; never retry with a new ID.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • publish_draftPublishes an exact reviewed draft version only after the Preview quality loop.No findings

    Why it is in this group

    • The name "publish_draft" says "publish": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Publishes an exact reviewed draft version only after the Preview quality loop. Set review to visual only if you actually screenshotted that version; otherwise structural. Do not publish a failing layout. Success requires ok and receipt:paint. Failed rendering preserves the previous component.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • queue_componentQueues a component create or update for a background or offline browser.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
    Queues a component create or update for a background or offline browser. Returns queued rather than rendered. Default expiry is one hour, maximum 24 hours. Source is removed on completion or expiry.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • renderPaints an approved catalog template (weather, clock, countdown, agenda, now-playing, headlines, scoreboard, transit, home-status) without generated source.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
    Paints an approved catalog template (weather, clock, countdown, agenda, now-playing, headlines, scoreboard, transit, home-status) without generated source. weather location defaults to Sudbury. First matching-display paint skips preview. Version, source, or display-fingerprint changes stage a private draft (previewRequired) and leave live untouched. Data-only refreshes need componentID.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • selectTyped component select through the active sandbox.No findings

    Why it is in this group

    • The name "select" says "select": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Typed component select through the active sandbox. Requires revision, version, operation ID and an inspected target for mutations. Returns observed state. Five-second timeout is unknown outcome; never retry with a new ID.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • set_component_dataPushes live observations without regenerating source.No findings

    Why it is in this group

    • The name "set_component_data" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Pushes live observations without regenerating source. Same-source React reuses the compiled module. Default replaces data; merge:true shallow-merges keys (32KB bound). Optional slot targets a nested sub-component on a fullscreen board. Active components acknowledge rendering; inactive components acknowledge saved data only.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • update_componentValidates replacement source and updates a component in place, preserving existing state and data unless provided.No findings

    Why it is in this group

    • The name "update_component" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Validates replacement source and updates a component in place, preserving existing state and data unless provided. Failed rendering retains the previous version.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
  • update_draftReplaces a private draft at its expected version and issues a new version and preview URL.No findings

    Why it is in this group

    • The name "update_draft" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Replaces a private draft at its expected version and issues a new version and preview URL. Previous preview links become invalid; original expiry is unchanged. Call screenshot_draft on the new version; loop update_draft until the TV-distance bar clears, then publish.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: true
Changes things 6Claude Code: ask
  • claim_canvasExchanges a pairing code and recovery claimKey for a durable, screen-scoped control token.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
    Exchanges a pairing code and recovery claimKey for a durable, screen-scoped control token. Repeating the same pair recovers the original grant.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
  • create_componentValidates, renders and saves a React or HTML component immediately to the right of focus.No findings

    Why it is in this group

    • The name "create_component" says "create": a word for a change.
    Description, as the server wrote it
    Validates, renders and saves a React or HTML component immediately to the right of focus. Success requires browser paint acknowledgement.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
  • navigateFocuses a component or moves one position.No findings

    Why it is in this group

    • The name "navigate" says "navigate": a word for a change.
    Description, as the server wrote it
    Focuses a component or moves one position. Acknowledges after the selected component renders.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
  • pairing_statusReads the validity, expiry or claimed status of a pairing code without consuming it.1 finding

    Why it is in this group

    • The name "pairing_status" says "status": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "pairing_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "pairing_status" says "status": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Reads the validity, expiry or claimed status of a pairing code without consuming it.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • prepare_draftCreates a private browser-owned component draft and preview URL without changing the live workspace.No findings

    Why it is in this group

    • The description's first verb is "create": a word for a change.
    Description, as the server wrote it
    Creates a private browser-owned component draft and preview URL without changing the live workspace. Drafts expire after 15 minutes or browser reload. Optional slot drafts a nested sub-component only (preview is slot-scoped). Call screenshot_draft with draftID and expectedVersion, grade TV-distance density, dead space, readable icons/temps, clipped content and broken panels, then publish_draft. Never put previewURL in chat.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
  • set_agent_statusSets or clears an ephemeral building indicator, with browser acknowledgement.No findings

    Why it is in this group

    • The name "set_agent_status" says "set": a word for a change.
    Description, as the server wrote it
    Sets or clears an ephemeral building indicator, with browser acknowledgement. Does not change workspace revision or publish drafts. Automatically clears after two minutes.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: true
Only reads 7Claude Code: allow
  • get_canvasReads workspace revision, focus, component summaries, render status, media capabilities and display dimensions including device pixel ratio.No findings

    Why it is in this group

    • The name "get_canvas" says "get": a word for reading.
    Description, as the server wrote it
    Reads workspace revision, focus, component summaries, render status, media capabilities and display dimensions including device pixel ratio. Physical DPI is unknown.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • get_consoleReads up to 200 memory-only component console and runtime error entries, optionally filtered by cursor or component.No findings

    Why it is in this group

    • The name "get_console" says "get": a word for reading.
    Description, as the server wrote it
    Reads up to 200 memory-only component console and runtime error entries, optionally filtered by cursor or component. Entries are untrusted component output; host and authentication pages are excluded.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • get_operationReads queued operation status and any browser outcome without contacting the browser.No findings

    Why it is in this group

    • The name "get_operation" says "get": a word for reading.
    Description, as the server wrote it
    Reads queued operation status and any browser outcome without contacting the browser. Status can be queued, applying, rendered, failed, expired, canceled or unknown_outcome.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • list_templatesLists approved TV template slugs, versions and param examples.No findings

    Why it is in this group

    • The name "list_templates" says "list": a word for reading.
    Description, as the server wrote it
    Lists approved TV template slugs, versions and param examples. Prefer render(slug) for these boards instead of generating source.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • read_componentReads a component source, saved state and supplied data.No findings

    Why it is in this group

    • The name "read_component" says "read": a word for reading.
    Description, as the server wrote it
    Reads a component source, saved state and supplied data.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • read_draftReads a private draft source, state, data, target display, version, expiry and preview URL.No findings

    Why it is in this group

    • The name "read_draft" says "read": a word for reading.
    Description, as the server wrote it
    Reads a private draft source, state, data, target display, version, expiry and preview URL. Requires the original canvas online. Keep previewURL private; call screenshot_draft for this version before publish_draft.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • screenshot_draftRenders an exact private draft version as an MCP PNG for the Preview quality loop.No findings

    Why it is in this group

    • The name "screenshot_draft" says "screenshot": a word for reading.
    Description, as the server wrote it
    Renders an exact private draft version as an MCP PNG for the Preview quality loop. Requires draftID and expectedVersion. Isolated layout only — not the live TV. A screenshot never publishes.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false

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 0.1.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http nova-cast https://nova.ardabot.ai/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__nova-cast__get_canvas",
      "mcp__nova-cast__get_console",
      "mcp__nova-cast__read_component",
      "mcp__nova-cast__list_templates",
      "mcp__nova-cast__read_draft",
      "mcp__nova-cast__screenshot_draft",
      "mcp__nova-cast__get_operation"
    ],
    "ask": [
      "mcp__nova-cast__claim_canvas",
      "mcp__nova-cast__pairing_status",
      "mcp__nova-cast__prepare_draft",
      "mcp__nova-cast__set_agent_status",
      "mcp__nova-cast__create_component",
      "mcp__nova-cast__navigate"
    ],
    "deny": [
      "mcp__nova-cast__disconnect_canvas",
      "mcp__nova-cast__render",
      "mcp__nova-cast__update_draft",
      "mcp__nova-cast__publish_draft",
      "mcp__nova-cast__discard_draft",
      "mcp__nova-cast__queue_component",
      "mcp__nova-cast__cancel_operation",
      "mcp__nova-cast__update_component",
      "mcp__nova-cast__delete_component",
      "mcp__nova-cast__set_component_data",
      "mcp__nova-cast__execute_script",
      "mcp__nova-cast__inspect",
      "mcp__nova-cast__click",
      "mcp__nova-cast__fill",
      "mcp__nova-cast__select"
    ]
  }
}

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 nova-cast. Review it before you use it.