# Tool reference

> Every tool registered by the ROS2 MCP server, generated from the source registry.

Pinned to ROS2 MCP release [`2610`](https://github.com/wise-vision/ros2_mcp/releases/tag/2610). This page is generated from the server's tool registry: do not edit it by hand.

Generated from ROS2 MCP `2606-3-g47b4918` (package version `0.1.0`, source `47b4918658f44f77a0e46da223aba5d9cca64ab6`).

24 tools are registered.

| Tool | Mutates robot state | Summary |
| --- | --- | --- |
| [`ros2_action_request_result`](#ros2_action_request_result) | no | Wait for the RESULT of a ROS 2 action (GetResult) for a given goal_id. Before **every** use of this tool, the agent should ensure the target action exists (e.g., by calling 'ros2_list_actions'). |
| [`ros2_action_subscribe_feedback`](#ros2_action_subscribe_feedback) | no | Subscribe to feedback messages of a ROS 2 action. Optionally filter by goal_id_hex. Collects feedback for a fixed duration or until a maximum number of messages is received. Each message contains goal_id, feedback payload, and receive timestamp. |
| [`ros2_action_subscribe_status`](#ros2_action_subscribe_status) | no | Subscribe to '/&lt;action>/_action/status' (action_msgs/msg/GoalStatusArray) and return a snapshot of status frames over a time window. Each frame contains goal_id, accept_stamp, status_code and status text. |
| [`ros2_cancel_action_goal`](#ros2_cancel_action_goal) | ⚠ yes | Cancel a ROS 2 action goal via '/&lt;action>/cancel_goal' (action_msgs/srv/CancelGoal). You can cancel a specific goal by goal_id_hex or cancel all matching goals using cancel_all=True. Optionally limit cancellation to goals accepted before a given stamp (sec/nanosec). Before **every** use of this tool, the agent should ensure the target action exists (e.g., by calling 'ros2_list_actions'). |
| [`ros2_get_map_as_image`](#ros2_get_map_as_image) | no | Get one nav_msgs/msg/OccupancyGrid message from a topic and return it as a PNG image (base64-encoded). Unknown cells rendered as gray, free as white, occupied as black. |
| [`ros2_get_message_fields`](#ros2_get_message_fields) | no | Returns the fields of a given ROS2 message type. |
| [`ros2_get_messages_stored_in_influx_data_base`](#ros2_get_messages_stored_in_influx_data_base) | no | Calls the ROS2 ‘/get_messages’ service to retrieve past messages from a topic for data which is stored in InfluxDB. |
| [`ros2_get_pointcloud_as_bev`](#ros2_get_pointcloud_as_bev) | no | Get one sensor_msgs/msg/PointCloud2 message from a topic and return it as a PNG image (base64-encoded) rendered as a bird's-eye view (XY projection). Supports coloring by intensity/height/rgb. |
| [`ros2_interface_list`](#ros2_interface_list) | no | Returns a list of available ROS 2 interfaces. |
| [`ros2_list_actions`](#ros2_list_actions) | no | List all available ROS 2 actions with their types and request fields. |
| [`ros2_publish_multiple_topics`](#ros2_publish_multiple_topics) | ⚠ yes | Publish messages to multiple ROS 2 topics simultaneously with optional frequency and duration. |
| [`ros2_send_action_goal`](#ros2_send_action_goal) | ⚠ yes | Send a goal to a ROS 2 action by name and action type using provided goal fields. Before **every** use of this tool, the agent must call 'ros2_list_actions' and 'ros2_interface_list' to ensure the latest available actions and types are known. Optionally wait for the result with a timeout. |
| [`ros2_service_call`](#ros2_service_call) | ⚠ yes | Call a ROS 2 service by name and type using provided fields. |
| [`ros2_service_list`](#ros2_service_list) | no | Returns a list of available ROS 2 services and their request fields. |
| [`ros2_stream_next`](#ros2_stream_next) | no | Fetch the latest item from a stream session. If after_seq is provided, returns available=false until seq increases. UI/App-only tool. |
| [`ros2_stream_next_image`](#ros2_stream_next_image) | no | Fetch the latest image from an image stream session and return it as ImageContent (useful when the client cannot render the Viewer App UI). UI/App-only tool. |
| [`ros2_stream_start`](#ros2_stream_start) | no | Start a keep-latest stream session for a ROS 2 topic (Image/CompressedImage/PointCloud2/Generic). Returns a session_id. UI/App-only tool. |
| [`ros2_stream_stop`](#ros2_stream_stop) | no | Stop and clean up a stream session previously started with ros2_stream_start. UI/App-only tool. |
| [`ros2_subscribe_multiple_topics`](#ros2_subscribe_multiple_topics) | no | Subscribe to multiple ROS 2 topics at once and return received messages. |
| [`ros2_topic_list`](#ros2_topic_list) | no | Returns a list of available ROS 2 topics and their types. |
| [`ros2_topic_publish`](#ros2_topic_publish) | ⚠ yes | Publish a message to a ROS 2 topic by name and message type using provided field values. |
| [`ros2_topic_subscribe`](#ros2_topic_subscribe) | no | Subscribe to a ROS 2 topic by name collecting messages for a given time or count limit. |
| [`ros2_viewer_app`](#ros2_viewer_app) | no | Open an interactive ROS 2 viewer app (Image + PointCloud2 + Plot) for MCP clients that support Apps/HTML resources. |
| [`ros2_viewer_config`](#ros2_viewer_config) | no | Return the last ROS 2 Viewer App configuration (if any). UI/App-only tool. |

## `ros2_action_request_result`

Wait for the RESULT of a ROS 2 action (GetResult) for a given goal_id. Before **every** use of this tool, the agent should ensure the target action exists (e.g., by calling 'ros2_list_actions').

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `action_name` | string | yes | Action name, e.g. '/fibonacci' |
| `action_type` | string | yes | Full action type, e.g. 'example_interfaces/action/Fibonacci' or 'pkg/ActionName' |
| `goal_id_hex` | string | yes | 32-char UUID hex of the goal (no dashes). |
| `timeout_sec` | number \| null | no | Seconds to wait for GetResult; null → wait indefinitely. · default: `60.0` |
| `wait_for_service_sec` | number | no | Seconds to wait for the GetResult service to appear. · default: `3.0` |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "action_name": {
      "description": "Action name, e.g. '/fibonacci'",
      "type": "string"
    },
    "action_type": {
      "description": "Full action type, e.g. 'example_interfaces/action/Fibonacci' or 'pkg/ActionName'",
      "type": "string"
    },
    "goal_id_hex": {
      "description": "32-char UUID hex of the goal (no dashes).",
      "type": "string"
    },
    "timeout_sec": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": 60.0,
      "description": "Seconds to wait for GetResult; null → wait indefinitely."
    },
    "wait_for_service_sec": {
      "default": 3.0,
      "description": "Seconds to wait for the GetResult service to appear.",
      "type": "number"
    }
  },
  "required": [
    "action_name",
    "action_type",
    "goal_id_hex"
  ],
  "type": "object"
}
```

</details>

## `ros2_action_subscribe_feedback`

Subscribe to feedback messages of a ROS 2 action. Optionally filter by goal_id_hex. Collects feedback for a fixed duration or until a maximum number of messages is received. Each message contains goal_id, feedback payload, and receive timestamp.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `action_name` | string | yes | Action name, e.g. '/fibonacci' |
| `action_type` | string | yes | Full action type, e.g. 'example_interfaces/action/Fibonacci' or 'pkg/ActionName' |
| `duration_sec` | number | no | How many seconds to keep spinning and collecting feedback. · default: `5.0` |
| `goal_id_hex` | string \| null | no | Optional 32-char UUID hex of the goal (no dashes) to filter feedbacks. |
| `max_messages` | integer | no | Maximum number of feedback messages to collect. · default: `100` |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "action_name": {
      "description": "Action name, e.g. '/fibonacci'",
      "type": "string"
    },
    "action_type": {
      "description": "Full action type, e.g. 'example_interfaces/action/Fibonacci' or 'pkg/ActionName'",
      "type": "string"
    },
    "duration_sec": {
      "default": 5.0,
      "description": "How many seconds to keep spinning and collecting feedback.",
      "type": "number"
    },
    "goal_id_hex": {
      "description": "Optional 32-char UUID hex of the goal (no dashes) to filter feedbacks.",
      "type": [
        "string",
        "null"
      ]
    },
    "max_messages": {
      "default": 100,
      "description": "Maximum number of feedback messages to collect.",
      "type": "integer"
    }
  },
  "required": [
    "action_name",
    "action_type"
  ],
  "type": "object"
}
```

</details>

## `ros2_action_subscribe_status`

Subscribe to '/&lt;action>/_action/status' (action_msgs/msg/GoalStatusArray) and return a snapshot of status frames over a time window. Each frame contains goal_id, accept_stamp, status_code and status text.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `action_name` | string | yes | Action name, e.g. '/fibonacci' |
| `duration_sec` | number | no | How many seconds to collect status frames. · default: `5.0` |
| `max_messages` | integer | no | Max number of individual statuses to collect in total. · default: `100` |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "action_name": {
      "description": "Action name, e.g. '/fibonacci'",
      "type": "string"
    },
    "duration_sec": {
      "default": 5.0,
      "description": "How many seconds to collect status frames.",
      "type": "number"
    },
    "max_messages": {
      "default": 100,
      "description": "Max number of individual statuses to collect in total.",
      "type": "integer"
    }
  },
  "required": [
    "action_name"
  ],
  "type": "object"
}
```

</details>

## `ros2_cancel_action_goal`

> **⚠ mutates robot state**

Cancel a ROS 2 action goal via '/&lt;action>/cancel_goal' (action_msgs/srv/CancelGoal). You can cancel a specific goal by goal_id_hex or cancel all matching goals using cancel_all=True. Optionally limit cancellation to goals accepted before a given stamp (sec/nanosec). Before **every** use of this tool, the agent should ensure the target action exists (e.g., by calling 'ros2_list_actions').

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `action_name` | string | yes | Action name, e.g. '/fibonacci' or '/navigate_to_pose' |
| `cancel_all` | boolean | no | If true, send zero-UUID to cancel all matching goals. · default: `false` |
| `goal_id_hex` | string | no | 32-char UUID hex of the goal (no dashes). Omit when cancel_all=True. |
| `stamp_nanosec` | integer | no | Nanoseconds part for the acceptance time filter. · default: `0` |
| `stamp_sec` | integer | no | Cancel goals accepted BEFORE this sec (default 0 → usually all). · default: `0` |
| `wait_timeout_sec` | number | no | Timeout (seconds) to wait for the service and response. · default: `3.0` |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "action_name": {
      "description": "Action name, e.g. '/fibonacci' or '/navigate_to_pose'",
      "type": "string"
    },
    "cancel_all": {
      "default": false,
      "description": "If true, send zero-UUID to cancel all matching goals.",
      "type": "boolean"
    },
    "goal_id_hex": {
      "description": "32-char UUID hex of the goal (no dashes). Omit when cancel_all=True.",
      "type": "string"
    },
    "stamp_nanosec": {
      "default": 0,
      "description": "Nanoseconds part for the acceptance time filter.",
      "type": "integer"
    },
    "stamp_sec": {
      "default": 0,
      "description": "Cancel goals accepted BEFORE this sec (default 0 → usually all).",
      "type": "integer"
    },
    "wait_timeout_sec": {
      "default": 3.0,
      "description": "Timeout (seconds) to wait for the service and response.",
      "type": "number"
    }
  },
  "required": [
    "action_name"
  ],
  "type": "object"
}
```

</details>

## `ros2_get_map_as_image`

Get one nav_msgs/msg/OccupancyGrid message from a topic and return it as a PNG image (base64-encoded). Unknown cells rendered as gray, free as white, occupied as black.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `topic_name` | string | yes | The name of the ROS 2 topic publishing nav_msgs/msg/OccupancyGrid (e.g., /map). |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "topic_name": {
      "description": "The name of the ROS 2 topic publishing nav_msgs/msg/OccupancyGrid (e.g., /map).",
      "type": "string"
    }
  },
  "required": [
    "topic_name"
  ],
  "type": "object"
}
```

</details>

## `ros2_get_message_fields`

Returns the fields of a given ROS2 message type.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `message_type` | string | yes | Full ROS2 message type, e.g., std_msgs/msg/String |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "message_type": {
      "description": "Full ROS2 message type, e.g., std_msgs/msg/String",
      "type": "string"
    }
  },
  "required": [
    "message_type"
  ],
  "type": "object"
}
```

</details>

## `ros2_get_messages_stored_in_influx_data_base`

Calls the ROS2 ‘/get_messages’ service to retrieve past messages from a topic for data which is stored in InfluxDB.
            Check if the /get_messages service is available before calling.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `message_type` | string | yes | Full ROS2 message type used for decoding |
| `number_of_messages` | integer | no | Number of messages to fetch. · default: `0` |
| `time_end` | string | no | ISO8601 timestamp string to filter messages before a point in time. |
| `time_start` | string | no | ISO8601 timestamp string to filter messages after a point in time. |
| `topic_name` | string | yes | Name of the topic to retrieve messages from. |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "message_type": {
      "description": "Full ROS2 message type used for decoding",
      "type": "string"
    },
    "number_of_messages": {
      "default": 0,
      "description": "Number of messages to fetch.",
      "type": "integer"
    },
    "time_end": {
      "description": "ISO8601 timestamp string to filter messages before a point in time.",
      "type": "string"
    },
    "time_start": {
      "description": "ISO8601 timestamp string to filter messages after a point in time.",
      "type": "string"
    },
    "topic_name": {
      "description": "Name of the topic to retrieve messages from.",
      "type": "string"
    }
  },
  "required": [
    "topic_name",
    "message_type"
  ],
  "type": "object"
}
```

</details>

## `ros2_get_pointcloud_as_bev`

Get one sensor_msgs/msg/PointCloud2 message from a topic and return it as a PNG image (base64-encoded) rendered as a bird's-eye view (XY projection). Supports coloring by intensity/height/rgb.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `color_mode` | string | no | Coloring mode: 'intensity' \| 'height' \| 'rgb'. · one of: `"intensity"`, `"height"`, `"rgb"` · default: `"intensity"` |
| `colormap` | string | no | Colormap for intensity/height: 'jet' \| 'gray'. · one of: `"jet"`, `"gray"` · default: `"jet"` |
| `max_pixels` | integer | no | Max image size per axis (to cap huge clouds). · default: `2048` |
| `resolution` | number | no | Meters per pixel for the BEV image. · default: `0.05` |
| `timeout` | number | no | Seconds to wait for a message. · default: `5.0` |
| `topic_name` | string | yes | ROS 2 topic with PointCloud2 (e.g., /points). |
| `zmax` | number | no | Max Z to include (meters). |
| `zmin` | number | no | Min Z to include (meters). |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "color_mode": {
      "default": "intensity",
      "description": "Coloring mode: 'intensity' | 'height' | 'rgb'.",
      "enum": [
        "intensity",
        "height",
        "rgb"
      ],
      "type": "string"
    },
    "colormap": {
      "default": "jet",
      "description": "Colormap for intensity/height: 'jet' | 'gray'.",
      "enum": [
        "jet",
        "gray"
      ],
      "type": "string"
    },
    "max_pixels": {
      "default": 2048,
      "description": "Max image size per axis (to cap huge clouds).",
      "type": "integer"
    },
    "resolution": {
      "default": 0.05,
      "description": "Meters per pixel for the BEV image.",
      "type": "number"
    },
    "timeout": {
      "default": 5.0,
      "description": "Seconds to wait for a message.",
      "type": "number"
    },
    "topic_name": {
      "description": "ROS 2 topic with PointCloud2 (e.g., /points).",
      "type": "string"
    },
    "zmax": {
      "description": "Max Z to include (meters).",
      "type": "number"
    },
    "zmin": {
      "description": "Min Z to include (meters).",
      "type": "number"
    }
  },
  "required": [
    "topic_name"
  ],
  "type": "object"
}
```

</details>

## `ros2_interface_list`

Returns a list of available ROS 2 interfaces.

No parameters.

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {},
  "type": "object"
}
```

</details>

## `ros2_list_actions`

List all available ROS 2 actions with their types and request fields.
            This tool queries the current ROS graph to discover active action servers and
            returns a structured description for each action.

No parameters.

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {},
  "type": "object"
}
```

</details>

## `ros2_publish_multiple_topics`

> **⚠ mutates robot state**

Publish messages to multiple ROS 2 topics simultaneously with optional frequency and duration.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `topics` | array&lt;object> | yes | List of topics to publish to. |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "topics": {
      "description": "List of topics to publish to.",
      "items": {
        "properties": {
          "data": {
            "description": "Message content as dictionary",
            "type": "object"
          },
          "duration": {
            "default": 5.0,
            "description": "Duration in seconds to publish (optional)",
            "type": "number"
          },
          "frequency": {
            "default": 1.0,
            "description": "Publishing frequency in Hz (optional)",
            "type": "number"
          },
          "message_type": {
            "type": "string"
          },
          "topic_name": {
            "type": "string"
          }
        },
        "required": [
          "topic_name",
          "message_type",
          "data"
        ],
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "topics"
  ],
  "type": "object"
}
```

</details>

## `ros2_send_action_goal`

> **⚠ mutates robot state**

Send a goal to a ROS 2 action by name and action type using provided goal fields. Before **every** use of this tool, the agent must call 'ros2_list_actions' and 'ros2_interface_list' to ensure the latest available actions and types are known. Optionally wait for the result with a timeout.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `action_name` | string | yes | Action name, e.g. '/fibonacci' or '/navigate_to_pose' |
| `action_type` | string | yes | Full action type, e.g. 'example_interfaces/action/Fibonacci' or 'pkg/ActionName' |
| `goal_fields` | object | yes | Dictionary with goal message fields (1st section of .action file) |
| `timeout_sec` | number | no | Timeout (seconds) for waiting on the result when wait_for_result=true · default: `60.0` |
| `wait_for_result` | boolean | no | If true, wait for GetResult and include final status/result · default: `false` |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "action_name": {
      "description": "Action name, e.g. '/fibonacci' or '/navigate_to_pose'",
      "type": "string"
    },
    "action_type": {
      "description": "Full action type, e.g. 'example_interfaces/action/Fibonacci' or 'pkg/ActionName'",
      "type": "string"
    },
    "goal_fields": {
      "description": "Dictionary with goal message fields (1st section of .action file)",
      "type": "object"
    },
    "timeout_sec": {
      "default": 60.0,
      "description": "Timeout (seconds) for waiting on the result when wait_for_result=true",
      "type": "number"
    },
    "wait_for_result": {
      "default": false,
      "description": "If true, wait for GetResult and include final status/result",
      "type": "boolean"
    }
  },
  "required": [
    "action_name",
    "action_type",
    "goal_fields"
  ],
  "type": "object"
}
```

</details>

## `ros2_service_call`

> **⚠ mutates robot state**

Call a ROS 2 service by name and type using provided fields.
            Will ask the user to confirm if some fields are missing unless 'force_call' is set to True.
            Before **every** use of this tool, the agent must call 'ros2 service list' and 'ros2 interface list' to ensure the latest interface information is available.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `fields` | object | yes | Dictionary of fields to send in the service request. |
| `force_call` | boolean | no | Whether to call the service even if some fields are missing · default: `false` |
| `service_name` | string | yes | Name of the service to call |
| `service_type` | string | yes | Full ROS 2 service type, before pass, check service type using tool ros2_service_list |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "fields": {
      "description": "Dictionary of fields to send in the service request.",
      "type": "object"
    },
    "force_call": {
      "default": false,
      "description": "Whether to call the service even if some fields are missing",
      "type": "boolean"
    },
    "service_name": {
      "description": "Name of the service to call",
      "type": "string"
    },
    "service_type": {
      "description": "Full ROS 2 service type, before pass, check service type using tool ros2_service_list",
      "type": "string"
    }
  },
  "required": [
    "service_name",
    "service_type",
    "fields"
  ],
  "type": "object"
}
```

</details>

## `ros2_service_list`

Returns a list of available ROS 2 services and their request fields.

No parameters.

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {},
  "type": "object"
}
```

</details>

## `ros2_stream_next`

Fetch the latest item from a stream session. If after_seq is provided, returns available=false until seq increases. UI/App-only tool.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `after_seq` | integer | no |  |
| `session_id` | string | yes |  |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "after_seq": {
      "type": "integer"
    },
    "session_id": {
      "type": "string"
    }
  },
  "required": [
    "session_id"
  ],
  "type": "object"
}
```

</details>

## `ros2_stream_next_image`

Fetch the latest image from an image stream session and return it as ImageContent (useful when the client cannot render the Viewer App UI). UI/App-only tool.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `after_seq` | integer | no |  |
| `session_id` | string | yes |  |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "after_seq": {
      "type": "integer"
    },
    "session_id": {
      "type": "string"
    }
  },
  "required": [
    "session_id"
  ],
  "type": "object"
}
```

</details>

## `ros2_stream_start`

Start a keep-latest stream session for a ROS 2 topic (Image/CompressedImage/PointCloud2/Generic). Returns a session_id. UI/App-only tool.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `jpeg_quality` | integer | no | default: `80` |
| `kind` | string | yes | one of: `"image"`, `"pointcloud"`, `"message"` |
| `max_height` | integer | no | default: `540` |
| `max_points` | integer | no | Max points to return; &lt;=0 means no limit. · default: `0` |
| `max_width` | integer | no | default: `960` |
| `qos_preset` | string | no | QoS preset for the stream subscription. Use sensor_data for most camera topics. · one of: `"auto"`, `"sensor_data"`, `"system_default"` · default: `"auto"` |
| `target_fps` | number | no | Soft cap for processing frames (keep-latest, drops when over). · default: `20.0` |
| `topic_name` | string | yes |  |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "jpeg_quality": {
      "default": 80,
      "type": "integer"
    },
    "kind": {
      "enum": [
        "image",
        "pointcloud",
        "message"
      ],
      "type": "string"
    },
    "max_height": {
      "default": 540,
      "type": "integer"
    },
    "max_points": {
      "default": 0,
      "description": "Max points to return; <=0 means no limit.",
      "type": "integer"
    },
    "max_width": {
      "default": 960,
      "type": "integer"
    },
    "qos_preset": {
      "default": "auto",
      "description": "QoS preset for the stream subscription. Use sensor_data for most camera topics.",
      "enum": [
        "auto",
        "sensor_data",
        "system_default"
      ],
      "type": "string"
    },
    "target_fps": {
      "default": 20.0,
      "description": "Soft cap for processing frames (keep-latest, drops when over).",
      "type": "number"
    },
    "topic_name": {
      "type": "string"
    }
  },
  "required": [
    "topic_name",
    "kind"
  ],
  "type": "object"
}
```

</details>

## `ros2_stream_stop`

Stop and clean up a stream session previously started with ros2_stream_start. UI/App-only tool.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `session_id` | string | yes |  |

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {
    "session_id": {
      "type": "string"
    }
  },
  "required": [
    "session_id"
  ],
  "type": "object"
}
```

</details>

## `ros2_subscribe_multiple_topics`

Subscribe to multiple ROS 2 topics at once and return received messages.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `topics` | array&lt;object> | yes | List of topics to subscribe to. |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "topics": {
      "description": "List of topics to subscribe to.",
      "items": {
        "properties": {
          "duration": {
            "default": 0.0,
            "description": "How many seconds to listen (optional).",
            "type": "number"
          },
          "message_limit": {
            "default": 0,
            "description": "Number of messages to collect (optional).",
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "topics"
  ],
  "type": "object"
}
```

</details>

## `ros2_topic_list`

Returns a list of available ROS 2 topics and their types.

No parameters.

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {},
  "type": "object"
}
```

</details>

## `ros2_topic_publish`

> **⚠ mutates robot state**

Publish a message to a ROS 2 topic by name and message type using provided field values.
            Supports single publish (default) or continuous publishing at a specified frequency for a duration.
            Before **every** use of this tool, the agent must call 'ros2_topic_list' and 'ros2_interface_list'
            to ensure the latest available topics and message types are known.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `data` | object | yes | Dictionary containing the message fields and values |
| `duration` | number | no | Optional: Duration in seconds for continuous publishing. Must be used with frequency parameter. |
| `frequency` | number | no | Optional: Publish frequency in Hz (messages per second). If provided with duration, publishes repeatedly. |
| `message_type` | string | yes | Full ROS 2 message type, e.g., 'std_msgs/msg/String' |
| `topic_name` | string | yes | Name of the topic to publish to |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "data": {
      "description": "Dictionary containing the message fields and values",
      "type": "object"
    },
    "duration": {
      "description": "Optional: Duration in seconds for continuous publishing. Must be used with frequency parameter.",
      "type": "number"
    },
    "frequency": {
      "description": "Optional: Publish frequency in Hz (messages per second). If provided with duration, publishes repeatedly.",
      "type": "number"
    },
    "message_type": {
      "description": "Full ROS 2 message type, e.g., 'std_msgs/msg/String'",
      "type": "string"
    },
    "topic_name": {
      "description": "Name of the topic to publish to",
      "type": "string"
    }
  },
  "required": [
    "topic_name",
    "message_type",
    "data"
  ],
  "type": "object"
}
```

</details>

## `ros2_topic_subscribe`

Subscribe to a ROS 2 topic by name collecting messages for a given time or count limit.
            Before **every** use of this tool, the agent must call 'ros2_topic_list'
            to ensure it has the latest available topics

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `duration` | number | no | If provided, collects messages for this many seconds. |
| `message_limit` | integer | no | If provided, stops after receiving this number of messages. |
| `topic_name` | string | yes | Name of the topic to subscribe to |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "duration": {
      "description": "If provided, collects messages for this many seconds.",
      "type": "number"
    },
    "message_limit": {
      "description": "If provided, stops after receiving this number of messages.",
      "type": "integer"
    },
    "topic_name": {
      "description": "Name of the topic to subscribe to",
      "type": "string"
    }
  },
  "required": [
    "topic_name"
  ],
  "type": "object"
}
```

</details>

## `ros2_viewer_app`

Open an interactive ROS 2 viewer app (Image + PointCloud2 + Plot) for MCP clients that support Apps/HTML resources.

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `auto_start` | boolean | no | default: `true` |
| `plot_fields` | array&lt;string> | no | Optional list of plot field paths to preselect in Plot mode. |
| `preferred_kind` | string | no | one of: `"image"`, `"pointcloud"`, `"plot"`, `"auto"` |
| `topic_name` | string | no |  |

<details><summary>Input schema (JSON)</summary>

```json
{
  "properties": {
    "auto_start": {
      "default": true,
      "type": "boolean"
    },
    "plot_fields": {
      "description": "Optional list of plot field paths to preselect in Plot mode.",
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "preferred_kind": {
      "enum": [
        "image",
        "pointcloud",
        "plot",
        "auto"
      ],
      "type": "string"
    },
    "topic_name": {
      "type": "string"
    }
  },
  "type": "object"
}
```

</details>

## `ros2_viewer_config`

Return the last ROS 2 Viewer App configuration (if any). UI/App-only tool.

No parameters.

<details><summary>Input schema (JSON)</summary>

```json
{
  "additionalProperties": false,
  "properties": {},
  "type": "object"
}
```

</details>
