Nvidia Broadcast
NVIDIAOfficialCreated by NVIDIA Broadcast Team
- Skill
- Tool integration
- Automation and integrations
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill enables an AI agent to interface with the NVIDIA Broadcast application through a local Model Context Protocol (MCP) gateway. It allows for the management of AI-powered audio and video effects, device selection, camera resolution adjustments, and the processing of local media files. The skill handles the lifecycle of the NVIDIA Broadcast application, including launching the process and establishing a secure connection to the local gateway.
What it does
- Applies and tunes AI effects for camera, microphone, and speaker inputs.
- Processes local media files with selected AI effects.
- Lists and switches active audio and video devices.
- Configures camera resolution and frame rate settings.
- Manages the NVIDIA Broadcast application process and gateway connection.
- Provides detailed descriptions of available AI effects and their parameters.
When to use it
- When you need to toggle or adjust AI background, noise removal, or voice enhancement effects.
- When you need to switch between different connected microphones, cameras, or speakers.
- When you want to apply AI effects to existing local video or audio files.
- When you need to change the resolution or frame rate of your active camera.
Advantages
- Provides programmatic control over NVIDIA Broadcast features.
- Supports both live stream adjustments and offline media file processing.
- Automates the connection and discovery process for the local MCP gateway.
- Ensures consistent effect application by using live server-reported capabilities.
Usage examples
- “Enable background blur on my camera with a strength of 0.8.”
- The agent connects to the NVIDIA Broadcast gateway and applies the background_blur effect with the specified strength parameter.
- “List all my available microphones and switch to the headset microphone.”
- The agent retrieves the list of devices and updates the active microphone device ID to the one corresponding to the headset.
- “Process my video file at C:\Users\User\Videos\input.mp4 with noise removal.”
- The agent submits the file to the NVIDIA Broadcast processing queue with the noise_removal effect enabled.
- “Change my camera resolution to 1920x1080.”
- The agent updates the active camera device configuration to the requested resolution.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/nvidia-broadcast/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip nvidia-broadcast.zip -d .agents/skills
Documentation by NVIDIA Broadcast Team
NVIDIA Broadcast
Hard rules
Launching: start Broadcast only by running
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<skill_dir>\scripts\launch_broadcast.ps1"with theterminaltool. When running inside WSL, follow Launch and version-check through interop inreferences/connection.mdinstead. Except for the security-policy fallback below and that WSL interop procedure, never invokeNVIDIA Broadcast.exedirectly — not viaterminal,execute_code,subprocess, orStart-Process.Security-policy fallback: use this only if security policy blocks the launcher script. Confirm that
NVIDIA Broadcast.exeis not already running, then run:powershell.exe -NoProfile -Command "Start-Process -FilePath ([Environment]::ExpandEnvironmentVariables('%ProgramFiles%\NVIDIA Corporation\NVIDIA Broadcast\NVIDIA Broadcast.exe')) -ArgumentList '--launch-hidden' -WindowStyle Hidden"with theterminaltool.Command tools: follow Which tool to run commands with below.
Never read effect state from disk — not
AppSetting.json, not the registry, not logs, not the UI. Those are saved settings, not live state. Exception:gateway.jsonmay be read and decoded only to obtain the gatewayportfor rule 4; it is connection configuration, not effect state.Connecting to the gateway — exactly these steps, no other path:
Before launching or registering the gateway, check the standard executable path and read its
ProductVersionwithout launching it. If the executable is missing or its version is 2.2.x or older, stop the connection sequence and follow Installing or updating NVIDIA Broadcast. Do not return the restart-only response below.Check Broadcast is running:
tasklist /FI "IMAGENAME eq NVIDIA Broadcast.exe"viaterminal. If Broadcast is installed but not running, launch it immediately (rule 1); do not ask the user to start it manually. Agateway.jsonleft from an earlier run proves nothing about whether the gateway is live.Whether already running or just launched, retry for up to 60 seconds: reread and base64-decode
%APPDATA%\nvidia-broadcast\gateway.json→{"port": <number>}. Use the port from the latest successful read. Decodegateway.jsonwithin the command and output only the port. Never print its base64 contents because credential redaction may mask them.Register
http://127.0.0.1:<port>/gatewaywith your MCP client as a Streamable HTTP server. You are the MCP client — register it yourself.Verify the server reports its name as
nvidia-broadcastvia the MCP client's server info. If it does not, treat NVIDIA Broadcast as unavailable, use the restart response below, and stop.Check whether the NVIDIA Broadcast MCP tools required for the user's request are available.
If the required tools are available, the connection is ready; proceed with the requested operation.
Stop if any of these occurs — report and go no further:
Registration fails, or
the server name is not
nvidia-broadcast, orafter registering, any required NVIDIA Broadcast MCP tool is not in your tool list.
Reply only: "NVIDIA Broadcast MCP tools are unavailable in this session. Please restart your MCP client and retry." Then stop. Do not add rationale, gateway URLs, port details, configuration instructions, or post-restart steps. Do not substitute another source or guess which effects are on.
Only after completing rule 4, if any required NVIDIA Broadcast MCP tool is still not in your tool list, that is the final answer. Stop. Its initial absence is not a reason to skip launch or registration. Do not try to make it work. Specifically, never:
Write, generate, or run any code that speaks MCP or HTTP to the gateway —
urllib,http.client,socket,requests,httpx,curl,Invoke-WebRequest, or anything else. A correct, spec-compliant client is still a violation. The prohibition is on you speaking the protocol at all, not on which library you choose.Search for, install, or run an MCP client binary —
which mcp,mcp exec,npx @modelcontextprotocol/cli,pip install mcp[cli].Scan ports, hunt the filesystem for an endpoint, or delegate to another agent or session. Use exactly the restart response from rule 4, then stop. A state read obtained by any other route is not a valid substitute, and a guessed effect list is simply wrong.
Recover from MCP connection failures. If any NVIDIA Broadcast tool call fails because the MCP connection was closed, refused, reset, disconnected, or otherwise became unavailable, repeat the connection sequence in rule 4:
Check whether
NVIDIA Broadcast.exeis running.If it is not running, launch it using rule 1. If it is already running, do not launch another instance.
Reread
gateway.json, obtain the current port, and register the gateway again.Verify the server reports its name as
nvidia-broadcast. If it does not, use the short restart response from rule 4 and stop.Check whether the NVIDIA Broadcast MCP tools required for the user's request are available.
If the tools are still unavailable, use the short restart response from rule 4 and stop. After reconnecting, retry a read-only or idempotent tool call at most once. Do not automatically repeat a non-idempotent request when the connection closed after submission because it may already have been accepted.
Do not run this recovery sequence for normal gateway or tool errors such as invalid arguments,
ambiguous_frame_rate,device_not_selected,file_not_found, rate limiting, or an effect operation failure.
Purpose
NVIDIA Broadcast applies AI effects to your camera, microphone, and speaker, and can apply the same effects to local media files. You drive it over a local MCP gateway that NVIDIA Broadcast runs on loopback. It also lets you check and change AI effects, select Studio Voice microphone profiles, manage camera, microphone, and speaker devices, and change camera resolution.
Prerequisites
Windows host with NVIDIA Broadcast installed. 2.2.x and older have no MCP gateway and cannot be driven by this skill at all. When it is missing or too old, you may offer to install it from NVIDIA's update service — see Installing or updating NVIDIA Broadcast below. Never install without asking.
Standard executable path:
%ProgramFiles%\NVIDIA Corporation\NVIDIA Broadcast\NVIDIA Broadcast.exe.MCP gateway config readable at
%APPDATA%\nvidia-broadcast\gateway.json.The current agent runtime acts as the MCP client and connects through Streamable HTTP over loopback.
Running inside WSL: the gateway lives on the Windows side, so both the endpoint and
gateway.jsonare reached differently — see If you are running inside WSL below.
Inputs
set_effects: eithereffects[]with 1-32 unique effect IDs (eacheffectId+enabled, optionalparams), oraction: "restore_previous_live".submit_file_processing:_version: 1, absoluteinputPath, 1-32 uniqueeffects[]; optionalbatchId,outputFolder,outputPath. There is no overwrite input — a fresh collision is rejected, while resume/retry replaces only that job's own partial output.list_devices: optionalkind.set_active_device:kind+ freshdeviceId, plus optional camerawidth,height,frameRate.set_camera_resolution: fresh cameradeviceId,width,height, optionalframeRate.Do not reuse device IDs from earlier sessions, and do not guess frame rates. Supply
frameRateonly when the user explicitly specified or selected it; the camera's current frame rate is not the user's choice for a new request.
Which tool to run commands with
Use terminal for shell commands and execute_code for Python. Never call browser_exec —
its code parameter makes it look like execute_code, but it runs that code inside a browser
session and opens Chrome. No task in this skill uses a browser.
Connecting
MCP client identity
In this skill, “MCP client” means the current agent runtime executing this skill—not a separate application, CLI, profile, agent, or session. This definition applies throughout the skill.
Do not conclude that no MCP client exists merely because Broadcast tools were not preloaded. Do not search client configuration files, invoke another client such as Claude Code, use a browser, browser-based MCP connection, browser automation, or browser-based remote debugging, delegate to another agent or session, or ask whether another MCP client is installed.
Streamable HTTP is the default and recommended transport. Register the gateway with your MCP client and let the client speak the protocol. Do not hand-roll HTTP requests — it is a normal Streamable HTTP MCP server, and your client already handles protocol version and transport. Add it to your MCP client configuration:
{
"mcpServers": {
"nvidia-broadcast": {
"type": "http",
"url": "http://127.0.0.1:18100/gateway"
}
}
}Or, for clients that register servers from the command line:
<mcp-client> mcp add --transport http nvidia-broadcast http://127.0.0.1:<port>/gatewaySubstitute the client's own command for <mcp-client> and the resolved gateway port for
<port>; subcommand and flag names vary by client, but the three values being registered are the
same ones in the entry above.
18100 is the default port and is correct on almost every install. No API key or header is
required for loopback MCP clients. This URL and port are for the client's configuration, not for
connecting directly.
If the default port does not work
The gateway takes the first free port in 18100-18109 and publishes the one it actually
bound in %APPDATA%\nvidia-broadcast\gateway.json — base64, decoding to { "port": <number> }.
Re-read that file on every retry rather than caching the port; a restart can move it, which is
the one case where a registered URL goes stale.
Before launching or registering the gateway, read the executable's
ProductVersionwithout launching it. If the executable is not there, NVIDIA Broadcast is not installed. If it is 2.2.x or older, that build has no MCP gateway and no amount of retrying will produce one. Either way, stop the connection sequence, tell the user what you found, and offer to install or update it — see Installing or updating NVIDIA Broadcast below. If they decline, or if installing is genuinely impossible from here — no Windows interop, no PowerShell — point them to https://www.nvidia.com/broadcast-app/ and stop. An earlier failed attempt is not one of those reasons, and neither is a download that had to be retried.Check whether
NVIDIA Broadcast.exeis running. If it is not, launch it by running the bundled launcher script — the primary launch command. Use the security-policy fallback in rule 1 under Hard rules only if policy blocks the script:powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<skill_dir>\scripts\launch_broadcast.ps1"<skill_dir>is the absolute path in theskill_dirfield of theskill_viewresult you already have. Run it with theterminaltool. Never withbrowser_exec— it takes acodeparameter just likeexecute_code, but it runs that code inside a browser session and will open Chrome. Nothing in this skill ever needs a browser. Except for the security-policy fallback in rule 1 under Hard rules, do not write your own launch command or invokeNVIDIA Broadcast.exedirectly withsubprocess.run,check_output,Start-Process -Wait, or any command that waits for or captures output from the Broadcast process. Never launch a second copy when the process is already running.Whether Broadcast was already running or was just launched, retry for up to 60 seconds: reread and decode
gateway.json, then registerhttp://127.0.0.1:<port>/gatewaythrough the MCP client. If nothing answers, use the restart response in hard rule 4 and stop.Discovery is exactly these two places and nothing else:
gateway.jsonand ports18100-18109. Do not search the filesystem for gateway or config files, and do not read environment variables looking for an endpoint or credential — the loopback gateway publishes its port only ingateway.jsonand needs no key. When both places come up empty, stop endpoint discovery.Probe only through your MCP client. Register the candidate URL and let the client connect; a failed registration is the probe result. Never reach the gateway from a shell: no command-line web clients, no throwaway request scripts, and no scanning the port range yourself — see Safety and scope for the full list of prohibited alternatives. If your client cannot register MCP servers at runtime, follow If your client cannot register MCP servers below. Not being able to probe never licenses shell tooling as a substitute.
If your client cannot register MCP servers at runtime
Some clients only load MCP servers from a config file at startup. That is a client configuration problem, not a Broadcast problem, and it is never a reason to fall back to "just turn it on in the app yourself" without checking anything. Do the version check in step 1 first — it reads the filesystem and needs no MCP client — then report whichever of these you actually found:
Broadcast is missing, or is 2.2.x or older. Offer to install or update it exactly as below. Installing needs no MCP client, and it is worth doing before any config change.
A 2.3+ build is installed. Nothing is wrong with Broadcast. Tell the user to add the gateway to their MCP client's configuration and restart the client, quoting the entry from Connecting with the port you resolved. Say plainly that you cannot drive Broadcast until they do.
Name which of the two it is. "The gateway isn't available to this session" on its own leaves the user unable to tell whether the app is missing, too old, or merely unconfigured — and sends them off to click through the UI when one config line, or an install, would have fixed it for good.
If you are running inside WSL
The gateway runs in the Windows Broadcast process, so before registering anything establish that
127.0.0.1 in the distro really is Windows loopback, and read the port through the mounted Windows
drive. Full procedure in references/connection.md; in short:
Detect WSL from
/proc/sys/kernel/osrelease— it containsmicrosoftorWSL. Do not read environment variables to decide this.Check
wslinfo --networking-mode. Onmirrored— or a WSL 1 distro — loopback is shared, so registerhttp://127.0.0.1:<port>/gatewayexactly as on Windows. Onnat(the default) the gateway is unreachable from the distro: stop, tell the user, and offer mirrored networking, an MCP client running on Windows, or a tunnel terminating on Windows loopback. Never substitute another address for loopback — not the nameserver in/etc/resolv.conf, the default route fromip route, nor$(hostname).local; nothing is published off loopback and the gateway rejects every non-loopbackHostby design.Go through Windows interop for the rest:
wslpath "$(cmd.exe /c 'echo %APPDATA%' | tr -d '\r')"to reachgateway.json, andpowershell.exe -NoProfile -Command '...'to launch, version-check, and install. If the Windows drive is not mounted orpowershell.exeis missing, say so and stop — do not search the Linux filesystem forgateway.jsonand do not look for a Linux-side substitute; ask the user to start Broadcast on Windows.
See references/connection.md for the version-check command, endpoint discovery, startup,
access, WSL specifics, and rate limits.
On connect, the server's instructions already list the exact effectIds available
right now, grouped by section, and the set_effects schema constrains effectId to
that live set. So you can act immediately — you do not need a discovery call first.
Installing or updating NVIDIA Broadcast
Only when the version check above found no executable at the standard path, or a
2.2.x-or-older build. Never as a workaround for any other failure, and never as a side effect
of an unrelated request. Full procedure, commands and failure modes in references/installation.md.
Ask what is available.
GET https://ota.nvidia.com/release/available?product=rtxb&channel=OFFICIAL&version=$installed&cpuArchType=$arch, where$installedis the installedProductVersion(0.0.0.0when Broadcast is not installed) and$archisaarch64orx86_64, read from the registry as shown next — never chosen or defaulted. Substitute both values; never send the names themselves. Check both before sending —$installeda dotted version number,$archexactlyaarch64orx86_64. The service never rejects a bad value: it answers[], which reads as "nothing newer". Read the architecture from the registry, not the process —$env:PROCESSOR_ARCHITECTUREsaysAMD64inside x64 emulation on Windows on ARM, which fetches the wrong installer. Use$native = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -ErrorAction Stop).PROCESSOR_ARCHITECTURE, mapAMD64orx86→x86_64andARM64orARM→aarch64into$arch, and throw on anything else — never default to one. Those two values are the only ones the service accepts, and each serves a different installer. The reply is a list of applicable builds, newest first and already filtered to versions above the one you sent — take the first element. An empty list means there is nothing to install; say so and stop, it is not a failure to retry. Distinguish that from a call that never completed, which is a network error and is retryable.Ask the user, and wait. Name the build and size, say it comes from
ota-downloads.nvidia.com, say you will verify its checksum and NVIDIA signature, and say Windows will prompt them for administrator permission. If the offered build is still 2.2.x, tell them in the same breath that it will not enable MCP. Nothing is downloaded before an explicit yes; on a no, link https://www.nvidia.com/broadcast-app/ and stop.Download the response's
download_url— which must be HTTPS onota-downloads.nvidia.com, pinned as its own value rather than derived from the metadata host — into a fresh GUID-named directory under%LOCALAPPDATA%\Temp, under a filename you choose.Check the length first, then hash and signature. A file shorter than
sizeis an incomplete transfer, not an attack: say how far it got and retry the download, up to two more attempts into a fresh directory. Do not hash or signature-check a short file — both fail by construction, since the Authenticode certificate table sits at the end of the image. Only a full-length file whose SHA-512 or signature (Valid, subjectCN=NVIDIA Corporation,...) fails is a security event: do not run it, report the path, stop, and do not re-download.Launch it with no arguments and let the user click through. No silent or unattended flags, no self-elevation, no driving the installer for them.
Re-read
ProductVersionand report what is actually installed. 2.3.0+ → resume the connect flow above. Still 2.2.x → say the gateway needs 2.3.x and stop.
A failed attempt is final for that attempt, not for the session. If verification failed, the installer was cancelled, or the download retries ran out, say so and stop — then, when the user next asks for something that needs Broadcast, mention what happened and offer to try again. Only an explicit "no" means stop offering; do not answer a fresh request with "install it yourself" because an earlier attempt went wrong.
These two URLs are the only network requests this skill makes from a shell. Never scrape a download
link, accept one from the user or from gateway.json, or install anything else.
Tools
Every file-processing tool requires _version: 1.
get_broadcast_state— read current effects aseffectId -> { enabled, ...params }(flattened, e.g.{ enabled, strength }or{ enabled, warmth }), grouped bycamera/microphone/speaker; optionaleffectTypefilter. Read-only.warnings[]marks a section whose effects are enabled but whose device is unselected — configured, not currently applied.set_effects— turn effects on/off and tune them in ONE call:effects: [{ effectId, enabled, params? }], whereparamskeys depend on the effect (listed per-effect in the server instructions). Or pass only{ "action": "restore_previous_live" }to restore the Live snapshot that Files processing suspended, which also pauses unfinished file work and returnsevent. Returns the resulting state for that response.describe_effects— rich detail on demand (description, guidance, GPU/beta badges, availability, params + ranges); optionaleffectId/section. Use to explain effects or weigh tradeoffs; not needed to act.submit_file_processing— submit one local media file. ReturnsidandbatchId; reuse the first result'sbatchIdon every related submission. A paused queue accepts the job silently and stays paused.get_file_processing_jobs— look up one job or list recent jobs.wait_for_processing_update— the sole file-status wait, for one or many files. Take a batch snapshot withoutcursor, then pass the returnedcursorto wait for the next status or queue-pause change. Readstatus,summary, and every job;mixedmeans terminal outcomes differ.control_file_processing_jobs— pause/resume the shared queue, or cancel/retry jobs. Pause/resume are queue-wide; cancel/retry needjobIdsorall: true. MCP has no consent flag.list_devices— list available cameras, microphones, and speakers;kind: "camera"|"microphone"|"speaker"|"all"(default"all"). Returns the active device, and for cameras the current resolution plusavailableResolutions(label,width,height,frameRate) for the current Video Super Resolution / Video Frame Generation mode.set_active_device— switch the active camera, microphone, or speaker withkindplus a freshdeviceIdfromlist_devices. For cameras, addwidth+height+optionalframeRateto switch device and resolution in one call. Camera switches restart the stream automatically (allow 2–5 seconds).set_camera_resolution— change the active camera's resolution withdeviceIdpluswidth+height+optionalframeRate; includeframeRateonly after the user explicitly specifies or selects it. When FPS is unspecified, omitframeRateso the gateway can accept a unique mode or return the available choices for an ambiguous size.
Invalid requests — including unavailable or ambiguous resolutions — return a gateway tool error
before anything changes. How to read the success-path fields (success, alreadyActive,
alreadySet, frameRateMismatch, failed[], skipped[]) is under Instructions.
Effect ids and params mirror the app's UI (e.g. "Virtual key light" → virtual_key_light with warmth). The exact ids + each effect's params are in the server instructions. See references/effects.md.
For file processing, nest every effect's options under params, exactly as with set_effects.
Frame Generation accepts multiplier 2|4 and model "performance"|"balanced"|"quality".
Studio Voice microphone profiles
Set the Studio Voice profile through params.micProfile in either set_effects or
submit_file_processing. Read the capability-aware enum from the tool schema or server
instructions; the current supported profiles are default,
bright, full, and warm. Do not send flat, colored, or thin when they are absent
from the advertised enum.
Examples
Complete tool calls — single and combined effects, per-effect params, background replace, frame
generation, Studio Voice profiles, restore_previous_live, state reads, device switches and
resolution changes — are in references/examples.md. Load it when you need the exact JSON shape.
Worked flows
Multi-step tasks have an expected shape. Follow it exactly.
Several files as one batch
Submit the first file with no
batchId— the response creates one:{ "name": "submit_file_processing", "arguments": { "_version": 1, "inputPath": "C:\\Users\\me\\Videos\\a.mp4", "effects": [{ "effectId": "background_blur", "params": { "strength": 0.6 } }] } }Keep the returned
batchId.Submit every other file with that same
batchId.Take one snapshot for the whole batch — omit
cursor:{ "name": "wait_for_processing_update", "arguments": { "_version": 1, "batchId": "<batchId>" } }While
statusisqueuedorin_progress, call it again with the samebatchIdplus thecursorthe previous response returned, and an optionaltimeoutMs.Stop at a terminal
status—completed,failed,cancelled, ormixed— then reportsummaryand name which files landed in which outcome fromjobs.mixedis not success.
Do not wait once per file, and do not poll get_file_processing_jobs in a loop.
Switch camera and set its resolution
List first — IDs and available modes change between turns:
{ "name": "list_devices", "arguments": { "kind": "camera" } }Take the camera's
id, then pick a row from that camera'savailableResolutionsrather than assuming a size is supported. If the size you want appears at more than oneframeRate, ask the user which — do not choose for them. The current FPS does not count as an explicit user choice.After the user specifies or selects an FPS, switch device and resolution in ONE
set_active_devicecall, passingkind, thedeviceIdfrom step 1,width,height, and the chosenframeRate. If FPS was not specified and the size has only one advertised rate,frameRatemay be omitted.Report from that response: check
success, then usedeviceandresolution.alreadyActive: truemeans nothing changed.success: truewithframeRateMismatch: truemeans the size applied but the frame rate differs — tell the user which FPS is actually live.
Do not follow with set_camera_resolution (that is a second stream restart), and do not call list_devices again to confirm.
Instructions
One call, no redundant verify. Put every effect you want to change in a single
set_effectscall — including bulk operations (e.g. "turn everything off" = one call with all effectIdsenabled:false; disabling an already-off effect is harmless). Its result includes the authoritativestatefor that call; do not follow it withget_broadcast_stateonly to confirm.Resume saved Live effects through
set_effects. Call it once with onlyaction: "restore_previous_live". Do not ask which effects were enabled, pre-read state, or pause the file queue first — Broadcast owns the snapshot. Reportevent: "live_effects_restored";event: "no_change"means no suspended snapshot was available or it was already restored.Disabled params are ignored.
set_effectsaccepts stale params whenenabled:false. To change params while keeping an effect disabled, enable it with the new params then disable it — two calls, because one call rejects a repeatedeffectId, and the effect is briefly live in between.Report what did and did not apply. The batch is ordered but not transactional.
success: falsecarriesfailed[]({ effectId, reason }—timeout,unavailable,device_not_selected,file_not_found, orfailed) and/orskipped[]({ effectId, conflictsWith }). Effects absent from both applied. Name which ones did not; never report the batch as done. Retrytimeoutandunavailable;device_not_selectedandfile_not_foundneed corrected user input.A missing device selection blocks the effect, on enabling or disabling. It returns
reason: "device_not_selected"withdeviceTypeandrequiresUserInput: truefor that effect; when no requested effect applied for that reason, the whole call fails with error-33201. Tell the user which device type is unselected and ask them to select one. Do not retry unchanged, and do not choose a device on their behalf without saying so.Read fresh state when asked. A
set_effectsresponse is point-in-time. Never answer a later current-state question from prior tool results; callget_broadcast_state.Live state comes only from MCP. For any question about effects or other live state,
get_broadcast_stateis the only authoritative source. Never open, read, parse, search for, inspect metadata for, or test the existence ofAppSetting.jsonor any other persisted settings file. Do not mention or offer a disk-file fallback, and do not report whether such a file exists. This prohibition still applies when Broadcast is stopped or its gateway is unavailable.Use the exact public
effectIdstrings (e.g.virtual_key_light,auto_frame,noise_removal) — do not invent ids or use internal names.paramsvalues are UI-aligned and normalized 0–1 where numeric (strength,warmth,zoom); modes are enums (e.g.mode: "performance"|"quality").For multiple files, use one batch — the shape is under Worked flows. Never infer earlier outcomes by waiting only for the last job.
Read batch outcomes literally.
completedmeans every file completed;mixedmeans terminal outcomes differ. Report the summary and affected files, never “all passed” when any job failed or was cancelled.Treat cancellation as final until the user asks. When a job is
cancelledwithreason: "cancelled_by_user", report it and stop. Never retry automatically. If the user explicitly asks afterward, callretrywith that job's exactjobIds; do not useall, resubmit, or create a replacement.Never auto-resume a user-stopped queue. When batch
statusispaused_by_user, ask in the agent conversation. Only after an explicit yes, call ordinary queue-wideresume; never send a consent flag.Retry failed jobs whose
recoveryisretry;all: truenever retries cancellations. Read the returnedeventandjobIds; if retry returnsno_change, stop and report it instead of submitting replacements.Every tool error carries concise text plus
structuredContent.error, schema rejections included, so one parse path covers all of them; JSON-RPC protocol failures use a top-levelerrorinstead. Whendata.requiresUserInputis true, stop and ask the user —ambiguous_frame_rate(withdata.frameRateOptions) means ask which fps,device_not_selectedmeans ask them to select that device,file_not_foundmeans ask for a real local path. Never substitute a value of your own.Read
error.retryablebefore giving up.-32602means your arguments were wrong and will stay wrong; fix them.-32603withretryable: truemeans the app was busy or not ready — the same call may well succeed shortly, so back off and retry rather than reporting failure.Always call
list_devicesfresh — every time the user asks what is available, and before everyset_active_deviceorset_camera_resolutionto get the currentdeviceId. Devices can be plugged or unplugged between turns; never reuse an ID from an earlier turn or session.Never infer an unspecified frame rate. The camera's current FPS, a previous setting, the first advertised mode, and 30 FPS are not permission to choose that rate. If
list_devicesshows multiple FPS values for the requested size, stop before a setter call, present those values, and ask the user to choose. If ambiguity is not known yet, call the setter withwidth+heightand omitframeRate; when it returnsrequiresUserInput: truewithframeRateOptions, present those options and ask. SupplyframeRateonly after the user explicitly specifies or selects it, then retry.Prefer one
set_active_devicecall with resolution over two calls. Switching camera and changing resolution together saves one stream restart and is faster.One call, no verify (devices). After a successful
set_active_deviceorset_camera_resolution, usedevice/resolutionfrom that response — do not follow withlist_devices.alreadyActive: truemeans the device was already selected and no stream restart happened;alreadySet: truemeans the camera was already at that resolution.Check
successin non-error results from both device tools.success: falsemeans the switch or width/height change did not fully apply, and the response carries what you need to recover without anotherlist_devices: forset_active_device,deviceConfirmed: truewithresolution.confirmed: falsemeans the device switched but the resolution did not (readresolution.actualandstate), whiledeviceConfirmed: falseincludesavailableDevicesandstate; forset_camera_resolution,actualandstate.camerasshow what the camera set. If width/height applied but only FPS differed, both returnsuccess: truewithframeRateMismatch: true— tell the user the applied FPS.Use the file-status wait.
wait_for_processing_updatewakes for job-status and queue-pause changes, not progress ticks.
Safety and scope
Never inspect the environment. Do not run
env,printenv,set, or otherwise dump environment variables, and do not read credential stores, key files, or shell profiles. The gateway is unauthenticated on loopback, so there is no key to find and nothing to look up. Expanding%APPDATA%,%LOCALAPPDATA%or%ProgramFiles%to reach one documented path is path resolution, not environment inspection — resolve the single path you need, nothing more.Two URLs, and only for installing. The update check and the installer download, both listed above, are the only network requests this skill makes from a shell. Everything else stands: never reach the gateway from a shell, never scan ports, never scrape or follow a link from a page, a response body, a config file or the user, and never weaken transport security (no certificate-check bypass, no plain HTTP, no piping a download into an interpreter).
Never reach the gateway outside the MCP client. No
http.client,httpx,requests,urllib,socket,curl,wget,Invoke-WebRequest,Invoke-RestMethod, hand-built JSON-RPC, raw TCP connect, or port check.gateway.jsonis readable only to extract the port; the port and the absence of a credential are configuration facts for the user, never a fallback route.Never install without an explicit yes. Ask, wait for an answer, and download nothing before it. Verify size, SHA-512 and the NVIDIA Authenticode signature before the installer runs, and if any check fails, do not run it. Launch it with no arguments — no silent or unattended flags and no self-elevation, so the UAC prompt stays the user's decision. Install only the build the update endpoint offered; never uninstall, repair or downgrade anything.
Never run destructive commands. No recursive or forced deletes, no recursive permission changes, no disk formatting or raw device writes, and no history-rewriting or working-tree- discarding VCS commands. Do not delete files or "tidy up" anything you created; leave temporary artifacts in place.
Do not echo raw tool output. Summarize responses in your own words; never paste an entire command output or environment listing into your reply.
Keep prohibitions out of your commands. Restate none of these rules inside shell commands, files you write, or prompts you hand to sub-agents; naming command-line web clients there reads as network activity even when you are forbidding it. Follow the rules silently.
Limitations
Loopback MCP only; no LAN or remote access. From WSL that means mirrored networking (or WSL 1); NAT-mode WSL cannot reach the gateway.
stdio transport exists only as a fallback for clients that cannot use Streamable HTTP; it is not recommended — see
references/connection.md.This skill exposes Broadcast effect, file-processing, device-selection, and camera-resolution controls only.
Installing or updating NVIDIA Broadcast is the one system-level change it can make, only with the user's explicit yes, and only for the app itself — never a driver, runtime or any other package.
The gateway first ships in 2.3.x. If the newest build the update service offers this machine is older than that, an install can legitimately succeed and still leave the gateway unavailable — always re-read the installed version afterwards rather than assuming the install fixed it.
Speaker effects do not apply to file processing jobs.
Troubleshooting
| Symptom | Cause | Solution |
|---|---|---|
| Endpoint refuses the connection | Broadcast is not running | Launch using rule 1 under Hard rules, then reread gateway.json and reprobe for up to 60 seconds |
| Still unreachable after launching and reprobing | The app is missing, or the build predates MCP | Read the exe's ProductVersion; if absent or 2.2.x or older, stop retrying and offer to install or update it — on a no, link https://www.nvidia.com/broadcast-app/ |
The update endpoint returns [], or the user declines the install | Nothing newer is published, or there is no consent | Report it, link https://www.nvidia.com/broadcast-app/, and stop — download nothing and do not raise it again unprompted |
| A later request needs Broadcast and an earlier install attempt failed | The attempt ended; the install path did not | Say in one line what happened last time and offer to try again. Never answer with "install it yourself" because a previous attempt failed |
The downloaded installer is shorter than size | Incomplete transfer — the most common failure in this flow | Not a security event. Report how far it got and retry the download, up to two more attempts in a fresh directory |
| A full-length installer fails SHA-512 or the NVIDIA signature check | Substituted or corrupted content | Do not run it. Report which check failed and where the file is, then stop — do not re-download it now, but offer a fresh attempt when the user next asks for something needing Broadcast |
ProductVersion is still 2.2.x after installing | The build that was installed predates the gateway | Say the MCP gateway needs 2.3.x, link the download page, and stop probing |
127.0.0.1:<port> refused, and you are inside WSL | NAT-mode WSL has its own loopback; Windows loopback is unreachable | Check wslinfo --networking-mode; on nat report it and offer mirrored networking, a Windows-side client, or a loopback-terminating tunnel — never swap in the host IP |
Tool error -33102 or -33103 | Rate limited, or too many in-flight calls | Back off using the limit in data, then retry |
requiresUserInput: true with frameRateOptions | That frame size exists at several frame rates | Ask the user which fps, then retry with frameRate |
Error -33201, or failed[].reason is device_not_selected | That effect's camera, mic, or speaker is not selected | Name the device type and ask the user to select it; do not retry unchanged or pick one silently |
Batch status is paused_by_user | The user stopped file processing | Ask in the agent conversation; after yes, call ordinary resume |
Job status is cancelled | The user cancelled processing | Report cancellation and stop. If explicitly asked afterward, retry with that job's exact jobIds; never use all or resubmit |
Batch status is mixed | Terminal outcomes differ | Report summary and per-job statuses; do not claim all files passed |
references/troubleshooting.md has the full table, including rejected effect IDs, warnings[],
and success: false recovery.
More detail (load only if needed)
references/effects.md— categories, effectIds, strength semantics, incompatibilities.references/examples.md— the full call-example set.references/file-processing.md— file workflow, output paths, progress.references/connection.md— endpoint discovery, startup, access, rate limits.references/installation.md— consent, download, verification, and install of a missing or too-old build.references/troubleshooting.md— the full symptom table.references/mcp-tool-contract.md— complete public tool contract.
Files
- ATTRIBUTION.mdAdded by AutoGineer955 B
- BENCHMARK.md11.5 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md40.9 KiB
- config/skillspector-baseline.yaml4.3 KiB
- evals/evals.json36.2 KiB
- references/connection.md14.6 KiB
- references/effects.md5.0 KiB
- references/examples.md2.6 KiB
- references/file-processing.md4.9 KiB
- references/installation.md23.6 KiB
- references/mcp-tool-contract.md31.4 KiB
- references/troubleshooting.md9.6 KiB
- scripts/launch_broadcast.ps1Script997 B
- skill-card.md4.7 KiB
- skill.oms.sig6.7 KiB
references/installation.md
Installing or updating NVIDIA Broadcast
Installing software is the most privileged thing this skill can do. It happens only after the user says yes to a direct question, only from NVIDIA's own update service, and only after the downloaded file proves it is a genuine NVIDIA build.
When this applies
Exactly two situations, both reached from the version check in connection.md:
NVIDIA Broadcast.exeis not at the standard path — the app is not installed.Its
ProductVersionis 2.2.x or older — the build predates the MCP gateway.
Nothing else. A reachable-but-failing gateway, a refused port on a 2.3+ build, NAT-mode WSL, a rate-limited call, or an effect that would not apply are not install problems. Never offer an install to work around them, and never install as a side effect of an unrelated request — "blur my background" is not consent to install a large application on someone's machine.
Ask first — always
Ask in the agent conversation and wait for an explicit answer. Do not pre-download "so it's ready", do not treat silence, "sure, whatever" or the original task as consent, and do not ask again after a decline — a decline being the user saying no, not an attempt that went wrong. Tell the user what will happen before they answer:
NVIDIA Broadcast isn't installed on this machine, so I can't drive it over MCP. NVIDIA's update service is offering NVIDIA_Broadcast_v2.2.0.52896077_C9D096 (180 MB) from
ota-downloads.nvidia.com. I'd download it, check its SHA-512 and confirm it's signed by NVIDIA Corporation, then open the NVIDIA installer — Windows will ask you for administrator permission and you'd click through the install yourself. Heads up: 2.2.x has no MCP gateway, so this gets you the app but I still won't be able to control it from here until 2.3.x is published. Want me to go ahead?
Adjust the build, size and caveats to what the service actually returned. Keep all four facts —
what, from where, verified how, and that a UAC prompt is coming — and add a caveat only when one
applies: when name and version disagree, or when the offered build is 2.2.x and so has no MCP
gateway.
Do not narrate the architecture. The user does not choose it, cannot act on it, and the build
name already carries it — an ARM64 package is named NVIDIA_Broadcast_ARM64_v…. Quote the name
field verbatim and let it speak.
One exception, and it matters on Windows on ARM. If the machine is ARM64 but the offered build
has no ARM64 in its name, you have been handed an x64 package. The service does not always filter
by architecture: asking for aarch64 when no ARM64 build is published returns the x64 one instead
of an empty list. Do not install it and do not assume your architecture detection was wrong — say
that no ARM64 build is currently published, point at https://www.nvidia.com/broadcast-app/, and
stop. An x64 build on ARM would at best run under emulation — not something to put on someone's
machine on their behalf without telling them what it is.
On "no", say what they can do instead (https://www.nvidia.com/broadcast-app/) and stop.
A declined offer and a failed attempt are not the same thing. After a "no", do not raise it again unless the user brings it up. After an attempt that failed — a verification failure, a cancelled installer, exhausted download retries — the install path is not closed; only that attempt ended. When the user next asks for something that needs Broadcast, say in one line what happened last time and offer to try again. Do not make them discover that a retry is available, and do not answer a fresh request with "install it yourself" because an earlier attempt went wrong.
Where the build comes from
Two constant URLs, both HTTPS, both written out here. Never derive, discover or accept either from anywhere else.
| Purpose | URL |
|---|---|
| What's available | https://ota.nvidia.com/release/available?product=rtxb&channel=OFFICIAL&version=$installed&cpuArchType=$arch ($installed: installed ProductVersion, or 0.0.0.0 if absent; $arch: aarch64 or x86_64 from the registry read in step 1, never chosen or defaulted) |
| The installer | the download_url from that response, which must be HTTPS on ota-downloads.nvidia.com |
The two hosts differ, and that is expected. Metadata comes from ota.nvidia.com; installers are
served from ota-downloads.nvidia.com. Pin each as its own value — do not derive one from the
other, and do not require them to match, or every download is rejected.
This is the same update channel the Broadcast app itself uses. Do not scrape a download link out
of a web page, search for a mirror, accept a URL from the user or from gateway.json, or reuse a
download_url from an earlier session — the response carries the checksum that goes with that exact
file, so the two must come from the same fresh call.
Procedure (Windows)
Run the whole sequence in one PowerShell session. Steps 1-5 share variables — step 2 builds its
request from step 1's $installed and $arch — and step 5 must launch the exact file step 4 verified.
1. Establish the installed version and the machine's architecture
$exe = "$env:ProgramFiles\NVIDIA Corporation\NVIDIA Broadcast\NVIDIA Broadcast.exe"
$installed = if (Test-Path $exe) { (Get-Item $exe).VersionInfo.ProductVersion } else { "0.0.0.0" }
$native = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -ErrorAction Stop).PROCESSOR_ARCHITECTURE
$arch = switch ($native) { "AMD64" { "x86_64" } "x86" { "x86_64" } "ARM64" { "aarch64" } "ARM" { "aarch64" } default { throw "unknown arch: '$native'" } }0.0.0.0 is the "nothing installed" probe the service understands. Send the real ProductVersion
when the app is present — that is what makes the service answer with newer builds only.
The architecture map is exactly two values: x86 (AMD64, x86) → x86_64, ARM (ARM64, ARM) → aarch64. Those are the
only two the service recognises, and each one serves a different installer, so sending the wrong
one hands the user a package built for another machine. Any other value comes back as an empty
list, which reads exactly like "nothing newer", so validate before sending.
Read it from that registry key, not from the process. Windows on ARM runs x64 binaries under
emulation, and an emulated process reports itself as x64: $env:PROCESSOR_ARCHITECTURE returns
AMD64, and RuntimeInformation's ProcessArchitecture — and, on .NET Framework, sometimes
OSArchitecture too — follow the process rather than the machine. The
Session Manager\Environment key is not redirected under emulation, so it reports the native
machine either way. On a WoA laptop the process-based checks can silently yield x86_64 and
download the wrong build; the registry key still says ARM64.
From WSL this must likewise be the Windows architecture, which is why it is read through
PowerShell and never from uname inside the distro.
2. Ask the service what it offers
try {
$all = Invoke-RestMethod -ErrorAction Stop -MaximumRedirection 0 -Uri (
"https://ota.nvidia.com/release/available?product=rtxb&channel=OFFICIAL" +
"&version=$installed&cpuArchType=$arch")
} catch {
"update service unreachable: " + $_.Exception.Message; return
}
if (@($all).Count -eq 0) { "nothing newer published"; return }
$rel = @($all)[0] # the service returns newest-first"The service said nothing" and "the service never answered" are different, and confusing them is
the worst failure this flow has. Invoke-RestMethod errors are non-terminating by default, so
without -ErrorAction Stop a DNS failure, a dropped VPN or a timeout leaves $all unset — and a
bare if (-not $all) then reports "nothing newer published". The user is told they are already
up to date when nothing was ever reached. Catch the failure explicitly, report it as a network
problem, and stop; that one is worth retrying later, unlike a genuine empty list.
An empty list means there is nothing newer than what is installed — not a failure to retry. Tell the user their build is the newest published one, and if it is 2.2.x add that the MCP gateway first appears in 2.3.x, so there is nothing to install yet. Stop there.
Count it with @($all).Count -eq 0, never $null -eq $all. The service answers [], which
comes back as an empty array: $null -eq $all is $false for it, so that test falls through to the
install path with no release to install. @(...) also normalises the single-record case, which
PowerShell would otherwise hand you as a bare object rather than a list.
The response is a list, ordered newest-first, and already filtered. Its length is not something
to reason about: the service returns however many applicable builds it currently publishes for that
architecture, and that changes over time. One record, several, or none are all normal, and no count
is a contract. What does hold is the ordering, and that anything at or below the version you sent
has already been excluded. So take [0] and never assume a count. When more than one record
comes back, say which one you chose.
Do not re-sort the list on version locally. That field is not always right — see the note
below — and sorting on it would rank a mislabelled build beneath genuinely older releases. The
service's own ordering tracks release recency and is the more reliable signal.
Otherwise read version, size, checksum_sha512 and download_url from $rel, and check three
things before going further:
$rel.versionis strictly newer than$installed. Never install a build that is the same or older, whatever the service says.([uri]$rel.download_url).Schemeishttpsand.Hostis exactlyota-downloads.nvidia.com. Compare against that pinned installer host as its own constant, not against the metadata host.$rel.checksum_sha512is present and non-empty. No checksum, no install.
If any check fails, stop and report it. Do not "try the URL anyway".
If name and version disagree, do not pick one yourself. The build name embeds a version of
its own (NVIDIA_Broadcast_v2.2.0.52896077_C9D096), and the two have been observed to disagree. A
mislabelled version cuts two ways: it can trip the downgrade guard above on a build that is really
newer, and it can fire — or wrongly suppress — the 2.2.x-has-no-gateway caveat. It is also why the
selection above uses the service's ordering rather than re-sorting on version. Neither guess is
yours to make: report both fields to the user, say which way the discrepancy cuts, and let them
decide. Never silently prefer name over version to get past a guard.
Now ask the user (above). Everything past this point runs only after a yes.
3. Download into a fresh, private directory
$dir = Join-Path $env:LOCALAPPDATA ("Temp\nvidia-broadcast-install-" + [guid]::NewGuid())
New-Item -ItemType Directory -Path $dir | Out-Null
$pkg = Join-Path $dir "nvidia-broadcast-setup.exe"
try {
Start-BitsTransfer -Source $rel.download_url -Destination $pkg -ErrorAction Stop
} catch {
$ProgressPreference = "SilentlyContinue" # else Windows PowerShell spends longer drawing the bar than downloading
Invoke-WebRequest -ErrorAction Stop -MaximumRedirection 0 -UseBasicParsing -Uri $rel.download_url -OutFile $pkg
}Prefer BITS for this transfer. It is a large file — hundreds of megabytes, and the exact figure
changes with every build — and Invoke-WebRequest -OutFile in Windows
PowerShell buffers without resume: one dropped connection leaves a short file on disk and reports
nothing wrong. Start-BitsTransfer is the Windows service built for large transfers — it resumes
after an interruption and retries by itself. Fall back to Invoke-WebRequest only when BITS is
unavailable or disabled by policy, and expect truncation to be likelier when you do.
-ErrorAction Stop on both, for the same reason as step 2: without it a failed transfer is
non-terminating, and the next step would verify a file that is missing or half-written instead of
reporting that the download failed. Note that a transfer can also fail silently — ending early
with no error at all — which is why step 4 checks the length before anything else.
This is a large download — the response's size field is the exact byte count, so quote that
rather than guessing. Tell the user it is running rather than going quiet on them, and give it
several minutes on a slow link before treating it as stuck.
A brand-new GUID directory under the user's own %LOCALAPPDATA%\Temp means nothing can have been
planted at that path in advance and no other user can swap the file between verification and launch.
Do not download to a shared or predictable location, and do not reuse a directory from a previous
attempt.
The local filename is ours, not theirs. Write to nvidia-broadcast-setup.exe; never build the
path out of the name field in the response.
-MaximumRedirection 0 fails loudly if the download is redirected off the pinned host. If that
happens, the distribution channel has changed — stop and tell the user. Do not follow the redirect.
One retry is reasonable if the transfer itself failed (reset connection, timeout); anything else is
not retryable.
4. Verify before running it
All checks must pass before the installer runs — but check the length first and branch on it. The three checks are not equivalent, and collapsing them into one "verification failed" is how a slow network turns into a false security alarm.
$actual = (Get-Item $pkg).Length
if ($rel.size -and $actual -ne $rel.size) {
"incomplete download: $actual of $($rel.size) bytes" # transport problem — see below
} else {
$hashOk = (Get-FileHash -Algorithm SHA512 -Path $pkg).Hash.ToLower() -eq $rel.checksum_sha512.ToLower()
$sig = Get-AuthenticodeSignature -FilePath $pkg
$sigOk = $sig.Status -eq "Valid" -and $sig.SignerCertificate.Subject -like "CN=NVIDIA Corporation,*"
"hash=$hashOk signature=$sigOk subject=$($sig.SignerCertificate.Subject)"
}A short file is an incomplete transfer, not a compromised one. This is the single most likely
failure in the whole flow — a large file over a real-world link — and it is routine, not suspicious.
Say plainly how far it got, quoting both numbers from $actual and $rel.size, then retry the
download, up to two further attempts, each into a fresh directory from step 3. Only after those
are exhausted do you give up, and even then report it as a network failure, not a security one.
The only correct comparand is $rel.size from this response. Installer sizes change with every
build, so never sanity-check against a figure from this document, from an earlier release, or from
an earlier session — hard-coding any number here silently rejects the next build. The response that
carried the checksum carries the byte count that goes with it; use that pair and nothing else.
Do not compute the hash or signature on a short file. Both fail as a matter of course: the
Authenticode certificate table lives at the end of the image, so a truncated installer always
reports NotSigned. Announcing that "size, checksum and signature all failed" makes a dropped
connection look like an attack, and tells the user to distrust a file that is merely unfinished.
If the response carried no usable size, skip the length branch — that is what the $rel.size
guard above does — and let SHA-512 carry both jobs. You then cannot tell a truncated file from a
tampered one, so allow the download one retry on a hash mismatch before treating it as final,
and say in your report that the size was unavailable so the distinction could not be made.
Only a full-size file that fails its hash or signature is a security event. Correct length with the wrong content is the tampering signal, and that one is final:
Size and SHA-512 confirm you got the file the service described, whole and unmodified.
Authenticode confirms NVIDIA actually signed it, chaining to the machine's own trust store. It is the check that still holds if the metadata itself were tampered with, which is why the signer subject is matched and not just the status. A genuine build reports
CN=NVIDIA Corporation, OU=..., O=NVIDIA Corporation, L=Santa Clara, S=California, C=US.
In that case: do not launch the file. Report which check failed and the full path, tell the user not to run it, and stop. Do not re-download this build now — a full-length file with the wrong hash will not fix itself, and fetching it again will not change that. Leave it where it is, exactly as with any other artifact this skill creates.
That ends the current attempt, not the install path. If the user later asks for something needing Broadcast, offer again as described under A declined offer and a failed attempt are not the same thing.
5. Let the user install it
Start-Process -FilePath $pkg -WaitNo arguments. The NVIDIA installer shows its own UI, Windows raises the UAC prompt, and the user
clicks through — that prompt is the point, and it is the last human checkpoint before a privileged
change. Never pass silent or unattended flags (-s, /S, /quiet, /norestart and the like),
never add -Verb RunAs to elevate on the user's behalf, and never drive the installer UI for them.
If they cancel it, that is a decision — report it and stop. That closes this attempt only; offer
again if they later ask for something that needs Broadcast.
6. Confirm, then carry on
Re-read ProductVersion from the standard path (step 1). Report the version that is actually
installed now — not the one you expected.
Start-Process -Wait returns when the process you launched exits, which for a self-extracting
installer can be before the install itself has finished. If the version has not changed yet, re-read
it for up to 60 seconds before concluding anything. Waiting is fine; launching the installer a second
time is not.
2.3.0 or newer — go back to the normal flow in
connection.md: launch withscripts/launch_broadcast.ps1, rereadgateway.json, probe through your MCP client.Still 2.2.x — the app is installed and usable on its own, but there is no MCP gateway on that build and this skill cannot drive it. Say so plainly, point at https://www.nvidia.com/broadcast-app/, and stop. Do not launch it, probe for a port, or retry.
Unchanged or unreadable — the install did not complete. Report that; do not reinstall.
From WSL
Everything above runs on the Windows side through interop, unchanged. Two differences:
One invocation. Each
powershell.exe -NoProfile -Command '...'is a new process, so$installed,$arch,$rel,$pkgand$dirdo not survive between calls. Send steps 1-5 as a single command and have it print the offered version, the three verification results and the installer path, so the transcript shows what was checked.Interop must exist. If
powershell.exeis not onPATH, you cannot install anything from here. Say so and ask the user to install Broadcast on Windows; do not look for a Linux-side installer, package or substitute.
Installing from NAT-mode WSL is allowed and does fix "not installed" — but it does not make the
gateway reachable. If wslinfo --networking-mode says nat, say that too, so the user is not
surprised when a successful install still leaves the gateway unreachable.
Hard limits
One consent, before anything is fetched. No download, no execution, no system change without an explicit yes to the question above.
Two URLs, both constant, both HTTPS. The metadata endpoint on
ota.nvidia.comand thedownload_urlonota-downloads.nvidia.com, each pinned as its own value. This is the only network access this skill performs from a shell; the rule against reaching the gateway from a shell is unchanged, and nothing else here licenses fetching, scanning or probing anything.Send the machine's real architecture. Never hard-code
cpuArchType, and never fall back to the other value when a query comes back empty — an empty result means no build for that machine, not "try the other architecture".Never weaken transport security. No
-SkipCertificateCheck, no certificate-validation callbacks, no falling back to plain HTTP, no proxy the user did not already configure.Never pipe a download into an interpreter. No
Invoke-Expression, noiex, no executing a script fetched over the network. The only downloaded file that ever runs is the verified installer.Never install silently or self-elevate. Interactive installer, UAC visible, user clicks.
Never install anything else. Not a driver, not a runtime, not a package manager, not the NVIDIA App — only the build this endpoint offered.
Never uninstall, repair, downgrade or remove an existing install, and do not delete the downloaded installer afterwards. Report where it is and leave it.
Retry an incomplete download; never retry a failed hash or signature. A short file is a transport problem and gets up to two more attempts. A full-length file whose hash or signature does not match ends the attempt — stop there, but do not treat the install path as closed for the session; offer again when the user next asks for something that needs Broadcast. Never install a build the service did not offer for this machine's current version.
Failure modes
| Symptom | Cause | What to do |
|---|---|---|
Response is [] | Nothing newer than the installed build is published | Report it and stop; if installed is 2.2.x, add that MCP arrives in 2.3.x |
download_url host is not ota-downloads.nvidia.com | The distribution channel changed, or the response is not trustworthy | Stop and report; never fetch it |
Response is [] on a machine you know has builds | cpuArchType was wrong or unrecognised — only aarch64 and x86_64 are accepted | Re-read the architecture in step 1; never retry with the other architecture to force a hit |
name says one version, version says another | The metadata fields disagree | Report both to the user and let them decide; never override the downgrade guard yourself |
Invoke-WebRequest fails on a redirect | The download was redirected off the pinned host | Stop and report; do not follow it |
| Transfer fails or times out | Transient network problem | At most one retry from step 3, with a fresh directory |
File is shorter than size | Incomplete transfer — the most common failure here | Not a security event. Report how far it got and retry the download, up to two more attempts, each into a fresh directory |
| Full-length file, SHA-512 mismatch | Substituted or corrupted content | Do not run it; report the path and stop. Do not re-download it now — but offer a fresh attempt if the user later asks for something needing Broadcast |
Signature NotSigned on a short file | Expected — the certificate table sits at the end of the image | Ignore it and treat this as an incomplete download; do not report it as a signature problem |
Full-length file, signature not Valid or signer is not NVIDIA | The file is not a genuine, intact NVIDIA build | Do not run it; report the path and stop |
Signer subject is not CN=NVIDIA Corporation,... | Signed, but not by NVIDIA | Do not run it; report the path and stop |
| Installer exits without installing | The user cancelled, or it failed | Report it; do not relaunch or reinstall |
ProductVersion is still 2.2.x afterwards | The installed build predates the gateway | Say MCP needs 2.3.x, link the download page, stop |
powershell.exe missing in WSL | Windows interop is disabled | Ask the user to install on Windows; no Linux-side substitute |
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs an API key, Needs Python, Needs Node.js
Security
What our scanner noticed· Medium risk
- Phrasing that asks for actions without confirmation
- Large base64-encoded blobs
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA Broadcast Team
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/nvidia-broadcast · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Broadcast Team or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download nvidia-broadcast.zip