Skip to main content
Glama

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 | sh

    • Windows: 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-mcp

If 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

  1. Install the bridge:

    uvx omniverse-mcp extension install

    It copies ovmcp.bridge into 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).

  2. Turn it on in the Kit app, once:

    1. Window > Extensions, the menu (☰) at the top right, Settings.

    2. Under Extension Search Paths, the green +, then paste the folder. The + adds an empty row: click it to type.

    3. Search for ovmcp under 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.bridge instead (headless Kit).

  3. 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 PYTHONPATH keeps 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.1

Something 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

get_scene_tree, get_prim_properties, get_prim_bounds, set_prim_transform, create_prim, delete_prim, clone_prim, set_visibility, set_prim_attribute, save_scene, open_scene, new_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_viewport, inspect_prim, capture_sweep, set_camera, viewport_light

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

set_material, update_material_paths

Give an object a colour and surface; fix material paths after files move

Simulation

sim_control, get_sim_state, get_performance

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

set_physics_properties, apply_force, raycast

Mass, friction and bounce; make a collider; push an object; cast a ray

Robots

create_robot, get_robot_info, set_joint_targets

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

start_recording, stop_recording, get_recording_frame

Record frames from any camera at any size, and objects' state, while physics plays, then look back at any frame

Geometry

get_mesh_stats, compare_prims

Count faces and vertices and find the heaviest parts, compare two objects or variants

USD files and variants

flatten_usd, export_prim_as_file, create_variant_structure, set_variant_selection

Write a stage as one file, export an object, make and switch variant sets

Kit

get_logs, manage_extensions, draw_debug

Read Kit's log, turn Kit extensions on and off, draw lines and points in the viewport

Scripts

execute_script, run_script_job, get_job, cancel_job

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, then claude 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 install fetches 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 need

Variable

Flag

Default

What

OMNIVERSE_MCP_HOST

--host

127.0.0.1

where the bridge listens

OMNIVERSE_MCP_PORT

--port

8211

the bridge's port

OMNIVERSE_MCP_OUTPUT_DIR

--output-dir

mcp_output in the working folder

where images and long answers go

OMNIVERSE_MCP_TOKEN

the token file

the bridge token, for a Kit app on another machine

OMNIVERSE_MCP_STATE_DIR

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

/exts/ovmcp.bridge/host

127.0.0.1

the address it listens on

/exts/ovmcp.bridge/port

8211

its port

/exts/ovmcp.bridge/token

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's step(), 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

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 tools
apply_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.

NameRequiredDescriptionDefault
forceYes[fx, fy, fz]: an impulse in N s, or a force in N for one physics step
impulseNoTrue 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
positionNoWorld-space point to push at; the body's centre of mass when omitted
prim_pathYesThe rigid body's prim path, a robot's link among them

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
job_idYesThe job to cancel, as run_script_job or capture_sweep answered it, such as j3

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
nameNoThe sweep's folder in mcp_output/sweeps/: letters, digits, '.', '_', '-' and spaces; the time when empty. A folder that holds a sweep already is refused
shotsNoThe shots, in order, up to 2,000; give this or shots_file
widthNoEvery picture's width in pixels, up to 4096
heightNoEvery picture's height in pixels, up to 4096
shots_fileNoA 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

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_viewportA
Read-only

Render one frame from a camera at width x height and save 3 files to mcp_output/captures/:

  1. Image (PNG): what the camera sees.

  2. Bounding boxes (TXT): each mesh or shape under /World whose world box lies on the image, its box in pixels, world centre and size.

  3. 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.

NameRequiredDescriptionDefault
widthNoImage width in pixels, up to 4096; the camera is rendered at this size
heightNoImage height in pixels, up to 4096; the camera is rendered at this size
camera_pathNoThe camera prim to capture from, which must be a camera; the viewport's when empty
include_imageNoAlso return the image inline, besides the file (uses more context)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
countNoHow many copies: one goes to target_path, more to target_path_001, _002, ...
offsetNo[x, y, z] in the parent's space: each copy after the first sits this far from the last
source_pathYesThe prim to clone, e.g. "/World/MyCube"
target_pathYesWhere the copy goes, e.g. "/World/MyCube_Copy"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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:

  1. Two prims: prim_path_a and prim_path_b.

  2. 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.

NameRequiredDescriptionDefault
prim_pathNoTwo variants: the prim that has them
variant_aNoTwo variants: the first
variant_bNoTwo variants: the second
prim_path_aNoTwo prims: the first
prim_path_bNoTwo prims: the second
variant_setNoTwo variants: their variant set

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
scaleNoA uniform scale, or [sx, sy, sz]
positionNo[x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit)
rotationNoEuler angles [rx, ry, rz] in degrees, or a quaternion [w, x, y, z]
usd_pathNoA USD file to reference instead of a type: an absolute path on Kit's machine, or a URL
prim_pathYesWhere to create it, e.g. "/World/MyCube"
prim_typeNoUSD type name, e.g. Cube, Sphere, Xform, DistantLightXform
enable_physicsNoAdd the RigidBody and Collision APIs

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
positionNo[x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit)
rotationNoEuler angles [rx, ry, rz] in degrees, or a quaternion [w, x, y, z]
prim_pathNoWhere to put it; made up from the name when empty
robot_typeYesA robot's name (franka, g1, spot, ...) or a USD file's path

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
prim_pathYesThe prim to add the variant set to
variant_namesYesThe variants to create, e.g. ["focused", "shell"]
default_variantNoThe variant to select; the first of variant_names when empty or not among them
variant_set_nameYesThe new variant set's name, e.g. "model"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_primA
Destructive

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.

NameRequiredDescriptionDefault
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
endNoFor "line": its end [x, y, z]
sizeNoFor "points": how far each point's cross reaches, in stage units
colorNo[r, g, b] colour in 0-1; red when omitted
shapeYesWhat to draw: "lines" joins the points in order
startNoFor "line": its start [x, y, z]
centerNoFor "sphere": its centre [x, y, z]
pointsNoFor "points" and "lines": a list of [x, y, z]
radiusNoFor "sphere": its radius
durationNoHow long it shows, in seconds from the call, whether the simulation plays or not

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_scriptA
Destructive

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).

NameRequiredDescriptionDefault
codeYesPython to run inside the Kit app; assign to result to return data

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_fileA
Destructive

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.

NameRequiredDescriptionDefault
prim_pathYesThe root of the subtree to export
output_pathYesThe 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

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_usdA
Destructive

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.

NameRequiredDescriptionDefault
input_pathNoThe USD file to flatten, on Kit's machine; the open stage, unsaved edits too, when empty
output_pathYesThe USD file to write, on Kit's machine; overwritten if there, but never one the open stage has loaded

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_jobA
Read-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.

NameRequiredDescriptionDefault
waitNoSeconds 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_idNoThe id run_script_job or capture_sweep answered, such as j3; the running or last job when empty

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_logsA
Read-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.

NameRequiredDescriptionDefault
countNoHow many of the latest entries; the buffer keeps 2000
searchNoOnly messages containing this anywhere, in any case
channelNoOnly channels containing this, e.g. "omni.physx"
min_levelNoThe lowest severity to return; every level when empty

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_statsA
Read-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.

NameRequiredDescriptionDefault
max_depthNoHow many levels of the tree below prim_path to list; 0 for prim_path alone
prim_pathYesThe prim to measure, its descendant meshes included

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_performanceA
Read-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.

NameRequiredDescriptionDefault
framesNoApp updates to time, after the warm-up: 120 take 8 s at 15 FPS
warmupNoApp updates to let pass first, once the stage has loaded, so shaders and caches settle

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_boundsA
Read-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.

NameRequiredDescriptionDefault
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_propertiesA
Read-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.

NameRequiredDescriptionDefault
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_frameA
Read-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.

NameRequiredDescriptionDefault
frame_indexNoThe frame's number, from 0
session_dirNoThe 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

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_infoA
Read-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.

NameRequiredDescriptionDefault
prim_pathYesThe robot's root prim, e.g. "/World/G1"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_treeA
Read-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.

NameRequiredDescriptionDefault
rootNoPrim path to start from/
max_depthNoHow 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_typesNoOnly prims of these types, e.g. ["Mesh", "Xform"], written to the file; the others' children are still walked
property_filterNoOnly 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_propertiesNoEach 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

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_stateA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
widthNoImage width in pixels, up to 4096; the camera is rendered at this size
anglesNoAngle 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"
heightNoImage height in pixels, up to 4096; the camera is rendered at this size
isolateNoHide everything else while capturing, then restore it
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"
zoom_offsetNoAdjusts the fitted distance: negative closer, positive further (-0.3 is 30% closer)
include_segmentationNoAlso capture instance segmentation at each angle

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_extensionsA
Destructive

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.

NameRequiredDescriptionDefault
actionNo"list" reads; "enable" and "disable" change the running applist
searchNoFor "list": only extensions whose name or id contains this, in any case
enabled_onlyNoFor "list": only enabled extensions
extension_idNoFor "enable" and "disable", required: the extension, e.g. "omni.syntheticdata"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_sceneA
Destructive

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.

NameRequiredDescriptionDefault
up_axisNoThe stage's up axis: Z, as Isaac Sim's robots and stages are, or YZ
meters_per_unitNoThe stage's metres per unit: 1.0 for metres, 0.01 for centimetres

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_sceneA
Destructive

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.

NameRequiredDescriptionDefault
file_pathYesThe 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

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

raycastA
Read-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.

NameRequiredDescriptionDefault
originYes[x, y, z] start point in world space
directionYes[dx, dy, dz] direction in world space, of any length but zero
max_distanceNoThe longest the ray goes, in stage units

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_jobA
Destructive

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.

NameRequiredDescriptionDefault
codeNoPython to run as the job; give this or file
fileNoA .py file on the Kit app's machine to run as the job, read there; or give code

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_sceneA
Destructive

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.

NameRequiredDescriptionDefault
file_pathNoThe 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

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
targetNo[x, y, z] the world point it looks at, the world origin when left out: for a point
azimuthNoDegrees 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
distanceNoFrom the prim's centre in stage units; 2.5 times its largest side when left out
positionNo[x, y, z] where the camera stands, in world space: for a point
elevationNoDegrees above the horizontal; 30 when left out
prim_pathNoA prim to frame instead: the camera aims at the centre of its world box

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
targetsNoRequired: {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_pathYesThe robot's root prim, e.g. "/World/G1"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
colorYes[r, g, b] diffuse colour: 0-1 floats (e.g. [1, 0, 0] for red) or 0-255 ints
opacityNo0 transparent to 1 opaque
metallicNo0 plastic (dielectric) to 1 metal
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"
roughnessNo0 glossy (mirror) to 1 rough (matte)
material_pathNoThe material prim's path; made under /World/Looks/ when empty

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
massNoMass in kg (applies MassAPI); 0 unsets it, so density decides
densityNoDensity in kg/m^3 (applies MassAPI); 0 unsets it; a mass set wins over it
frictionNoFriction coefficient, set as both static and dynamic friction
collisionNotrue 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_pathYesFull USD path of the prim, e.g. "/World/Robot"
restitutionNoBounciness: 0 no bounce, 1 full bounce

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
nameYesThe attribute, as get_prim_properties names it, e.g. "inputs:intensity"
layerNoauto: 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 goauto
valueYesIts 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_pathYesFull USD path of the prim, e.g. "/World/Robot"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
scaleNoA uniform scale, or [sx, sy, sz]
positionNo[x, y, z] relative to the parent prim, in the stage's units (get_sim_state's meters_per_unit)
rotationNoEuler angles [rx, ry, rz] in degrees, or a quaternion [w, x, y, z]
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
layerNosession: 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 targetsession
prim_pathYesThe prim with the variant set
variant_setYesThe variant set's name, e.g. "model"
variant_nameYesThe variant to select, e.g. "shell"; "" clears the layer's selection, so the one beneath shows again

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
visibleNoTrue to show, False to hide
prim_pathYesFull USD path of the prim, e.g. "/World/Robot"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
actionYesWhat to do

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
fpsNoFrames a second: 5 takes one every 0.2 s, of simulation while it plays and by the clock while not
widthNoFrame width in pixels, up to 4096
heightNoFrame height in pixels, up to 4096
camera_pathNoThe camera to record, e.g. /World/RecCam; the active viewport's camera when empty
track_primsNoPrims whose state to record, descendants included, e.g. ["/World/G1"]
property_filterNoOnly properties whose names contain one of these, e.g. ["joint", "pos", "vel"]

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_pathsA
Destructive

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.

NameRequiredDescriptionDefault
prim_pathNoThe subtree to update; the whole stage by default/
new_prefixYesWhat to put in its place, e.g. "/World/Materials/"
old_prefixYesThe start of the paths to change, matched as text, e.g. "/OldProject/Materials/"

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
modeNoFor "set": "off", "camera", "stage", or a light rig "get" lists, e.g. "Default"
actionNo"get" the mode, "set" one, or the legacy "set_camera_light"get
enabledNoFor "set_camera_light": turn the camera light on or off

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 20 tool updatesv0.4.1
    • Addedcancel_job
    • Addedcapture_sweep
    • Removeddump_scene
    • Addedget_job
    • Removedget_joint_states
    • Changedget_logs1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"Only messages containing this, in any case"New value: +"Only messages containing this anywhere, in any case"
    • Changedget_mesh_stats1 field changed
      • addedInput schema / properties / max_depth
        Added 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"
        +}
    • Addedget_performance
    • Removedget_prim_face_count_tree
    • Changedget_recording_frame1 field changed
      • changedInput schema / properties / session_dir / description
        Previous 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"
    • Changedget_scene_tree9 fields changed
      • addedInput schema / properties / filter_types
        Added 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"
        +}
      • addedInput schema / properties / include_properties
        Added 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"
        +}
      • addedInput schema / properties / max_depth / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / max_depth / default
        Previous value: -5New value: +null
      • changedInput schema / properties / max_depth / description
        Previous 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"
      • removedInput schema / properties / max_depth / maximum
        Removed value: -15
      • removedInput schema / properties / max_depth / minimum
        Removed value: -0
      • removedInput schema / properties / max_depth / type
        Removed value: -"integer"
      • addedInput schema / properties / property_filter
        Added 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"
        +}
    • Removedlook_at_prim
    • Changednew_scene2 fields changed
      • addedInput schema / properties / meters_per_unit
        Added 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"
        +}
      • addedInput schema / properties / up_axis
        Added 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"
        +}
    • Changedraycast1 field changed
      • changedInput schema / properties / direction / description
        Previous 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"
    • Addedrun_script_job
    • Changedset_camera11 fields changed
      • addedInput schema / properties / azimuth
        Added 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"
        +}
      • addedInput schema / properties / distance
        Added 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"
        +}
      • addedInput schema / properties / elevation
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Degrees above the horizontal; 30 when left out",
        +  "title": "Elevation"
        +}
      • addedInput schema / properties / position / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "type": "number"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / position / default
        Added value: +null
      • changedInput schema / properties / position / description
        Previous value: -"[x, y, z] camera position in world space"New value: +"[x, y, z] where the camera stands, in world space: for a point"
      • removedInput schema / properties / position / items
        Removed value: -{
        -  "type": "number"
        -}
      • removedInput schema / properties / position / type
        Removed value: -"array"
      • addedInput schema / properties / prim_path
        Added value: +{
        +  "default": "",
        +  "description": "A prim to frame instead: the camera aims at the centre of its world box",
        +  "title": "Prim Path",
        +  "type": "string"
        +}
      • changedInput schema / properties / target / description
        Previous 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"
      • removedInput schema / required
        Removed value: -[
        -  "position"
        -]
    • Changedset_physics_properties1 field changed
      • addedInput schema / properties / collision
        Added 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"
        +}
    • Addedset_prim_attribute
    • Changedset_variant_selection2 fields changed
      • addedInput schema / properties / layer
        Added 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"
        +}
      • changedInput schema / properties / variant_name / description
        Previous 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"
    • Changedstart_recording1 field changed
      • changedInput schema / properties / fps / description
        Previous 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"
  2. 22 tool updatesv0.2.3
    • Changedapply_force1 field changed
      • changedInput schema / properties / prim_path / description
        Previous value: -"The rigid body's prim path"New value: +"The rigid body's prim path, a robot's link among them"
    • Changedcapture_viewport3 fields changed
      • changedInput schema / properties / camera_path / description
        Previous 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"
      • changedInput schema / properties / height / description
        Previous value: -"Image height in pixels"New value: +"Image height in pixels, up to 4096; the camera is rendered at this size"
      • changedInput schema / properties / width / description
        Previous value: -"Image width in pixels"New value: +"Image width in pixels, up to 4096; the camera is rendered at this size"
    • Changedclone_prim2 fields changed
      • changedInput schema / properties / count / description
        Previous value: -"How many copies; paths get _001, _002, ..."New value: +"How many copies: one goes to target_path, more to target_path_001, _002, ..."
      • changedInput schema / properties / offset / description
        Previous 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"
    • Changedcreate_prim2 fields changed
      • changedInput schema / properties / position / description
        Previous 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)"
      • changedInput schema / properties / usd_path / description
        Previous 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"
    • Changedcreate_robot1 field changed
      • changedInput schema / properties / position / description
        Previous 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)"
    • Changedcreate_variant_structure1 field changed
      • changedInput schema / properties / default_variant / description
        Previous 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"
    • Changedexport_prim_as_file1 field changed
      • changedInput schema / properties / output_path / description
        Previous 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"
    • Changedflatten_usd2 fields changed
      • changedInput schema / properties / input_path / description
        Previous 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"
      • changedInput schema / properties / output_path / description
        Previous 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"
    • Changedget_recording_frame1 field changed
      • changedInput schema / properties / session_dir / description
        Previous 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"
    • Changedget_scene_tree1 field changed
      • changedInput schema / properties / max_depth / description
        Previous 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"
    • Changedinspect_prim2 fields changed
      • changedInput schema / properties / height / description
        Previous value: -"Image height in pixels"New value: +"Image height in pixels, up to 4096; the camera is rendered at this size"
      • changedInput schema / properties / width / description
        Previous value: -"Image width in pixels"New value: +"Image width in pixels, up to 4096; the camera is rendered at this size"
    • Changedlook_at_prim2 fields changed
      • changedInput schema / properties / azimuth / description
        Previous 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"
      • changedInput schema / properties / distance / description
        Previous 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"
    • Changedmanage_extensions3 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"What to do"New value: +"\"list\" reads; \"enable\" and \"disable\" change the running app"
      • changedInput schema / properties / extension_id / description
        Previous value: -"The extension to enable or disable"New value: +"For \"enable\" and \"disable\", required: the extension, e.g. \"omni.syntheticdata\""
      • changedInput schema / properties / search / description
        Previous value: -"For \"list\": only extensions whose name contains this"New value: +"For \"list\": only extensions whose name or id contains this, in any case"
    • Addedopen_scene
    • Changedraycast3 fields changed
      • changedInput schema / properties / direction / description
        Previous 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"
      • changedInput schema / properties / max_distance / description
        Previous value: -"The longest the ray goes"New value: +"The longest the ray goes, in stage units"
      • changedInput schema / properties / origin / description
        Previous value: -"[x, y, z] start point"New value: +"[x, y, z] start point in world space"
    • Changedsave_scene1 field changed
      • changedInput schema / properties / file_path / description
        Previous 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"
    • Changedset_camera1 field changed
      • changedInput schema / properties / target / description
        Previous value: -"[x, y, z] point to look at"New value: +"[x, y, z] world point to look at; the origin when omitted"
    • Changedset_joint_targets1 field changed
      • changedInput schema / properties / targets / description
        Previous 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"
    • Changedset_physics_properties1 field changed
      • changedInput schema / properties / friction / description
        Previous value: -"Static and dynamic friction coefficient"New value: +"Friction coefficient, set as both static and dynamic friction"
    • Changedset_prim_transform1 field changed
      • changedInput schema / properties / position / description
        Previous 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)"
    • Changedstart_recording3 fields changed
      • changedInput schema / properties / camera_path / description
        Previous 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"
      • changedInput schema / properties / height / description
        Previous value: -"Ignored for now: frames come at the active viewport's size (#25)"New value: +"Frame height in pixels, up to 4096"
      • changedInput schema / properties / width / description
        Previous value: -"Ignored for now: frames come at the active viewport's size (#25)"New value: +"Frame width in pixels, up to 4096"
    • Changedupdate_material_paths2 fields changed
      • changedInput schema / properties / new_prefix / description
        Previous value: -"What to put in its place, e.g. \"/World/Materials\""New value: +"What to put in its place, e.g. \"/World/Materials/\""
      • changedInput schema / properties / old_prefix / description
        Previous 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/\""
  3. 41 tool updatesv0.2.2
    • First observedapply_force
    • First observedcapture_viewport
    • First observedclone_prim
    • First observedcompare_prims
    • First observedcreate_prim
    • First observedcreate_robot
    • First observedcreate_variant_structure
    • First observeddelete_prim
    • First observeddraw_debug
    • First observeddump_scene
    • First observedexecute_script
    • First observedexport_prim_as_file
    • First observedflatten_usd
    • First observedget_joint_states
    • First observedget_logs
    • First observedget_mesh_stats
    • First observedget_prim_bounds
    • First observedget_prim_face_count_tree
    • First observedget_prim_properties
    • First observedget_recording_frame
    • First observedget_robot_info
    • First observedget_scene_tree
    • First observedget_sim_state
    • First observedinspect_prim
    • First observedlook_at_prim
    • First observedmanage_extensions
    • First observednew_scene
    • First observedraycast
    • First observedsave_scene
    • First observedset_camera
    • First observedset_joint_targets
    • First observedset_material
    • First observedset_physics_properties
    • First observedset_prim_transform
    • First observedset_variant_selection
    • First observedset_visibility
    • First observedsim_control
    • First observedstart_recording
    • First observedstop_recording
    • First observedupdate_material_paths
    • First observedviewport_light

TDQS

A4.1/5.0

Scored across 44 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Connects 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.
    21
    32,810
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Facilitates 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.
    17
    1,514
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    42
    40 PyPI
    69
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    1
    MIT