so101-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SO101_MCP_CONFIG | No | Absolute path to the config.json file containing port, robot_id, limits, poses, etc. If not set, the server looks for config.json in the current working directory. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_robot_stateA | Read calibrated motor positions (no intentional movement). |
| list_safe_posesA | Show only pre-taught named poses. Never guess an extreme pose. |
| move_to_poseA | Move slowly to a locally taught and verified safe pose by name. Do not use if work area is obstructed. |
| move_jointsA | 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. |
| move_joint_byA | 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. |
| cycle_gripperA | Open then close gripper a specified number of times (1-5), using operator-validated calibrated endpoints. |
| open_gripperB | Slowly open gripper to the operator-verified safe position. |
| close_gripperB | Slowly close gripper to the operator-verified safe position. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
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.
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.
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.
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.