Skip to main content
Glama
Tibe31

so101-mcp

so101-mcp

CI License: MIT

Asking Cursor to open and close the gripper of a SO-101 arm through so101-mcp

Cursor asks the arm, through so101-mcp, to open and close the gripper.

An MCP server that lets an AI assistant in any MCP client (Claude Code, Claude Desktop, Cursor, VS Code, ...) move a SO-101 / SO-ARM101 robot arm, with per-joint safety limits. It talks to the arm through your existing LeRobot installation and calibration.

Safety first. This software moves a real robot. It checks every target against per-joint limits and moves in small, bounded steps, but it does not detect collisions between links, with the table, or with people. Keep the work area clear, keep a hand on the power supply, and never run it with anyone near the arm. Use at your own risk (see the license).

Not affiliated with Hugging Face, TheRobotStudio, Anthropic or Cursor.

Tools

Tool

What it does

get_robot_state

Reads the current joint positions. No movement.

list_safe_poses

Lists the named poses defined in config.json.

move_to_pose(name)

Moves smoothly to a named pose.

move_joints({joint: value})

Moves one or more joints to absolute positions (degrees). All joints move together.

move_joint_by(joint, delta_degrees)

Rotates one joint by a relative amount.

open_gripper / close_gripper / cycle_gripper(n)

Gripper control between configured endpoints.

Every movement tool refuses the whole request, and moves nothing, if any target is outside the configured limits or a limit is missing.

Related MCP server: SO-ARM100 Robot Control MCP

Joints

#

Name

Moves

1

shoulder_pan

base rotation (left/right)

2

shoulder_lift

upper arm (forward/back)

3

elbow_flex

elbow

4

wrist_flex

wrist up/down

5

wrist_roll

rotation of the gripper

6

gripper

opening (about 0-100)

Sign conventions depend on your calibration and assembly. On the author's arm, negative shoulder_pan turns left. Check each joint with a small move before relying on a direction.

Requirements

  • A SO-101 arm, already calibrated with LeRobot (the server refuses to run on an uncalibrated arm).

  • uv and Python 3.12+.

Install

git clone https://github.com/Tibe31/so101-mcp
cd so101-mcp
uv sync --extra robot

The robot extra installs LeRobot and its dependencies (large download). Run this once yourself, so your MCP client does not time out on first start.

If the arm is not calibrated yet:

uv run --extra robot lerobot-calibrate --robot.type=so101_follower --robot.port=COM4 --robot.id=my_arm

Configure

cp config.example.json config.json    # copy config.example.json config.json on Windows
  1. Set port (for example COM4 or /dev/ttyACM0) and robot_id (the id used at calibration time).

  2. Generate the joint limits from your calibration file (the path is printed by lerobot-calibrate; it lives under ~/.cache/huggingface/lerobot/calibration/ unless HF_LEROBOT_CALIBRATION is set):

    uv run so101-limits path/to/my_arm.json --margin 3

    Paste the printed limits into config.json. The margin keeps the motors a few degrees away from the mechanical end stops. The numbers assume LeRobot's degree mode (the default for SO101FollowerConfig).

  3. Set the gripper: read get_robot_state with the gripper fully open and fully closed, then fill gripper.open, gripper.closed and limits.gripper ([min, max]).

  4. Optional: add poses. Put the arm in a safe position, read it with get_robot_state, and copy the values into poses:

    "poses": {
      "rest": {"shoulder_pan": 0, "shoulder_lift": -103.9, "elbow_flex": 93.4,
               "wrist_flex": 78.0, "wrist_roll": -90.0, "gripper": 2.0}
    }

    Pose values must fall inside the limits, and the gripper in a pose must not be below limits.gripper.

max_step_degrees (0-2) and updates_per_second (1-20) set the speed: roughly their product in degrees per second. Increase them gradually.

config.json holds your own port, id, limits and poses: it is git-ignored.

Use with an MCP client

The server speaks MCP over stdio, so it works with any MCP client. Before adding it, check that it starts on its own: uv run --extra robot so101-mcp should wait silently for input (stop it with Ctrl+C). Use the absolute path of config.json in SO101_MCP_CONFIG, so it does not depend on the working directory.

Claude Code

  1. Add the server (replace the paths with yours; on Windows use C:\path\to\so101-mcp):

    claude mcp add so101 --env SO101_MCP_CONFIG=/path/to/so101-mcp/config.json -- \
      uv run --directory /path/to/so101-mcp --extra robot so101-mcp

    By default the server is available only in the current project. Add --scope user to make it available everywhere.

  2. Check it: claude mcp list should show so101 as connected. Inside Claude Code, /mcp shows its status and tools.

  3. Ask for something small first: "read the robot state", then "rotate shoulder_pan by 5 degrees".

  4. Claude Code asks for permission the first time a tool is used. Approve movement tools one call at a time rather than "always allow".

To remove it: claude mcp remove so101.

Claude Desktop

Edit claude_desktop_config.json (Settings > Developer > Edit Config), then restart Claude Desktop:

{
  "mcpServers": {
    "so101": {
      "command": "uv",
      "args": ["run", "--directory", "C:\\path\\to\\so101-mcp", "--extra", "robot", "so101-mcp"],
      "env": {"SO101_MCP_CONFIG": "C:\\path\\to\\so101-mcp\\config.json"}
    }
  }
}

Cursor

Create .cursor/mcp.json in your project (or ~/.cursor/mcp.json for all projects). The format is the same as for Claude Desktop:

{
  "mcpServers": {
    "so101": {
      "command": "uv",
      "args": ["run", "--directory", "C:\\path\\to\\so101-mcp", "--extra", "robot", "so101-mcp"],
      "env": {"SO101_MCP_CONFIG": "C:\\path\\to\\so101-mcp\\config.json"}
    }
  }
}

Then enable so101 in Cursor's MCP settings. Keep tool approval on (no auto-run) for the movement tools.

Other clients

Any client that can launch a stdio MCP server works: use uv as the command, ["run", "--directory", "<repo>", "--extra", "robot", "so101-mcp"] as the arguments and SO101_MCP_CONFIG as an environment variable.

All clients

Only one client at a time can hold the arm's serial port: close LeLab, LeRobot scripts and any other MCP client first (for example, Claude Desktop while using Cursor). Whether a client asks for confirmation before moving the arm depends on the client; the server only marks movement tools as destructive.

Then ask things like "read the robot state", "rotate joint 1 left by 30 degrees" or "go to the rest pose".

Troubleshooting

  • Access is denied / ClearCommError on the port: another program holds the serial port (LeLab, a LeRobot script, another MCP client). Close it, or replug the USB cable, then restart the server.

  • Missing verified limit for joint ...: the joint has no [min, max] in limits.

  • Target for ... is outside the locally configured safe limits: the target (or a pose value) is outside the limits. Nothing moved.

  • LeRobot is not installed: install with uv sync --extra robot and start the server with --extra robot.

  • The reading is a few tenths of a degree off the target: normal motor tolerance and settling.

Development

uv run pytest

The tests use a fake robot, so no hardware or LeRobot install is needed.

Limitations

  • No collision checking (links, table, people). No kinematics: moves are in joint space, not centimeters.

  • Fixed speed profile, set only through the config.

  • A movement cannot be interrupted. A single move can run for up to about 40 seconds (600 steps at the slowest rate) while the server holds a lock, and the MCP client cannot cancel it. If a step fails midway, the arm stays where it stopped. Keep the power supply within reach.

  • Limits are checked on the final target only. The path between start and target is a straight line in joint space and is not checked for collisions.

  • The server does not manage the arm's torque when it exits. Do not assume the arm will hold or release its position; check this on your setup.

  • config.json is read once at startup: restart the server after changing limits or poses.

  • Movement tools carry MCP annotations (destructiveHint), so clients can ask for confirmation before moving the arm. Keep that confirmation enabled.

License

MIT, see LICENSE.

Available Tools

8 tools
close_gripperB
Destructive

Slowly close gripper to the operator-verified safe position.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and non-idempotent behavior, so the safety bar is partly covered elsewhere. The description adds two genuinely useful traits beyond that: the motion is 'slowly' and the target is an 'operator-verified safe position'. It still omits the consequence of the destructive hint (crushing the grasped object), whether the call blocks until motion completes, and what happens if no verified safe position exists.

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?

A single front-loaded sentence with no filler. The one weakness is that 'operator-verified safe position' is dense but undefined, leaving ambiguity inside an otherwise tight sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument action tool with no output schema, the annotations carry the safety profile, but the description should explain what closing implies (blocking motion, crush risk, unknown state if already closed). It covers the target and speed but leaves the agent guessing about the outcome of a destructive, open-world action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The only semantics worth clarifying would be implicit inputs such as the safe pose source, which the description gestures at but does not define.

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?

States a specific verb (close) and resource (gripper) plus a qualifier about the target position. It is distinguishable from open_gripper and cycle_gripper by the verb alone, though it never explicitly names or contrasts those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to prefer this over cycle_gripper or open_gripper, and no preconditions (e.g., object grasped, safe pose already recorded) are given. Usage must be inferred entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cycle_gripperA
Destructive

Open then close gripper a specified number of times (1-5), using operator-validated calibrated endpoints.

NameRequiredDescriptionDefault
timesYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as destructive, non-idempotent and open-world, so the safety bar is lower; the description adds the useful detail that endpoints are operator-validated and calibrated. It says nothing, however, about what physical risk a 1-5 cycle burst carries, what happens on failure mid-cycle, or whether the gripper ends open or closed.

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?

One front-loaded sentence with zero filler; the range constraint sits right next to the parameter it constrains.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive physical-motion tool with no output schema and an undocumented parameter, the description should disclose end state, failure behavior, or safety preconditions. The calibrated-endpoint note helps but leaves meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden; it does supply the crucial 1-5 range that the schema lacks. It omits the unit of 'times' interpretation for an out-of-range value and any error behavior, so compensation is partial.

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?

States a specific compound verb and resource: opening then closing the gripper N times with calibrated endpoints. This clearly sets it apart from the single-shot open_gripper and close_gripper siblings by implication, though it never names them explicitly.

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 cycling use case is implied by 'a specified number of times', but there is no explicit guidance on when to prefer this over calling open_gripper/close_gripper repeatedly, nor any stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_robot_stateA
Read-only

Read calibrated motor positions (no intentional movement).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that no movement is commanded, which reinforces rather than duplicates the annotation, but it omits latency, whether it requires the robot to be enabled/calibrated, or error conditions.

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 front-loaded sentence with zero filler; the key constraint (no movement) is stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing return values, and 'calibrated motor positions' is vague—no mention of units, per-joint structure, or freshness of the reading. Adequate but incomplete for a state-query tool.

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?

Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies.

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?

States a specific read operation ('read calibrated motor positions') and the parenthetical 'no intentional movement' distinguishes it from the move_* siblings. It's clear what resource is accessed, though the exact return shape (joint angles vs. raw counts) isn't pinned down.

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 'no intentional movement' note implies this is the passive/observation tool versus the move_joints and move_to_pose siblings, but it never explicitly says when to call it (e.g., before planning a motion) or that it should be used instead of motion commands for observation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_safe_posesA
Read-only

Show only pre-taught named poses. Never guess an extreme pose.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is partly covered. The description adds a useful safety constraint by stating it will only show pre-taught named poses and warns against guessing extreme poses, but it does not add details on permissions, limits, or return behavior beyond what the output schema provides.

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 no wasted words. The core purpose is front-loaded, and the safety warning follows immediately.

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 listing tool with annotations and an output schema, the description provides enough context to understand what is returned and why it is safe. It could be slightly richer by explicitly tying the tool to pre-motion checks, but it is largely complete.

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 the baseline is 4. The description does not need to explain parameter semantics, and the empty schema is consistent with a no-argument listing tool.

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 uses a specific verb and resource: 'Show only pre-taught named poses.' It clearly distinguishes this listing tool from the move-oriented siblings by emphasizing pre-taught named poses, though it does not explicitly name an alternative tool.

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 clause 'Never guess an extreme pose' implies this tool should be used to retrieve safe, known poses before attempting motion. However, it does not explicitly state when to use this versus alternatives like move_to_pose or get_robot_state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_joint_byA
Destructive

Rotate a single joint by a relative amount from its current position. Example: joint="shoulder_pan", delta_degrees=-10 (negative pan = left). The final position must be inside the limits in config.json, otherwise nothing moves.

NameRequiredDescriptionDefault
jointYes
delta_degreesYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as destructive and non-idempotent, so the bar is lower, and the description still adds real value: the move is silently rejected if the target falls outside the limits in config.json, which is critical pre-call knowledge. It does not say what happens to prior state or how a rejected move is reported, but the key failure mode is disclosed.

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?

Three short sentences: the core behavior first, then a concrete example, then the failure constraint. No filler, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description covers purpose, an example, and the limits-based rejection behavior, which is enough to invoke it. The main omission is the set of valid joint identifiers, which an agent would otherwise have to discover by trial.

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 carry the burden; it does supply a concrete joint value ("shoulder_pan") and the sign convention (negative pan = left), which is genuinely beyond the schema. However, it never enumerates valid joint names or clarifies units beyond the parameter name itself, leaving real gaps.

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?

Names a specific verb (rotate) and a precisely scoped resource (a single joint) and states that the motion is relative from the current position, which implicitly contrasts with the plural move_joints sibling. It stops short of naming the alternative tool, so the differentiation is inferred rather than stated.

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 example clarifies the intent of a relative move, but there is no explicit guidance on when to pick this over move_joints, move_to_pose, or get_robot_state first, nor any prerequisite such as needing the robot in a known state. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_jointsA
Destructive

Move one or more joints to absolute positions (degrees; gripper 0-100). Example: {"shoulder_pan": -50, "wrist_roll": 0}. Joints not listed stay in place. Every target must be inside the limits in config.json, otherwise nothing moves. Do not use if work area is obstructed.

NameRequiredDescriptionDefault
targetsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes meaningfully beyond the annotations (destructiveHint=true, idempotentHint=false) by disclosing atomicity ('otherwise nothing moves'), partial-update semantics ('joints not listed stay in place'), and an external precondition (limits live in config.json). It does not state what feedback or confirmation the caller receives after a successful move.

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?

Five short clauses, front-loaded with the core action and units, then example, defaults, constraint, and a safety exclusion. No repetition and nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent mutation with a free-form object parameter and no output schema, the description covers units, partial-update behavior, atomic failure, and a safety precondition. Only the post-call feedback/success signal is unaddressed.

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 0% and the single 'targets' param is an open-ended nested object, so the description must carry the load — and it does: keys are joint names, values are degrees with gripper 0-100, a concrete example is given, unlisted joints are untouched, and every value must fall inside config.json limits. The one gap is that the agent cannot know those limits from the description itself.

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?

States a specific verb and resource plus the operating mode: move one or more joints to ABSOLUTE positions, in degrees, with gripper on a 0-100 scale. The 'absolute' qualifier implicitly separates it from the near-named sibling move_joint_by (relative), but no sibling is named explicitly, so it stops short of a 5.

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 clear when-not ('Do not use if work area is obstructed') and the absolute-vs-incremental framing that distinguishes it from move_joint_by. It still never names move_joint_by or move_to_pose as the alternative for a given situation, so routing is left partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_to_poseA
Destructive

Move slowly to a locally taught and verified safe pose by name. Do not use if work area is obstructed.

NameRequiredDescriptionDefault
nameYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety bar is partly covered. The description adds real context beyond them: motion is slow, the pose is locally taught and verified safe, and it warns against use under obstruction. What's missing is reversibility/halt behavior and permission needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, the core action front-loaded and the safety caveat directly after. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/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 destructive annotations, the safety warning is present, but the description leaves the agent without a pointer to discover valid pose names (list_safe_poses is the obvious sibling), which is a meaningful gap for correct invocation.

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 0%, so the description must carry the load. 'By name' signals the name refers to a taught pose, which adds meaning over the bare 'name' string, but it never says where valid names come from (e.g., list_safe_poses) or the accepted format.

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?

States a specific verb (move) and resource (a taught safe pose identified by name), plus a speed/scope qualifier (slowly). It does not explicitly distinguish itself from the other motion siblings (move_joints, move_joint_by), but the 'safe pose by name' framing gives a clear functional identity.

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?

Provides one exclusion ('Do not use if work area is obstructed'), which is useful guidance. However, it offers no positive when-to-use condition and no routing versus move_joints or move_joint_by, so the agent must infer which motion tool to pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_gripperB
Destructive

Slowly open gripper to the operator-verified safe position.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds nothing about the consequences — e.g. whether opening releases a grasped object, what force/limits apply, or what happens on repeat invocation. 'Slowly' is the only behavioral detail, which is thin for a destructive motion command.

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?

A single front-loaded sentence with no filler. It is efficient, though the vague term 'operator-verified safe position' consumes the one clause that could have carried operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter action with no output schema, this covers the basic action, but a destructive, non-idempotent motion command should disclose safety implications (dropped payloads, prior state requirements). The description leaves the agent unable to judge consequences before invoking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4.

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?

States a specific verb and resource ('open gripper') and adds a target qualifier ('operator-verified safe position'), which distinguishes it from close_gripper and cycle_gripper. The concept of 'operator-verified safe position' is never defined, so the destination remains ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this instead of close_gripper or cycle_gripper, nor any precondition (e.g. whether an operator must have verified the pose first, or whether the gripper must be holding something). The only hint of usage is buried in the phrase 'operator-verified', which is never explained.

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. 8 tool updatesv0.1.0
    • First observedclose_gripper
    • First observedcycle_gripper
    • First observedget_robot_state
    • First observedlist_safe_poses
    • First observedmove_joint_by
    • First observedmove_joints
    • First observedmove_to_pose
    • First observedopen_gripper

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

Each tool maps to a distinct action on a distinct target: read state, list named poses, move to a named pose, absolute multi-joint moves, relative single-joint moves, and three gripper operations. The only mild overlap is move_joints vs. move_joint_by, but the descriptions clearly separate absolute/multi-joint from relative/single-joint semantics, and cycle_gripper is distinguished from open/close by its repeat count.

Naming Consistency5/5

All names follow a consistent snake_case verb_noun pattern (get_*, list_*, move_*, cycle_*, open_*, close_*) with predictable, domain-specific nouns. No mixed conventions or vague verbs anywhere in the set.

Tool Count5/5

Eight tools is a well-scoped surface for a robot arm: state read, pose listing, three movement primitives, and three gripper operations. Nothing feels redundant or padded, and no important primitive is obviously duplicated.

Completeness4/5

The surface covers perception (get_robot_state, list_safe_poses), motion (move_to_pose, move_joints, move_joint_by), and end-effector control (open/close/cycle_gripper) with clear lifecycle coverage. Minor gaps exist: no explicit stop/halt or return-to-home primitive and no way to teach/register a new safe pose, though the latter appears intentionally done by an operator outside the toolset.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLM-based AI agents to control SO-ARM100 and SO-101 robots through natural language commands and camera feedback. It supports various transport protocols and provides tools for both autonomous robotic movement and manual keyboard operation.
    86
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to control SO-ARM100 and LeKiwi robots using natural language instructions and integrated camera vision. It supports multiple communication transports and includes a CLI agent compatible with Claude, Gemini, and GPT models.
    Apache 2.0