ros2-inspector
Provides read-only inspection of a running ROS 2 system: one-page system overview (nodes, topics, wiring), node and topic listing/info (types, endpoint counts, QoS), time-boxed topic message sampling and publish-rate measurement, node parameters, actions, message/service/action interface field definitions, and environment health checks. Also reports whether ROS 2 is installed and whether the local machine meets the support matrix for running it.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ros2-inspectorAnalyze the current runtime state of my ROS 2 system."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ros2-inspector
ros2-inspector lets an LLM automatically analyze the runtime state of your ROS 2 system. It is an MCP server: ask "how is the system doing?" in natural language, and the model decides which ros2 inspection commands to run, in what order, and how to combine their outputs into a complete analysis.
┌────────────────────────────────────────────┐
│ MCP Host (Claude Code / ZCode / Qoder / │
│ Cursor / Claude Desktop) │
│ │ MCP protocol (stdio) │
└────────────────────┼───────────────────────┘
▼
┌─────────────────────────┐
│ ros2-inspector MCP │
│ pure Python · zero ROS │
│ dependency · read-only │
└────────────┬────────────┘
│ subprocess (auto-detected ROS env)
▼
ROS 2 system (DDS)Why ros2-inspector?
Figuring out "what is the system doing right now" used to look like this:
ros2 node list→ a wall of nodes → pick one →ros2 node info→ spot a suspicious topic →ros2 topic info -v→ros2 topic echo→ros2 topic hz→ros2 param list… jumping back and forth between a dozen commands;the command surface is huge and the syntax inconsistent — nobody memorizes it;
at every step, you read the output and you connect the dots into "who talks to whom, and is the data healthy".
ros2-inspector hands the whole job to an LLM: say "analyze the current system state" once, and it runs the entire loop — overview → spot anomalies → drill down → summarize. Memorizing and composing commands, reading and correlating output: no longer your problem.
You: Analyze the current runtime state of my ROS 2 system.
Model: calls
system_overviewfor the big picture → notices/inspector_demo/chatterhas 0 subscribers → callsget_topic_infoto confirm → callssample_topic/get_topic_rateto verify the data itself is healthy → concludes: "One node is running normally, publishing at 6.1 Hz on/inspector_demo/chatter— but there are no subscribers, so the messages have no readers. Check whether the downstream node was started."
The guarantees that make this safe to actually run:
Read-only, by construction → a four-layer safety fence; there is simply no entry point for "publish / call a service / set a param / launch a node";
Zero ROS dependency → the server is pure Python, sources nothing at startup, and runs on machines without ROS 2 installed (it can even tell you whether ROS is installed and whether the machine is fit for it);
Never blocks → streaming commands are time-boxed ("N messages or T seconds, whichever comes first"), killed on timeout with the partial output already captured;
Distro-agnostic → auto-detects
/opt/ros/*at runtime; Humble / Jazzy / Lyrical with zero configuration;Works with any MCP host → Claude Code, ZCode, Qoder, Cursor, Claude Desktop.
Related MCP server: k8s-readonly-mcp
🎥 Examples in Action
📌 TODO: demo GIF here (a natural-language ROS 2 inspection session)
Example 1 — System inspection
You: Which nodes are running, and how are they connected?
Model: (calls
system_overview) The system has 1 node,/inspector_demo_talker, publishingstd_msgs/msg/Stringmessages on/inspector_demo/chatter. The topic currently has 0 subscribers…
Example 2 — Data content & rate
You: What does the data on
/inspector_demo/chatterlook like? Is the rate normal?Model: (calls
sample_topicfor 3 messages +get_topic_ratefor 3 seconds) The payload is an incrementing counter string —hello 279,hello 280… Measured average rate: 6.1 Hz…
Example 3 — A machine without ROS
You: Can this machine run ROS?
Model: (calls
machine_readiness) Ubuntu 24.04 — inside the official support matrix (Jazzy / Kilted / Lyrical); 16 GB RAM and 120 GB free disk both sufficient; hostname resolves, network interfaces present. Verdict: ready to install.
🛠 Quick Start
Prerequisites: uv — the only requirement. With ROS 2 on the machine the inspection tools work; without it the server still starts fine.
1. Configure your host — universal MCP JSON:
{
"mcpServers": {
"ros2-inspector": {
"command": "uvx",
"args": ["ros2-inspector-mcp"]
}
}
}No install step, no local paths: uvx pulls the package from PyPI on first run. Pin a version with "args": ["ros2-inspector-mcp@0.1.1"] if you need reproducibility.
Install as a persistent tool instead (optional):
uv tool install ros2-inspector-mcp # install
ros2-inspector-mcp --version # check version
uv tool upgrade ros2-inspector-mcp # upgrade
uv tool uninstall ros2-inspector-mcp # uninstallFrom source (development):
git clone https://github.com/XuChen-AI/ros2-inspector.git
cd ros2-inspector && uv sync{
"mcpServers": {
"ros2-inspector": {
"command": "uv",
"args": ["run", "--directory", "/path/to/ros2-inspector", "ros2-inspector"]
}
}
}If your host cannot find
uv/uvx(GUI apps with a restricted PATH), use the absolute path to the uv binary (e.g./home/you/.local/bin/uvx) in thecommandfield.
Host | Where to put it |
ZCode / Claude Code |
|
Claude Desktop | the |
Qoder / Cursor | Settings → MCP → add server, paste the same JSON |
2. Ask away
"Analyze the current system state" · "Which nodes are running?" · "What does the data on /chatter look like?" · "Is the environment healthy?"
(Optional) Self-test: see the tests/ directory (safety-fence tests, end-to-end smoke test, and a demo publisher script).
📦 Tools (13, all read-only)
Tool | Needs ROS? | What it answers |
| No | Is ROS installed? Which distro, where? |
| No | Is this machine fit to install/run ROS (OS/RAM/disk/network vs. the support matrix)? |
| Yes | One-page snapshot: nodes + topics + wiring + counts |
| Yes | Which nodes are running / what a node publishes & subscribes |
| Yes | Which topics exist & their types / type, endpoint counts, QoS |
| Yes | What the data looks like (time-boxed) / publish rate (time-boxed) |
| Yes | A node's parameter list / a parameter's current value |
| Yes | Action list / one action's detail |
| Yes | Field definitions of a message/service/action type |
| Yes | Environment health: daemon status + doctor verdict |
Protocol primitives: Tools only (works everywhere). Resources are deliberately omitted (our data is live and dynamic — Tool is the right primitive), as are Prompts (the analysis playbook lives in the tool descriptions; revisit in v1.5).
🔒 Safety Design
Read-only is designed, not promised. Four defense layers, centralized in the single executor (runner.py):
Registration layer: only the 13 read-only functions exist; mutating code is absent from the codebase;
Allowlist layer: subcommands allowlisted down to "verb + subverb" (13 groups); a banned-token denylist (
pub/call/set/launch/run/pkg…) as backstop;Validation layer: only flags, ROS names, interface types and numbers pass the format allowlist;
;|&`$are always rejected;shell=Falsethroughout;Runtime layer: timeout + process-group kill; every call is audit-logged (
audit.log).
❓ Troubleshooting
Symptom | Fix |
Tools report "no ROS 2 environment detected" | Confirm with |
|
|
| The topic may have no publishers; check the publisher count with |
"topic/node not found" errors | Names must start with |
|
|
🗺 Roadmap
v1.5: diagnostic Prompt templates (one-click system checkup); read-only
service list/typev2: PyPI release —
uvx ros2-inspector-mcp, path-independentv2: Docker packaging (zero host dependencies)
🤝 Contributing
Issues and PRs are welcome: new tool suggestions (read-only only), host-configuration feedback, doc improvements.
📜 License
MIT — Copyright (c) 2026 XuChen
Available Tools
13 toolsactionsA
查询 ROS2 动作(action)。
何时用:想看系统里有哪些动作、某个动作被谁提供服务。 action_name 不传=列出全部动作(show_types=True 时附带类型); 传入=查看该动作详情:动作服务端/客户端数量(原文返回)。 参数 action_name:动作全名,以 / 开头(如 /rotate_absolute)。 失败时返回 error。
| Name | Required | Description | Default |
|---|---|---|---|
| show_types | No | ||
| action_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does well: it discloses that output varies by mode, that show_types affects the listing, that details are 'returned raw' (原文返回), and that failures return an error. The only gap is it doesn't describe the return format or size beyond that.
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?
Tight and front-loaded: purpose, when-to-use, the two behaviors, the parameter note, and error handling in a few lines with zero 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?
For a read-only introspection tool with two params, no annotations, and no output schema, the description tells the agent enough to call it correctly in both modes. Slightly more on the detail-mode return contents would make it fully complete.
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 must compensate, and it covers both parameters: show_types (attaches type info when True) and action_name (full name, leading slash, example /rotate_absolute). The example is the main value-add, though no constraints beyond the format are elaborated.
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+resource: query ROS2 actions, and names the two distinct modes (list all vs. inspect one). An agent can easily separate this from siblings like list_nodes, list_topics, and params, which cover different ROS2 entities.
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 何时用 line explicitly scopes usage to two situations (seeing which actions exist, and who provides one). It gives clear context but names no alternative tool or exclusion condition, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_node_infoA
获取指定节点的连接详情:发布/订阅哪些话题、提供/调用哪些服务与动作。
何时用:已知节点名,想看它与系统其他部分的连接关系; 或配合 system_overview 下钻某个可疑节点。 参数 node:节点全名,以 / 开头(如 /talker),大小写敏感。 返回:CLI 原始分节报告(Publishers/Subscribers/Service Servers/Action Servers 等)。失败时返回 error(常见原因:名称拼错、节点刚好退出)。
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly succeeds: it discloses the return shape (raw CLI sectioned report with named sections) and failure semantics (error return, likely causes: typo'd name, node just exited). It does not discuss permissions or read-only nature, but for an inspection tool the disclosure is solid beyond structured fields.
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?
Three labeled blocks (purpose / when-to-use / params+returns) with the function statement front-loaded and zero filler; every sentence carries information an agent needs.
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?
No output schema and no annotations exist, so the description must supply both the return format and failure behavior it does. For a single-parameter, read-only introspection tool, nothing needed to call it correctly 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?
Schema description coverage is 0%, so the description must compensate and does: it specifies the expected format (fully-qualified name, leading '/', e.g. /talker) and the case-sensitivity constraint, which is precisely the syntax the bare string schema lacks.
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+resource ('get connection details for a node') and enumerates the exact facets returned (topics, services, actions), which cleanly separates it from siblings like get_topic_info, show_interface, and list_nodes. An agent can identify the right tool without opening a schema.
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?
Explicit '何时用' section names the triggering condition (known node name, want to see its connections) and a concrete drill-down workflow with the sibling system_overview. No alternative is left implicit for the node-introspection case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topic_infoA
获取指定话题的详情:消息类型、发布者数、订阅者数,以及 QoS 配置。
何时用:确认话题类型;排查"发了没人收/收不到"类问题时看双方数量与 QoS。 参数 topic:话题全名,以 / 开头(如 /chatter),大小写敏感; verbose=True 时附带每个端点的 QoS 详情(推荐)。 返回:CLI 原始输出。失败时返回 error(常见:话题不存在)。
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| verbose | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the return format ('raw CLI output') and the failure behavior (returns error, commonly when the topic does not exist). It is implicitly a read operation, though permission scope and any performance cost of verbose enumeration are not stated.
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?
Well front-loaded: purpose first, then when-to-use, then parameter notes, then return/error behavior. The labeled sections make it scannable and every sentence adds information an agent needs; no 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?
For a 2-parameter, no-output-schema, no-annotation tool, the definition covers purpose, invocation triggers, parameter formatting, return shape, and the common error case. Nothing required to call it correctly 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?
Schema description coverage is 0%, so the description must compensate and it does: topic is specified as the full name beginning with '/' (e.g., /chatter) and explicitly case-sensitive, and verbose is explained as attaching per-endpoint QoS detail with a recommendation to enable it. Both parameters gain semantics not present anywhere in the 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?
The description opens with a specific verb+resource and enumerates exactly what is retrieved: message type, publisher count, subscriber count, and QoS. This is clearly distinguishable from siblings like list_topics (enumeration), sample_topic (data sampling), and get_topic_rate (rate measurement). An agent can select it without opening the schema.
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 '何时用' section gives concrete when-to-use triggers: confirming a topic's datatype and diagnosing 'published but nobody receives it' scenarios via the publisher/subscriber counts and QoS. It does not name alternatives (e.g., list_topics or sample_topic) or state when not to use it, but the usage context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topic_rateA
限时统计话题发布频率:观察 duration_s 秒后返回平均频率。
何时用:排查"数据不更新/更新太慢"类问题——先看频率是否正常。 参数 topic:话题全名(/ 开头);duration_s:1~15 秒,默认 5。 返回:average_rate_hz(平均频率,未统计到时为 None)、raw_tail(原始输出尾部)。 note 字段会说明未统计到频率的原因。
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| duration_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: the observation window, the None fallback for average_rate_hz when nothing was measured, the raw_tail output, and a note field explaining why a rate was missed. It omits whether it registers a subscriber/load on the system or any permission requirements.
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?
Compact and labeled: purpose, when-to-use, parameters, return values, and failure note. Every sentence adds information and the purpose is front-loaded.
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 simple two-parameter observation tool with no annotations and no output schema, the description covers inputs, the return fields, and the failure mode, leaving nothing an agent needs in order to call it 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 compensate and it does: topic is documented as the full name starting with '/', and duration_s is bounded to 1~15 seconds with a stated default of 5. Both parameters gain meaning that the bare schema lacks.
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+resource: observe a topic for duration_s seconds and return its average publish frequency. It is clearly distinct from siblings like list_topics, get_topic_info, or sample_topic, which enumerate or inspect rather than measure rate over a window.
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 '何时用' line gives an explicit diagnostic scenario: troubleshooting 'data not updating / updating too slowly'. It provides clear context for invocation but names no sibling alternatives or explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkA
对 ROS2 环境本身做健康检查:daemon 状态 + doctor 体检结论。
何时用:怀疑问题不在业务节点,而在 ROS 环境/网络/daemon 本身时; 或 list_nodes 为空想进一步定位原因。 返回:daemon_running(是否在运行)、doctor_returncode (0 全部通过 / 1 有警告 / 2 有错误)、verdict(doctor 结论行)、 warnings_found(警告摘要)、raw_tail(doctor 原始输出尾部)。 注意:doctor 含网络检查,最长约 30 秒。失败时返回 error 字段。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the latency ceiling (~30s because doctor runs network checks) and the failure behavior (an error field is returned). What it doesn't cover (permissions, whether the check is purely read-only) is minor for a diagnostic tool, so a 4 is warranted.
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 sectioned into purpose, when-to-use, return values, and cautions, with the most decision-relevant content (purpose and trigger) front-loaded. Every sentence earns its place; the return-field list is terse and non-redundant.
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?
There is no output schema, so the description fully documents the return shape: daemon_running, doctor_returncode with its enumerated values (0/1/2), verdict, warnings_found, raw_tail, plus the error field on failure. Nothing an agent needs to interpret the result 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 takes zero parameters, so parameter semantics require no explanation and the baseline of 4 applies. There is no input whose meaning could be ambiguous.
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?
Names a specific action (health check) and a specific resource (the ROS2 environment itself), explicitly distinguishing it from business-node tools. The scope is bounded to daemon status plus doctor diagnosis, so an agent immediately knows what class of problem this tool addresses.
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 states when to use it: when the problem is suspected to lie in the ROS environment/network/daemon rather than business nodes, or when list_nodes comes back empty and further localization is needed. It names the sibling list_nodes and the exact triggering condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_nodesA
列出当前 ROS2 系统中所有正在运行的节点名。
何时用:确认某个节点是否活着;排查前先看看系统里有什么。 返回:node_count 与 nodes 列表(全名以 / 开头)。 nodes 为空说明未发现任何节点——系统未启动、与本机 ROS_DOMAIN_ID 不同或 daemon 异常,可用 health_check 进一步检查。 失败时返回 error 字段。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it states the return fields node_count and nodes, explains that empty nodes means no nodes were discovered, lists likely causes, and notes the error field on failure. It does not explicitly state that the operation is read-only or discuss performance/rate characteristics, but for a zero-parameter listing tool this is minor.
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?
Front-loads the purpose, then follows with when-to-use, return shape, empty-result interpretation, and failure behavior. Every sentence adds useful operational context without wasted words.
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?
There is no output schema, so the description must explain return values, which it does by naming node_count and nodes and describing their format. It also covers the empty and error cases, making the definition complete for this simple inspection 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?
The tool takes no parameters, so the baseline is 4. The description correctly does not invent parameter documentation, and the empty schema needs no further semantic explanation.
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?
Stated as a specific verb and resource: lists all currently running ROS2 node names. The scope (current ROS2 system, all running nodes) clearly separates it from get_node_info, list_topics, and other siblings.
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 says when to use it: to confirm whether a node is alive and to survey the system before troubleshooting. It also names health_check as the follow-up when no nodes are found, though it does not compare against all sibling diagnostics tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_topicsA
列出当前系统中的全部话题及其消息类型。
何时用:想看系统里在传什么数据、某个话题的类型是什么。 返回:topic_count 与 topics 列表(name + type 字段)。 失败时返回 error 字段。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It usefully states the return shape (topic_count, topics list with name and type, and an error field on failure), but omits safety profile, authentication needs, rate limits, or pagination behavior. Moderate transparency for a read-like operation.
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?
Three short sentences, front-loaded with purpose, then usage, then return values. No redundancy, filler, or tangential detail. Every sentence earns its place.
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?
This is a low-complexity tool with an empty input schema and no output schema. The description compensates by specifying the return shape (topic_count plus topics with name and type fields, and an error field on failure), giving the agent enough to call and interpret results.
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 the schema provides no parameter semantics to supplement. Per the rules, a zero-parameter tool earns a baseline of 4, and the description appropriately adds no unnecessary parameter detail.
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 '列出' (list) and resource '全部话题' (all topics) plus message types, making the action clear. It does not explicitly differentiate from sibling get_topic_info, but the '全部' scope implies bulk listing versus single-topic detail.
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?
Provides explicit when-to-use guidance: '想看系统里在传什么数据、某个话题的类型是什么。' This gives clear context for selection. However, it does not name alternatives (e.g., get_topic_info for one topic) or state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
machine_readinessA
评估本机是否适合安装/运行 ROS2。无需安装 ROS 即可运行(纯 Python,零子进程)。
何时用:准备在这台机器上安装 ROS / 部署机器人软件之前的体检。 返回:操作系统与版本、内核、架构、CPU/内存/磁盘概况、网络接口、 主机名解析、locale、ROS_DOMAIN_ID,并对照官方支持矩阵给出参考结论 (verdict 字段)与改进建议(hints 列表)。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add real behavioral context: it runs without ROS installed, is pure Python with zero subprocesses, and produces a verdict plus hints. It does not explicitly state that it is read-only or disclose runtime cost, but the self-contained/no-subprocess note is genuinely useful for an agent deciding whether it is safe to call.
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?
Front-loads the purpose, then uses labeled 'when to use' and 'returns' blocks. The return enumeration is somewhat long but each item is informative rather than filler, so the structure earns its length.
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?
With no output schema available, the description compensates by enumerating the returned fields (OS/kernel/arch, CPU/mem/disk, network, hostname resolution, locale, ROS_DOMAIN_ID) and calling out the verdict and hints outputs. An agent knows both what the tool does and what it will get back.
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 the baseline is 4; there is no parameter surface for the description to clarify.
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+resource: evaluating whether the local machine can install/run ROS2, with the added scoping detail that it is a pre-install health check. It implicitly separates itself from siblings like system_overview and health_check via the ROS support-matrix comparison, but never names those siblings directly.
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?
Gives an explicit usage context ('体检 before installing ROS / deploying robot software'), which tells the agent when to reach for this tool. It stops short of naming alternatives or stating when NOT to use it, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paramsA
读取指定节点的参数(只读,不支持设置)。
何时用:想看某节点配置了什么、某个行为开关当前是什么值。 参数 node:节点全名,以 / 开头(如 /talker); name:参数名(不带前导斜杠,如 use_sim_time;复杂参数名可含 . 与 /)。 name 不传=列出该节点全部参数名;传入=读取该参数当前值 (raw 字段为含类型前缀的原文,如 "Integer value: 10")。 失败时返回 error(常见:节点名拼错、节点无此参数)。
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| node | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares the read-only/no-set constraint, explains the 'raw' field's type-prefixed format ('Integer value: 10'), and documents the failure mode (returns error for misspelled node or unknown parameter). It does not cover permissions or behavior for complex/nested parameter values.
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?
Front-loaded purpose, then usage, then parameter rules, then return/failure behavior. Every line adds information with no 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?
With no annotations and no output schema, the description still covers the essentials an agent needs: semantics of the optional parameter, the shape of the returned value, and the failure contract. Nothing material is missing for a two-parameter read 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?
Schema coverage is 0%, so the description must compensate, and it does: 'node' is a full name with a leading slash, 'name' has no leading slash and may contain '.' and '/', and the omitted-vs-provided distinction (list all names vs read one value) is spelled out explicitly.
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: reads the parameters of a given ROS node, explicitly read-only ('只读,不支持设置'). An agent can tell this apart from generic node inspection tools, though no sibling is named to sharpen the boundary against get_node_info/list_nodes.
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?
Gives an explicit 'when to use' clause: inspecting a node's configuration or the current value of a behavior switch. It does not name alternatives or state when-not-to-use, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ros_install_infoA
检测本机是否安装了 ROS2、装了哪些发行版。无需安装 ROS 即可运行。
何时用:不确定这台机器有没有 ROS、装的什么版本、工具能否查看时, 先调这个再决定用哪些查看类工具。 返回:installed(布尔)、distros 列表(发行版名+路径)、PATH 上是否 直接可用 ros2、当前 MCP 工具将使用的发行版、ROS 相关环境变量。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it names what is returned (installed flag, distro list with paths, PATH availability, the distro the MCP tools will use, ROS env vars) and clarifies it works without ROS installed. It stops short of an explicit read-only/no-side-effect statement, which would complete the safety profile.
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?
Front-loaded with the purpose, then clearly labeled '何时用' and '返回' sections. It is slightly verbose but every line carries meaning; no filler or repetition.
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?
No output schema exists, and the description compensates by enumerating the return fields and the preflight ordering role. For a zero-parameter detection tool with no annotations, nothing an agent needs to call it correctly 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?
Zero parameters, which warrants the baseline 4; there are no inputs to disambiguate, and the description correctly spends no words on parameters.
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+resource: detect whether ROS2 is installed and which distros are present, plus that it runs without ROS installed. An agent can distinguish this preflight probe from the sibling inspection tools (list_nodes, list_topics, etc.) without opening any schema.
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 '何时用' block gives an explicit triggering condition (uncertain whether ROS exists, which version, whether tools can run) and an explicit ordering rule — call this first, then decide which inspection tools to use. So it directly routes the agent relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sample_topicA
限时采样话题内容:抓取最多 max_messages 条消息,或 timeout_s 秒到期即停。
何时用:想看某话题里数据实际长什么样、字段值是否合理。
参数 topic:话题全名(/ 开头);max_messages:150 条,默认 5;
timeout_s:115 秒,默认 5。命令一定会在限时内返回,不会挂起。
返回:messages_received(实际条数)、stopped_because
(message_limit / timeout / publisher_stopped)、raw(消息原文,未解析)。
采样窗口内无消息时 note 字段会说明(话题可能没有发布者)。
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| timeout_s | No | ||
| max_messages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it guarantees the command always returns within the limit and '不会挂起' (never hangs), enumerates stopped_because outcomes (message_limit / timeout / publisher_stopped), and notes the no-message case via a note field. It omits auth/permission needs or rate limits, keeping it below 5.
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?
Front-loads the core action in the first sentence, then separates 何时用 / 参数 / 返回 into scannable sections. Reasonably economical, though slightly verbose in restating defaults already present in the schema.
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?
There is no output schema, yet the description documents the return shape (messages_received, stopped_because, raw unparsed payload, and the note field when empty), so an agent can interpret results correctly. Combined with full parameter documentation, nothing essential 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?
Schema coverage is 0%, so the description must compensate, and it does: topic is specified as a fully-qualified name beginning with '/', max_messages as 1–50 with default 5, timeout_s as 1–15 with default 5. All three parameters get concrete ranges and semantics absent from the 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+resource ('限时采样话题内容' – sample topic content with a time bound) and an explicit scope (max_messages cap or timeout). This is clearly distinguishable from siblings like get_topic_info or get_topic_rate, which describe metadata rather than actual sampled payloads.
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 gives the when-to-use context: 'when you want to see what the data in a topic actually looks like and whether field values are reasonable.' It does not name an alternative tool or state when NOT to use it, so it falls short of the 5-level routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_interfaceA
查看 ROS2 消息/服务/动作类型的字段定义。
何时用:拿到一个类型名(如 sample_topic 返回里的 type)想看它有哪些字段、 各字段是什么意思。 参数 interface_type:格式为 包/类型/名称,例如 std_msgs/msg/String、 example_interfaces/srv/AddTwoInts、turtlesim/action/RotateAbsolute。 返回:definition 字段为字段定义原文。失败时返回 error(常见:类型名拼错、 相应功能包未安装)。
| Name | Required | Description | Default |
|---|---|---|---|
| interface_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose the return shape (definition field with raw field text) and failure behavior (error on typo or missing package). It does not explicitly state that the call is read-only/has no side effects, so a small gap remains.
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?
Front-loaded purpose followed by clearly labeled when-to-use, parameter, and return sections; every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema or annotations, the description covers purpose, invocation trigger, parameter format, return field, and error cases — everything an agent needs to call it 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 compensate, and it does: it specifies the 包/类型/名称 format and gives three concrete examples spanning msg, srv, and action variants. This adds meaning the bare string schema entirely lacks.
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?
Names a specific verb (查看/view) and resource (ROS2 消息/服务/动作类型的字段定义), making clear this is about interface type definitions rather than topics, nodes, or params like the siblings. An agent can distinguish it from sample_topic or get_topic_info without opening any schema.
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?
Explicit '何时用' section states the exact trigger condition — having a type name such as the 'type' returned by sample_topic — which directly links it to a sibling tool. This is precise when-to-use guidance rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_overviewA
获取当前 ROS2 系统的一页式快照:节点、话题、连接关系与数量统计。
何时用:回答"系统现在什么状态"类问题的第一入口——先看总览, 发现异常节点/话题后再用 get_node_info / get_topic_info / sample_topic 下钻。 返回:node_count / topic_count 统计、nodes 列表、topics 列表(含类型)、 connections(每个节点的发布/订阅概况)。节点数超过 12 个时只展开前 12 个 (notes 字段会注明)。失败时返回 error 或 notes 说明原因,不会中断会话。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does disclose meaningful traits: the 12-node expansion cap with a notes field caveat, and failure semantics (returns error/notes without interrupting the session). It stops short of describing read-only guarantees or performance/cost characteristics, but the operational behaviors that matter for invocation are covered.
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?
Front-loaded with the purpose, then clearly sectioned into usage and returns, with no filler. The return section enumerates several field names, which is slightly verbose, but each line earns its place by clarifying scope or output shape.
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?
With no output schema and no annotations, the description supplies exactly what is missing: the return payload structure (node_count/topic_count, nodes, topics with types, connections), the truncation rule, and failure handling. An agent has everything needed to call it and interpret the result.
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 and schema coverage is complete, so there is nothing for the description to document. Baseline 4 applies; the description correctly adds no parameter noise.
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: a one-page snapshot of the current ROS2 system covering nodes, topics, connections and counts. It also implicitly scopes itself against the drill-down siblings, so an agent can distinguish it from list_nodes/get_node_info without opening a schema.
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 designates itself as the first entry point for "what is the system state now" questions, and names the follow-up alternatives (get_node_info / get_topic_info / sample_topic) with the condition that triggers them (an anomalous node/topic is found). When-to-use and when-to-escalate are both 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.
13 tool updates
v0.1.1- First observed
actions - First observed
get_node_info - First observed
get_topic_info - First observed
get_topic_rate - First observed
health_check - First observed
list_nodes - First observed
list_topics - First observed
machine_readiness - First observed
params - First observed
ros_install_info - First observed
sample_topic - First observed
show_interface - First observed
system_overview
TDQS
Scored across 13 tools
Most tools target clearly distinct objects (nodes, topics, actions, interfaces), and descriptions explicitly route usage. There is mild overlap between system_overview and list_nodes/list_topics (the former is a superset), and three environment tools (ros_install_info, machine_readiness, health_check) share a diagnostic flavor, but each is scoped differently enough to pick correctly.
All names are snake_case, which is good, but conventions are mixed: verb_noun (show_interface, list_nodes, get_topic_info, sample_topic), noun-phrase (health_check, machine_readiness, system_overview, ros_install_info), and bare/broad nouns (params, actions). Readable overall but not a predictable single pattern.
13 tools is well within the ideal 3-15 range and each tool covers a distinct slice of ROS2 inspection (install, readiness, health, nodes, topics, sampling, rate, params, actions, interfaces). No tool feels redundant or trivial.
The read-only inspection domain is well covered across environment, topology, topics, sampling, params, and actions. Minor gaps: there is no dedicated service-listing or service-calling tool, and params is read-only, but for an inspector these are acceptable and mostly workable via node/topic tools.
Related MCP Connectors
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Read-only MCP server: let AI agents read your ORANO saved-video library, tasks, and memory.
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server for ROS 2, enabling AI assistants to introspect and interact with ROS 2 systems.2MIT
- AlicenseAqualityCmaintenanceA read-only MCP server for inspecting Kubernetes clusters, allowing LLMs to list resources, describe pods, and read logs without mutation.5MIT
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that enables LLMs to safely explore and query any SQLite database via natural language. It exposes tools for listing tables, describing schemas, and executing SELECT/WITH queries with built-in safety guards like write prevention and row limits.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for AI agents to inspect and control ROS2 graphs, enabling topic listing, node info, service calls, parameter management, and pub/echo without manual ROS2 CLI usage.11MIT