Nova Cast
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Give your AI agent the power to cast to your home TV and control an interactive canvas. By ArdaBot.
| Author | io.github.r4v3n-art |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 145 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Nova Cast": {
"url": "https://nova.ardabot.ai/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (28)
claim_canvasExchanges a pairing code and recovery claimKey for a durable, screen-scoped control token. Repeating the same pair recovers the original grant.
Parameters:
code(required) — stringclaimKey— string
Hints: read-only no · destructive no · idempotent not declared · open-world yes
pairing_statusread-onlyReads the validity, expiry or claimed status of a pairing code without consuming it.
Parameters:
code(required) — stringcontrolToken(required) — string
Hints: read-only yes · destructive no · idempotent not declared · open-world yes
disconnect_canvasdestructiveRevokes the screen pairing, owner access and claim recovery, including while the browser is offline.
Parameters:
controlToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
get_canvasread-onlyReads workspace revision, focus, component summaries, render status, media capabilities and display dimensions including device pixel ratio. Physical DPI is unknown.
Parameters:
controlToken(required) — string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_consoleread-onlyReads 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.
Parameters:
controlToken(required) — stringafter— integercomponentID— string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
read_componentread-onlyReads a component source, saved state and supplied data.
Parameters:
componentID(required) — stringcontrolToken(required) — string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
list_templatesread-onlyLists approved TV template slugs, versions and param examples. Prefer render(slug) for these boards instead of generating source.
Hints: read-only yes · destructive no · idempotent not declared · open-world yes
renderdestructivePaints 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integerslug(required) — string — Approved catalog slug from list_templates, for example weather, clock or countdown.controlToken(required) — stringdata— objectparams— objectcomponentID— string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
prepare_draftCreates 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integertitle(required) — stringformat(required) — stringsource(required) — string — React TSX or full HTML. Use a sized nova-video element: YouTube/Vimeo embed URLs play inline, other service URLs are unsupported; do not create launch buttons or placeholders; see /agent media guidance. Arbitrary nested frames stay blocked. Do not author clickable links or external-navigation buttons; keep interactions within the canvas and share external URLs in the agent conversation.action(required) — stringcontrolToken(required) — stringdata— objectslot— stringstate— objectcomponentID— string
Hints: read-only no · destructive no · idempotent not declared · open-world yes
read_draftread-onlyReads 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.
Parameters:
draftID(required) — stringcontrolToken(required) — string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
screenshot_draftread-onlyRenders 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.
Parameters:
draftID(required) — stringexpectedVersion(required) — integercontrolToken(required) — string
Hints: read-only yes · destructive no · idempotent not declared · open-world no
update_draftdestructiveReplaces 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integertitle(required) — stringformat(required) — stringsource(required) — string — React TSX or full HTML. Use a sized nova-video element: YouTube/Vimeo embed URLs play inline, other service URLs are unsupported; do not create launch buttons or placeholders; see /agent media guidance. Arbitrary nested frames stay blocked. Do not author clickable links or external-navigation buttons; keep interactions within the canvas and share external URLs in the agent conversation.draftID(required) — stringexpectedVersion(required) — integercontrolToken(required) — stringdata— objectstate— object
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
publish_draftdestructivePublishes 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integerdraftID(required) — stringversion(required) — integerreview(required) — string — visual if you actually screenshotted this exact version after the Preview quality loop; structural if you only inspected source/metadata. Never claim visual without a screenshot. Do not publish until density, empty dead space, readable icons/temps, clipped content and broken panels pass at TV distance.controlToken(required) — stringoverrideReason— string — Only when deterministic lint reported error-level findings you have judged acceptable (for example decorative text intentionally cropped). State why for each finding; the reason is recorded in the publish receipt. Never use it to skip fixing readable content.
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
discard_draftdestructiveRemoves an exact private draft version and its preview access without changing the live workspace.
Parameters:
operationID(required) — stringexpectedRevision(required) — integerdraftID(required) — stringversion(required) — integercontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
queue_componentdestructiveQueues 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integertitle(required) — stringformat(required) — stringsource(required) — string — React TSX or full HTML. Use a sized nova-video element: YouTube/Vimeo embed URLs play inline, other service URLs are unsupported; do not create launch buttons or placeholders; see /agent media guidance. Arbitrary nested frames stay blocked. Do not author clickable links or external-navigation buttons; keep interactions within the canvas and share external URLs in the agent conversation.action(required) — stringcontrolToken(required) — stringdata— objectstate— objectcomponentID— stringexpiresInSeconds— integer
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
get_operationread-onlyReads queued operation status and any browser outcome without contacting the browser. Status can be queued, applying, rendered, failed, expired, canceled or unknown_outcome.
Parameters:
operationID(required) — stringcontrolToken(required) — string
Hints: read-only yes · destructive no · idempotent yes · open-world yes
cancel_operationdestructiveCancels a queued component update and removes its source. Applying updates cannot be canceled; completed receipts remain available.
Parameters:
operationID(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
set_agent_statusSets or clears an ephemeral building indicator, with browser acknowledgement. Does not change workspace revision or publish drafts. Automatically clears after two minutes.
Parameters:
operationID(required) — stringexpectedRevision(required) — integerstatus(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive no · idempotent not declared · open-world yes
create_componentValidates, renders and saves a React or HTML component immediately to the right of focus. Success requires browser paint acknowledgement.
Parameters:
operationID(required) — stringexpectedRevision(required) — integertitle(required) — stringformat(required) — stringsource(required) — string — React TSX or full HTML. Use a sized nova-video element: YouTube/Vimeo embed URLs play inline, other service URLs are unsupported; do not create launch buttons or placeholders; see /agent media guidance. Arbitrary nested frames stay blocked. Do not author clickable links or external-navigation buttons; keep interactions within the canvas and share external URLs in the agent conversation.controlToken(required) — stringdata— objectstate— object
Hints: read-only no · destructive no · idempotent not declared · open-world yes
update_componentdestructiveValidates replacement source and updates a component in place, preserving existing state and data unless provided. Failed rendering retains the previous version.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringtitle(required) — stringformat(required) — stringsource(required) — string — React TSX or full HTML. Use a sized nova-video element: YouTube/Vimeo embed URLs play inline, other service URLs are unsupported; do not create launch buttons or placeholders; see /agent media guidance. Arbitrary nested frames stay blocked. Do not author clickable links or external-navigation buttons; keep interactions within the canvas and share external URLs in the agent conversation.controlToken(required) — stringdata— objectstate— object
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
delete_componentdestructiveDeletes a component and selects its nearest remaining neighbor.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
navigateFocuses a component or moves one position. Acknowledges after the selected component renders.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercontrolToken(required) — stringdirection— stringcomponentID— string
Hints: read-only no · destructive no · idempotent yes · open-world yes
set_component_datadestructivePushes 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringdata(required) — objectcontrolToken(required) — stringslot— stringmerge— boolean
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
execute_scriptdestructiveRuns 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringscript(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
inspectread-onlyTyped 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringexpectedComponentVersion(required) — integerselector(required) — stringcontrolToken(required) — string
Hints: read-only yes · destructive no · idempotent not declared · open-world yes
clickdestructiveTyped 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringexpectedComponentVersion(required) — integerselector(required) — stringtargetID(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
filldestructiveTyped 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringexpectedComponentVersion(required) — integerselector(required) — stringtargetID(required) — stringvalue(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
selectdestructiveTyped 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.
Parameters:
operationID(required) — stringexpectedRevision(required) — integercomponentID(required) — stringexpectedComponentVersion(required) — integerselector(required) — stringtargetID(required) — stringvalue(required) — stringcontrolToken(required) — string
Hints: read-only no · destructive yes · idempotent not declared · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.