mujoco-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mujoco-mcpload the pendulum sample and step it 100 times with control 0.2"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mujoco-mcp
MCP server that lets clients load, inspect, and control MuJoCo models, with an optional native interactive window. Multiple independent named sessions, compact JSON responses, deterministic stepping, and real-time viewer playback. Supports stdio and Streamable HTTP. Headless use requires no display or GPU.
Use from another project (including KaizenHand)
This repository is the MuJoCo MCP infrastructure, not the consuming application. It provides physics, contact force/torque, per-step force guarding, seeded conditions/noise, trajectory capture, provenance, and full-state snapshots. The other project owns its MJCF model, control FSM/strategies, retry policy, incident storage, approvals, statistics, dashboard, and physical-rig adapter.
make install
make server-headless # HTTP MCP at http://127.0.0.1:8000/mcp
# If another server is already using 8000:
make server-headless PORT=8001 # http://127.0.0.1:8001/mcpConnect with Streamable HTTP, then load your project's model through mujoco_load_model(file_path=...). No preloaded demo or viewer is required. See the external-project integration guide for a runnable client, configuration fields, force semantics, trace/snapshot replay, and scope boundaries. Existing servers must be restarted to expose newly added tools; restarting discards their in-memory sessions.
Related MCP server: UniRoboSim MCP
Connect on this Mac
The project environment is installed in .venv with MuJoCo 3.13.0, matching the installed DMG app. The Python package includes its own engine and native viewer. The MCP server opens a window sharing its model and state; it cannot attach to an already-open standalone MuJoCo.app window. You can use the same XML/MJB model file in either application.
Start the server in a terminal and leave it running:
./start.sh --transport streamable-http --port 8000 --viewer --sample pendulumConnect your MCP client with transport Streamable HTTP and URL http://127.0.0.1:8000/mcp. The repository's .mcp.json already points to this endpoint for clients that read that format. This is an MCP endpoint, not a browser dashboard. It is reachable from clients on this Mac; a cloud-hosted client cannot reach your Mac's loopback address.
The server starts with session main, displaying a paused pendulum. Try these tool calls:
mujoco_list_sessions({})
mujoco_set_running({"session_id":"main","running":true,"ctrl":[0.5]})
mujoco_set_running({"session_id":"main","running":false})
mujoco_step({"session_id":"main","nsteps":100,"ctrl":[0.2]})
mujoco_get_state({"session_id":"main"})Use the MCP play/pause tools for playback. State responses include viewer_open, running, and runtime_error. Closing the window pauses the session but keeps its state available; mujoco_open_viewer reopens it. One window per server is supported; close that viewer before opening another session. Reset pauses playback and clears runtime errors. Sessions are in memory and end when the server stops.
Verify the connection without changing the model:
.venv/bin/python projects/http_client.pyTo use your own model at startup:
./start.sh --transport streamable-http --viewer --model /absolute/path/to/robot.xmlCtrl+C stops the server and closes its viewer. Restart with the same command when needed; no login/background service is installed.
For clients that only support stdio, use projects/mcp-stdio.json. That configuration starts its own independent server and viewer when the client connects. Its absolute launcher path is configured for this checkout; update it if you move the project.
The launcher automatically uses mjpython on macOS, as required by the native passive viewer. The DMG app itself does not need to be running.
Install
uv sync --extra dev # recommended: reproduce the tested environment from uv.lock
# Or install with pip in a Python environment:
pip install . # runtime
pip install -e ".[dev]" # development + testsRequires Python >= 3.10; this checkout selects Python 3.12. Dependencies: mujoco, mcp, numpy. The MCP SDK is constrained to v1 because this server uses FastMCP; v2 has incompatible APIs.
Run
mujoco-mcp # stdio (default)
mujoco-mcp --transport streamable-http --port 8000 # HTTP, binds 127.0.0.1
./start.sh --viewer --sample cartpole # stdio + native viewer on macOS
./start.sh --transport streamable-http --viewer --play # HTTP + playing pendulumTools
Tool | Purpose | Key args |
| Create a session from a model | exactly one of |
| Joints, actuators, sensors, geoms, contact pairs, mocap bodies, options |
|
| Reset to configured experiment start, model default, or keyframe; clear stop/error |
|
| Advance physics, optionally setting ctrl first |
|
| Read state without stepping |
|
| Overwrite qpos / qvel / ctrl / time, then |
|
| Enumerate active sessions | — |
| Free a session |
|
| Display a session in a native MuJoCo window |
|
| Close the window and pause, retaining the model/state |
|
| Play/pause the visible session, optionally update controls |
|
| All external rigid contacts on a body subtree; world force and torque |
|
| Step with force-limit stop and optional trajectory recording |
|
| Set seeded conditions, friction, bias and observation noise; reset |
|
| Compiled-model/config/code hashes, versions, source label |
|
| Capture unrounded full integration state for continuation |
|
| Restore matching model/config/engine state and guard status |
|
Conventions:
Responses are compact JSON strings.
ctrlfollows actuator order. Forqpos/qvel, use joint types andqpos_adr/dof_adrfrommujoco_model_info: free and ball joints occupy multiple entries.ctrlis either a full vector in actuator order or{actuator_name: value}for a subset; it persists on the session until changed.includeselects state blocks:qpos,qvel,ctrl,sensors(the default four),sensors_raw(without configured observation noise),bodies(world-frame pos/quat),contacts(geom pairs, penetration depth, normal force; capped at 20). Wrench/guard calculations use all contacts, not this display cap.precision(default 5) rounds state views. Guarded traces use 9 decimals for state; wrench values and snapshots are unrounded. Use snapshots for exact continuation, not roundedget_stateresults.Batch physics into one call:
nsteps=500is 1 s at the default 0.002 timestep. Avoid step-per-call loops.Pause real-time playback before calling
mujoco_step. Its returned sensors/body poses are recomputed at the final state. Usemujoco_set_running(running=true, ctrl=...)to update controls during playback.Force limits apply only during
mujoco_step_guarded, not ordinary stepping/playback. Once tripped, the stop blocks every stepping path until reset (including experiment reconfiguration) or restoration of a pre-stop snapshot. Detection is at physics-step boundaries and does not guarantee zero overshoot or physical-robot safety.
Bundled samples
Sample | System | Actuators | Keyframes |
| torque-limited pendulum |
|
|
| cart with unactuated pole |
|
|
| planar 2-link arm (gravity-free) with tip site sensor |
| — |
| free box falling onto a plane (contact demo) | — | — |
Embedding in your orchestrator
projects/agent_client.py is a complete working loop: it spawns the server over stdio, loads the cartpole, and balances the pole from sensor feedback through nothing but MCP tool calls. Core pattern:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
params = StdioServerParameters(command="mujoco-mcp")
async with stdio_client(params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = (await session.list_tools()).tools
result = await session.call_tool(
"mujoco_step", {"session_id": "sim1", "nsteps": 500, "ctrl": [0.3]}
)To surface the tools to a Claude (or any tool-calling) model, map them 1:1 and route tool_use back through the session:
anthropic_tools = [
{"name": t.name, "description": t.description, "input_schema": t.inputSchema}
for t in tools
]
result = await session.call_tool(block.name, block.input)
tool_result_content = result.content[0].textErrors come back with isError=true and an actionable message (valid session ids, actuator order, allowed values), so they are safe to feed straight back to the model as tool_result with is_error=true.
Loading your own models
file_path: any MJCF.xml(relative includes/assets resolve normally) or compiled.mjb, resolved on the machine running the server.MuJoCo Menagerie:
git clone https://github.com/google-deepmind/mujoco_menagerie, thenfile_path=".../mujoco_menagerie/franka_emika_panda/scene.xml".xml_string: for models generated on the fly by the agent.
Configuration
Env var | Default | Effect |
| 16 | Max concurrent sessions |
| unset (any path) | Colon-separated allowlist of directories |
Claude Code / Claude Desktop
For Claude Code, the project's .mcp.json connects to the running HTTP server:
{"mcpServers":{"mujoco":{"type":"http","url":"http://127.0.0.1:8000/mcp"}}}For stdio clients such as Claude Desktop, copy the mujoco entry from projects/mcp-stdio.json into the client's MCP configuration. The client then launches its own server; the manually started HTTP server is not used. The launcher uses absolute paths, so it works even if the client starts in a different directory.
Notes
Deterministic manual stepping: same model + same reset + same ctrl/step sequence reproduces the trajectory. Real-time playback uses wall-clock scheduling and is not a deterministic control interface.
Divergence (non-finite state) is detected after stepping and returned as an error with recovery guidance instead of NaN payloads.
State lives in server memory; run one server process per trusted consumer. stdio has no auth; streamable HTTP binds
127.0.0.1— put a reverse proxy with auth in front before exposing it.
Tests
.venv/bin/python -m pytest
# Opens actual native windows; requires a logged-in desktop:
MUJOCO_MCP_TEST_VIEWER=1 .venv/bin/python -m pytest tests/test_viewer_integration.pyCovers every tool, error paths (unknown session/actuator/keyframe, wrong vector lengths, divergence, path allowlist), determinism, contact-force sanity, and an end-to-end stdio client session. Viewer checks cover shared state, real-time play/pause, window closure, session cleanup, and automatic pause on instability. The opt-in GUI integration test exercises the actual native window over MCP, including closing and reopening it.
Experiment tests cover seeded noise, atomic configuration, geom/pair friction, actuator bias, mocap poses, full-state snapshot continuation, non-cancelling contact loads, force-stop latching, and bounded trace sampling. Both stdio and an isolated HTTP server are exercised. A 100-trial headless box-drop batch checks transport and physics plumbing; it is not evidence that an external connector model or recovery strategy has been validated.
Available Tools
17 toolsmujoco_close_sessionADestructive
Close a session and free its model and data. The session_id becomes invalid immediately.
Returns JSON: {closed, remaining: [session_ids]}.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful side-effect details beyond the annotations: it frees model and data, invalidates the session_id, and returns a JSON shape with remaining sessions. This is consistent with destructiveHint=true and idempotentHint=false, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: action and consequence first, invalidation note second, return format third. Every sentence contributes useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter destructive cleanup tool, this description covers the action, side effects, and return shape sufficiently. The explicit JSON return format is especially helpful since the output schema is not fully available in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the session_id parameter. It does show the parameter in context and states it becomes invalid, which adds some meaning, but it does not explain where a valid session_id comes from or its expected format. The single-parameter context makes this moderate rather than severe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Close a session and free its model and data.' It clearly distinguishes this from close_viewer and session-listing tools by focusing on session lifetime and resource cleanup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: close a session to release its model and data, with the warning that the session_id becomes invalid immediately. It does not explicitly name an alternative or exclusion, but the object and effect are unambiguous enough to guide selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_close_viewerAIdempotent
Close this session's window and pause playback, keeping its state loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover idempotency and non-destructiveness; the description adds the behavioral detail that playback is paused and state remains loaded. It aligns with annotations and adds value beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the main action and packs the two key behavioral consequences (pause playback, keep state loaded) with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, non-destructive, idempotent operation with an output schema, the description covers the essential behavior. It omits edge cases such as closing a viewer that is already closed, but the complexity is low and annotations cover the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented session_id parameter. It only implies the session via 'this session's window' and does not explain what session_id is, where to obtain it, or any format constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action — closing the current session's window — and immediately differentiates it from closing the whole session by noting the state stays loaded. It also clarifies 'pause playback', which leaves no ambiguity about what closing the viewer does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'keeping its state loaded' signals when to prefer this over the sibling mujoco_close_session, giving clear context without naming the alternative explicitly. There is no explicit when-not-to-use guidance, so it stops 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.
mujoco_configure_experimentADestructiveIdempotent
Configure generic trial conditions and reset to the realized seeded start.
Close viewer first. Supports named geom friction [sliding,torsional,rolling],
named explicit pair_friction [sliding1,sliding2,torsional,rolling1,rolling2],
hinge/slide initial joint_offsets and Gaussian joint_noise_std (rad/m), mocap
body poses (m, wxyz), additive ctrl_bias in actuator input units, and named
sensor_noise_std in each sensor's units. Noise affects observations only;
physical state and force guarding remain raw. Missing options return to model
defaults. Repeating the same config reproduces initial conditions. metadata
stores caller tags such as trial_id/param_version, without enforcing policy.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly supplements the annotations by explaining that noise affects observations only, physical state and force guarding remain raw, missing options return to defaults, and metadata is not policy-enforced. It also clarifies the destructive reset action implied by destructiveHint: true. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient, with the core purpose front-loaded and every subsequent sentence adding operational or behavioral value. It avoids repetition and gets an extreme amount of useful information into a compact space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers preconditions (close viewer), all major configurable categories, noise behavior, idempotence, defaults, and metadata semantics. An output schema exists, so return-value documentation is not a gap. This is complete enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds substantial meaning beyond the schema: units for joint offsets and noise (rad/m), mocap poses in meters and wxyz quaternions, ctrl_bias in actuator input units, and sensor noise in sensor-specific units. It also defines the semantics of key config fields such as metadata, force guarding, and reproducibility, which the raw schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Configure generic trial conditions and reset to the realized seeded start.' This clearly distinguishes the tool from siblings like mujoco_reset or mujoco_set_state, since it both configures and resets in one operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete operational guidance such as 'Close viewer first', explains when options are omitted ('Missing options return to model defaults'), and clarifies that repeated configs reproduce initial conditions. It does not explicitly name alternative tools or state when not to use it, so it stops 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.
mujoco_get_provenanceARead-onlyIdempotent
Return compiled-model SHA-256, engine/server versions, code hash and experiment config.
Source label is always sim. The consuming project supplies its own strategy, parameter version and code commit; arbitrary caller tags are metadata only.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, and destructive=false, so the safety profile is covered. The description adds valuable context: 'Source label is always sim' and clarifies that caller tags are metadata only, explaining what data is meaningful. It also enumerates the returned fields, giving the agent expectations beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core functionality. The additional sentences about source label and caller tags are directly relevant and not padding. Every sentence earns its place with no redundancy or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (which likely documents the return values), the description sufficiently summarizes the output content and nuances like source label and tag handling. However, the missing documentation of the session_id parameter leaves a minor gap in completeness, as the agent may not know how to construct a valid request without external context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention the session_id parameter at all, and the schema provides no description (coverage 0%). The agent must infer that session_id refers to the simulation session from context clues, but the description fails to explicitly define its role or format, which is a significant gap for a required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: 'compiled-model SHA-256, engine/server versions, code hash and experiment config.' This clearly identifies the resource and action, and distinguishes it from sibling tools like get_state or model_info, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving provenance of a compiled simulation, clearly differentiating it from state or control tools. However, it does not explicitly name alternatives or conditions for when not to use it, so it falls short of a 5 but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_get_snapshotARead-onlyIdempotent
Get unrounded mjSTATE_INTEGRATION plus step/noise counters and guard status.
Includes act, warm-start, applied forces, mocap and other integration inputs,
beyond qpos/qvel. Persist this JSON in your project. Pause before capture.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context beyond that: values are unrounded, internal counters and guard status are included, and the snapshot must be taken while paused. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each earning its place: the first front-loads scope, the second enumerates contents, and the last two give capture/storage guidance. There is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return shape, the annotations cover safety, and the description covers content, precision, and the need to pause. For a one-parameter snapshot tool, this is enough for an agent to invoke it correctly without missing critical context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description never mentions session_id or explains how to obtain it. With low coverage, the description was expected to compensate for the parameter semantics, and it does not. The single self-explanatory 'Session Id' property limits the practical harm, but the gap remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise verb and resource: 'Get unrounded mjSTATE_INTEGRATION plus step/noise counters and guard status.' It also distinguishes itself from the sibling get_state-like tools by saying the snapshot goes 'beyond qpos/qvel.' An agent can tell exactly what this tool returns without opening the output schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear capture context: persist the JSON and pause before capture, which tells an agent when snapshotting is valid. It does not explicitly name alternatives like mujoco_get_state or mujoco_restore_snapshot, so the when-not-to-use guidance is mostly implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_get_stateARead-onlyIdempotent
Read the current state of a session without advancing physics.
Returns JSON with the requested blocks: qpos/qvel/ctrl (vectors in model order),
sensors ({name: value}), bodies ({name: {pos, quat}} world-frame), contacts
({ncon, listed, contacts: [{geom1, geom2, pos, dist, normal_force}]}, capped at 20).
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | State blocks to return, any of: qpos, qvel, ctrl, sensors, sensors_raw, bodies, contacts (default: qpos, qvel, ctrl, sensors) | |
| precision | No | Decimal places for returned floats | |
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds substantial behavioral context beyond these: it specifies the return format (JSON blocks), the cap of 20 contacts, world-frame coordinates for bodies, and the exact shape of sensor/body/contact data. This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that front-loads the core purpose and then enumerates output blocks. Every clause carries useful information—no filler, no repetition of schema content. It is concise yet comprehensive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only, idempotent nature (covered by annotations) and the detailed description of all possible return blocks, limits, and coordinate frames, the description covers everything an agent needs to call the tool correctly. It also notes the contact cap, addressing potential data volume concerns. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 67% of parameters with descriptions (include and precision). The description indirectly clarifies the 'include' parameter by detailing what each block (qpos, qvel, ctrl, sensors, bodies, contacts) returns, helping the agent choose values. However, it does not add explicit syntax or format details for the parameters themselves, so it does not fully exceed the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Read the current state of a session') and explicitly notes it does not advance physics, distinguishing it from step or set_state tools. It also lists the exact data blocks returned, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without advancing physics' provides clear context for when to use this tool (inspection rather than simulation advancement) but does not explicitly name alternatives or state when not to use it. The guidance is implicit rather than explicit, so it falls just 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.
mujoco_get_wrenchARead-onlyIdempotent
Measure ALL external contacts on a non-world body and its descendants.
Raw resultant force (N) and torque (N m) are in world axes. Torque is about
the requested body's origin. force_N sums contact magnitudes (opposing forces
do not cancel). This is contact-only, not a general wrist F/T sensor.
observed_force_xyz_N adds configured noise; raw force and guard stay unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| body_name | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description goes well beyond that by disclosing world-axis units, torque origin, the sum-of-magnitudes behavior that prevents cancellation, and the distinction between noisy observed force and unchanged raw force/guard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose, followed by only high-value behavioral details. Every sentence contributes either scope, units, axis conventions, or noise behavior, with no redundant repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only measurement tool, the description covers scope, units, coordinate frames, torque reference point, sum semantics, and noise behavior. The output schema exists and can carry return-value field details, so the description is sufficiently complete for an agent to decide when and how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions, so the description must compensate. It adds real meaning to body_name: the requested body must be non-world, and torque is about its origin. However, session_id is left entirely implicit, so one of the two required parameters still lacks explicit semantic coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair: 'Measure ALL external contacts on a non-world body and its descendants.' It clearly defines the scope of the measurement and explicitly contrasts itself with a general wrist F/T sensor, making it easy to distinguish from sibling state and model tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use it to measure external contact wrenches, and explicitly warns that it is contact-only, not a general wrist F/T sensor. It does not name alternative sibling tools for the 'when not to use' case, so it stops just short of fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_list_sessionsARead-onlyIdempotent
List all active simulation sessions.
Returns JSON: {count, sessions: [{session_id, source, time, steps_taken, nq, nu}]}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds the 'active-only' scope and the response shape, but the response shape is presumably covered by the output schema, so the incremental behavioral disclosure is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with the core purpose front-loaded and the response shape immediately following. There is no filler, restatement of the schema, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only listing tool, the description is nearly complete: it states the scope and response format, and annotations cover side-effect safety. However, it does not define what makes a session 'active' or mention any prerequisites, which would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The baseline of 4 applies because the description does not need to compensate for any undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a well-scoped resource ('all active simulation sessions'). No sibling tool performs this exact operation, so an agent can distinguish it immediately from state getters, snapshots, and session controls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose statement implies when to call it—whenever the agent needs to enumerate active sessions—but it gives no explicit guidance, exclusions, or alternatives. It does not say, for example, when to use get_snapshot or close_session instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_load_modelA
Load a MuJoCo model into a new simulation session. Provide exactly ONE of sample | file_path | xml_string.
Returns JSON: {session_id, source, nq, nv, nu, nsensor, nkey, timestep,
joints: [names], actuators: [names], sensors: [names], keyframes: [names]}.
The name arrays define the element order of qpos/qvel/ctrl vectors used by every other tool.
Next: mujoco_step to advance physics, mujoco_get_state to read, mujoco_model_info for ranges/types.
| Name | Required | Description | Default |
|---|---|---|---|
| sample | No | Bundled sample scene: pendulum, cartpole, arm2, box_drop | |
| file_path | No | Path to an MJCF .xml (or compiled .mjb) on the machine running this server, e.g. a mujoco_menagerie scene.xml | |
| session_id | No | Explicit session id (letters, digits, '_', '-', '.'); auto-generated when omitted | |
| xml_string | No | Raw MJCF XML document |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations are uninformative; the description carries the burden. It discloses the new-session side effect, the exclusive-input requirement, the full JSON return shape, and the crucial fact that the returned name arrays define qpos/qvel/ctrl ordering for all other tools. It does not discuss failure/validation behavior or repeated-call consequences, but the provided behavioral context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: core action, input constraint, return contract, ordering implication, and next-step routing. It is front-loaded with the core purpose and keeps the detail compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to call the tool successfully: it states what to provide, what comes back, how to interpret the returned arrays, and which tools to use next. The richer return details also compensate for any ambiguity in the schema-only view.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description adds the essential constraint "exactly ONE of sample | file_path | xml_string," which is not captured by the optional/required schema fields. It also explains the downstream meaning of the returned names in terms of vector ordering.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: "Load a MuJoCo model into a new simulation session." The phrase "new simulation session" distinguishes this from state-restoration and inspection siblings, and the explicit source options add operational precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual guidance: use it to create a new session, and exactly one of sample, file_path, or xml_string must be supplied. It also routes the agent to subsequent tools. It does not explicitly say when to prefer this over mujoco_restore_snapshot, but the "new simulation session" wording covers the main distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_model_infoARead-onlyIdempotent
Detailed structure of a loaded model: joint types/ranges, actuator ctrlranges, sensors, bodies, options.
Returns JSON: {session_id, source, sizes: {nq, nv, nu, na, nbody, njnt, ngeom, nsensor, nkey},
options: {timestep, gravity, integrator},
joints: [{name, type, range|null, qpos_adr, dof_adr}],
actuators: [{name, ctrlrange|null, gear}],
sensors: [{name, type, dim}], bodies: [names], keyframes: [names]}.
Use before choosing ctrl values (respect ctrlrange) or interpreting qpos/qvel layout.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the output JSON structure and usage advice, which is helpful but does not go beyond what annotations already establish. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: a one-line summary followed by the JSON return structure. It is front-loaded with the purpose and the detailed structure is useful for an info tool. No waste, though the JSON block is somewhat lengthy but necessary for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description provides a complete JSON structure in text, covering all returned fields. It also gives usage context. The tool is simple and the description is sufficient for an agent to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter is session_id, which is self-explanatory from its name and type (string). Schema coverage is 0%, but the description does not elaborate on session_id, nor does it need to given its simplicity. The baseline of 3 applies because the parameter is trivial and the name is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides detailed structure of a loaded model, listing joint types/ranges, actuator ctrlranges, sensors, bodies, and options. This verb+resource combination is specific and distinguishes it from siblings like mujoco_get_state (which deals with state values) and mujoco_step (simulation). The annotation title 'Inspect model structure' reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use before choosing ctrl values (respect ctrlrange) or interpreting qpos/qvel layout.' This tells the agent when to call this tool, but it does not explicitly mention alternatives or exclusions. However, the intended use case is clear, and the read-only nature is implied by the tool type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_open_viewerAIdempotent
Open a native MuJoCo window sharing this session's model and state.
Starts paused; call mujoco_step or mujoco_set_running next. One window per
server: close the current viewer before displaying another session. This
opens a new controlled window; it does not attach to the standalone DMG app.
On macOS launch the server via start.sh or mjpython.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the window starts paused, there is a one-window-per-server constraint, and it does not attach to the standalone app. It also mentions macOS launch requirements. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose is in the first sentence, followed by essential usage constraints and platform notes. Every sentence earns its place, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple input schema (one required parameter) and an output schema exists, so the description doesn't need to explain return values. The description covers the key behavioral constraints (paused start, one-window limit, standalone app distinction, macOS launch). It could explicitly state that session_id is the session to open, but the overall context is sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single parameter session_id. The description mentions 'this session's model and state' but does not explicitly explain that session_id identifies which session's model/state to display. However, with only one parameter and a clear name, the meaning is largely inferable. The description adds some context but not a full parameter explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Open') and resource ('native MuJoCo window sharing this session's model and state'), and distinguishes it from the standalone DMG app. It clearly identifies what the tool does and is distinct from siblings like mujoco_close_viewer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Starts paused; call mujoco_step or mujoco_set_running next' and 'One window per server: close the current viewer before displaying another session.' It also tells the user what not to do ('does not attach to the standalone DMG app') and gives platform-specific launch instructions. This is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_resetAIdempotent
Reset a session to its initial state (or a named keyframe) and zero the step counter.
Without a keyframe, restores the configured seeded start (if any), else model defaults.
Clears force guard and runtime errors. Identical full states and control sequences
reproduce trajectories with the same model, engine and stepping schedule.
Returns the post-reset state JSON (same shape as mujoco_get_state).
| Name | Required | Description | Default |
|---|---|---|---|
| keyframe | No | Keyframe name or index; omit for the configured experiment start, or model default | |
| precision | No | Decimal places for returned floats | |
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotentHint annotation, the description adds meaningful behavior: it zeros the step counter, clears force guard/runtime errors, restores the seeded start when present, and promises deterministic trajectory reproduction. It also states the return contract (same shape as mujoco_get_state). No contradiction with readOnlyHint=false or destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and every sentence contributes behavior or return information. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a reset operation with an output schema and clear annotations, the description covers side effects, determinism, keyframe behavior, and return shape. The main gap is the lack of explicit guidance on when reset should be preferred over snapshot restore or set_state, but this is not essential to invoking it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description adds value by specifying what happens without a keyframe (configured seeded start vs model defaults) and clarifying keyframe selection. Precision and session_id are already adequately documented in the schema, so the description need not repeat them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific action and resource ('Reset a session to its initial state (or a named keyframe) and zero the step counter'). This clearly differentiates it from siblings like mujoco_set_state or mujoco_restore_snapshot, which restore arbitrary or previously captured states rather than the session's initial/keyframe state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the behavior for keyframe vs no-keyframe calls, which implies when reset is useful, but it never explicitly says when to choose reset over restore_snapshot, set_state, or configure_experiment. No alternatives or exclusions are named, so the guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_restore_snapshotADestructiveIdempotent
Restore a paused session; requires identical compiled model, config and engine version.
Restores exact integration state, step/noise counters and guard status. A snapshot taken before a force stop clears the latch; a tripped one retains it.
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds meaningful behavioral context: it restores exact integration state, step/noise counters, and guard status, and explains how the guard latch behaves across force-stop vs tripped snapshots. This goes beyond the annotations and helps the agent predict side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core action and precondition, and the second adds the most important behavioral nuance about guard latch behavior. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a restore operation with a nested snapshot object, no output schema, and destructive annotations), the description covers the critical preconditions and behavioral consequences. It could be more complete by explaining what happens to the current session state or whether the session must be paused vs. any state, but the essential information for safe invocation is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only explains the snapshot's role at a high level ('restores exact integration state, step/noise counters and guard status') and does not explain session_id semantics or the snapshot fields' meaning. The schema itself is fairly rich with field names and types, so the baseline is 3, but the description adds little parameter-level detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Restore') and resource ('a paused session'), and adds the key precondition that the compiled model, config, and engine version must be identical. It distinguishes itself from siblings like mujoco_get_snapshot and mujoco_set_state by focusing on restoring a full snapshot into a paused session, though it doesn't explicitly name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when a session is paused and a snapshot exists, and it warns that the model/config/engine must match. It does not explicitly state when not to use it or name alternatives, but the precondition and 'paused session' context provide solid usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_set_runningAIdempotent
Play/pause the visible session at approximately real-time speed.
Open a viewer first. Optional ctrl changes persist; this can update controls
during playback. Pause before deterministic mujoco_step calls. Closing the
window or resetting pauses playback. Instability pauses automatically and
appears in runtime_error; call mujoco_reset to recover.
| Name | Required | Description | Default |
|---|---|---|---|
| ctrl | No | Actuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed. | |
| running | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, idempotentHint true), the description discloses that ctrl changes persist, playback can be updated live, closing the window or resetting pauses playback, and instability auto-pauses with recovery via mujoco_reset. No contradiction with annotations; it adds substantial behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact paragraph with a front-loaded purpose, followed by tightly packed behavioral notes. Every sentence adds unique, non-redundant information without fluff, making it efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (play/pause with live ctrl updates and error recovery), the description covers prerequisites, timing, side effects, and recovery. It even references the output mechanism (runtime_error) and pairs with an output schema, so return details are not needed here. No critical usage context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only ctrl has a description). The description does not explicitly explain running or session_id, though running is implied by 'play/pause' and session_id is a standard identifier. It adds value for ctrl by noting persistence, but fails to fully compensate for the low schema coverage on the other two parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Play/pause the visible session at approximately real-time speed,' specifying the action and resource. It distinguishes itself from siblings like mujoco_step (single-step) and mujoco_reset (recovery) by focusing on the play/pause control of the viewer session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a prerequisite ('Open a viewer first') and a key usage condition ('Pause before deterministic mujoco_step calls'), and explicitly routes to mujoco_reset for recovery from instability. It doesn't explicitly enumerate all alternative tools, but the context given is actionable and sufficient for common scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_set_stateAIdempotent
Overwrite parts of a session's state (qpos, qvel, ctrl, time), then recompute derived quantities.
Only provided fields change. Runs mj_forward so sensors/body poses reflect the new state
without advancing time. Returns the resulting state JSON. Useful for setting initial
conditions or visual replay. Use snapshots, not rounded state views, for exact continuation.
| Name | Required | Description | Default |
|---|---|---|---|
| ctrl | No | Actuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed. | |
| qpos | No | Full generalized positions, length nq; free-joint quaternions must be unit norm | |
| qvel | No | Full generalized velocities, length nv | |
| time | No | Override simulation clock (seconds) | |
| precision | No | Decimal places for returned floats | |
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical mechanics: only provided fields change, mj_forward runs so derived quantities update, time does not advance, and the resulting state JSON is returned. The idempotentHint and non-destructive annotations are consistent with the description, and the partial-update detail is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then adds compact, high-value behavioral and usage notes. Every sentence earns its place; there is no repeated schema content or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return shape is already covered. The description supplies the remaining context an agent needs: how the state overwrite behaves, how derived quantities are recomputed, why time is unaffected, and when to prefer snapshots instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 83% and the parameter descriptions are already detailed. The description adds the crucial partial-update semantic ('Only provided fields change') and hints at precision behavior with 'rounded state views.' It doesn't elaborate on session_id, but that parameter is self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Overwrite parts of a session's state' with qpos, qvel, ctrl, and time listed. It also differentiates from the snapshot-restore sibling by noting that snapshots, not rounded state views, should be used for exact continuation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says this is 'useful for setting initial conditions or visual replay' and gives a clear when-not instruction: 'Use snapshots, not rounded state views, for exact continuation.' This routes the agent away from an inappropriate use case and toward the sibling restore_snapshot behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_stepA
Advance the simulation. Optionally set actuator controls first; ctrl persists across later steps.
Returns the post-step state JSON: {session_id, time, steps_taken, qpos, qvel, ctrl, sensors, ...}
filtered by `include`. Batch steps in one call (e.g. nsteps=500 for 1s at timestep 0.002)
instead of many single-step calls. Errors and suggests mujoco_reset if the state diverges.
| Name | Required | Description | Default |
|---|---|---|---|
| ctrl | No | Actuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed. | |
| nsteps | No | Physics steps to advance; simulated time = nsteps * timestep | |
| include | No | State blocks to return, any of: qpos, qvel, ctrl, sensors, sensors_raw, bodies, contacts (default: qpos, qvel, ctrl, sensors) | |
| precision | No | Decimal places for returned floats | |
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only four all-false hints in the annotations, the description carries the behavioral burden and delivers: ctrl persistence across subsequent steps, the error-and-suggest behavior ("suggests mujoco_reset if the state diverges"), and the performance characteristic of batching. This is meaningful context beyond the structured annotation fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with zero filler: the first states the core action, the second the persistence trait, the third the return shape, and the fourth batching plus error recovery. The strongest detail is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format details are mostly handled externally, and the description covers the key call patterns (optional ctrl, batched nsteps, include filtering, divergence recovery). The main omission is the relationship to mujoco_step_guarded, which keeps this from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents most parameters. The description adds real interpretive value for nsteps (batching to reach a 1s simulation) and include (filtering the returned state), but ctrl persistence is already stated in the schema, and precision is left for the schema to carry. Net addition is modest, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Advance the simulation" is a crisp verb+resource statement, and the description further scopes the tool by noting optional control-setting plus the returned state. However, it never distinguishes itself from the near-identical sibling mujoco_step_guarded, so an agent must infer the difference from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete in-tool guidance ("Batch steps in one call... instead of many single-step calls") with a worked example tying nsteps to simulated time. But it does not explicitly say when to choose this tool over alternatives such as mujoco_step_guarded or mujoco_set_state, leaving tool-selection guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mujoco_step_guardedA
Advance a paused session, measuring all contacts after every physics step.
Stops at the first force-limit exceedance. guard.peak_force_N is the maximum
summed contact load on body_name (including descendants); opposite contact
forces do not cancel. World-frame resultant force and torque are also returned.
The guard detects an exceedance, it cannot guarantee zero overshoot. No hard
real-time or physical safety certification is implied. A tripped session is
latched until reset or snapshot restore. Optional record_every samples a JSON
trace every N steps (0 disables; maximum 2000 frames). Initial, terminal and
trip states are always captured; peak_force_N tracks all steps, not samples.
Persist returned trace/provenance in the consuming project for replay/evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| ctrl | No | Actuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed. | |
| nsteps | No | ||
| body_name | Yes | ||
| session_id | Yes | ||
| force_limit | Yes | ||
| record_every | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral nuances beyond the annotations: the guard cannot guarantee zero overshoot, no safety certification, latching until reset/restore, sampling behavior (record_every, max 2000 frames), and that peak_force_N tracks all steps not just samples. These details are not in the annotations and are essential for correct usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, front-loading the core action and guard behavior. Each sentence adds unique value (overshoot, latching, sampling, persistence). It is longer than minimal but not verbose; the structure keeps the most important behavior first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (force guard, sampling, latching) and the presence of an output schema, the description covers all essential usage aspects: when it stops, what peak_force_N means, trip latching, sampling details, and persistence guidance. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at only 17%, the description compensates by explaining the meaning of record_every (sampling trace, max 2000 frames), ctrl persistence, and the semantics of peak_force_N (summed contact load, no cancellation). However, it does not elaborate on nsteps or force_limit beyond what titles imply, and there is a minor discrepancy (schema max 10000 for record_every vs description's 2000) that could confuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Advance a paused session, measuring all contacts after every physics step' and specifies the stopping condition ('Stops at the first force-limit exceedance'). It distinguishes itself from the sibling mujoco_step by adding the force guard, making the verb+resource+differentiator explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context (advancing a paused session, guard behavior) but does not explicitly compare with alternatives like mujoco_step or state when the unguarded version is preferable. The existence of a sibling tool is implied but not referenced, so an agent must infer the differentiation.
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.
17 tool updates
v0.1.0- First observed
mujoco_close_session - First observed
mujoco_close_viewer - First observed
mujoco_configure_experiment - First observed
mujoco_get_provenance - First observed
mujoco_get_snapshot - First observed
mujoco_get_state - First observed
mujoco_get_wrench - First observed
mujoco_list_sessions - First observed
mujoco_load_model - First observed
mujoco_model_info - First observed
mujoco_open_viewer - First observed
mujoco_reset - First observed
mujoco_restore_snapshot - First observed
mujoco_set_running - First observed
mujoco_set_state - First observed
mujoco_step - First observed
mujoco_step_guarded
TDQS
Scored across 17 tools
Each tool maps to a distinct responsibility: session lifecycle, model inspection, stepping, state access, snapshots, viewer control, contact measurement, experiment configuration, and provenance. Even the paired tools like step/step_guarded and get_state/get_snapshot are clearly separated by their exact purpose and behavior.
All tools consistently use the mujoco_ prefix with a clear snake_case verb_noun pattern (load_model, get_state, close_session, set_running, restore_snapshot). There are no mixed naming conventions or vague generic verbs.
17 tools is slightly above the typical well-scoped range, but the count is justified by the breadth of the domain: session management, physics stepping, state access, snapshot handling, viewer control, and experiment configuration. A few tools could potentially be consolidated, but none feel redundant.
The tool set covers the full simulation lifecycle: load, inspect, step, read/write state, reset, snapshot/restore, run experiments, measure contacts, and close sessions. It also includes reproducibility-oriented tools like provenance and snapshots, so agents can execute and evidence a complete MuJoCo workflow without obvious dead ends.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
QuLab MCP remote server (Streamable HTTP) for computational science and lab tools.
Remote MCP server exposing SMI Aware tools, resources, and skills over Streamable HTTP.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for AI agents to drive Gazebo / gz-sim simulation, with offline mock mode for CI/demos.4MIT
- FlicenseNot gradedqualityBmaintenanceMCP server exposing UniRoboSim evidence, simulation state, camera images, and optional explicit control of owned simulation sessions.-
- FlicenseNot gradedqualityBmaintenanceEnables external clients to spawn, control, observe, and terminate isolated AI coding agent sessions over MCP via stdio or Streamable HTTP, with scoped chip datasheet knowledge-base retrieval.-
- FlicenseAqualityCmaintenanceEnables an MCP-capable desktop client to inspect canvas state and action schemas, execute design edits and submissions, and read rewards from a deterministic design-canvas environment over stdio.5-