duck-mcp
microduck-mcp 🦆
모든 MCP 클라이언트 — Claude Code, Claude Desktop, 또는 자체 에이전트 — 에서 Pollen Robotics Microduck을 구동하세요. AI는 오리를 산책시키고, 트릭을 실행하고, 밀치고, 렌더링된 카메라 프레임을 통해 볼 수 있는 도구를 얻습니다.
현재는 시뮬레이션된 오리를 구동합니다(CPU MuJoCo가 pollen-robotics/microduck의 공식 사전 훈련 ONNX 폴리시를 실행). 제어 평면은 인텐트 전용 — 속도, 트릭, 시선 — 으로 실제 로봇의 robotd 계약을 미러링하므로, 오리가 도착하면 동일한 도구 뒤에 하드웨어 백엔드를 끼워 넣을 수 있습니다.
산책 중 | 롤라드 도중 | 명령 대기 중 |
|
|
|
모든 프레임은 duck_camera 도구로 렌더링된 것입니다 — AI가 조종하는 동안 말 그대로 보는 화면입니다.
아키텍처
MCP client (Claude, ...) duck CLI (humans / scripts) browser: AX debug page
│ stdio │ │ http :8400
▼ ▼ ▼
duck-mcp ────────────► Unix socket, JSON lines ◄──── built-in web UI
│
▼
duck-sim (50 Hz MuJoCo loop,
ONNX policy hot-swapping via
microduck_rl's PolicyInference)설계 근거(도구 vs 리소스, 구조화된 출력, 오류 의미론)는 docs/mcp-design-notes.md에 문서화되어 있습니다.
Related MCP server: robot-runtime
설치
두 개의 공식 저장소의 클론(scenes/policy-runner와 번들된 ONNX 폴리시를 위한)과 uv가 필요합니다:
git clone https://github.com/pollen-robotics/microduck
git clone https://github.com/pollen-robotics/microduck_rl
git clone https://github.com/aj-dev-smith/microduck-mcp
cd microduck-mcp && uv sync실행
시뮬레이션 서버를 시작합니다(기본값은 세 저장소가 같은 디렉터리에 있다고 가정):
uv run duck-sim --rl-repo ../microduck_rl --policies ../microduck/policies기본적으로 헤드리스입니다. MuJoCo 뷰어에서 보려면(macOS는 mjpython 필요):
uv run mjpython -m microduck_mcp.sim_server --viewer \
--rl-repo ../microduck_rl --policies ../microduck/policies셸에서 호출해 보세요:
uv run duck state
uv run duck drive 0.2 # walk forward at 0.2 m/s
uv run duck trick roulade # forward roll
uv run duck cam follow # render a frame, prints the PNG path
uv run duck push # shove it, watch it recoverClaude Code에 MCP 서버를 등록합니다:
claude mcp add duck -- uv --directory /path/to/microduck-mcp run duck-mcpMCP 도구
상태를 반환하는 모든 도구는 타입이 지정된 구조화된 출력(DuckState 스키마, 필드별 단위 문서화)을 내보냅니다. 모든 변경 도구는 동작 후 상태를 반환하므로 에이전트가 후속 폴링을 할 필요가 거의 없습니다.
도구 | 기능 |
| 위치, 방향, 바디 프레임 속도, 활성 폴리시, 기립 여부 |
| 속도 인텐트; |
| 명령 0 → 기립 폴리시 |
|
|
| 머리 방향 지정(폴리시에 대한 명령이지 서보 직접 쓰기가 아님) |
| 렌더링된 프레임: |
| 몸통 밀기; 밀림 회복 테스트 |
| 원점, 기본 자세로 복귀( |
AX 디버그 페이지
duck-sim은 http://127.0.0.1:8400에서 Agent Experience 디버그 페이지도 제공합니다(--web PORT, 비활성화하려면 --web 0): 제어 소켓에 도달하는 모든 명령의 실시간 피드 — 클라이언트별(mcp, cli, web) 태그 — 와 자동 새로고침 카메라 뷰 및 상태 대시보드가 함께 표시됩니다. MuJoCo 뷰어 옆에 열어 에이전트가 무엇을 하고 있고 무엇을 볼 수 있는지 실시간으로 확인하세요. 순수 stdlib HTTP + HTML 파일 하나로 구성되며, 모든 렌더링은 여전히 다른 모든 클라이언트와 동일한 인텐트 큐를 통해 시뮬레이션 스레드에서 이루어집니다.
참고
시뮬레이션 서버는 모든 MuJoCo 호출을 단일 스레드에서 실행합니다. 소켓 클라이언트는 인텐트를 큐에 넣기만 합니다. 여러 클라이언트(MCP + CLI 동시)도 문제없습니다.
폴리시는 로봇에서와 똑같이 공유된 61차원 관측 계약 뒤에서 핫스왑됩니다: 주행은 걷기 폴리시를 활성화하고, 제로 명령은 기립으로 복귀하며, 에피소드형 트릭은 타임아웃되어 기립으로 돌아갑니다.
카메라 렌더링은 오프스크린으로 수행됩니다(창 불필요). macOS의
--viewer모드에서는 오프스크린 렌더링을 사용할 수 없을 수 있습니다 — 프레임이 필요하면 헤드리스로 실행하세요.번들된 폴리시 세트에는 StandUp 폴리시가 포함되어 있지 않으므로 옆으로 넘어진 오리(예: 거친 롤라드 착지 후)는 그 자리에 남게 됩니다 —
duck_reset이 탈출구입니다. StandUp 폴리시를 하나 훈련시키는 것(microduck_rl의Mjlab-StandUp-*)이 해결책입니다.
로드맵
동일한 도구 뒤에서 데몬의 WebSocket API를 사용하는 실제 로봇 백엔드(
microduck문서design/architecture.md§5.3 참조)바디 포즈 인텐트(기립 중 웅크리기/기울이기)
선택적 StandUp 폴리시 슬롯 —
duck_reset없이도 넘어짐에서 회복 가능하도록
라이선스
Apache-2.0. Pollen Robotics의 microduck과 microduck_rl을 기반으로 제작되었으며, 둘 다 Apache-2.0입니다.
Available Tools
8 toolsduck_cameraDuck cameraARead-only
Render a camera frame of the sim. Views: 'follow' (behind the duck),
'front' (facing it), 'side', 'top'. distance in meters (0.4 close-up
to ~1.5 wide). Pair with duck_state for pose numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | follow | |
| distance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the no-side-effect profile is covered. The description adds useful context about views and distance but does not disclose additional behavioral details such as output format or whether the frame is static or animated. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long and every clause adds distinct, actionable information: what the tool does, valid view values, distance semantics, and a usage hint. There is no filler or repetition of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, zero-required tool with a readOnly annotation and no output schema, the description covers the key invocation details: valid views, distance range, and a state-pairing tip. The return format is not explicitly described, but 'render a camera frame' makes the output type inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only parameter names and defaults, with 0% description coverage and no enums. The description fully compensates by defining each view ('follow' behind the duck, 'front' facing it, 'side', 'top') and giving distance units and a usable range of 0.4 to ~1.5 meters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and object: 'Render a camera frame of the sim.' The view list and distance range further clarify exactly what kind of camera output is produced. This clearly distinguishes the tool from siblings like duck_drive, duck_push, and duck_state, which are action/state tools rather than rendering tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit pairing recommendation: 'Pair with duck_state for pose numbers.' It does not explicitly state when not to use it or name alternatives, but for a simple visualization tool the guidance is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_driveDrive the duckAIdempotent
Set the walking velocity intent. vx: forward m/s (max ±0.3; the policy tracks ~half the commanded speed, so command 0.25+ for a brisk walk), vy: leftward m/s (max ±0.2), wz: counterclockwise yaw rate rad/s (max ±1.5). Nonzero engages the walking policy; all-zero hands back to standing.
With duration_s (max 10): drive for that long, then stop and return the resulting state — one call instead of drive/poll/stop. Without it the intent persists until changed: the robot keeps walking between your tool calls, and the sim runs in real time, so returned state is already slightly stale when you read it.
| Name | Required | Description | Default |
|---|---|---|---|
| vx | Yes | ||
| vy | No | ||
| wz | No | ||
| duration_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral context beyond annotations: intents persist across calls, the sim runs in real time, returned state is already slightly stale, nonzero values engage walking, and all-zero returns to standing. It also discloses policy tracking behavior and commanded-speed scaling. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense paragraphs with no filler. The opening sentence states the core purpose, parameter details are grouped logically, and the duration_s alternative is explained in a dedicated paragraph. Every sentence adds operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no schema descriptions, the description covers all parameters, limits, behavioral persistence, and the optional duration mode. The output schema exists, so return values do not need to be described. Nothing essential is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden for parameter meaning. It explains vx, vy, wz with units, sign conventions, and max magnitudes, plus duration_s semantics and the all-zero special case. Every parameter is given actionable meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Set the walking velocity intent.' The description clearly distinguishes this from siblings by explaining when velocity intents engage the walking policy and when they hand back to standing, and it contrasts the one-call duration mode with drive/poll/stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the two usage modes: with duration_s for a self-terminating drive, and without it for persistent intent. It also tells the agent when to use the shorter one-call form instead of drive/poll/stop, which routes to the relevant alternative behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_lookPoint the headAIdempotent
Point the head (radians; caps ~±1.4 yaw, ±1.1 pitch, ±0.31 roll). This is a command to the balance policy, not a servo write — the body compensates. All zeros returns the head to neutral. The gaze intent is sticky — it holds between tool calls until changed.
| Name | Required | Description | Default |
|---|---|---|---|
| head_yaw | No | ||
| head_roll | No | ||
| head_pitch | No | ||
| neck_pitch | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It adds substantial behavior beyond annotations: the command is sticky and persists between calls, all zeros returns to neutral, and the body compensates rather than directly moving a servo. These details meaningfully shape how an agent should invoke and reason about the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact—three sentences, each carrying distinct value: units/caps, policy behavior, and persistent-state behavior. It is front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose and key behavioral traits, and an output schema exists so return values need not be described. Still, neck_pitch is absent, direction conventions are unclear, and interaction with sibling tools is not addressed, so an agent is left with material gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by providing units and approximate caps for yaw, pitch, and roll. However, neck_pitch is never mentioned, and sign/direction conventions are not explained, leaving an important parameter underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool points the head and gives units and range caps, which is specific and useful. It does not explicitly differentiate from sibling tools like duck_camera or duck_drive, though the resource ('head') is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives important context: it is a command to the balance policy, not a servo write, and the body compensates. However, it does not name alternatives or give explicit when-to-use vs. when-not-to-use guidance relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_pushShove the duckA
Shove the duck: sets trunk velocity to magnitude m/s (max 2.0) in a
world-frame direction (random if angle_deg omitted). Tests push recovery.
| Name | Required | Description | Default |
|---|---|---|---|
| angle_deg | No | ||
| magnitude | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-readonly, non-idempotent mutation. The description adds meaningful behavioral detail: velocity is in m/s with a max of 2.0, direction is world-frame, and angle_deg is randomly chosen when omitted. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence that front-loads the action, then covers the mechanism, constraints, and purpose. Every clause adds useful information with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low parameter count and existing annotations, the description covers the core behavior, bounds, and purpose. The output schema exists, so return value explanation is unnecessary. It could be slightly more complete with angle convention details, but it is sufficient for calling correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does: magnitude is velocity in m/s capped at 2.0, and angle_deg defines a world-frame direction that becomes random when omitted. Minor ambiguity remains about the reference axis for angle_deg, so it is not a perfect 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: 'Shove the duck' sets trunk velocity, naming the resource (duck/trunk), the action (set velocity), and the parameterized behavior. It does not explicitly distinguish itself from siblings such as duck_drive or duck_trick, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied by 'Tests push recovery,' which tells the agent this is for simulating a push and checking recovery. However, there is no explicit when-to-use versus alternatives like duck_drive or duck_trick, and no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_resetReset the simADestructiveIdempotent
Reset the sim: duck back to the origin in its default standing pose, ball back to its spawn. Discards the current episode — the escape hatch after a fall (there is no stand-up policy yet).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive and idempotent behavior. The description goes beyond them by revealing exactly what changes: the duck returns to origin in its standing pose, the ball returns to spawn, and the current episode is discarded. This is valuable behavioral context for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first states the reset outcome, the second explains the trigger and rationale. Every clause adds value, with the core action front-loaded and no redundant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter reset with annotations and an output schema, the description fully covers what happens, when to use it, and why it is the fallback. Nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters and 0 required inputs, so the description carries no parameter-semantics burden. The schema already fully covers the empty parameter set, and the description naturally communicates a parameterless call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reset the sim') and specifies the exact resulting state: 'duck back to the origin in its default standing pose, ball back to its spawn'. This makes the tool's purpose concrete and clearly distinct from sibling action tools like duck_drive or duck_trick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly positions this as the 'escape hatch after a fall' and explains the need with 'there is no stand-up policy yet'. That gives clear trigger conditions. It does not explicitly name an alternative, but no sibling tool provides a reset action, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_stateDuck telemetryARead-only
Current robot state: pose, body-frame velocity, active policy, whether it is upright/sitting/mid-trick, and the ball position. Cheap — poll freely.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so no side effects are expected. The description goes beyond annotations by adding that the tool is 'cheap' and safe to poll freely, which signals performance characteristics. It also clarifies that the state includes posture modes like upright/sitting/mid-trick, giving useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the core purpose, lists concrete return fields, and ends with actionable usage guidance. No words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, a readOnly annotation, and an existing output schema, the description provides all necessary context. It tells the agent what the tool returns, that it is low-cost, and implicitly that it should be used for telemetry rather than actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to document. The description correctly omits parameter details; the baseline of 4 applies because no parameter compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a state-read operation for the robot, listing the specific fields it returns (pose, velocity, active policy, posture status, ball position). This distinguishes it from the sibling action tools like duck_drive and duck_trick, which perform movements rather than report status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Cheap — poll freely' provides explicit guidance that this tool is safe to call frequently, making its usage context clear. It does not explicitly name alternatives or exclusions, but the sibling tools are all action-oriented, so the intended use case of polling status is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_stopStopAIdempotent
Zero all velocity intents — the duck stops walking and stands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal mutability (readOnlyHint=false), idempotency (idempotentHint=true), and non-destructiveness. The description adds a useful behavioral detail—all velocity intents are zeroed and the duck stands—but does not discuss side effects like interactions with duck_trick or state persistence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence immediately conveys the core effect and an accessible metaphor. There is no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless command with an output schema and simple behavior, the description captures everything an agent needs: it knows the call stops the duck and stands it. No prerequisites or additional context are required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to clarify; the baseline of 4 for a parameterless tool applies. The description imposes no hidden arguments or prerequisites.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise action—'Zero all velocity intents'—and adds an observable effect ('the duck stops walking and stands'). This clearly distinguishes it from movement-producing siblings like duck_drive and duck_push.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implicit from the action description: call this to halt the duck. However, it does not explicitly state when to use this tool over duck_reset, duck_drive, or other siblings, and no alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duck_trickDo a trickA
Trigger a trick: 'sit', 'stand', 'ground_pick' (touch beak to floor), 'kick_left'/'kick_right' (stages the ball at that foot, then kicks), or 'roulade' (forward roll — NOTE: usually ends with the duck down, since no stand-up policy ships yet; follow with duck_reset). Episodic tricks hand control back to standing automatically after a few seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rpy_deg | Yes | Trunk orientation [roll, pitch, yaw], degrees |
| sitting | Yes | |
| upright | Yes | False once tilted past ~45 deg. There is no self-recovery policy: if the duck falls, use duck_reset. |
| vel_cmd | Yes | Current sticky velocity intent [vx, vy, wz] |
| behavior | Yes | Episodic trick currently running, else null |
| position_m | Yes | Trunk world position [x, y, z], meters |
| sim_time_s | Yes | Sim clock, seconds. The sim runs in real time; this snapshot is stale on arrival. |
| ground_pick | Yes | |
| vel_body_mps | Yes | |
| yaw_rate_rps | Yes | Yaw rate, rad/s, counterclockwise positive |
| active_policy | Yes | Which ONNX policy is driving: standing, walking, sit, ground_pick, kick_left/right, roulade |
| ball_position_m | No | Ball world position [x, y, z], meters (ball scene only) |
| trunk_height_mm | Yes | Trunk height above floor, mm (~116 standing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important physical side effects beyond the annotations, including that ground_pick touches the beak to the floor, kicks stage the ball at the indicated foot first, and roulade usually leaves the duck down because no stand-up policy ships yet. It also reveals that episodic tricks automatically hand control back to standing after a few seconds, which is exactly the kind of behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core verb and immediately lists options in a scannable inline list. Every clause earns its place: the parentheticals clarify physical behavior, and the trailing note explains an important edge case rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one required parameter and an output schema, so the description need not document return values. It covers the accepted value set, per-value semantics, post-trick state, a required follow-up action, and automatic control handback, leaving no practical gap for an agent deciding whether and how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and only a bare string 'name' in the schema, the description carries full responsibility for parameter meaning. It compensates completely by listing every accepted value and explaining the effect of each, including the roulade/duck_reset caveat.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Trigger a trick' and enumerates every valid trick value ('sit', 'stand', 'ground_pick', 'kick_left'/'kick_right', 'roulade'), making the operation specific and unambiguous. This clearly separates it from the sibling tools, which are state, drive, push, stop, look, camera, and reset operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended trigger action is clear, and the description gives sequencing advice ('follow with duck_reset' after roulade) plus automatic return-to-standing behavior. However, it never explicitly states when to prefer this tool over sibling alternatives such as duck_drive or duck_push, so usage 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
duck_camera - First observed
duck_drive - First observed
duck_look - First observed
duck_push - First observed
duck_reset - First observed
duck_state - First observed
duck_stop - First observed
duck_trick
TDQS
Scored across 8 tools
Each tool targets a distinct aspect of the duck robot: tricks, state reading, locomotion, perturbation, stopping, head gaze, camera rendering, and reset. Even though duck_stop overlaps slightly with duck_drive(all-zero), the descriptions clearly separate an explicit stop from a velocity command.
All tools share the duck_ prefix and use lowercase snake_case, which is easy to follow. However, the suffixes mix verbs (trick, push, reset) with nouns (state, camera), so the naming is mostly consistent but not perfectly uniform.
Eight tools is well within the ideal range for a robot-control MCP server. Each tool covers a necessary capability: actuation, sensing, perception, perturbation, and recovery, with no obvious bloat or redundancy.
The tool surface covers the core sim-control loop: inspect state, move, trick, push, look, view, stop, and reset. Minor gaps exist, such as no dedicated stand-up command and no ball manipulation beyond trick-triggered kicks, but those are explicitly handled via reset or documented limitations.
Maintenance
Related MCP Connectors
Hosted MCP server to manage a restaurant menu from AI agents - 39 tools over the DuckHub API.
Official Duck Framework MCP server for AI-assisted development and project scaffolding.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
- FensoryOAuthcom.fensory
Trading MCP server for AI agents, with live market data, account reads and controlled execution.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAn MCP server that gives AI agents full control and observability of the Webots robot simulator, enabling launch and monitoring of simulations, reinforcement learning training, model evaluation, and interactive scene manipulation.MIT
- FlicenseNot gradedqualityCmaintenanceEnables agents to safely drive a simulated Franka Panda pick-and-place cell through MCP tools, with gated motion, emergency stop, structured errors, and audit logging.-
- AlicenseAqualityBmaintenanceEnables any AI agent to control a Pollen Robotics Microduck through MCP, including walking, sitting, picking objects, reading health, and stopping, with support for mock, simulated, or real hardware transports.81Apache 2.0
- AlicenseAqualityBmaintenanceEnables MCP-capable agents to see and control robots directly by listing tasks, starting and resetting episodes, observing camera feeds and robot state, and moving end effectors and grippers, including coordinating two arms. Supports LIBERO, RoboDojo, a simulator-free fake backend and remote backends over SSH or TCP, with configurable episode budgets, logs, live monitoring and frame-by-frame replay.737 PyPI5Apache 2.0


