Skip to main content
Glama
Lecoeurdelest

mujoco-mcp

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/mcp

Connect 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 pendulum

Connect 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.py

To use your own model at startup:

./start.sh --transport streamable-http --viewer --model /absolute/path/to/robot.xml

Ctrl+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 + tests

Requires 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 pendulum

Tools

Tool

Purpose

Key args

mujoco_load_model

Create a session from a model

exactly one of sample | file_path | xml_string; optional session_id

mujoco_model_info

Joints, actuators, sensors, geoms, contact pairs, mocap bodies, options

session_id

mujoco_reset

Reset to configured experiment start, model default, or keyframe; clear stop/error

session_id, keyframe (name or index)

mujoco_step

Advance physics, optionally setting ctrl first

session_id, nsteps (1–100000), ctrl, include, precision

mujoco_get_state

Read state without stepping

session_id, include, precision

mujoco_set_state

Overwrite qpos / qvel / ctrl / time, then mj_forward

session_id, qpos, qvel, ctrl, time

mujoco_list_sessions

Enumerate active sessions

mujoco_close_session

Free a session

session_id

mujoco_open_viewer

Display a session in a native MuJoCo window

session_id

mujoco_close_viewer

Close the window and pause, retaining the model/state

session_id

mujoco_set_running

Play/pause the visible session, optionally update controls

session_id, running, ctrl

mujoco_get_wrench

All external rigid contacts on a body subtree; world force and torque

session_id, body_name

mujoco_step_guarded

Step with force-limit stop and optional trajectory recording

session_id, body_name, force_limit (N), nsteps (1–10000), ctrl, record_every

mujoco_configure_experiment

Set seeded conditions, friction, bias and observation noise; reset

session_id, config

mujoco_get_provenance

Compiled-model/config/code hashes, versions, source label

session_id

mujoco_get_snapshot

Capture unrounded full integration state for continuation

session_id

mujoco_restore_snapshot

Restore matching model/config/engine state and guard status

session_id, snapshot

Conventions:

  • Responses are compact JSON strings. ctrl follows actuator order. For qpos/qvel, use joint types and qpos_adr/dof_adr from mujoco_model_info: free and ball joints occupy multiple entries.

  • ctrl is either a full vector in actuator order or {actuator_name: value} for a subset; it persists on the session until changed.

  • include selects 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 rounded get_state results.

  • Batch physics into one call: nsteps=500 is 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. Use mujoco_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

pendulum

torque-limited pendulum

hinge_motor

down, up

cartpole

cart with unactuated pole

slide_motor

balanced, tilted

arm2

planar 2-link arm (gravity-free) with tip site sensor

shoulder_motor, elbow_motor

box_drop

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].text

Errors 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, then file_path=".../mujoco_menagerie/franka_emika_panda/scene.xml".

  • xml_string: for models generated on the fly by the agent.

Configuration

Env var

Default

Effect

MUJOCO_MCP_MAX_SESSIONS

16

Max concurrent sessions

MUJOCO_MCP_MODEL_ROOTS

unset (any path)

Colon-separated allowlist of directories file_path may load from

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

Covers 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 tools
mujoco_close_sessionA
Destructive

Close a session and free its model and data. The session_id becomes invalid immediately.

Returns JSON: {closed, remaining: [session_ids]}.
ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

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

Usage Guidelines4/5

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_viewerA
Idempotent

Close this session's window and pause playback, keeping its state loaded.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

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

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_experimentA
DestructiveIdempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
configYes
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

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

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

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

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_snapshotA
Read-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.
ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON 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, 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_stateA
Read-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).
ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoState blocks to return, any of: qpos, qvel, ctrl, sensors, sensors_raw, bodies, contacts (default: qpos, qvel, ctrl, sensors)
precisionNoDecimal places for returned floats
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_wrenchA
Read-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.
ParametersJSON Schema
NameRequiredDescriptionDefault
body_nameYes
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_sessionsA
Read-onlyIdempotent

List all active simulation sessions.

Returns JSON: {count, sessions: [{session_id, source, time, steps_taken, nq, nu}]}.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

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

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
sampleNoBundled sample scene: pendulum, cartpole, arm2, box_drop
file_pathNoPath to an MJCF .xml (or compiled .mjb) on the machine running this server, e.g. a mujoco_menagerie scene.xml
session_idNoExplicit session id (letters, digits, '_', '-', '.'); auto-generated when omitted
xml_stringNoRaw MJCF XML document

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

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

Purpose5/5

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.

Usage Guidelines4/5

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_infoA
Read-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.
ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON 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=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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_viewerA
Idempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_resetA
Idempotent

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
keyframeNoKeyframe name or index; omit for the configured experiment start, or model default
precisionNoDecimal places for returned floats
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_snapshotA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
snapshotYes
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_runningA
Idempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctrlNoActuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed.
runningYes
session_idYes

Output Schema

ParametersJSON 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 (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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_stateA
Idempotent

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctrlNoActuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed.
qposNoFull generalized positions, length nq; free-joint quaternions must be unit norm
qvelNoFull generalized velocities, length nv
timeNoOverride simulation clock (seconds)
precisionNoDecimal places for returned floats
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

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

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctrlNoActuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed.
nstepsNoPhysics steps to advance; simulated time = nsteps * timestep
includeNoState blocks to return, any of: qpos, qvel, ctrl, sensors, sensors_raw, bodies, contacts (default: qpos, qvel, ctrl, sensors)
precisionNoDecimal places for returned floats
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/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-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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctrlNoActuator controls: full vector in actuator order, or {actuator_name: value} for a subset. Persists on the session until changed.
nstepsNo
body_nameYes
session_idYes
force_limitYes
record_everyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 17 tool updatesv0.1.0
    • First observedmujoco_close_session
    • First observedmujoco_close_viewer
    • First observedmujoco_configure_experiment
    • First observedmujoco_get_provenance
    • First observedmujoco_get_snapshot
    • First observedmujoco_get_state
    • First observedmujoco_get_wrench
    • First observedmujoco_list_sessions
    • First observedmujoco_load_model
    • First observedmujoco_model_info
    • First observedmujoco_open_viewer
    • First observedmujoco_reset
    • First observedmujoco_restore_snapshot
    • First observedmujoco_set_running
    • First observedmujoco_set_state
    • First observedmujoco_step
    • First observedmujoco_step_guarded

TDQS

A4.3/5.0

Scored across 17 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers