omniverse-mcp
Omniverse MCP lets an AI client inspect, control, simulate, capture, and script a running NVIDIA Omniverse Kit/Isaac Sim app.
Inspect scenes: prim hierarchy, properties, bounds, mesh stats, comparisons, logs, simulation state, and performance.
Edit scenes: create, delete, clone, move, rotate, scale, hide, set attributes, assign materials, save/open/new scenes, and export or flatten USD.
Capture visuals: viewport images with bounding boxes and segmentation, multi-angle prim inspection, camera aiming, lighting control, and batch capture sweeps.
Simulate physics: play/pause/stop/step, set mass/friction/restitution/collision, apply forces, and raycast.
Work with robots: add Isaac Sim robots, read joints and limits, and set joint targets.
Record simulation frames and tracked prim state, then review individual frames.
Manage USD variants and rewrite material/asset paths.
Use Kit utilities: read logs, enable/disable extensions, and draw debug shapes.
Run arbitrary Python inside Kit, including long-running jobs with progress checks and cancellation.
Integrates with NVIDIA Isaac Sim and other Omniverse Kit apps, allowing an AI assistant to inspect and edit scenes, capture viewport images, run physics simulation, drive robots, record simulation state, manage USD files and variants, and execute Python scripts inside Kit.
Omniverse MCP connects an AI client, such as Claude Code, Cursor or VS Code, to a running Kit app. It comes in two parts, from one release:
the server,
omniverse-mcp: the MCP server your AI client starts, from PyPI;the bridge,
ovmcp.bridge: the Kit extension inside the Kit app, listed in Kit as Omniverse MCP Bridge, and in Kit's community extension registry.
Claude Code users get both from one plugin, with skills for each kind of work.
AI client --MCP, stdio--> omniverse-mcp --HTTP, with a token--> ovmcp.bridge
(the server) (inside the Kit app, port 8211)Requirements
A Kit app of Kit 107 or later, on Windows or Linux. Tested on Isaac Sim 6.2 (Windows and Linux) and 5.1 (Linux); USD Composer and other Kit apps should work, but are untested. On Linux, Isaac Sim 5.1 runs on NVIDIA's 580 drivers; on a 595 driver its renderer crashes as it starts.
uv, which runs the server. Install it, then open a new terminal and restart your AI client, so both find
uvx:macOS and Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
An MCP client that can read files: the tools write images and long answers to files and return their paths.
Kit and the client on the same machine, or see Kit on another machine.
Related MCP server: ROS MCP Server
Install
Claude Code: the plugin
In Claude Code:
/plugin marketplace add serionist/omniverse-mcp
/plugin install omniverse-mcp@omniverse-mcpIf it asks you to, run /reload-plugins. From a terminal, the same is claude plugin marketplace add serionist/omniverse-mcp, then claude plugin install omniverse-mcp@omniverse-mcp, and the plugin loads when
Claude Code next starts.
Then run /omniverse-mcp:setup. It installs the bridge of the plugin's release, tells you what to click in Kit, and
checks the connection. The plugin also brings skills for scenes, geometry, simulation, scripts and bug reports, which
Claude uses when a request fits (the plugin).
Other MCP clients
Install the bridge:
uvx omniverse-mcp extension installIt copies
ovmcp.bridgeinto your user data folder, then prints the folder Kit needs, under "Kit finds it once its extension search paths hold this folder". Or install the bridge in Kit itself, from Kit's community registry, and give the server its version in step 3 (From Kit's community registry).Turn it on in the Kit app, once:
Window > Extensions, the menu (☰) at the top right, Settings.
Under Extension Search Paths, the green +, then paste the folder. The + adds an empty row: click it to type.
Search for
ovmcpunder THIRD PARTY, and turn Omniverse MCP Bridge on, with Autoload.
The bridge starts at once, and Kit's console shows
[ext: ovmcp.bridge-<version>] startup. Kit saves the search path and Autoload when it exits, so quit it once with File > Exit. A headless Kit takes--ext-folder <that folder> --enable ovmcp.bridgeinstead (headless Kit).Add the server to your client's MCP config, and restart the client. In most clients' JSON:
{ "mcpServers": { "omniverse": { "command": "uvx", "args": ["omniverse-mcp"], "env": { "PYTHONPATH": "" } } } }Each client's file and form, VS Code's and Codex's included, are in MCP clients. The empty
PYTHONPATHkeeps a Python path that Isaac Sim's environment sets out of the server's Python.
Your client gets the server's short instructions with it. If it ignores them, see docs/AI_GUIDE.md, which also points at the plugin's skills as plain Markdown files.
Check that it works
With the Kit app running, ask your assistant to "call get_sim_state". It answers with lines such as:
state = stopped
up_axis = Z
...
extension_version = 0.5.1
server_version = 0.5.1Something else? See Troubleshooting.
Used the extension before 0.2.0? It came from a clone of this repo, and before that it was
isaacsim.mcp.bridge. Turn the old one off and remove its search path, so Kit loads one copy. See the changelog.
What you can ask
"What's in the scene? Capture the viewport and tell me where each object is."
"Put a table at the origin with a red, a green and a blue cube on it, and light it so the capture isn't black."
"Show me /World/Table from its four top corners, with everything else hidden."
"How many faces does /World/Robot have, and which parts have the most?"
"Add a Franka arm on the table, and list its joints and their limits."
"Drop a cube from one metre, record two seconds of it falling, and show me the last frame."
"Export /World/Table as a self-contained USD file."
"That failed. Show me Kit's warnings and errors."
The tools
Area | Tools | What they do |
Scene |
| Read the scene's hierarchy and properties; create, move, copy, hide and delete objects; set an attribute such as a light's intensity; save, open a file, or start an empty scene |
Camera |
| Capture the viewport with each object's screen box and colour, see one object from several sides, capture many viewpoints and variant states in one job and again after a change, aim the camera at a point or an object, light the view |
Materials |
| Give an object a colour and surface; fix material paths after files move |
Simulation |
| Play, pause, stop and step physics; the state, the up axis and the versions; measure the frame rate, the physics step and GPU memory |
Physics |
| Mass, friction and bounce; make a collider; push an object; cast a ray |
Robots |
| Add a robot from Isaac Sim's library (Franka, UR10, G1, Spot and more), read its joints and where they are, set joint targets |
Recording |
| Record frames from any camera at any size, and objects' state, while physics plays, then look back at any frame |
Geometry |
| Count faces and vertices and find the heaviest parts, compare two objects or variants |
USD files and variants |
| Write a stage as one file, export an object, make and switch variant sets |
Kit |
| Read Kit's log, turn Kit extensions on and off, draw lines and points in the viewport |
Scripts |
| Run Python inside Kit for anything the other tools don't do; run a long script as a job while Kit renders, read its progress and cancel it |
Every tool, with its parameters, is in the tool reference.
Updating
The server and the bridge come from one release, so update them together, then restart Kit and your client.
The plugin:
claude plugin marketplace update omniverse-mcp, thenclaude plugin update omniverse-mcp@omniverse-mcp, and restart Claude Code. Then run/omniverse-mcp:setup, which installs the matching bridge.Other clients:
uvx omniverse-mcp@latest extension installfetches the newest server and installs its bridge. On Windows a running Kit holds the bridge's folder: quit it first. Unpinned, uvx can also move to a new release by itself; the server then names the command that installs the matching bridge. To stay on one release, pin it (Updating).The bridge from Kit's community registry: update it in Kit's Extensions window, and the server's pin with it.
Configuration
The server
omniverse-mcp [--host HOST] [--port PORT] [--output-dir DIR] the MCP server, over stdio
omniverse-mcp extension install install the bridge of this release
omniverse-mcp extension path print the folder Kit's search paths needVariable | Flag | Default | What |
|
|
| where the bridge listens |
|
|
| the bridge's port |
|
|
| where images and long answers go |
| the token file | the bridge token, for a Kit app on another machine | |
| per system | the token file's folder, set the same on both sides |
The plugin's server reads them from the environment Claude Code starts in. Add mcp_output/ to your project's
.gitignore.
The bridge
Setting | Default | What |
|
| the address it listens on |
|
| its port |
| empty: a new token at every start | a fixed token, for a remote MCP server |
Set them on Kit's command line, such as --/exts/ovmcp.bridge/port=8212, and give the server the same port in
OMNIVERSE_MCP_PORT. Don't edit the installed extension's extension.toml: the next extension install replaces it.
The bridge token
The bridge runs any Python the server sends, so it answers only a server that holds its token. At every start it writes a new token to a file only your user can read, and the server on the same machine reads it: nothing to set up. Requests from web pages are refused. Kit on another machine says how to set a token by hand, and Architecture where the file lives.
Context7 for scripts
Models are not trained on Omniverse and Isaac Sim APIs, and guess their names. With Context7
as a second MCP server, the assistant looks the API up (library isaac-sim/isaacsim) before writing execute_script
code; the server's instructions and the script skill ask it to.
Troubleshooting
"Missing or wrong bridge token": Kit runs as another user, in a container or on another machine. Set a token by hand (Kit on another machine).
"The Kit extension is older than this MCP server", or "speaks bridge protocol": the server and the bridge come from different releases. Run the command the message names, then restart Kit.
"Kit app connection failed", refused or timed out: is the Kit app running, with the bridge on? Its console shows
[ext: ovmcp.bridge-<version>] startup. The server looks on port 8211 unless OMNIVERSE_MCP_PORT says otherwise. On
its first start Isaac Sim compiles shaders for several minutes, and answers slowly until then.
"Kit at ... stopped answering": a call got no answer in 120 s, and /health none in 5 s either. Kit may be busy
with a long script that never awaits, or hung: Kit 110 (Isaac Sim 6.2) can hang for good inside NVIDIA's renderer
while it sets up a new camera view (Known issues has NVIDIA's workaround). Later calls fail in 5 s
while Kit stays silent, and go again once it answers. If it stays silent for minutes, restart the Kit app.
Kit logs [MCP Bridge] Failed to start server: another program, or a second Kit app, holds port 8211. Give this
Kit app another port, and the server the same one (The bridge).
The server doesn't start: Claude Code's /mcp shows its error; other clients have an MCP log. Is uvx on the
PATH the client starts with? Restart the client after installing uv.
A capture comes back black, or its prims do: the answer warns, with the lighting mode. viewport_light(action="set", mode="Default") lights the view, or mode="camera" for a light that follows the camera; Kit apps have no default
light.
A tool returns an error: get_logs(min_level="warn") shows what Kit reported. get_robot_info reads joint
positions while physics plays or is paused, and raycast needs it to have played once; the robot tools need Isaac Sim.
More in SETUP.md.
Known issues
Isaac Sim 6.2 (Kit 110) can hang for good while it sets up a new camera view, inside NVIDIA's renderer, its log silent from then on, and tools fail with "Kit at ... stopped answering" (#114). The bridge keeps one render between captures, and records through it at its size, so it sets up few new views, but a long session can still meet it. NVIDIA's workaround is a flag on Kit's command line,
--/rtx/hydra/supportMultiTickRate=false(isaac-sim/IsaacSim#920; where it goes, with Kit's window or without: Headless Kit): NVIDIA's repro ran 1,000 new views twice with it, and hung after 600 without. Its cost: repeated captures of one view differ a little more. Two captures of Replicator's walking agents, with the timeline stopped, came a mean of about 3.2 of 255 a channel apart with the flag, against about 1.2 without, in our tests. NVIDIA hasn't said yet what it does to sensors that render at different rates. Kit's renderer reads the flag only as it starts: set from a script while Kit runs, it doesn't reconfigure the renderer, and it misleads Replicator'sstep(), which reads it on each call (#189).Isaac Sim 6.2 (Kit 110.4) can stop answering after a long session of stage changes, its main thread busy inside Fabric's population code (
usdrt.population.plugin), with none of the bridge's code running: seen in a test order that opens many stages, plays physics with colliders and captures with segmentation, never in a short session. Restart Kit; nothing of the bridge's can prevent it (#162). NVIDIA's flag for the new-view hang, above, avoided this one too in that order: 2 runs of 2 passed with it, where Kit hung 9 times of 9 without.
Report another as an issue. When a tool misbehaves, your assistant asks whether to report it, then drafts the report with the versions, the call and Kit's log, and files it with the GitHub CLI once you agree to the draft, or leaves it for you to post (the plugin's report-bug skill).
Security
The bridge runs any Python the server sends, by design: execute_script and run_script_job are tools. The token
keeps other programs and web pages out, but not your own AI client, so keep it asking before execute_script,
run_script_job and manage_extensions.
Report a vulnerability privately, as SECURITY.md says.
Documentation
Setup in depth: each client's config, headless Kit, ports, remote setups, uninstalling
Tool reference: every tool, its parameters and hints
The plugin: what the Claude Code plugin brings, and its skills
Without the plugin: the context and workflows for other clients
Architecture: how the server and the bridge work, for contributors
Until 1.0, a minor release can change the tools; the changelog lists it under Breaking. Questions, ideas and bugs: open an issue.
Licence
MIT. Not affiliated with or endorsed by NVIDIA; Omniverse and Isaac Sim are NVIDIA's trademarks.
Available Tools
44 toolsapply_forceA
Push a rigid body through PhysX with a force or an impulse, so its mass counts. The simulation must be playing or paused. A push on an articulation's link, such as a robot's, moves the robot through its joints: a floating robot touching nothing changes speed by the impulse over its whole mass; a fixed robot's link turns about its joints, and on the ground friction takes some of the push. The answer gives the point pushed at and the path the push took: method: physx, PhysX's own push, or method: tensor. With /physics/suppressReadback on, as Isaac Sim's GPU device sets it for PhysX's Direct GPU API, the push goes through PhysX's tensor API. Under that API a second push on a body before the next physics step replaces the first, so push once per body per step, combining pushes into one; pushes on different bodies each land. Refused for a prim without RigidBodyAPI, a disabled or kinematic body, and one a fixed joint holds to the world (a fixed robot's base). To place a body rather than push it, use set_prim_transform.
| Name | Required | Description | Default |
|---|---|---|---|
| force | Yes | [fx, fy, fz]: an impulse in N s, or a force in N for one physics step | |
| impulse | No | True for an impulse in N s, False for a force in N for one physics step. For a sustained push, give an impulse of force times seconds | |
| position | No | World-space point to push at; the body's centre of mass when omitted | |
| prim_path | Yes | The rigid body's prim path, a robot's link among them |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, non-destructive, closed-world; the description goes far beyond that by disclosing articulation/link behaviour, friction effects, the tensor-API path under suppressReadback, the replace-on-second-push semantics before the next physics step, and the exact refusal conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the key distinction from the sibling, then progresses through behaviour, caveats, and refusals. It is dense and long, but nearly every sentence carries operational information; minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still sketches the answer (point pushed at, path taken, method: physx vs tensor). Combined with the edge-case coverage, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so force/impulse/position/prim_path are already documented, including the impulse-vs-force meaning and the centre-of-mass default. The description reinforces the physical interpretation ('its mass counts', impulse over whole mass) but adds no syntax or format details beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource – pushing a rigid body through PhysX with force or impulse – and immediately distinguishes it from set_prim_transform ('To place a body rather than push it'). An agent can tell which sibling to use without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions (simulation playing or paused), explicit exclusions (no RigidBodyAPI, disabled/kinematic bodies, bodies fixed to the world), an explicit alternative for positioning, and guidance to combine pushes into one per step. This is close to exhaustive routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobA
Cancel a job run_script_job or capture_sweep started, at its next await. It reads cancelling until its own cleanup, its finally blocks, has run, then cancelled: get_job(job_id, wait=10) reads it. A job whose code caught the cancel, as a bare except does, runs on: call cancel_job again. A sweep puts the stage back and keeps the shots it took, in its manifest. A job that has ended is left as it is.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job to cancel, as run_script_job or capture_sweep answered it, such as j3 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the state machine (cancelling during finally-block cleanup, then cancelled), the idempotent retry pattern when cancellation is swallowed by a bare except, and the side effect that a sweep restores the stage while retaining captured shots in its manifest. These are exactly the non-obvious behaviors an agent needs and none of them are recoverable from readOnlyHint/destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded and every clause carries distinct information: cancellation timing, cleanup state, polling, retry-on-swallowed-cancel, sweep manifest behavior, and the already-ended case. The phrasing is sometimes garbled (missing relative pronoun in 'a job run_script_job or capture_sweep started', dense colons and run-ons), which costs a little readability but not content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with an output schema and annotations, the description covers timing, intermediate and terminal states, verification via get_job, retry semantics, and side effects on sweeps. What remains unstated is minor: whether the call returns immediately, and any permission or concurrency constraints on cancelling another caller's job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the job_id property already explains the expected format and provenance ('as run_script_job or capture_sweep answered it, such as j3'). The description only reuses job_id in the get_job polling example and adds no new syntax or constraint beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancel) applied to a specific resource (a job) and names the exact origin of that resource: jobs started by run_script_job or capture_sweep. It also implicitly distinguishes itself from get_job, which only observes status, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real when-to-use context: call it to stop a running job, call it again if the job's code caught the cancellation, and expect a no-op if the job has already ended. It points at get_job(job_id, wait=10) as the way to confirm the outcome, but it never states an explicit exclusion such as a precondition on job ownership or a case where cancel should not be attempted at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_sweepA
Capture many shots in one call, each with its own camera pose, lens, variant selections and timeline time, as a job: for checking a scene's looks and switches from many viewpoints, where one capture_viewport a picture costs a turn each. Answers the job's id and folder at once.
A shot is a position with yaw and pitch (yaw about the up axis, 0 along +X; pitch -90 looks straight down), a position with a target, or camera_path, a camera of the stage rendered as it is. Its lens is focal_length and the apertures in mm, the vertical one fitted to the image when left out; one that doesn't fit the image's shape is refused. selections switch variant sets for the shot alone, in the session layer, which no save writes; time sets the timeline. Every shot is checked before anything changes.
Kit writes each shot's PNG and a manifest.json, each shot's pose, lens, selections, time and file, into mcp_output/sweeps//. Read it with get_job(id, wait=100): shot 37 of 400 as it goes, then one line naming the folder and the shots that came out black or failed. A sweep's manifest.json given as shots_file takes the same shots again, given the first sweep's width and height, on this scene after a change or on another built from the same spec. Afterwards every layer, the timeline and the selections are as they were, after cancel_job too, which keeps the shots taken. A time repeats time-sampled animation; Replicator's walking agents move on each update whatever the time, so stop the timeline (sim_control) for shots of them that repeat. One size for all the shots; one job runs at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The sweep's folder in mcp_output/sweeps/: letters, digits, '.', '_', '-' and spaces; the time when empty. A folder that holds a sweep already is refused | |
| shots | No | The shots, in order, up to 2,000; give this or shots_file | |
| width | No | Every picture's width in pixels, up to 4096 | |
| height | No | Every picture's height in pixels, up to 4096 | |
| shots_file | No | A JSON file on this server's machine holding a list of shots, or a sweep's manifest.json to take its shots again; give this or shots |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, destructiveHint=false, openWorldHint=false; the description goes well beyond by disclosing that selections are applied in the session layer 'which no save writes', that all state is restored afterwards including after cancel_job, that every shot is validated before anything changes, and that an existing sweep folder is refused. Strong disclosure for a mutation tool, though it never states the permissions or time/cost expectations of a long multi-shot job.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core action, but several sentences are spliced run-ons ('Its lens is focal_length and the apertures in mm, the vertical one fitted...') and the paragraph has stray line breaks that hurt scanability. Nearly every sentence carries unique information, so the length is justified by tool complexity, but the packaging could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2,000-shot batch job tool, the description covers output location (mcp_output/sweeps/<name>/ with PNGs and manifest.json), how to monitor via get_job(id, wait=100), what failure looks like, state restoration semantics, and reuse of the manifest. With an output schema present, nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the prose adds real meaning: vertical_aperture is fitted to the image shape and refused when it doesn't fit, a manifest.json passed as shots_file re-takes shots and needs the first sweep's width and height, and shots/shots_file are mutually exclusive with a 2,000 ceiling on shots. These are behavioral constraints the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Capture many shots in one call, each with its own camera pose, lens, variant selections and timeline time, as a job') and explicitly contrasts itself with the sibling capture_viewport ('where one capture_viewport picture costs a turn each'). An agent can distinguish it from both capture_viewport and get_job without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditions for use (checking a scene's looks and switches from many viewpoints), names the alternative it replaces, explains the shots_file reuse path across scenes and after changes, and states operational constraints ('one job runs at a time') plus the interaction with cancel_job and sim_control for repeating agents. That is explicit when-to-use plus real exclusions and follow-ups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_viewportARead-only
Render one frame from a camera at width x height and save 3 files to mcp_output/captures/:
Image (PNG): what the camera sees.
Bounding boxes (TXT): each mesh or shape under /World whose world box lies on the image, its box in pixels, world centre and size.
Instance segmentation (PNG): each prim in a colour of its own, with a legend naming them.
Use it to see the scene and tell which prim is where: the boxes for places, the segmentation for prims that overlap. It renders camera_path, or the viewport's camera when empty, in a render of its own, so the viewport the user sees keeps its camera and size. Aim first with set_camera, at a point or a prim; for one prim from every side, use inspect_prim. An all-black image, or lighting that lights nothing (mode off, or stage with no scene lights) though Kit's grid shows, comes with a warning saying what to change with viewport_light. Without omni.syntheticdata only the image comes: the boxes and segmentation need it.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Image width in pixels, up to 4096; the camera is rendered at this size | |
| height | No | Image height in pixels, up to 4096; the camera is rendered at this size | |
| camera_path | No | The camera prim to capture from, which must be a camera; the viewport's when empty | |
| include_image | No | Also return the image inline, besides the file (uses more context) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent with a non-mutating capture. Beyond annotations it discloses what would otherwise be surprising: the render is isolated so the user's viewport camera and size are preserved, an all-black image or inactive lighting returns a warning, and omni.syntheticdata is required for boxes and segmentation (image only without it).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The numbered output list is well structured and the usage guidance is front-loaded. The final paragraph is dense and packs several separate facts (isolation, aiming, lighting warning, syntheticdata prerequisite) into one block, but nearly every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully enumerates the return artifacts and file locations, plus the degraded-mode prerequisite and failure warnings. Nothing an agent needs to invoke and interpret the capture is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so width/height/camera_path/include_image are already fully documented in structured fields. The description only reinforces the render-size behavior and the empty-camera_path fallback, adding little per-parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (render one frame) and resource (camera), and enumerates the three artifacts it writes (image, bounding boxes TXT, instance segmentation PNG), so the agent knows exactly what the tool produces versus siblings like inspect_prim or get_scene_tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('see the scene and tell which prim is where'), which output to prefer for which question (boxes for places, segmentation for overlapping prims), and routes to alternatives: set_camera to aim first, inspect_prim for one prim from every side, viewport_light for lighting problems.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clone_primA
Copy a prim with everything under it to a new path, once or as a row of count copies.
The first copy sits on the source and each next one moves by offset from the one before, so a single copy is never moved: move it with set_prim_transform. With offset, copy n moves n times offset from the source in the parent's space, through its own translate op or matrix, its other ops and placement kept; the first copy, and a single copy, are left as copied. A source whose position can't be written copies nothing. It copies what the stage's root layer holds at source_path, its references included, so a prim from a sublayer, or from inside a referenced asset, can't be copied whole. A target path that already holds a prim is refused before anything is copied. For a new prim, use create_prim.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many copies: one goes to target_path, more to target_path_001, _002, ... | |
| offset | No | [x, y, z] in the parent's space: each copy after the first sits this far from the last | |
| source_path | Yes | The prim to clone, e.g. "/World/MyCube" | |
| target_path | Yes | Where the copy goes, e.g. "/World/MyCube_Copy" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say it is a non-readonly, non-destructive, closed-world write), the description discloses exactly what is copied (root-layer contents including references), what silently fails ('a source whose position can't be written copies nothing'), and that target collisions are rejected before any copying happens. The offset naming scheme and the fact that the first/single copy is never displaced are also spelled out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded, but the offset rules are stated twice in slightly different wording ('each next one moves by offset from the one before' vs. 'copy n moves n times offset from the source'), and the opening sentence's clause about a single copy never being moved is syntactically tangled. Trimming the duplicated offset explanation would make it sharper.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with four parameters and an output schema, this covers purpose, alternatives, failure modes, and transform semantics without needing to describe return values. An agent has everything required to call it correctly and to know when it will not work.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the prose adds genuine meaning: offset is applied cumulatively through the copy's own translate op or matrix while all other ops and placement are preserved, and the schema's _001/_002 naming for count is reinforced. It does not restate every parameter, which is appropriate given the schema already documents them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (copy) plus resource (prim) and scope ('with everything under it', 'once or as a row of count copies'), which no sibling does. The closing sentence explicitly separates it from create_prim, so an agent can route without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names concrete alternatives and the conditions that select them: set_prim_transform for moving a single copy, create_prim for a new prim. It also states hard when-not conditions (sublayer or referenced-asset prims can't be copied whole, existing target paths are refused), so the agent can predict failures before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_primsA
Compare two prims, or two variants of one prim, side by side: mesh, face, vertex and triangle counts, world bounds and bound materials, with B minus A, and the change in faces as a percentage when A has faces.
Two modes:
Two prims: prim_path_a and prim_path_b.
Two variants: prim_path, variant_set, variant_a and variant_b; this mode wins when all four are given.
Variant mode switches to each variant in turn in Kit's session layer, then puts that layer back exactly as it was, so no file and no selection changes. An unknown variant set or variant is refused, listing those there, and so is a prim inside an instance, naming the instance. For one prim's counts, use get_mesh_stats.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | No | Two variants: the prim that has them | |
| variant_a | No | Two variants: the first | |
| variant_b | No | Two variants: the second | |
| prim_path_a | No | Two prims: the first | |
| prim_path_b | No | Two prims: the second | |
| variant_set | No | Two variants: their variant set |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing that variant mode temporarily switches variants in Kit's session layer and then restores the layer exactly, with no file or selection changes — consistent with destructiveHint=false and readOnlyHint=false. It also documents refusal behavior (unknown variant set/variant listed back; prim inside an instance refused and the instance named), which annotations cannot convey. It does not cover cost or side effects on concurrent session state, so it falls just short of the top.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and output fields, then cleanly segmented into numbered modes, then caveats. Dense but nearly every clause carries information; the session-layer restoration sentence is slightly long but justifies itself as the only statement that this call does not leave side effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description instead covers the things an agent must know to call correctly: mode selection, precedence, restoration of session state, and the two refusal conditions. Nothing material is missing for a comparison tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter meanings are already given and the baseline is 3. The description adds real value on top by grouping the six flat parameters into two mutually exclusive modes and stating a precedence rule (all four variant params present means variant mode wins), which the schema does not express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) plus the two resources it operates on (two prims, or two variants of one prim) and enumerates the compared metrics: mesh, face, vertex and triangle counts, world bounds, bound materials, B minus A deltas. It explicitly routes single-prim counting to get_mesh_stats, so an agent can separate it from that sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two numbered modes with the exact parameter sets that select each, and resolves the ambiguity an agent would hit: variant mode wins when all four variant parameters are given. It also names the alternative (get_mesh_stats) for the one-prim case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_primA
Create a prim at prim_path: a shape, an Xform, a camera, a light or any USD type, or a reference to a file.
prim_type is a USD type name: Cube, Sphere, Cylinder, Cone, Capsule, Xform, Camera, DistantLight, DomeLight, SphereLight and the rest. Missing parents are made as typeless prims. A prim already at prim_path keeps its type: one of another type is refused, one of the same type takes the new transform, written as set_prim_transform writes it. A transform it can't write makes nothing. A usd_path file whose upAxis, metersPerUnit or kilogramsPerUnit isn't the stage's is brought to the stage as create_robot brings a robot file: turned upright, scaled, its physics values converted, and the answer says so; one that authors none is left as it is. usd_path adds its reference to a prim already there as the file is. A file that can't be opened is an error. enable_physics puts the RigidBody and Collision APIs on the prim itself, so a shape falls and collides while the simulation plays; the meshes under an Xform or a referenced file's root get no Collision API of their own: give each one with set_physics_properties' collision=True, which makes a static collider without a rigid body. To copy a prim, use clone_prim; for a robot, create_robot.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | A uniform scale, or [sx, sy, sz] | |
| position | No | [x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit) | |
| rotation | No | Euler angles [rx, ry, rz] in degrees, or a quaternion [w, x, y, z] | |
| usd_path | No | A USD file to reference instead of a type: an absolute path on Kit's machine, or a URL | |
| prim_path | Yes | Where to create it, e.g. "/World/MyCube" | |
| prim_type | No | USD type name, e.g. Cube, Sphere, Xform, DistantLight | Xform |
| enable_physics | No | Add the RigidBody and Collision APIs |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-readonly, non-destructive, closed-world; the description goes well beyond them by disclosing implicit parent creation, type-conflict refusal, that a failed transform write aborts creation, upAxis/metersPerUnit/kilogramsPerUnit conversion of referenced files, and unopenable-file errors. The one gap is that it never says what create_prim returns, though an output schema exists to cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in sentence one and each subsequent sentence carries distinct behavioral information, so nothing is filler. It is dense and some sentences chain several clauses (the reference-file conversion sentence especially), which costs a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter creation tool this covers the important surface: type resolution, transform writing, physics enablement, reference-file normalization, failure modes, and sibling alternatives. An output schema exists, so the absence of return-value prose is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the baseline is 3, but the description genuinely adds meaning: it enumerates valid prim_type values, explains that usd_path references a file instead of a type and how that reference merges into an existing prim, and clarifies that enable_physics applies only to the prim itself, not to descendant meshes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb plus the full range of resources (shape, Xform, camera, light, any USD type, or a file reference) and names the exact creation location parameter. It is immediately distinguishable from clone_prim and create_robot because the description explicitly says what those are for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to alternatives by name: clone_prim for copies, create_robot for robots, set_prim_transform for rewriting a transform, and set_physics_properties' collision=True for meshes under an Xform or reference. It also states the condition under which a same-type prim is accepted versus refused, which is real when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_robotA
Add a robot to the stage as a reference: one of Isaac Sim's asset library by name, or a robot's USD file.
Names, which need Isaac Sim: franka, ur10, carter, jetbot, g1, go1, go2, h1, spot, anymal. A USD file as robot_type is a path on the Kit app's machine, a URL, or a path in Isaac Sim's asset library (/Isaac/...). Without prim_path, the prim is named after the robot or the file: /World/Franka, or /World/MyBot for MyBot.usd. A prim already at prim_path, or a file that can't be opened, is an error. A file whose upAxis isn't the stage's is stood upright on it, as Kit stands a dropped file, and the answer says so: Isaac Sim's robots are Z-up, so each is turned on a Y-up stage. A file that authors no upAxis is left as it is. A file whose metersPerUnit or kilogramsPerUnit isn't the stage's is brought to the stage's units, as Kit's metrics assembler brings a dropped file with its physics rules: scaled, its physics values converted, and the answer says so; one that authors neither is left as it is. position and rotation stay in the stage's frame. For anything but a robot, use create_prim; get_robot_info then lists the robot's joints.
| Name | Required | Description | Default |
|---|---|---|---|
| position | No | [x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit) | |
| rotation | No | Euler angles [rx, ry, rz] in degrees, or a quaternion [w, x, y, z] | |
| prim_path | No | Where to put it; made up from the name when empty | |
| robot_type | Yes | A robot's name (franka, g1, spot, ...) or a USD file's path |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only say the tool is non-read-only and non-destructive. The description adds a lot beyond that: the default prim naming rule, the error cases (prim already exists, file can't be opened), and up-axis correction that is reported in the answer. It also covers unit and physics conversion matching Kit's metrics assembler, and notes that position and rotation stay in the stage frame.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the purpose, but the middle is a dense run-on paragraph about up-axis and unit handling. The phrasing is awkward in places ("stood upright on it", "the answer says so"). That content is useful but could be tighter or structured as a list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Inputs, defaults, error conditions, side effects and related tools are all covered, which makes the description complete for this moderately complex mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, yet the description still adds real meaning. It gives the full list of valid robot names, which the schema lacks as an enum, and the accepted path forms: local path, URL, or /Isaac/ library path. It also explains how the default prim_path is derived, e.g. /World/Franka or /World/MyBot.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource: add a robot to the stage as a USD reference, either from Isaac Sim's asset library by name or from a USD file. It also separates itself from create_prim, which is for anything but a robot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the alternative explicitly ("For anything but a robot, use create_prim") and names the follow-up tool, get_robot_info, for listing joints. It also states a prerequisite: library names need Isaac Sim.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_variant_structureA
Add a variant set of empty variants to a prim and select one, ready to fill and to switch between with set_variant_selection.
A set or variant that already exists is kept and added to, never replaced. The variants hold nothing until you author into them, with execute_script. An error when the prim doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | Yes | The prim to add the variant set to | |
| variant_names | Yes | The variants to create, e.g. ["focused", "shell"] | |
| default_variant | No | The variant to select; the first of variant_names when empty or not among them | |
| variant_set_name | Yes | The new variant set's name, e.g. "model" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, closed-world. The description adds genuinely new behavior beyond that: merge semantics ('kept and added to, never replaced'), that variants start empty, and the error condition when the prim doesn't exist. It doesn't cover return shape, but an output schema exists so that's acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with the action, then merge semantics, then the authoring pointer. Minor inefficiency in the fragment 'An error when the prim doesn't exist.', but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations and an output schema, the description covers creation, selection, merge behavior, follow-up authoring, and the failure mode. The only gap is what the returned structure contains, which the output schema presumably covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the schema, including the default_variant fallback to the first entry. The description reinforces that one variant is selected at creation but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Add a variant set of empty variants to a prim and select one'. It also names the complementary sibling, set_variant_selection, so an agent can distinguish creation from switching without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: variants are empty until authored via execute_script, and existing sets are added to rather than replaced. It stops short of an explicit 'do not use this when...' exclusion, but the creation-vs-switching split with set_variant_selection is implied well enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_primADestructive
Delete a prim and everything under it, by removing what the stage's edit layer holds at that path.
A prim another layer defines too, or one a reference or payload on a prim above brings, such as a part of a referenced asset, can't be deleted this way: the call is refused, saying why, and nothing changes; set_visibility hides such a prim, or its instance for a prim inside one. Kit's undo doesn't record the delete, and the file on disk keeps the prim until save_scene. An error when no prim is there.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds several traits they cannot express: the refusal is atomic ("nothing changes"), the error message explains why, Kit's undo does not record the delete, and the on-disk file keeps the prim until save_scene. It also notes an error when the prim is absent. This is exactly the extra context the annotation bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and mechanism, then failure modes, then persistence caveats—a sensible order with no filler. The second sentence is convoluted ("one a reference or payload on a prim above brings, such as a part of a referenced asset") and could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-param tool with an output schema, the description covers everything an agent needs before calling: what is deleted (including descendants), what blocks deletion, irreversibility via undo, and the required follow-up save. Return values are handled by the output schema, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required parameter with 100% description coverage including a concrete example ("/World/Robot"), so the baseline is 3. The description refers to "that path" but adds no format or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a prim and everything under it") plus the exact mechanism ("removing what the stage's edit layer holds at that path"). An agent can distinguish this from set_visibility or save_scene without consulting any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates the cases where the call is refused (prim defined by another layer, brought in by a reference or payload) and names the alternative, set_visibility, for those cases. It also points at save_scene as the step needed to persist the change, so both when and when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_debugA
Draw debug lines in the viewport, 2 pixels wide, for duration seconds: a line, a polyline, a sphere as
three crossing lines, or a small cross per point.
Use it to mark points, rays or paths, such as a raycast's hit, for a capture or the user to see: on Isaac Sim 6.x the lines show in capture_viewport's image. Nothing is added to the stage. In Isaac Sim, when a drawing expires, lines other code drew with isaacsim.util.debug_draw go too. A new stage drops the old one's drawings.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | For "line": its end [x, y, z] | |
| size | No | For "points": how far each point's cross reaches, in stage units | |
| color | No | [r, g, b] colour in 0-1; red when omitted | |
| shape | Yes | What to draw: "lines" joins the points in order | |
| start | No | For "line": its start [x, y, z] | |
| center | No | For "sphere": its centre [x, y, z] | |
| points | No | For "points" and "lines": a list of [x, y, z] | |
| radius | No | For "sphere": its radius | |
| duration | No | How long it shows, in seconds from the call, whether the simulation plays or not |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing a shared-state side effect: expired drawings also remove lines other code drew via isaacsim.util.debug_draw, and a new stage drops the previous stage's drawings. Also clarifies that nothing is added to the stage, which materially changes how an agent treats this versus create_prim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and rendering contract, then usage, then caveats. Every sentence adds a distinct fact (shape rendering, integration with capture, stage non-persistence, side effects) with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations present and an output schema, the description covers safety, persistence, lifetime and side effects well. The remaining gap is per-shape parameter requirements, which the description leaves entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is a 3; the description earns above that by explaining that a sphere renders as three crossing lines and each point as a cross, plus the fixed 2px width. It does not state which shape-specific params are mandatory per shape, which stays with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource ("Draw debug lines in the viewport") with the exact rendering semantics (2px wide, `duration` seconds) and an enumeration of the four shapes. An agent knows exactly what the call produces, and no sibling tool competes for this job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the use case ("mark points, rays or paths, such as a raycast's hit, for a capture or the user to see") and names the integration point (capture_viewport on Isaac Sim 6.x). No when-not-to-use or named alternative for persistent geometry, so short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_scriptADestructive
Run Python inside the Kit app (Isaac Sim, USD Composer, ...) on its main thread, for what no tool does.
Prefer a tool that does the job: it checks its input and bounds its waits. The script has omni, carb, Usd, UsdGeom, UsdLux, UsdPhysics, Sdf, Gf and mcp. Assign to 'result' to return JSON-serialisable data (anything else comes back as its str); stdout and stderr come back too, and an exception as an error with the traceback's last lines. A script that blocks freezes Kit: the call gives up after 120 s, and the script runs on. For work that may outlast 120 s, such as settling many objects under physics, use run_script_job: it runs as a job while Kit renders and other tools answer, and get_job reads its progress and result.
mcp calls the tools' handlers from the script, each returning a dict with "status" and "result". Await them,
which makes the script async: bounds = await mcp.prim_bounds("/World/Cube"), then
result = bounds["result"]. Its methods: capture_viewport(width, height, camera_path), set_camera(position,
target), look_at(prim_path, distance, azimuth, elevation), inspect(prim_path, angles, width, height,
zoom_offset=0.0, isolate=False), scene_tree(root, max_depth), prim_properties(prim_path),
prim_bounds(prim_path), set_transform(prim_path, position, rotation, scale), create_prim(prim_path, prim_type,
**kwargs), delete_prim(prim_path), set_material(prim_path, color, opacity, roughness, metallic),
sim_control(action), sim_state(), get_logs(count, min_level, channel, search).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Python to run inside the Kit app; assign to result to return data |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: main-thread execution, a 120 s call timeout, the fact that the script keeps running after the call gives up, and that a blocking script freezes Kit. It also documents the return contract ('assign to result' for JSON-serialisable data, else str), stdout/stderr capture, and exception-as-error with the traceback's last lines. The destructiveHint/openWorldHint annotations are consistent with arbitrary code execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary constraint (prefer dedicated tools) before the escape hatches, and each paragraph maps to one decision: whether to use it, how results come back, timeouts, and the mcp bridge. The mcp method enumeration is long but is functional API reference the agent cannot get elsewhere; minor cost is dense backtick-cluttered prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for a powerful escape-hatch tool: safety framing, timeout and freeze semantics, return/error conventions, and an in-script tool bridge with exact call syntax and awaited-handler pattern. With an output schema and annotations already present, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100%, so the baseline is 3; the description still adds real meaning by explaining the 'result' convention, what serialisation rules apply, and how stdout/stderr and exceptions surface. It does not restate the parameter needlessly, though it could say whether the code runs in a fresh namespace.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run Python inside the Kit app ... on its main thread') and gives a scope qualifier ('for what no tool does') that separates it from the ~45 siblings. It also names the environment variants (Isaac Sim, USD Composer) so the agent knows the runtime context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prefers dedicated tools ('Prefer a tool that does the job') with a reason (validated input, bounded waits), making this the fallback. It also names the concrete alternative and the condition that selects it: work that may outlast 120 s, such as settling physics, should use run_script_job with get_job for progress.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_prim_as_fileADestructive
Write one prim's subtree to a USD file of its own, flattened, with the materials it is bound to from outside the subtree, so the file opens without the scene.
The prim becomes / and the file's default prim, with the stage's up axis and units. Use it to hand one asset to another tool or project; flatten_usd writes the whole stage, save_scene the root layer as it is. output_path is overwritten, but one the open stage has loaded (its own file, a sublayer, a referenced or payload file) is an error, since writing it would replace a file the open scene is made of: name another path. An error too when the prim doesn't exist. Textures and other files the subtree points at are not copied.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | Yes | The root of the subtree to export | |
| output_path | Yes | The file to write on Kit's machine: .usd, .usda or .usdc, which a path without one gets; never one the open stage has loaded |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a destructive, non-read-only write, but the description adds far more: the output file is overwritten, flattening is applied, outside material bindings are pulled in, textures are NOT copied, and writing over a loaded file is an error. These are non-obvious side effects and failure modes not captured anywhere in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded — purpose first, then usage, then error conditions — and every sentence carries information. The heavy colon-separated sentences in the back half make it denser than it needs to be, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive export with an output schema present, the description covers the transformation performed, the naming convention, side effects (materials in, textures not), and both error conditions. Nothing an agent needs before calling correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics: the prim becomes /<its name> and the file's default prim, inherits the stage's up axis and units, a missing extension defaults to .usd/.usda/.usdc, and output_path must not be a loaded file. Only prim_path gets no extra treatment beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (write), resource (one prim's subtree), and precise scope (flattened, plus externally-bound materials, so the file opens standalone). It also names the two siblings that do something similar but different — flatten_usd and save_scene — so the agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use it to hand one asset to another tool or project; flatten_usd writes the whole stage, save_scene the root layer as it is.' It also states when the call fails (output_path already loaded by the open stage, prim doesn't exist) and what to do instead ('name another path'), which is exactly the when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flatten_usdADestructive
Write a stage flattened into one USD file: its references, payloads and sublayers resolved into a single layer.
Use it to hand the whole scene to another tool as one file; save_scene keeps the references and writes only the root layer, and export_prim_as_file writes one prim's subtree. Leave input_path empty for the open stage, or name a USD file: one the open stage has loaded, its own file included, is flattened as Kit holds it, unsaved edits too, and the open stage is left as it is; one USD can't open is an error. output_path is overwritten, but one the open stage has loaded (its own file, a sublayer, a referenced or payload file) is an error, since writing it would replace a file the open scene is made of: name another path, or save the open stage with save_scene. Textures and other files the stage points at are not copied.
| Name | Required | Description | Default |
|---|---|---|---|
| input_path | No | The USD file to flatten, on Kit's machine; the open stage, unsaved edits too, when empty | |
| output_path | Yes | The USD file to write, on Kit's machine; overwritten if there, but never one the open stage has loaded |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it says exactly what gets overwritten, what constitutes a forbidden overwrite (own file, sublayer, referenced or payload file), that unsaved edits are included, that the open stage is left untouched, that an unopenable USD is an error, and that textures are not copied. That is unusually rich disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by alternatives and then the error semantics, which is the right ordering. Some clauses are run-on and grammatically rough ("one USD can't open is an error") and a few rules restate the schema, costing a little tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; what an agent still needs — input resolution rules, overwrite safety, error conditions, and the side effects on the open stage — is all covered. Nothing material is missing for a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by spelling out the consequences of each parameter choice (empty input_path = open stage including unsaved edits; output_path overwrite vs. error). It overlaps noticeably with the schema's own parameter descriptions rather than adding genuinely new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Write a stage flattened into one USD file") and immediately explains what flattening means: references, payloads and sublayers resolved into a single layer. It explicitly distinguishes itself from the two sibling tools that could be confused with it (save_scene, export_prim_as_file), so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ("hand the whole scene to another tool as one file") plus named alternatives with their differing behavior: save_scene keeps references and writes only the root layer, export_prim_as_file writes one prim's subtree. It also states when-not: an output_path the open stage has loaded is an error, with the remedy (name another path, or use save_scene).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobARead-only
Read a job run_script_job or capture_sweep started: its state, how long it has run, its last line and the lines it printed since the last read; once it has ended, its result, or its error and traceback, and what it printed, each stream's last 200 lines. A sweep's result is one line: its folder, and the shots that came out black or failed; its message says which shot it is on, and its last line, whatever its end, says what it took.
States: working; cancelling, while its cleanup runs after a cancel; completed; failed; cancelled. With wait, the call returns when the job ends or changes state, or after that many seconds, so a long job is waited for without a call every few seconds. With no job_id it reads the running job or the last one, so a job is found again after the conversation was compacted. Reading changes nothing in Kit.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Seconds to wait for the job to end or change state, at most 100; new lines don't end it, and other calls through this server wait meanwhile | |
| job_id | No | The id run_script_job or capture_sweep answered, such as j3; the running or last job when empty |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, but the description goes further by enumerating the state machine (working, cancelling, completed, failed, cancelled), explaining what a sweep's result contains (folder, black or failed shots, current shot message), and stating that reading changes nothing in Kit. That is meaningful behavioral context beyond the annotations, though it repeats the read-only point the hint already makes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, and each sentence carries useful information about states, waiting, and sweep results. The prose is dense and somewhat run-on, with several clauses chained into single sentences, which costs some readability but not enough to waste space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema, the description covers everything an agent needs: what is returned in each phase, the full state list, the wait semantics, and the fallback behavior when job_id is absent. It also pre-empts the sweep-specific output shape, leaving no material gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented, including the wait ceiling of 100 seconds and the meaning of an empty job_id. The description echoes those semantics ('With wait, the call returns when the job ends or changes state', 'with no job_id it reads the running job or the last one') but adds little beyond what the schema descriptions already say, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Read a job run_script_job or capture_sweep started') and enumerates what it returns: state, runtime, last line, printed lines, result or error, and per-stream output. It explicitly names the sibling tools that create such jobs, so an agent can distinguish it from cancel_job or get_logs without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use context: the wait parameter is explained as a way to wait for a long job 'without a call every few seconds', and omitting job_id is framed as recovering the running or last job after conversation compaction. It stops short of naming cancel_job as the alternative for stopping a job or stating when-not to use it, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsARead-only
Get the latest entries of the Kit app's log, read from its log file since the bridge extension started, by level, channel or text.
Each entry shows its channel and the first 200 characters of its message, saying how many more it has. search matches the whole message: an entry whose match lies past the 200 gets a matched: line with the match in its line. Kit's file holds Info and above by default; verbose lines need Kit started with both --/log/level=verbose and --/log/fileLogLevel=verbose. A script's own exception, print and stderr come back in execute_script's answer and never reach Kit's log; carb.log_error and the other carb.log_* calls in a script do.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many of the latest entries; the buffer keeps 2000 | |
| search | No | Only messages containing this anywhere, in any case | |
| channel | No | Only channels containing this, e.g. "omni.physx" | |
| min_level | No | The lowest severity to return; every level when empty |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and closed-world, so safety is covered. The description adds real behavior beyond that: entries are truncated to 200 characters with a remainder count, matches past the truncation surface as a matched: line, and verbose lines require startup flags. It does not discuss the 2000-entry buffer limit or ordering, which the schema partially covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and filter axes, then behavior, then the script-log caveat. Dense but every sentence carries information; the long compound sentences around truncation and verbosity take a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only, four-parameter tool with an output schema and full schema coverage needs modest description, and this supplies truncation format, match behavior, and level gating. The only notable omission is ordering/pagination beyond the schema's buffer note, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, including enum values for min_level and per-parameter descriptions, so baseline applies. The description does add value on `search` semantics (matches the whole message, not just the visible excerpt) and on the level gate, pushing it just past a pure baseline read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get the latest log entries), names the source (Kit app's log file since the bridge extension started), and enumerates the filter axes (level, channel, text). No sibling tool reads logs, so an agent can identify it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the practical condition for verbose output (Kit must be started with --/log/level=verbose and --/log/fileLogLevel=verbose) and explicitly routes script output away to execute_script, telling the agent when this tool will not have the data it wants. It stops short of naming a full alternative for log browsing, but the exclusions are concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mesh_statsARead-only
Count the faces, vertices and triangles of every mesh at or under a prim: the totals, then the prims under it to max_depth, each mesh with its counts and each prim above meshes with subtree_faces.
Use it for a geometry budget, what a simplification saved, or the heavy subtrees: a heavy one is the next call's prim_path. compare_prims puts two prims or variants side by side. Only UsdGeom.Mesh prims count, inside instances too, which get_scene_tree doesn't list: implicit shapes such as Cube and Sphere have no faces. Prims below max_depth aren't listed, but count in the totals and in their ancestors' subtree_faces. The totals always come inline; a tree too long to give with them goes to a file, its path in the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| max_depth | No | How many levels of the tree below prim_path to list; 0 for prim_path alone | |
| prim_path | Yes | The prim to measure, its descendant meshes included |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds substantial context beyond them: only UsdGeom.Mesh prims count, meshes inside instances are included, implicit shapes like Cube and Sphere have zero faces, and prims below max_depth are excluded from the listing yet still counted in totals and ancestor subtree_faces. It also discloses output behavior — totals are always inline, but an oversized tree is written to a file whose path is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope and purpose come first, followed by usage guidance and then caveats, so it is well ordered and every clause carries information. It is dense to the point of being a wall of prose, and a short enumerated clause list for the caveats would be easier to scan, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, yet the description still flags the file-spill path behavior that an agent must handle. Combined with the depth/counting rules and instance handling, nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real semantics: prim_path can be any prim and its descendants are counted, and max_depth controls what is listed versus what still contributes to totals and subtree_faces — a distinction the schema description does not make. This meaningfully clarifies the effect of the depth parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: count faces, vertices and triangles for every mesh at or under a prim, returning totals plus per-prim counts. It explicitly differentiates itself from siblings by noting that instances are not listed by get_scene_tree and that compare_prims is the side-by-side alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names three concrete use cases (geometry budget, measuring what a simplification saved, finding heavy subtrees) and tells the agent the actionable next step: a heavy prim is the next call's prim_path. It also routes the comparison use case to compare_prims, so the when/when-not boundary is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performanceARead-only
Measure how fast the Kit app runs the open stage: the app loop's frames per second and frame time (mean,
p50, p95, worst) over frames app updates after warmup; the GPU's render time a frame; while the simulation
plays, the physics steps a frame, their time and the simulated-to-real ratio; GPU memory; the stage's prim,
mesh and instance counts; the render products (cameras, lidars) rendering every update; and the conditions to
compare two answers by: the GPU, the Kit app, the renderer, the timeline, headless or not, the frame-rate
limiter, async rendering and eco mode.
Use it to check a frame-rate target, such as 15 FPS with a robot's sensors on, and to see what each cut of the scene gains. Play the simulation first, with the sensors on, so physics and rendering run as they will; a stopped timeline gives no physics numbers. Measure alone: a capture called meanwhile waits for the measurement, and any other call's work counts in its frames. It waits for the stage to finish loading, and stops at 90 s, answering what it measured.
While it measures, Kit's frame-rate limiter is lifted and put back after, so a playing stage with fixed time steps runs faster than real time for those seconds, and a robot driven from outside falls behind meanwhile. The render a capture keeps for the next one is released first, so the next capture sets up its view again. The answer notes when the run's two halves differ by more than 10% (measure again), when eco mode on a still timeline makes the stage read faster than it plays, and when a recording's camera counts in the numbers. The numbers are this machine's and GPU's: measure where the target must be met.
| Name | Required | Description | Default |
|---|---|---|---|
| frames | No | App updates to time, after the warm-up: 120 take 8 s at 15 FPS | |
| warmup | No | App updates to let pass first, once the stage has loaded, so shaders and caches settle |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the readOnlyHint/openWorldHint annotations: it discloses the 90 s cap, the load-wait, the blocking interaction with captures, the temporary lifting of the frame-rate limiter (and that a playing fixed-time-step stage runs faster than real time meanwhile), the release of a prior capture's render, and the built-in warnings for >10% variance and eco mode. The only slight tension is that readOnlyHint=true while the tool has transient environmental side effects (limiter state, discarded capture render) — not a data mutation, so not a contradiction, but the description is what makes that nuance visible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well organized: purpose, then usage, then side effects, then interpretation caveats. Every sentence carries content, though the metrics enumeration in the first paragraph is long and a few phrases are awkward ('the GPU's render time a frame', 'the conditions to compare two answers by'), costing some readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a measurement tool with an output schema (so return shape needn't be explained), it covers what an agent needs to call it correctly: prerequisites, isolation requirements, timeout, machine-specificity of results, and how to tell when the numbers are untrustworthy. Nothing material is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already explains both parameters in nearly the same words ('app updates to let pass first, once the stage has loaded, so shaders and caches settle'). The description reinforces that the warmup precedes measurement and adds the 90 s overall cap, but adds no format, tuning, or interaction guidance for the two parameters beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Measure how fast the Kit app runs the open stage', then enumerates exactly the metrics produced (FPS/frame time percentiles, GPU render time, physics step timing and sim-to-real ratio, GPU memory, prim/mesh/instance counts, render products, and the conditions for comparison). It is clearly distinct from siblings like get_mesh_stats or get_sim_state, which cover only a slice of this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('check a frame-rate target, such as 15 FPS with a robot's sensors on'), a precondition ('Play the simulation first... a stopped timeline gives no physics numbers'), and an exclusion ('Measure alone: a capture called meanwhile waits for the measurement, and any other call's work counts in its frames'). This is the rare case where when-to-use, how-to-prepare, and what-not-to-do are all stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prim_boundsARead-only
Get a prim's world-space, axis-aligned bounding box, its descendants included: centre, dimensions, min and max corners, and diagonal, in the stage's units.
Use it to place things and measure: what rests on what (a bottom on a top along the up axis), gaps, sizes. get_prim_properties gives the same box among a prim's other values. A prim with no geometry, such as an empty Xform, gets a 0.1 box at its position rather than an error.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds valuable behavior beyond the annotations: descendants are included, values are in the stage's units, and geometryless prims such as empty Xforms return a 0.1 box at their position rather than an error. This is exactly the kind of edge-case context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core operation, follows with usage guidance, then the sibling comparison and edge case. Every sentence earns its place and there is no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for the task: it defines the measurement, its inclusion of descendants, units, return components, the alternative tool, and fallback behavior for non-geometric prims. The output schema handles return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single prim_path parameter has 100% schema description coverage, including an example path. The description adds useful scope about which prim is measured but does not add syntax or format details beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: gets a prim's world-space axis-aligned bounding box including descendants, and names the returned components. It also distinguishes itself from get_prim_properties, which returns the same box among other values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear use cases: placing things and measuring what rests on what, gaps, and sizes. It also names the closest alternative, get_prim_properties, though it does not state an explicit when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prim_propertiesARead-only
Get one prim as a prim block: its type, world position and rotation, world bounding box, physics flags, its applied API schemas, its variant sets, every attribute's value, and each relationship with its targets.
Use it to read one prim; get_prim_bounds when only its size and place matter, get_scene_tree to find paths, and with include_properties for many prims at once, written to a file. The rotation, rot, is a quaternion w, x, y, z with any scale taken out; a prim scaled to 0 has none. api_schemas lists the applied API schemas the Kit app knows, a type's built-in ones included, [] for none: PhysicsCollisionAPI for a collider, MaterialBindingAPI for a bound material. variant_sets lists each variant set with its selection (none when there is none), its options, and the layer holding the selection: session (Kit's session layer, which set_variant_selection writes by default), root, or a file's name; [] for no set, such as state: open [closed, open] (session). A relationship gives its targets, such as material:binding = /World/Looks/Red; one with none is left out, as an unset attribute is.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered and the description's job is to add context. It does add real behavioral detail: quaternions have scale factored out, zero-scaled prims have no rotation, unset attributes and empty relationships are omitted rather than null, and variant set selection provenance (session/root/file) is reported. A 3 reflects that the annotations plus the added edge-case semantics combine well, though most of the added text is return-shape material rather than operational behavior such as cost or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and routing sentence is correctly front-loaded, which is good. But the remaining two dense paragraphs are almost entirely return-value formatting detail, and the tool already ships an output schema, so that material is largely redundant and makes the definition longer than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only inspection tool with full schema coverage and an output schema, nothing needed to call it correctly is missing. Selection rules, edge cases, and sibling routing are all present, and the return format is definitionally covered by the output schema even if the description over-explains it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter, prim_path, with 100% schema description coverage and an example path already in the schema. The description adds no syntax, wildcarding, or path-resolution guidance beyond what the schema states. Baseline 3 applies when the schema does all the parameter work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("Get one prim as a prim block") and then enumerates exactly what the block contains: type, transform, bounds, physics flags, API schemas, variant sets, attributes, and relationships. It explicitly names the siblings it is not (get_prim_bounds, get_scene_tree, include_properties), so an agent can separate it from near-neighbors without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: use this to read one prim, use get_prim_bounds when only size and place matter, use get_scene_tree to find paths, and use include_properties for many prims written to a file. Both the when-to-use and the when-to-use-something-else conditions are stated, including the single-vs-batch boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recording_frameARead-only
Copy one recorded frame to a new PNG in mcp_output/captures/, and return its path and, once the recording has stopped, the frame's simulation time.
Frames come from start_recording, which Kit writes itself as frame_00000.png and on in the session folder: with Kit on this machine you can also open them there, and with Kit on another this brings one here. Without session_dir it reads the last recording started since the Kit extension started, the running one included. A relative session_dir is read from this server's working folder, as start_recording and stop_recording give it. A frame Kit failed to capture comes back as an empty file; a frame number past the last is an error. For a picture of the scene now, use capture_viewport.
| Name | Required | Description | Default |
|---|---|---|---|
| frame_index | No | The frame's number, from 0 | |
| session_dir | No | The session folder as start_recording and stop_recording give it, relative to this server's working folder, or an absolute path on Kit's machine; the last recording when empty |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint=true and openWorldHint=false, but the description adds substantive behavior the annotations cannot convey: the tool writes a new PNG into mcp_output/captures/, simulation time is only returned once recording has stopped, and a missed frame yields an empty file rather than an error. The relative-path resolution rule (read from this server's working folder, matching start_recording/stop_recording) is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and return values are front-loaded in sentence one, and later sentences are organized around frame provenance, path resolution, error cases, and the alternative tool. The middle sentence ("with Kit on this machine you can also open them there, and with Kit on another this brings one here") is slightly convoluted and could be tightened, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema and annotations that already pin down safety, the description covers everything else an agent needs: source of frames, default session selection, path semantics, return values, and failure modes. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by explaining the meaning of the empty session_dir default (the last recording started since the Kit extension started, including the running one) and how relative paths resolve on this machine versus Kit on another. That is real added semantics rather than a restatement of the parameter titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb, resource and destination: "Copy one recorded frame to a new PNG in mcp_output/captures/, and return its path and, once the recording has stopped, the frame's simulation time." It also explicitly separates itself from the sibling capture_viewport ("For a picture of the scene now, use capture_viewport"), so an agent can choose between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use this tool versus the alternative (capture_viewport for live scenes), where frames originate (start_recording, frame_00000.png onward in the session folder), and what happens when session_dir is omitted. It also names two failure conditions — an empty file for a frame Kit failed to capture, and an error past the last frame — which is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_robot_infoARead-only
Read a robot: from USD, at any time, whether it is an articulation, its link and DOF counts, and each joint's name, type, limits and drive; from physics, while the simulation plays or is paused, each joint's position and velocity.
Use it before driving a robot, and to see where its joints are now. Limits are as USD holds them: degrees for revolute joints, stage units for prismatic ones. Joint states are in radians for revolute joints and stage units for prismatic ones, velocities per second; set_joint_targets takes degrees. The Joints list comes in the order a list of set_joint_targets follows, fixed joints included, and the DOF count leaves fixed joints out; the joint states come in physics' own order of degrees of freedom. Stopped, or in a Kit app without Isaac Sim, the answer gives the structure and a line saying why there are no joint states. prim_path is the robot's root: the joint states are the first articulation's at or under it. An answer too long to give inline keeps the counts, and the joint states where they fit, and writes the Joints list to a file, its path in the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | Yes | The robot's root prim, e.g. "/World/G1" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint=false, so the description carries real weight and delivers: unit conventions (degrees vs radians vs stage units), that limits reflect USD values rather than live values, ordering rules for the Joints list vs the DOF-ordered joint states, and the truncation-to-file fallback with the path echoed back. It also discloses the degraded path when the sim is stopped or Isaac Sim is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the tool's purpose and every clause carries distinct information about units, ordering, or fallbacks. The long semicolon-chained sentences are dense and could be split into a short list of invariants for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema, the description supplements it with the ordering and truncation semantics an agent needs to interpret results correctly, plus the no-sim and too-long response cases. Nothing material for correct invocation or interpretation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as the root prim, so the baseline is 3; the description goes further by explaining that joint states are taken from the first articulation at or under that path, which resolves genuine ambiguity about sub-articulation prims.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource (read a robot) and enumerates exactly what is returned: articulation status, link/DOF counts, per-joint name/type/limits/drive, and live joint positions/velocities. It clearly distinguishes robot articulation reads from generic prim reads, though it never names inspect_prim or get_prim_properties as the narrower/wider alternatives an agent might otherwise pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it before driving a robot, and to see where its joints are now" gives an explicit use context, and the repeated contrast with set_joint_targets (radians/degrees) steers the agent to the right tool pairing. There is no explicit when-not guidance, e.g. that non-robot prims should go to get_prim_properties.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scene_treeARead-only
List the stage's prims under root as prim blocks: each one's path, type and world position, to max_depth.
Use it to find prim paths before acting on them: it is the lightest look at a scene. A prim at max_depth that has children says how many, as children = N (truncated), and nothing below it is listed. The prims inside an instanceable prim are not listed (get_mesh_stats looks inside). With include_properties, filter_types or property_filter, Kit writes the blocks to mcp_output/scene_dump.txt instead, replacing the last, each with the prim's rotation, world box and physics flags, and its applied API schemas, variant sets, attribute values and relationship targets with include_properties or property_filter; the answer gives the file's path, how many prims it holds and how deep it went: grep it, or read it in parts. Kit writes that file itself, so with Kit on another machine it lands there. get_prim_properties reads one prim inline.
The positions and rotations follow the simulation, where physics has each rigid body while it plays or after a pause, so one call with property_filter=["physics:"] gives where every body under root came to rest, whatever the filter keeps of the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Prim path to start from | / |
| max_depth | No | How many levels below root: 5 when left out, or 15 with properties or a filter; in the list, a prim on the last level says how many children it has | |
| filter_types | No | Only prims of these types, e.g. ["Mesh", "Xform"], written to the file; the others' children are still walked | |
| property_filter | No | Only properties whose names hold one of these, e.g. ["joint"], written to the file; it takes the properties with it. ["variant_sets"] lists every prim's variant sets: a scene's switches | |
| include_properties | No | Each prim's rotation, world box, applied API schemas, variant sets, attribute values and relationship targets, written by Kit to mcp_output/scene_dump.txt |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint it discloses truncation semantics ('children = N (truncated)'), that instanceable prim contents are omitted, the effective default depths, that three of the parameters silently switch output to mcp_output/scene_dump.txt and overwrite the previous file, and that the file lands on Kit's machine rather than the caller's. It also explains that positions/rotations track simulation state, which is non-obvious behavioral context an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core statement is front-loaded and no sentence is pure filler, but the middle section is a run-on with tangled clauses ('replacing the last, each with the prim's rotation, world box and physics flags...'), and defaults are repeated from the schema. It is dense rather than tight — appropriate information, poor sequencing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter read tool with an output schema, it covers everything that matters: defaults, truncation, instance behavior, the file-output branch including its path, size and remote-host caveat, and the simulation-frame caveat on returned transforms. Even though an output schema exists, the alternate file return path is explained, which the schema alone would not convey.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not convey: any of include_properties/filter_types/property_filter redirects output to a file, filter_types still walks the children of excluded prims, and property_filter=["variant_sets"] is a special switch-listing mode. The only weakness is that it restates default depths already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource — 'List the stage's prims under root' — plus exactly what each entry carries (path, type, world position) and the depth bound. It also differentiates against siblings by name: get_mesh_stats 'looks inside' instances and get_prim_properties 'reads one prim inline', so an agent can tell them apart without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended use case plainly ('find prim paths before acting on them') and characterizes the tool as 'the lightest look at a scene', then routes property reads to get_prim_properties and instance interiors to get_mesh_stats. That is strong alternative routing, but it never frames an explicit when-not-to-use condition (e.g. large scenes where the file dump is always preferable), so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sim_stateARead-only
Get the simulation's state and the stage's frame of reference: playing, paused or stopped, the timeline's time, the up axis, meters_per_unit, the prim count; the Kit app, its version, Kit's version and the OS Kit runs on; and the versions of the Kit extension and this server.
timeline gives the timeline's range and what it does at its end: while it loops, time goes back to the start there, so a wait for time to pass the end never finishes; a timeline that doesn't loop pauses at its end, and physics with it. A range of one frame or less gets a note.
fps is the timeline's time codes per second, not a render rate: get_performance measures the frame rate. When the two versions differ, the answer names the command that installs the matching extension; while a recording runs whose frames stopped early, it says why; while a job run_script_job started runs, it names it. sim_control changes the state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes far beyond by disclosing conditional return behavior: a looping timeline resets time so a wait for the end never completes, a non-looping timeline pauses at its end along with physics, and a range of one frame or less produces a note. It also explains when the answer names a version-matching command, why a recording's frames stopped early, and when a run_script_job job is named — all context an agent needs to interpret the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description runs three dense paragraphs and much of the middle section reads as a list of return fields that an output schema already covers. Some sentences are telegraphic to the point of ambiguity ('A range of one frame or less gets a note', 'while a job run_script_job started runs, it names it'), costing clarity rather than saving space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with a full output schema and read-only annotations, this is more than sufficient — the behavioral caveats about timeline looping and fps-vs-frame-rate are the genuinely load-bearing additions. The remaining gap is that it never says the practical precondition for calling it, so completeness is high but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is an empty object, so there is no parameter meaning to add; the baseline of 4 applies. The description correctly spends no space on argument semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (get) and resource (simulation's state), then enumerates exactly what is returned: play state, timeline time, up axis, meters_per_unit, prim count, Kit/app/OS versions, and extension/server versions. It distinguishes itself from siblings by naming get_performance, sim_control, and run_script_job where their domains overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly routes away from itself where appropriate — 'sim_control changes the state' and 'get_performance measures the frame rate' — which tells the agent which sibling to pick for mutation or performance data. What's missing is an explicit statement of when to call this tool (e.g. before issuing sim commands, or to check unit scale before transforms).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_primA
Capture a prim from up to 14 angles around it, each framed so the prim fills the image, and save each as a PNG in mcp_output/captures/.
Use it to see one object from every side; capture_viewport takes one picture from a camera as it stands. The angles are the 6 face centres and 8 corners of a cube around the prim, all 14 unless angles names some. The distance is fitted to the prim's size at width x height, then moved by zoom_offset. It moves whichever camera the viewport looks through, a scene camera included, and leaves it at the last angle. isolate hides everything but the prim and the lights while it captures, then shows them again. A call has about 80 s: an angle that fails says why, and the angles after it say Not captured. An orthographic camera is refused. An all-black angle, or lighting that lights nothing (mode off, or stage with no scene lights) though Kit's grid shows, comes with a warning, once a call, saying what to change with viewport_light.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Image width in pixels, up to 4096; the camera is rendered at this size | |
| angles | No | Angle names, all 14 when omitted. Face centres: "front", "back", "right", "left", "top", "bottom". Cube corners: "top_front_right", "top_front_left", "top_back_right", "top_back_left", "bottom_front_right", "bottom_front_left", "bottom_back_right", "bottom_back_left" | |
| height | No | Image height in pixels, up to 4096; the camera is rendered at this size | |
| isolate | No | Hide everything else while capturing, then restore it | |
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" | |
| zoom_offset | No | Adjusts the fitted distance: negative closer, positive further (-0.3 is 30% closer) | |
| include_segmentation | No | Also capture instance segmentation at each angle |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that the tool moves whichever camera the viewport looks through and leaves it at the last angle, that isolate hides then restores other objects, an ~80 s per-call budget, per-angle failure semantics ('an angle that fails says why, and the angles after it say Not captured'), and warning conditions for all-black angles. These are exactly the side effects and limits an agent needs before committing to a mutating capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and output path are front-loaded, then usage, then mechanics, then failure behavior — a sensible order with little filler. It is dense and a couple of clauses (the warning-sentence detail) could be tightened, but nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter capture tool with an output schema, this covers everything an agent needs: what is produced, where it lands, camera side effects, runtime budget, failure reporting, and refusal/warning conditions. Return-value details are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds real meaning by tying width x height to the fitted framing distance and explaining how zoom_offset modifies that fit, plus the cube-geometry rationale behind the angle set. It stops short of syntax detail beyond what the schema already lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture a prim from up to 14 angles around it'), the framing rule, and the output location (PNG in mcp_output/captures/). It also explicitly contrasts itself with the nearest sibling, capture_viewport, so the agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule: 'Use it to see one object from every side; capture_viewport takes one picture from a camera as it stands.' It adds preconditions that change tool choice (an orthographic camera is refused) and points to viewport_light when lighting is wrong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_extensionsADestructive
List the Kit app's extensions, or turn one on or off in the running app.
"list" (the default) only reads: each extension's id, version and whether it is on, the first 50 shown with the total. "enable" and "disable" need extension_id, last until Kit restarts, and answer whether the extension is on afterwards: enabled=False after an enable means it didn't take. Use enable when a tool names an extension it lacks, such as omni.syntheticdata for segmentation. Disabling one that other tools use breaks them, and disabling ovmcp.bridge cuts this server off from Kit.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | "list" reads; "enable" and "disable" change the running app | list |
| search | No | For "list": only extensions whose name or id contains this, in any case | |
| enabled_only | No | For "list": only enabled extensions | |
| extension_id | No | For "enable" and "disable", required: the extension, e.g. "omni.syntheticdata" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description substantiates exactly why: enable/disable mutate the running app, persist only until Kit restarts, and can break other tools or cut off the MCP bridge. It also discloses the response semantics (enabled=False after an enable means it didn't take) and the list truncation behavior (first 50 with the total), which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and default behavior come first, then the read path, then the mutation semantics and safety warnings, in a logical order. It is dense and slightly overlong, but nearly every clause (restart persistence, enabled=False signal, bridge warning) carries information an agent would otherwise have to infer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description still covers what the agent needs beyond it: the three modes, the required id for mutation, transient lifetime of changes, and the failure/breakage modes. For a 4-parameter tool with destructive semantics, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so action, search, enabled_only, and extension_id are already fully documented with per-action applicability. The description reinforces that enable/disable need extension_id but adds no format or edge-case detail, and it never mentions the search or enabled_only filters, so it sits at the baseline for a fully-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (the Kit app's extensions) and the three concrete operations: list, enable, disable. It also states the default action, so an agent can distinguish the read path from the two mutation paths without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger for enable ("Use enable when a tool names an extension it lacks, such as omni.syntheticdata for segmentation") and concrete when-not-to guidance for disable (disabling extensions other tools use breaks them; disabling ovmcp.bridge severs this server). That is when/when-not/alternative guidance in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_sceneADestructive
Discard the open stage, unsaved changes included, and open an empty one in the up axis and units asked for, with a /World Xform as its default prim.
The stage is Z-up in metres when left out: the frame of Isaac Sim's own new stage, its robots, SimReady assets and most robotics scenes, so scripts, payloads and physics written for them need no conversion. up_axis="Y" makes a Y-up stage, as USD Composer's are, and meters_per_unit=0.01 one in centimetres. The answer gives the stage's up_axis and meters_per_unit as read back. Kit places the viewport's camera for the units of its app's own new stages, so in other units place it with set_camera. Call save_scene first to keep the old one. The new stage has no file, so save_scene needs a file_path for it. A recording that runs stops taking frames, and draw_debug's drawings go.
| Name | Required | Description | Default |
|---|---|---|---|
| up_axis | No | The stage's up axis: Z, as Isaac Sim's robots and stages are, or Y | Z |
| meters_per_unit | No | The stage's metres per unit: 1.0 for metres, 0.01 for centimetres |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true, but the description adds real substance: unsaved changes are lost, the default prim is /World Xform, the new stage has no file so save_scene requires a file_path, an active recording stops taking frames, and draw_debug drawings are cleared. That is concrete disclosure of side effects beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive action and default prim are front-loaded, then defaults and caveats follow logically. It is dense but almost every sentence carries information; the viewport camera and recording/debug side-effects could be tightened but are not filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description still states what is returned (up_axis and meters_per_unit read back). For a destructive two-parameter tool with defaults, everything needed to call and follow up correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by explaining why the defaults matter (Z-up metres matching Isaac Sim robots/SimReady assets and physics) and what Y or 0.01 implies (USD Composer-style Y-up, centimetres). Minor extra value over the enum and default already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (discard and open) on a specific resource (the open stage), and explicitly says the result is an empty stage with a /World Xform default prim. This is distinguishable at a glance from open_scene (opens a file) and save_scene (persists).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context: it names save_scene as the prerequisite to keep the old stage and set_camera as the follow-up when units differ from the app's own. It does not explicitly contrast with open_scene for loading an existing file, which is the one sibling an agent might confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_sceneADestructive
Open a USD file as the stage, in place of the open one, which goes with its unsaved changes.
Use it to work on a scene from a file; new_scene starts an empty stage instead, and save_scene writes the open one, so call save_scene first to keep it. Opening the stage's own file reloads it from disk. It stops the simulation first; a recording that runs stops taking frames, and draw_debug's drawings go. Refused, with the open stage kept, for a file that isn't there or can't be reached, a type USD doesn't open, a local file that holds no USD (a Git LFS pointer, say), or while Kit opens or closes a stage. A file that passes those checks and still fails to load leaves no stage open, and the error says so; an open that takes over 80 s goes on in Kit after the error. Answers the path opened, the stage it replaced, and the stage's up axis, meters_per_unit, default prim and prim count, with a note for an axis or units the file leaves to USD's fallbacks.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | The USD file: a path on Kit's machine, a relative one read from the folder Kit was started in; a URL (omniverse://, https://, file:///); or a path in Isaac Sim's asset library (/Isaac/...) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false; the description goes well beyond that by naming what is lost (unsaved changes, running recording frames, draw_debug drawings) and that the simulation is stopped first. It also enumerates refusal conditions (missing/unreachable file, unsupported type, LFS pointer, Kit busy), the no-stage-left-open failure mode, and the 80 s timeout behaviour — unusually rich for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive consequence is front-loaded in the first clause, then alternatives, then failure modes — good ordering with no filler. It is dense and long, but nearly every clause carries operational information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, one-parameter stage-replacement operation, everything needed is present: prerequisites, side effects, refusal cases, timeout behaviour, and a summary of returned fields (path, replaced stage, up axis, meters_per_unit, default prim, prim count). An output schema exists, so the return-value sketch is a bonus rather than a requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents the accepted path forms (local, relative, URL, /Isaac/ asset library), so baseline is 3. The description adds a non-obvious semantic: passing the currently open stage's own file reloads it from disk rather than erroring.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Open a USD file as the stage, in place of the open one.' It immediately contrasts with siblings new_scene (empty stage) and save_scene (writes the open one), so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('work on a scene from a file'), explicit alternatives (new_scene, save_scene), and an actionable prerequisite: 'call save_scene first to keep it.' It also flags the special case where the path equals the current stage's own file (reload from disk).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raycastARead-only
Cast a ray through PhysX and return the closest collider it hits: its prim, the hit point, the surface normal and the distance in stage units, or "No hit".
Use it to find what lies along a line, such as the ground under a point or what a robot faces; get_prim_bounds measures a prim you already know. Only colliders (the Collision API, which set_physics_properties' collision=True or create_prim's enable_physics adds) are hit, not plain meshes. PhysX needs to know the scene: play or step the simulation once first, or it may find nothing, or fail. The prim named is the rigid body hit, or a static collider itself.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | [x, y, z] start point in world space | |
| direction | Yes | [dx, dy, dz] direction in world space, of any length but zero | |
| max_distance | No | The longest the ray goes, in stage units |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description goes well beyond them: only colliders registered with the Collision API are hit, not plain meshes, and the sim must be stepped first or the call may return no hit or fail. It also explains that the returned prim is the rigid body hit or a static collider itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the operation and return contract, then follows with alternatives and prerequisites. Three paragraphs is slightly more than needed, but each carries distinct, non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple three-parameter tool with an output schema, the description covers behavior, prerequisites, filtering (colliders only), and failure modes. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by specifying that the returned distance is in stage units, tying the ray result back to max_distance semantics. It does not re-explain origin or direction, which the schema already documents fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource pair ('Cast a ray through PhysX') and enumerates the exact return values: prim, hit point, surface normal, distance, or 'No hit'. It distinguishes itself from get_prim_bounds, which is a different operation on a known prim.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names concrete use cases ('find what lies along a line, such as the ground under a point or what a robot faces') and explicitly contrasts with the alternative get_prim_bounds. It also states the precondition that the simulation must be played or stepped once first, otherwise it may find nothing or fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_script_jobADestructive
Start a long Python script inside the Kit app as a job, and answer its id at once: for work that may outlast execute_script's 120 s, such as dropping and settling many objects under physics one after another.
The job runs on Kit's main thread between Kit's updates, so Kit renders and other tools answer while it runs.
It must await once a step: await omni.kit.app.get_app().next_update_async() lets one update pass, physics
stepping while the timeline plays, up to its end: get_sim_state's timeline line says where that is and whether
it loops back there. A script that never awaits at its top level is refused, since its loops
would hold Kit from its start to its end; a coroutine the script only defines or schedules doesn't count: await
it at the top level, await main(). One that awaits once and then loops, or calls Isaac Sim's world.step(),
holds Kit too, and no tool can read or cancel it until it ends. It has execute_script's names (omni, carb, Usd,
UsdGeom, UsdLux, UsdPhysics, Sdf, Gf, mcp); assign to result to return data. Print a line a step: the lines are
the progress get_job shows. Read it with get_job(id, wait=60), cancel it with cancel_job. One job runs at a
time, and the last one is kept until the next starts.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Python to run as the job; give this or file | |
| file | No | A .py file on the Kit app's machine to run as the job, read there; or give code |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as non-read-only, destructive, and open-world, but the description adds substantial behavioral context beyond them: it runs on Kit's main thread, must await at least once at top level or be refused, can become uncancellable if it loops after awaiting or calls world.step, and only one job runs at a time. It also explains progress via printed lines and result assignment. This is unusually complete for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and sibling comparison are front-loaded, and most sentences carry necessary constraints. However, several sentences are dense and awkwardly packed, especially the await/update/timeline passage, which could be split for faster parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive arbitrary-code execution tool with concurrency constraints, the description covers the key operational facts: the 120 s alternative, main-thread scheduling, the await requirement and refusal behavior, one-job-at-a-time semantics, progress reporting, and cancellation. An output schema exists, so return values do not need further explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the two parameters (code and file) are already documented by the schema as alternatives. The description does not add syntax, precedence, or conflict-resolution rules for code versus file beyond what the schema says, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Start a long Python script inside the Kit app as a job,' and immediately contrasts it with execute_script's 120 s limit. An agent can distinguish it from both execute_script and get_job without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (execute_script) and the condition that selects this tool: work that may outlast the 120 s limit. It also gives concrete uses such as dropping and settling many physics objects, and later names get_job and cancel_job as the read/cancel companions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_sceneADestructive
Write the open stage's root layer to a USD file: back to the stage's own file when file_path is empty, or as a copy at file_path.
Without file_path it overwrites the file the stage was opened from, and fails for a stage never saved, such as new_scene's. With file_path it overwrites any file there, and the stage stays tied to its own file, or to none; but another file the open stage has loaded (a sublayer, a referenced or payload file) is an error, since writing it would replace a file the open scene is made of: name another path. The stage's own file, by any name, is a save. Only the root layer is written: sublayers and referenced files stay as they are, still referenced, and Kit's session layer stays out, so the answer names the variant selections it holds, which set_variant_selection writes there by default. For one self-contained file, use flatten_usd; for one prim's subtree, export_prim_as_file.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No | The USD file to write, on Kit's machine, but never another file the open stage has loaded; empty overwrites the stage's own file |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=false, and the description goes further by saying exactly what is overwritten, which files may not be targeted, and that only the root layer is written (sublayers/references untouched, session layer excluded). The remaining gap is that the variant-selection remark in the return discussion is hard to parse, but behavior around destruction and failure is otherwise well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first sentence, but the following paragraph is a dense run-on with stacked clauses (session layer, variant selections, set_variant_selection default) that a reader must untangle. Content mostly earns its place, yet the phrasing could be split into shorter, ordered statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema, the description covers prerequisites, overwrite semantics, error conditions, scope of write, and alternatives. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 would be the floor, but the description adds real semantics beyond the schema: empty means overwrite the stage's own file, an explicit path must not name a loaded sublayer/reference, and the path is on Kit's machine. That is meaningful added meaning for the single optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Write the open stage's root layer to a USD file') and immediately splits the two behavioral modes (empty path = save in place, path = copy). It also names the siblings it is not (flatten_usd, export_prim_as_file), so an agent can distinguish it without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when to use each mode, the failure case for an unsaved stage ('fails for a stage never saved, such as new_scene's'), the error case for loaded sublayer/reference files, and routes to alternatives for whole-file and per-prim exports.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_cameraA
Move the viewport's camera and aim it, at a world point or at a prim.
For a point, position is where the camera stands and target what it looks at, the world origin when left out. For a prim, prim_path, and the camera goes around the prim's centre at distance, azimuth and elevation, without position or target. It moves whichever camera the viewport looks through, a scene camera included, and the user sees the move. inspect_prim captures a prim from up to 14 sides in one call; capture_viewport's camera_path captures from another camera without moving the viewport. An error when the prim doesn't exist, when position is the point it would look at, and for a mix of the two forms, saying what to drop.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | [x, y, z] the world point it looks at, the world origin when left out: for a point | |
| azimuth | No | Degrees around the prim: 0 the front (+Y on a Z-up stage, +Z on a Y-up one), 90 the right (+X), 180 the back, 270 the left; 45 when left out | |
| distance | No | From the prim's centre in stage units; 2.5 times its largest side when left out | |
| position | No | [x, y, z] where the camera stands, in world space: for a point | |
| elevation | No | Degrees above the horizontal; 30 when left out | |
| prim_path | No | A prim to frame instead: the camera aims at the centre of its world box |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real behavioral context beyond that — it moves whichever camera the viewport looks through, including a scene camera, and the user visibly sees the move. It also enumerates the error conditions (missing prim, position equal to target, mixed forms). It stops short of saying whether the prior camera state is recoverable, which is the one remaining gap for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then two tight lines for the modes, then alternatives, then failure modes. Dense and useful throughout, though the closing clause 'saying what to drop' is slightly indirect phrasing for 'the error tells you which parameter set to drop'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers mode selection, side effects, alternatives, and failure modes. For a 6-parameter all-optional camera tool, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already documents defaults (45° azimuth, 30° elevation, 2.5× largest side, world origin), so the baseline is 3. The description adds semantics the schema does not encode: the two parameter sets are mutually exclusive and mixing them is an error, plus prim mode forbids position/target.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('Move the viewport's camera and aim it') and immediately scopes the two targeting modes: a world point or a prim. That is enough for an agent to separate it from capture_viewport and inspect_prim without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when each form applies (position+target for a point; prim_path with distance/azimuth/elevation for a prim) and names the alternatives with the condition that selects them: inspect_prim for multi-side capture, capture_viewport's camera_path for capturing from another camera without moving the viewport.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_joint_targetsA
Set the position targets of a robot's joint drives, which physics drives the joints toward while the simulation plays.
A dict sets the joints it names and skips names it doesn't find; a list follows the order of get_robot_info's Joints list, not of its joint states. A joint without a drive gets one, with stiffness 1000 and damping 100. It writes USD, so it works stopped too, before physics has started. The answer counts the targets set; get_robot_info then reads where the joints are, in radians, while the simulation plays or is paused.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | No | Required: {joint_name: value}, or [v0, v1, ...] in get_robot_info's joint order, fixed joints included; degrees for revolute joints, stage units for prismatic ones | |
| prim_path | Yes | The robot's root prim, e.g. "/World/G1" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that a dict skips unknown joint names, a list uses get_robot_info's Joints order, missing drives are created with stiffness 1000 and damping 100, USD is written, and the call works before physics. These are meaningful side-effect and operational details not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the purpose and then packs dict/list behavior, auto-drive side effects, and read/write context into a few dense sentences. There is minor repetition about simulation playing, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter write tool with an output schema, it covers units, ordering, missing-joint behavior, auto-drive creation, USD write behavior, and return count. It omits what happens if targets is null or omitted and does not discuss error cases for an invalid prim_path, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds semantics beyond the schema: dict entries set only named joints and skip missing names, and list order follows get_robot_info's Joints list rather than joint states. It does not elaborate on prim_path beyond the schema, but the targets nuances are valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb "Set" with the resource "position targets of a robot's joint drives" and explains that physics drives the joints toward them during simulation. It also distinguishes this write operation from get_robot_info's read of joint positions, so an agent can identify the tool's role without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use: during simulation or stopped before physics starts, and it distinguishes setting targets from reading joint positions via get_robot_info. It does not explicitly name alternatives such as apply_force or sim_control or state when not to use it, so it is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_materialA
Colour a prim with an OmniPBR material: make the material, or update the one at its path, set its colour and surface values, and bind it to the prim in place of its binding.
opacity, roughness and metallic are set on every call, each to its default when left out, so a call without opacity makes the material opaque. Without material_path the material is /World/Looks/_Mat, so prims of the same name share one and colouring one recolours the rest: give material_path to keep them apart, or to share one on purpose. The binding reaches the prim's children unless they have bindings of their own. For friction and bounce, use set_physics_properties; to repoint bindings after materials move, update_material_paths.
| Name | Required | Description | Default |
|---|---|---|---|
| color | Yes | [r, g, b] diffuse colour: 0-1 floats (e.g. [1, 0, 0] for red) or 0-255 ints | |
| opacity | No | 0 transparent to 1 opaque | |
| metallic | No | 0 plastic (dielectric) to 1 metal | |
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" | |
| roughness | No | 0 glossy (mirror) to 1 rough (matte) | |
| material_path | No | The material prim's path; made under /World/Looks/ when empty |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering safety hints, the description adds substantial non-obvious behavior: opacity/roughness/metallic reset to defaults on every call, default material naming at /World/Looks/<prim name>_Mat with name-based aliasing, replacement of the existing binding, and inheritance to children unless they have their own bindings. The aliasing/overwrite risk is disclosed even though destructiveHint is false, so there is no contradiction, just useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs: the action summary is front-loaded, then the gotchas (default reset, shared material naming, child inheritance) and sibling routing. No filler sentences; every clause contributes a constraint or a caution.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with an output schema already defining return values, the description covers the risky behaviors (binding replacement, default reset, material aliasing) that an agent must know before calling. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter formats (e.g. [r,g,b] scaling) are already documented. The description still adds real meaning beyond the schema by explaining implicit-default semantics for omitted optional params and the sharing consequences of the material_path default, which the schema only states as an empty string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ('Colour a prim with an OmniPBR material') and enumerates the sub-actions taken (create or update material, set colour/surface values, bind). It is clearly distinguishable from siblings like set_physics_properties and update_material_paths, which are named as out of scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use set_physics_properties for friction/bounce and update_material_paths to repoint bindings after materials move. It also states the decision rule for material_path (omit to share by name, supply to keep prims apart or share intentionally), which is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_physics_propertiesA
Set a prim's mass or density, friction or restitution, or make it a collider or turn its collision off, for PhysX; a value left out stays as it is.
collision=true makes a static collider, such as a floor something should land on, with no rigid body and no physics material: only a Cube, Sphere, Capsule, Cylinder, Cone, Mesh or Plane collides, so an Xform is refused, its error naming the shapes under it. A Mesh that moves with a rigid body, its own or an ancestor's, not kinematic, gets a convexHull approximation unless one is set, as PhysX can't simulate a triangle mesh there. collision=false turns physics:collisionEnabled off and keeps the API. Mass or density goes through MassAPI and makes the prim a rigid body (RigidBodyAPI) if it isn't one, so a static collider starts to fall when the simulation plays. Friction or restitution adds the Collision API if missing, and sets them on the prim's own physics material, a child named PhysMat (/World/Cube/PhysMat for /World/Cube), bound to the prim for physics only; delete_prim removes it with the prim. That material starts from the body's own: the physics material bound to it before, else the physics scene's default, else PhysX's (friction 0.5, restitution 0), so the one left out, and anything else the replaced material held, stays. A copy made with clone_prim takes its own with it. A clone that inherits from its source, as Isaac Sim's cloner makes them, follows the source's material until a call on the clone, and the answer names the prims a call changes so. An instance or an inactive prim can hold no material of its own, so friction or restitution on one is refused, as collision is on an inactive prim or one inside an instance. A prim on an older extension's shared /World/PhysicsMaterials/_PhysMat moves to its own, and the call that moves the last prim off it deletes it. A call with friction or restitution reads the whole stage, about 1 s per 100,000 prims. The answer gives each value set, collision on or off, the material and the APIs applied, the rigid body a collider moves with, and whether the older shared material was deleted or kept, and why. For the prim's look, use set_material; to make a new prim physical in one call, create_prim with enable_physics.
| Name | Required | Description | Default |
|---|---|---|---|
| mass | No | Mass in kg (applies MassAPI); 0 unsets it, so density decides | |
| density | No | Density in kg/m^3 (applies MassAPI); 0 unsets it; a mass set wins over it | |
| friction | No | Friction coefficient, set as both static and dynamic friction | |
| collision | No | true makes the prim a collider (the Collision API), with no rigid body, such as a floor; false turns its collision off and keeps the API | |
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" | |
| restitution | No | Bounciness: 0 no bounce, 1 full bounce |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a non-read-only, non-destructive, closed-world call; the description goes far beyond that. It discloses side effects the annotations hide: mass implicitly adds RigidBodyAPI so a static collider starts to fall, friction/restitution creates a PhysMat child bound to the prim, shared legacy /World/PhysicsMaterials materials are migrated and possibly deleted, and a call with friction/restitution reads the whole stage at roughly 1 s per 100,000 prims.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, which is good, but the remainder is a dense wall of run-on clauses mixing material lifecycle, clone/inheritance rules, legacy migration, and performance cost without bullets or paragraph breaks. Nearly every sentence carries real information, yet the packing makes it hard to scan for the one rule an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with an output schema, this covers everything an agent needs: which shapes collide, what APIs get applied, what the answer reports, cost of the call, and edge cases around instances, clones, and legacy materials. No material gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter, but the description adds genuinely new semantics: a null/omitted value leaves the current value untouched, collision=true yields a static collider with no rigid body while mass/density promotes the prim to a rigid body, and a mesh on a non-kinematic body gets a convexHull approximation unless one is set. That is meaning beyond the field-level descriptions, though the mass-vs-density precedence is left mostly to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the exact verb and resources: setting a prim's mass/density, friction/restitution, or collision state for PhysX, and states that omitted values are left unchanged. It distinguishes itself from siblings by explicitly routing look-and-feel to set_material and first-time physical setup to create_prim with enable_physics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit alternatives (set_material for appearance, create_prim + enable_physics for new prims) and states the refusal conditions: an Xform cannot be a collider, instances and inactive prims cannot hold their own material, and collision on an inactive or instanced prim is refused. That is a complete when-to-use / when-not-to-use map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_prim_attributeA
Set one attribute of a prim, such as a light's intensity or colour, a camera's focal length, a shape's size or radius, or a display colour.
Use it for an attribute no other tool sets; set_prim_transform, set_visibility, set_material and set_physics_properties set theirs. The attribute must exist on the prim: get_prim_properties lists them, a schema's included, and a name it lacks gets its closest names. The value is converted to the attribute's type, within the type's range; a token outside its allowed ones is written, with a note naming them. A change that alters a shape's box updates its authored extent, so get_prim_bounds follows. Refused, with nothing written: a relationship, an xform op, visibility, an animated attribute, one a stronger layer holds, a size change whose extent another layer or an animation holds, a prim inside an instance or a prototype, an inactive prim. By default (layer="auto") it writes where edits go, but Kit's own cameras and a viewport light rig's lights in Kit's session layer, which save_scene doesn't keep. layer="session" writes there for a check that must leave every file as it is; no tool takes such a value back, and a later write beneath it, at the edit target, is refused until the stage is opened again or execute_script removes it from the session layer. A physics value set while the simulation plays may reach PhysX only once it stops. A DistantLight comes at an intensity of 50,000, UsdLux's sunlight; a few thousand suits a viewport capture. The answer gives the value before and after, and the layer written.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The attribute, as get_prim_properties names it, e.g. "inputs:intensity" | |
| layer | No | auto: where edits go, but Kit's own cameras and a light rig's lights in Kit's session layer; session: Kit's session layer, which no save writes, for a check that must leave every file as it is; edit_target: where edits go | auto |
| value | Yes | Its new value in JSON: a number, true or false, a string or token, or a list for a vector, colour or array, e.g. [1, 0, 0] | |
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, destructiveHint=false and openWorldHint=false; the description adds the substance: refusals occur 'with nothing written' for relationships, xform ops, animated attributes, stronger layers, instances/prototypes and inactive prims; a session-layer write blocks later edit-target writes until the stage reopens; physics values may reach PhysX only after the sim stops. It also discloses the return payload (before/after value plus layer written), which is behavior an agent cannot infer from the hints. No contradiction with destructiveHint=false — the described failure mode is always a no-op refusal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and sibling exclusion are correctly front-loaded, and almost no sentence is padding — nearly every clause carries a distinct behavioral fact. However, the body is a single run-on block of colon-chained clauses ('The attribute must exist on the prim: get_prim_properties lists them, a schema's included, and ...'), which makes it hard to parse at speed and buries the high-value refusal and layer rules inside dense prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 4 parameters and an output schema, this covers what an agent needs: attribute discovery, type coercion, refusal conditions, layer persistence tradeoffs, simulation timing, and even a domain hint that UsdLux sunlight defaults to 50,000 intensity while a few thousand suits a viewport capture. Nothing material about correct invocation is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description still adds real semantics: the name must exist on the prim and an unmatched name resolves to its closest names, the value is converted to the attribute's declared type and clamped to its range, and out-of-range tokens are written with a note naming the allowed ones. It also explains the non-obvious consequence that a shape size change updates the authored extent, so get_prim_bounds reflects it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Set one attribute of a prim') and immediately grounds it in concrete examples: light intensity or colour, camera focal length, shape size/radius, display colour. It explicitly differentiates from siblings by naming set_prim_transform, set_visibility, set_material and set_physics_properties as the tools that own their own attributes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the selection rule precisely ('Use it for an attribute no other tool sets') and points to get_prim_properties as the way to discover valid attribute names. It also gives conditional guidance for the layer choice — layer='session' only 'for a check that must leave every file as it is' — and enumerates the cases where the call is refused rather than silently misapplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_prim_transformA
Set a prim's position, rotation or scale relative to its parent; any of the three left out keeps its value.
Use it to move, turn or size a prim; to aim the viewport camera, use set_camera, and to push a rigid body while physics runs, apply_force. Values are in the parent's space, not world space: get_prim_properties gives a prim's world position. It writes into the prim's own xform ops: the position into its translate op, the rotation into its rotate or orient ops in their kind, the scale into its scale op, adding an op it lacks; other ops, a pivot among them, stay. A part with no op of its own goes into the prim's matrix (xformOp:transform) when it has one, as imported assets often do. An error when the prim doesn't exist or can't be transformed, for an animated op, for ops a stronger layer holds, such as a Kit camera's, and for a rotation or scale on a matrix that can't be factored.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | A uniform scale, or [sx, sy, sz] | |
| position | No | [x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit) | |
| rotation | No | Euler angles [rx, ry, rz] in degrees, or a quaternion [w, x, y, z] | |
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations, which only declare readOnly=false, destructive=false, openWorld=false. The description discloses exactly which xform ops get written (translate, rotate/orient in kind, scale), that missing ops are added, that untouched ops such as pivots are preserved, and the matrix fallback for imported assets. It also enumerates concrete error conditions (missing prim, animated op, stronger-layer override like a Kit camera, non-factorable matrix), which is unusually specific for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation and the parent-space caveat are front-loaded in the first clause, then usage, then mechanism, then errors. The later sentences are long and densely packed with USD op vocabulary, but each carries distinct information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation with full annotations and an output schema, this covers coordinate frame, op-level write behaviour, preservation of other ops, the matrix fallback, and failure modes. Return values need not be explained because an output schema exists, and the only remaining gap is minor granularity on some error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining that any of the three omitted values 'keeps its value' rather than resetting to zero, and by insisting the values are in the parent's space, not world space. Those are semantic clarifications the null defaults in the schema do not convey on their own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set a prim's position, rotation or scale relative to its parent') and immediately clarifies the parent-space frame, which is the key distinguishing trait versus a world-space or camera tool. An agent can identify this apart from set_camera, apply_force, and get_prim_properties without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says what the tool is for ('move, turn or size a prim') and routes two near-neighbours elsewhere: set_camera for aiming the viewport, apply_force for pushing rigid bodies under physics. It also names get_prim_properties as the way to read world position, which resolves the most likely confusion about coordinate frames.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_variant_selectionA
Select a variant in a prim's variant set, or clear a layer's selection, and wait until the viewport shows it.
By default the selection goes to Kit's session layer: it shows at once over what the files select, and save_scene leaves it out of the file, so a check leaves every file as it found it; it lasts until it is cleared or the stage is opened again. To keep one in the stage's file, use layer="edit_target", where edits go: the root layer, which save_scene writes, unless Kit's Layer window made a sublayer the edit target, which save_scene doesn't write; the answer names the layer. It is refused while the session layer holds a selection for the set, since that would hide it: clear that first with variant_name="". An extension older than the server writes every switch at the edit target and can't clear, and the answer warns. get_prim_properties' variant_sets line lists a prim's sets, their options and the layer holding each selection. A selection on an instance prim gives it a prototype of its own; a prim inside an instance is refused, naming the instance. An unknown set or variant is refused, listing those there (create_variant_structure makes them). Switch variants with this rather than execute_script: with Fabric Scene Delegate on before Kit 110 (Isaac Sim 5.x), it deactivates and reactivates the prim in the session layer around the switch, some 40 app updates, so the viewport drops the old geometry; otherwise it waits 5. compare_prims measures two variants and leaves the selection as it was.
| Name | Required | Description | Default |
|---|---|---|---|
| layer | No | session: Kit's session layer, which no save writes, so every file stays as it is; edit_target: where edits go, the stage's root layer, which save_scene writes, unless Kit's Layer window made a sublayer the edit target | session |
| prim_path | Yes | The prim with the variant set | |
| variant_set | Yes | The variant set's name, e.g. "model" | |
| variant_name | Yes | The variant to select, e.g. "shell"; "" clears the layer's selection, so the one beneath shows again |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes far beyond by explaining persistence semantics (session layer never written by save_scene, lasts until cleared or stage reopened), refusal rules, the extension-version caveat that warns instead of clearing, and the 40-app-update deactivate/reactivate path under Fabric Scene Delegate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, but the prose is dense and run-on, packing several conditionals into single sentences. Nearly every sentence carries information, yet it would be far more scannable as bulleted points or short clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema and partial annotations, the description covers the edge cases an agent needs: layer persistence, clearing, refusals, instance behavior, delegate-specific timing, and sibling alternatives. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds parameter-level consequences not present in the schema: that edit_target may resolve to a sublayer and the answer names it, and that variant_name="" is required to clear before switching layers. This meaningfully raises it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource: 'Select a variant in a prim's variant set, or clear a layer's selection.' It also distinguishes itself from the related siblings create_variant_structure (which makes sets/variants) and compare_prims (which measures variants without changing selection).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use which mode: session layer by default for a non-persistent check, edit_target when the selection must be saved. It also enumerates when-not conditions (clear with variant_name="" first if the session layer holds a selection, prim inside an instance refused, unknown set refused) and says to use this rather than execute_script.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_visibilityA
Show or hide a prim and everything under it, in the viewport and in captures; the prim stays in the stage.
Use it to see inside or behind something, then show it again; delete_prim removes a prim, and inspect_prim's isolate hides all but one prim for its captures. Showing a prim under a hidden parent shows the parent and hides the parent's other children, as USD's MakeVisible does. An error for a prim that has no visibility, such as a material.
| Name | Required | Description | Default |
|---|---|---|---|
| visible | No | True to show, False to hide | |
| prim_path | Yes | Full USD path of the prim, e.g. "/World/Robot" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only but non-destructive, and the description substantiates that by stating the prim persists in the stage. It goes further than annotations can by disclosing the hierarchical MakeVisible cascade (shows the hidden parent, hides the parent's other children) and the error case for prims with no visibility, such as materials.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then alternatives, then edge-case semantics in descending priority. It is dense with three clauses carrying distinct information, but nothing reads as filler; a slightly tighter phrasing of the MakeVisible analogy would be the only trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating visibility tool with an output schema, the description covers what changes, what does not change (the prim remains), the inheritance behavior, the alternative tools, and the failure mode. Nothing an agent needs in order to call it correctly or interpret failure is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented; the description still adds meaning by implying the boolean toggles a subtree rather than a single node. It could have noted the default of true explicitly in prose, which is the only small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause names a specific verb ("Show or hide") and resource ("a prim and everything under it") and scopes the effect to viewport and captures while clarifying that the prim stays in the stage. This clearly separates it from delete_prim (removal) and inspect_prim's isolate (capture-only hiding), both named siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ("to see inside or behind something, then show it again") plus explicit differentiation from the two most confusable alternatives, delete_prim and inspect_prim's isolate. The parent/child cascade rule tells the agent the precondition and side effects of the call before it runs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sim_controlA
Play, pause, stop or step the simulation's timeline, and return the state it is left in.
play starts or resumes physics; pause holds it where it is; stop rewinds the timeline, and physics puts bodies back where play found them; step plays for two app updates, then pauses. A robot's first play cooks its collision meshes, and Kit answers nothing until that ends. get_sim_state reads the state without changing it; get_robot_info's joint states and apply_force need it playing or paused.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic non-read-only, non-destructive, non-open-world profile; the description adds substantive behavior the annotations cannot convey — that stop is restorative rather than destructive ('physics puts bodies back where play found them'), that step is bounded to two app updates, and that the first play triggers collision-mesh cooking during which Kit answers nothing. The blocking/latency caveat is a genuinely useful disclosure for an agent sequencing calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core scope, then per-action semantics, then cross-tool dependencies — a sound order with no filler sentences. It is dense and the per-action clauses run together mid-paragraph, so parsing takes a second pass, but nothing here is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-enum mutation tool with an output schema already covering return values, the description covers everything an agent needs: action semantics, reversibility of stop, the mesh-cooking block, and which sibling tools depend on the play/pause state. No meaningful gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100% and the enum itself is enumerated, but the schema's own parameter text is only 'What to do'. The description supplies the actual meaning of every enum member, including the non-obvious duration semantics of 'step' — meaning that exists nowhere in the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb set and resource ('Play, pause, stop or step the simulation's timeline') and states the return contract ('return the state it is left in'). Later sentences explicitly separate this from get_sim_state, get_robot_info, and apply_force, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It spells out what each action does and when each applies (play resumes physics, pause holds, stop rewinds, step is two app updates then pause). It also names the read-only alternative ('get_sim_state reads the state without changing it') and states a prerequisite condition ('get_robot_info's joint states and apply_force need it playing or paused'), which is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_recordingA
Start recording simulation frames to disk.
Records camera_path, or the active viewport's camera when empty, at width x height (up to 4096 a side), through the render capture_viewport and inspect_prim keep when it is that size, else one of its own: the viewport, its camera and its size stay as they are. The render runs while the recording does and up to 30 s after, kept for the next capture or recording unless a capture's render is still kept at the stop, and slows the app's updates, the more the larger the frames.
Takes a frame every 1/fps seconds of the recording's own clock, at most one an app update. The clock runs with the simulation while it plays, so a simulation faster than real time gives more than fps frames a wall second, and with the wall clock while it is stopped or paused. Play it to record motion. Frames taken while it is stopped or paused show Kit's grid, as the viewport does; Isaac Sim 6.2 hides the grid while it plays. Frames stop if the stage changes or the camera is deleted; stop_recording says so. Frames are saved as PNGs in mcp_output/recordings/, by Kit itself. One recording runs at a time: another start is refused until stop_recording. Use stop_recording when done, then get_recording_frame to review any frame. Frames go on while the simulation is stopped, and a stop puts the scene back: pause it, or call stop_recording, before stopping it to end on the run's last state.
Optionally tracks prim state (transforms, properties) alongside video frames, in state.txt.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Frames a second: 5 takes one every 0.2 s, of simulation while it plays and by the clock while not | |
| width | No | Frame width in pixels, up to 4096 | |
| height | No | Frame height in pixels, up to 4096 | |
| camera_path | No | The camera to record, e.g. /World/RecCam; the active viewport's camera when empty | |
| track_prims | No | Prims whose state to record, descendants included, e.g. ["/World/G1"] | |
| property_filter | No | Only properties whose names contain one of these, e.g. ["joint", "pos", "vel"] |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false/destructive=false/openWorld=false; the description adds substantial context the agent could not infer: PNGs written to mcp_output/recordings/, the render continues up to 30 s past the recording and is reused, app updates slow with frame size, frames abort if the stage changes or the camera is deleted, and viewport/camera/size are left untouched. The one real gap is that it does not say what happens to already-written frames when recording is stopped early.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly with the one-line purpose, and every paragraph carries real information, but sentences are convoluted ('through the render capture_viewport and inspect_prim keep when it is that size, else one of its own') and the 30-second render-retention aside interrupts the main flow. It is dense rather than wasteful, yet readability suffers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful, side-effecting recording tool this covers the full operational picture: output location/format, timing model, one-at-a-time constraint, abort conditions, interaction with sim stop, and how to review frames. An output schema exists, so return-value detail is correctly omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds meaning by tying track_prims and property_filter to a concrete artifact ('tracks prim state ... alongside video frames, in state.txt'), which the schema does not state. The clock semantics for fps (simulation vs wall clock) are also restated in prose form that clarifies the schema's shorthand.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource ('Start recording simulation frames to disk') and immediately scopes what is captured, at what size, and where it lands. It implicitly separates itself from capture_viewport (single frame) and names stop_recording/get_recording_frame as the follow-on lifecycle tools, so an agent can distinguish it from siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('Play it to record motion'), the refusal condition ('One recording runs at a time: another start is refused until stop_recording'), and the follow-up sequence ('Use stop_recording when done, then get_recording_frame to review any frame'). It also gives a concrete when-not/do-this-instead rule: pause the sim or call stop_recording before stopping, rather than just stopping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_recordingA
Stop the running recording: wait for the frames still being written, write metadata.json with each frame's simulation time, and hand the render back to the captures, kept up to 30 s unless a capture's render is still kept at the stop, which stays instead.
Returns the frame count, the duration, the seconds of simulation played and the seconds stopped or paused (the frame count comes out near fps times their sum), the session folder and the state file, with a note when frames stopped early or the cleanup failed in part. An error when no recording runs. Use get_recording_frame to review frames.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as a non-read-only, non-destructive, closed-world write; the description adds substantial context on top: it blocks until in-flight frames are flushed, writes metadata.json, returns render control with a 30 s grace period unless a capture still holds the render, and surfaces partial-failure notes. That is exactly the mutation behavior an agent needs before invoking it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence is well front-loaded, but the render-handback clause ("hand the render back to the captures, kept up to 30 s unless a capture's render is still kept at the stop, which stays instead") is tangled and hard to parse on first read. The lengthy enumeration of return fields is also partly redundant because an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter mutation with annotations and an output schema, the description covers effects, failure modes, and the follow-up tool. Its remaining weakness is spending effort restating return values that the output schema already documents, while the render-handback rule stays ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no argument semantics to explain and the baseline is 4. The description does not need to compensate for anything here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Stop the running recording") and enumerates its effects: waiting on pending frames, writing metadata.json with per-frame simulation time, and restoring render ownership. This clearly separates it from start_recording and get_recording_frame without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the error condition ("An error when no recording runs") and explicitly routes review work to a sibling: "Use get_recording_frame to review frames." It stops short of stating the obvious pairing with start_recording or any prerequisites for calling it, so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_material_pathsADestructive
Rewrite every path under a subtree that starts with old_prefix to start with new_prefix instead: relationship targets, such as material bindings, and asset paths, such as texture files.
Use it after materials or textures move, so bindings and textures point at their new place. The match is a plain text prefix, on any relationship or asset path: a joint's bodies or a shader's source file change too if they match, so end the prefix with "/" and keep it specific. Nothing checks that the new paths exist. Kit's undo doesn't record the change, and a failure part way keeps the edits made before it. The answer counts the paths changed and names the prims.
| Name | Required | Description | Default |
|---|---|---|---|
| prim_path | No | The subtree to update; the whole stage by default | / |
| new_prefix | Yes | What to put in its place, e.g. "/World/Materials/" | |
| old_prefix | Yes | The start of the paths to change, matched as text, e.g. "/OldProject/Materials/" |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructive=true and openWorld=false, but the description adds what they can't: nothing verifies the new paths exist, Kit's undo doesn't record the change, and a mid-way failure keeps the edits already made. Those are exactly the risk disclosures an agent needs before running a destructive rewrite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation in the first sentence, then when-to-use, then risk notes, then the return shape. The parenthetical examples are compact, and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, yet the description still briefly says the answer counts changed paths and names the prims. Combined with the partial-failure and undo disclosures, an agent has everything needed to call this safely. The destructive rewriter has no remaining informational gap for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics beyond the schema: the match is a plain text prefix applied to any relationship or asset path, and prefixes should end with "/" to avoid over-matching. That meaningfully improves how an agent forms old_prefix.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: rewrite every path under a subtree that starts with old_prefix to new_prefix. It further enumerates what gets rewritten (relationship targets like material bindings, asset paths like texture files), which lets an agent distinguish this from sibling mutators such as set_material or create_prim.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: after materials or textures move, so bindings and textures point at their new place. It also gives a concrete usage caveat (end the prefix with "/" and keep it specific) because a plain-text match can hit unrelated paths. It doesn't name an alternative tool, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viewport_lightA
Read or set the viewport's lighting mode, which decides how the viewport and its captures are lit, without changing the scene.
Use it when a capture comes back black, or warns that the lighting lights nothing (mode off, or stage with no scene lights, though Kit's grid shows), then capture again. "get" (the default) answers the mode, the modes on offer, and the stage's own lights with their intensity, inside instances too, the first 20 listed; a light rig's lights are the viewport's, not the stage's, and aren't among them. "set" takes a mode "get" lists: "stage" (the stage's own lights), "camera" (a light that follows the camera), "off", or a light rig such as "Default", "Colored Lights" or "Grey Studio"; rigs need Kit's lighting menu, omni.kit.viewport.menubar.lighting, and a mode not on offer is an error. "set_camera_light" is the older switch, turning the camera light on or off with enabled. To add a light to the stage itself, use create_prim (DistantLight, DomeLight), then set_prim_attribute for its intensity: a DistantLight comes at 50,000, which washes a capture out.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | For "set": "off", "camera", "stage", or a light rig "get" lists, e.g. "Default" | |
| action | No | "get" the mode, "set" one, or the legacy "set_camera_light" | get |
| enabled | No | For "set_camera_light": turn the camera light on or off |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, non-destructive, closed-world; the description adds far more: 'set' does not alter the scene, rig modes require the omni.kit.viewport.menubar.lighting extension, an unavailable mode is an error, and 'get' truncates to the first 20 lights and omits rig lights. These are exactly the failure modes an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every paragraph carries information, but the second and third sentences are long run-ons that chain several clauses with parentheticals, making them slower to parse than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still sketches what 'get' returns (mode, modes on offer, stage lights with intensity) and flags the DistantLight 50,000 intensity pitfall. Nothing an agent needs to call this correctly in a lighting/capture workflow is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real semantics: the accepted mode values and their meanings ('stage', 'camera', 'off', named rigs), that an unlisted mode errors, and that 'enabled' applies only to the legacy set_camera_light action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb pair and resource: "Read or set the viewport's lighting mode," and immediately scopes it ("without changing the scene"). It is clearly separable from siblings like create_prim and set_prim_attribute, which the description explicitly routes stage-light work to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger condition: use it when a capture comes back black or warns that lighting lights nothing. It also states which tool to use instead for adding stage lights (create_prim then set_prim_attribute), and calls out the legacy set_camera_light alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
20 tool updates
v0.4.1- Added
cancel_job - Added
capture_sweep - Removed
dump_scene - Added
get_job - Removed
get_joint_states - Changed
get_logs1 field changed- changed
Input schema / properties / search / descriptionPrevious value: -"Only messages containing this, in any case"New value: +"Only messages containing this anywhere, in any case"
- Changed
get_mesh_stats1 field changed- added
Input schema / properties / max_depthAdded value: +{ + "default": 2, + "description": "How many levels of the tree below prim_path to list; 0 for prim_path alone", + "minimum": 0, + "title": "Max Depth", + "type": "integer" +}
- Added
get_performance - Removed
get_prim_face_count_tree - Changed
get_recording_frame1 field changed- changed
Input schema / properties / session_dir / descriptionPrevious value: -"The session folder on Kit's machine, absolute or relative to Kit's working folder; the last recording when empty"New value: +"The session folder as start_recording and stop_recording give it, relative to this server's working folder, or an absolute path on Kit's machine; the last recording when empty"
- Changed
get_scene_tree9 fields changed- added
Input schema / properties / filter_typesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Only prims of these types, e.g. [\"Mesh\", \"Xform\"], written to the file; the others' children are still walked", + "title": "Filter Types" +} - added
Input schema / properties / include_propertiesAdded value: +{ + "default": false, + "description": "Each prim's rotation, world box, applied API schemas, variant sets, attribute values and relationship targets, written by Kit to mcp_output/scene_dump.txt", + "title": "Include Properties", + "type": "boolean" +} - added
Input schema / properties / max_depth / anyOfAdded value: +[ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / max_depth / defaultPrevious value: -5New value: +null - changed
Input schema / properties / max_depth / descriptionPrevious value: -"How many levels below root to list; the next shows only prims with children"New value: +"How many levels below root: 5 when left out, or 15 with properties or a filter; in the list, a prim on the last level says how many children it has" - removed
Input schema / properties / max_depth / maximumRemoved value: -15 - removed
Input schema / properties / max_depth / minimumRemoved value: -0 - removed
Input schema / properties / max_depth / typeRemoved value: -"integer" - added
Input schema / properties / property_filterAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Only properties whose names hold one of these, e.g. [\"joint\"], written to the file; it takes the properties with it. [\"variant_sets\"] lists every prim's variant sets: a scene's switches", + "title": "Property Filter" +}
- Removed
look_at_prim - Changed
new_scene2 fields changed- added
Input schema / properties / meters_per_unitAdded value: +{ + "default": 1, + "description": "The stage's metres per unit: 1.0 for metres, 0.01 for centimetres", + "exclusiveMinimum": 0, + "title": "Meters Per Unit", + "type": "number" +} - added
Input schema / properties / up_axisAdded value: +{ + "default": "Z", + "description": "The stage's up axis: Z, as Isaac Sim's robots and stages are, or Y", + "enum": [ + "Z", + "Y" + ], + "title": "Up Axis", + "type": "string" +}
- Changed
raycast1 field changed- changed
Input schema / properties / direction / descriptionPrevious value: -"[dx, dy, dz] direction in world space, a unit vector: PhysX takes it as given"New value: +"[dx, dy, dz] direction in world space, of any length but zero"
- Added
run_script_job - Changed
set_camera11 fields changed- added
Input schema / properties / azimuthAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Degrees around the prim: 0 the front (+Y on a Z-up stage, +Z on a Y-up one), 90 the right (+X), 180 the back, 270 the left; 45 when left out", + "title": "Azimuth" +} - added
Input schema / properties / distanceAdded value: +{ + "anyOf": [ + { + "exclusiveMinimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "From the prim's centre in stage units; 2.5 times its largest side when left out", + "title": "Distance" +} - added
Input schema / properties / elevationAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Degrees above the horizontal; 30 when left out", + "title": "Elevation" +} - added
Input schema / properties / position / anyOfAdded value: +[ + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / position / defaultAdded value: +null - changed
Input schema / properties / position / descriptionPrevious value: -"[x, y, z] camera position in world space"New value: +"[x, y, z] where the camera stands, in world space: for a point" - removed
Input schema / properties / position / itemsRemoved value: -{ - "type": "number" -} - removed
Input schema / properties / position / typeRemoved value: -"array" - added
Input schema / properties / prim_pathAdded value: +{ + "default": "", + "description": "A prim to frame instead: the camera aims at the centre of its world box", + "title": "Prim Path", + "type": "string" +} - changed
Input schema / properties / target / descriptionPrevious value: -"[x, y, z] world point to look at; the origin when omitted"New value: +"[x, y, z] the world point it looks at, the world origin when left out: for a point" - removed
Input schema / requiredRemoved value: -[ - "position" -]
- Changed
set_physics_properties1 field changed- added
Input schema / properties / collisionAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "true makes the prim a collider (the Collision API), with no rigid body, such as a floor; false turns its collision off and keeps the API", + "title": "Collision" +}
- Added
set_prim_attribute - Changed
set_variant_selection2 fields changed- added
Input schema / properties / layerAdded value: +{ + "default": "session", + "description": "session: Kit's session layer, which no save writes, so every file stays as it is; edit_target: where edits go, the stage's root layer, which save_scene writes, unless Kit's Layer window made a sublayer the edit target", + "enum": [ + "session", + "edit_target" + ], + "title": "Layer", + "type": "string" +} - changed
Input schema / properties / variant_name / descriptionPrevious value: -"The variant to select, e.g. \"shell\""New value: +"The variant to select, e.g. \"shell\"; \"\" clears the layer's selection, so the one beneath shows again"
- Changed
start_recording1 field changed- changed
Input schema / properties / fps / descriptionPrevious value: -"Frames a second: 5 captures one every 0.2 s"New value: +"Frames a second: 5 takes one every 0.2 s, of simulation while it plays and by the clock while not"
22 tool updates
v0.2.3- Changed
apply_force1 field changed- changed
Input schema / properties / prim_path / descriptionPrevious value: -"The rigid body's prim path"New value: +"The rigid body's prim path, a robot's link among them"
- Changed
capture_viewport3 fields changed- changed
Input schema / properties / camera_path / descriptionPrevious value: -"The camera prim to capture from; the active one when empty"New value: +"The camera prim to capture from, which must be a camera; the viewport's when empty" - changed
Input schema / properties / height / descriptionPrevious value: -"Image height in pixels"New value: +"Image height in pixels, up to 4096; the camera is rendered at this size" - changed
Input schema / properties / width / descriptionPrevious value: -"Image width in pixels"New value: +"Image width in pixels, up to 4096; the camera is rendered at this size"
- Changed
clone_prim2 fields changed- changed
Input schema / properties / count / descriptionPrevious value: -"How many copies; paths get _001, _002, ..."New value: +"How many copies: one goes to target_path, more to target_path_001, _002, ..." - changed
Input schema / properties / offset / descriptionPrevious value: -"[x, y, z] each copy moves from the one before"New value: +"[x, y, z] in the parent's space: each copy after the first sits this far from the last"
- Changed
create_prim2 fields changed- changed
Input schema / properties / position / descriptionPrevious value: -"[x, y, z] in the stage's units (usually metres)"New value: +"[x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit)" - changed
Input schema / properties / usd_path / descriptionPrevious value: -"A USD file to load as a reference instead"New value: +"A USD file to reference instead of a type: an absolute path on Kit's machine, or a URL"
- Changed
create_robot1 field changed- changed
Input schema / properties / position / descriptionPrevious value: -"[x, y, z] in the stage's units (usually metres)"New value: +"[x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit)"
- Changed
create_variant_structure1 field changed- changed
Input schema / properties / default_variant / descriptionPrevious value: -"The variant selected at first; the first when empty"New value: +"The variant to select; the first of variant_names when empty or not among them"
- Changed
export_prim_as_file1 field changed- changed
Input schema / properties / output_path / descriptionPrevious value: -"The file to write: .usd, .usda or .usdc (the default)"New value: +"The file to write on Kit's machine: .usd, .usda or .usdc, which a path without one gets; never one the open stage has loaded"
- Changed
flatten_usd2 fields changed- changed
Input schema / properties / input_path / descriptionPrevious value: -"The USD file to flatten; the open stage when empty"New value: +"The USD file to flatten, on Kit's machine; the open stage, unsaved edits too, when empty" - changed
Input schema / properties / output_path / descriptionPrevious value: -"The flattened USD file to write"New value: +"The USD file to write, on Kit's machine; overwritten if there, but never one the open stage has loaded"
- Changed
get_recording_frame1 field changed- changed
Input schema / properties / session_dir / descriptionPrevious value: -"The session's folder; the last recording when empty"New value: +"The session folder on Kit's machine, absolute or relative to Kit's working folder; the last recording when empty"
- Changed
get_scene_tree1 field changed- changed
Input schema / properties / max_depth / descriptionPrevious value: -"How many levels below root; 0 for root alone"New value: +"How many levels below root to list; the next shows only prims with children"
- Changed
inspect_prim2 fields changed- changed
Input schema / properties / height / descriptionPrevious value: -"Image height in pixels"New value: +"Image height in pixels, up to 4096; the camera is rendered at this size" - changed
Input schema / properties / width / descriptionPrevious value: -"Image width in pixels"New value: +"Image width in pixels, up to 4096; the camera is rendered at this size"
- Changed
look_at_prim2 fields changed- changed
Input schema / properties / azimuth / descriptionPrevious value: -"Horizontal angle in degrees: 0 front, 90 right, 180 back"New value: +"Horizontal angle in degrees: 0 from the front (+Y on a Z-up stage, +Z on a Y-up one), 90 from the right (+X), 180 the back, 270 the left" - changed
Input schema / properties / distance / descriptionPrevious value: -"Camera distance; worked out from the prim's size when omitted"New value: +"From the prim's centre, in stage units; 2.5 times its largest side when omitted"
- Changed
manage_extensions3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"What to do"New value: +"\"list\" reads; \"enable\" and \"disable\" change the running app" - changed
Input schema / properties / extension_id / descriptionPrevious value: -"The extension to enable or disable"New value: +"For \"enable\" and \"disable\", required: the extension, e.g. \"omni.syntheticdata\"" - changed
Input schema / properties / search / descriptionPrevious value: -"For \"list\": only extensions whose name contains this"New value: +"For \"list\": only extensions whose name or id contains this, in any case"
- Added
open_scene - Changed
raycast3 fields changed- changed
Input schema / properties / direction / descriptionPrevious value: -"[dx, dy, dz] direction; it is normalised"New value: +"[dx, dy, dz] direction in world space, a unit vector: PhysX takes it as given" - changed
Input schema / properties / max_distance / descriptionPrevious value: -"The longest the ray goes"New value: +"The longest the ray goes, in stage units" - changed
Input schema / properties / origin / descriptionPrevious value: -"[x, y, z] start point"New value: +"[x, y, z] start point in world space"
- Changed
save_scene1 field changed- changed
Input schema / properties / file_path / descriptionPrevious value: -"The USD file to write; empty overwrites the stage's own file"New value: +"The USD file to write, on Kit's machine, but never another file the open stage has loaded; empty overwrites the stage's own file"
- Changed
set_camera1 field changed- changed
Input schema / properties / target / descriptionPrevious value: -"[x, y, z] point to look at"New value: +"[x, y, z] world point to look at; the origin when omitted"
- Changed
set_joint_targets1 field changed- changed
Input schema / properties / targets / descriptionPrevious value: -"{joint_name: value} or [v0, v1, ...] in joint order: degrees for revolute joints, metres for prismatic ones"New value: +"Required: {joint_name: value}, or [v0, v1, ...] in get_robot_info's joint order, fixed joints included; degrees for revolute joints, stage units for prismatic ones"
- Changed
set_physics_properties1 field changed- changed
Input schema / properties / friction / descriptionPrevious value: -"Static and dynamic friction coefficient"New value: +"Friction coefficient, set as both static and dynamic friction"
- Changed
set_prim_transform1 field changed- changed
Input schema / properties / position / descriptionPrevious value: -"[x, y, z] in the stage's units (usually metres)"New value: +"[x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit)"
- Changed
start_recording3 fields changed- changed
Input schema / properties / camera_path / descriptionPrevious value: -"Ignored for now: frames come from the active viewport's camera (#25)"New value: +"The camera to record, e.g. /World/RecCam; the active viewport's camera when empty" - changed
Input schema / properties / height / descriptionPrevious value: -"Ignored for now: frames come at the active viewport's size (#25)"New value: +"Frame height in pixels, up to 4096" - changed
Input schema / properties / width / descriptionPrevious value: -"Ignored for now: frames come at the active viewport's size (#25)"New value: +"Frame width in pixels, up to 4096"
- Changed
update_material_paths2 fields changed- changed
Input schema / properties / new_prefix / descriptionPrevious value: -"What to put in its place, e.g. \"/World/Materials\""New value: +"What to put in its place, e.g. \"/World/Materials/\"" - changed
Input schema / properties / old_prefix / descriptionPrevious value: -"The path prefix to find, e.g. \"/OldProject/Materials\""New value: +"The start of the paths to change, matched as text, e.g. \"/OldProject/Materials/\""
41 tool updates
v0.2.2- First observed
apply_force - First observed
capture_viewport - First observed
clone_prim - First observed
compare_prims - First observed
create_prim - First observed
create_robot - First observed
create_variant_structure - First observed
delete_prim - First observed
draw_debug - First observed
dump_scene - First observed
execute_script - First observed
export_prim_as_file - First observed
flatten_usd - First observed
get_joint_states - First observed
get_logs - First observed
get_mesh_stats - First observed
get_prim_bounds - First observed
get_prim_face_count_tree - First observed
get_prim_properties - First observed
get_recording_frame - First observed
get_robot_info - First observed
get_scene_tree - First observed
get_sim_state - First observed
inspect_prim - First observed
look_at_prim - First observed
manage_extensions - First observed
new_scene - First observed
raycast - First observed
save_scene - First observed
set_camera - First observed
set_joint_targets - First observed
set_material - First observed
set_physics_properties - First observed
set_prim_transform - First observed
set_variant_selection - First observed
set_visibility - First observed
sim_control - First observed
start_recording - First observed
stop_recording - First observed
update_material_paths - First observed
viewport_light
TDQS
Scored across 44 tools
Most tools have clearly distinct resource/action roles, and descriptions explicitly cross-reference alternatives such as get_prim_bounds vs get_prim_properties, capture_viewport vs inspect_prim, and execute_script vs run_script_job. A few clusters overlap in practice—scene inspection, capture/record/sweep, and physics/robot control—but the descriptions differentiate them enough for an agent to choose.
Names overwhelmingly use snake_case with a predictable verb_noun or action pattern (get_scene_tree, create_prim, set_material, run_script_job, stop_recording). There are a few noun-like exceptions such as raycast, viewport_light, capture_sweep, and get_job, but no camelCase mixing and no chaotic convention.
44 tools is heavy and well above the 3–15 well-scoped range. The breadth of Omniverse/Isaac Sim justifies many specialized operations, but the surface is still large enough to burden tool selection and discovery.
The surface covers scene lifecycle, prim CRUD/transforms, materials, physics, simulation control, recording/capturing, robot joints, USD import/export/flatten, jobs, variants, logs, and extensions. Any remaining gaps are minor and mostly reachable through execute_script, so lifecycle coverage is strong.
Maintenance
Related MCP Connectors
Make games with AI: one MCP server that connects your agent to Unity, Unreal and Godot editors.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseBqualityBmaintenanceConnects Blender to Claude AI through the Model Context Protocol (MCP), allowing Claude to directly interact with and control Blender for AI-assisted 3D modeling, scene manipulation, and rendering.2132,810MIT
- AlicenseBqualityBmaintenanceFacilitates robotic movement control by providing functions that enable precise manipulation of linear and angular velocities through natural language commands, compatible with both ROS and ROS2.171,514Apache 2.0
- AlicenseAqualityAmaintenanceEnables natural language control of NVIDIA Isaac Sim through the Model Context Protocol, allowing you to create robots, build scenes, run simulations, and debug physics from any MCP-compatible IDE.4240 PyPI69MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants like Codex or ChatGPT to inspect and control a local Blender scene, including creating objects, editing materials, setting cameras and lights, rendering previews, and saving safe copies of .blend files.1MIT