-
Release v3.0.0 (#229)
发布于
2026-01-29 05:50:45 +00:00 | 81 次提交 在此版本后已推送到 main- fix: Add cross-platform X11 forwarding support for Docker turtlesim
- Fix macOS XQuartz display issues with dynamic DOCKER_DISPLAY variable
- Add platform-specific setup instructions for macOS, Linux, Windows
- Remove hard-coded IP addresses and display numbers
- Add comprehensive troubleshooting for common X11 connection errors
Resolves Docker GUI display issues on macOS and improves cross-platform compatibility.
-
Fixed the error in building uv venv
-
feat: Enhance turtlesim launch scripts for cross-platform compatibility and X11 support
-
Added CI test
-
Added CI test
-
launch scripts
-
Removed ci
-
Delete mcp_json.txt
-
updated README
-
*launch.py for turtlesim docker
-
chore: bump version to v2.2.1
-
Add turtlebot3 example (#193)
-
add images of examples using turtlebot3
-
add example tutorial of turtlebot3
-
change turtlebot3 image and add gif to show example3 image
-
fix image file path
-
compress gif file
-
add specification i used for the demo
-
add launch file for turtlebot3 and mcp server
Co-authored-by: Rohit John Varghese rohit@contoro.com
-
Reorganize docker turtlesim example scripts
-
Cross platform docker launch system and fix for GUI display issues on macOS with XQuartz for example 5 (#186)
- Fix macOS XQuartz display issues with dynamic DOCKER_DISPLAY variable
- Add platform-specific setup instructions for macOS, Linux, Windows
- Remove hard-coded IP addresses and display numbers
- Add comprehensive troubleshooting for common X11 connection errors
- Resolves Docker GUI display issues on macOS and improves cross-platform compatibility.
Co-authored-by: Stefano Dalla Gasperina stefano.dallagasperina@austin.utexas.edu
-
Fixed the scripts path
-
Fixed the scripts path in example 5 (#195)
-
Update example image for ROS2 system query (#198)
-
Update image under installation guide for tutrtesim ROS2 system query example
-
Updated docs with Custom MCP Client (#197)
Updated docs with custom MCP client integration
- Fix mutable defaults in publish_once and publish_for_durations (#202)
Replace mutable default arguments (dict={}, lists=[]) with None and
initialize inside the functions to prevent cross-call state bleed.-
Add MCP Resources for ROS Metadata etc (#205)
-
Add MCP resources for ROS metadata and robot specs
- Add resources/ros_metadata.py: Resource for getting all ROS metadata (topics, services, nodes, parameters)
- Add resources/robot_specs.py: Resource for listing all available robot specifications
- Fix rosapi parameters service: Use /rosapi/get_param_names instead of /rosapi/parameters
- Add resources/__init__.py: Register all resources with MCP server
- Update server.py: Register MCP resources on startup
-
ruff format and check
-
Added functionality and tested the Unitree GO2
The following commit address the the issue that due to control heirarchy in Unitree Go2, the previously implemented archietcture of publishing values to the /wirellesscontroller topic may not always result in the robot movement, even after successful publication to the the respective topic. This commit adds a ROS workspace - go2_ws which exposes all the sports sdk commands as ROS2 services which can be used the ROS-MCP server. The following implementaion uses a variety of movements, acctions available at high level for the unitree go2. The given code has been tested on a real robot. In addition, for the setup in the README I have added instructioons o how to connect to the robot without the access to the WiFi router, it assumes that not everyone may have admin access.
-
ruff format
-
Major refactoring and modularization of the ros-mcp server (#213)
-
chore: bump version to v2.2.1
-
fix: use consistent image path for compressed and raw images
Previously, compressed images were saved to
./camera/received_image_compressed.jpeg
while raw images were saved to./camera/received_image.jpeg. This caused the
analyze_previously_received_imagetool to fail when trying to analyze compressed
images, as it only looks for./camera/received_image.jpeg.This commit standardizes the path for both compressed and raw images to use
./camera/received_image.jpeg, ensuring that the analysis tool can find images
regardless of their original format.- Add comprehensive restructuring and migration plans
- Add plans.md: Index document for all planning documents
- Add restructuring_plan.md: Complete implementation guide with split-by-feature structure
- Update merge_plan.md: High-level overview with structure options
- Update move_all_tools.md: Quick reference guide for tool migration
- Move planning documents to docs/ directory
- Move merge_plan.md, move_all_tools.md, restructuring_plan.md to docs/
- Add plans.md index document in docs/
- Update references to simple-mcp-ai in merge_plan.md
-
Organized subplans to docs folder
-
Update restructuring plan to use __init__.py in tools/ and utils/
- Updated restructuring_plan.md to reflect package structure using __init__.py
- Changed tools.py references to tools/__init__.py
- Documented utils/__init__.py structure
- Updated pyproject.toml: removed py-modules, added proper packages configuration
- Restructured codebase to use package structure with __init__.py files
-
Merge back develop (with resources feature) to dev/ros_mcp (#212)
-
Add MCP resources for ROS metadata and robot specs
- Add resources/ros_metadata.py: Resource for getting all ROS metadata (topics, services, nodes, parameters)
- Add resources/robot_specs.py: Resource for listing all available robot specifications
- Fix rosapi parameters service: Use /rosapi/get_param_names instead of /rosapi/parameters
- Add resources/__init__.py: Register all resources with MCP server
- Update server.py: Register MCP resources on startup
- Refactor: Move services and nodes tools to separate modules
- Create ros_mcp/tools/services.py with service-related tools
- Create ros_mcp/tools/nodes.py with node-related tools
- Update restructuring plan documentation with progress
- Update tools_plan.md with migration status
- Update tool registration in __init__.py
-
Refactoring entrypoints for the repo
-
Moved node-related tools to tools folder
-
Moved topic-related tools to tools folder
-
Moved service-related tools to tools folder
-
Clean up topics.py: remove redundant None checks, improve validation logic, and format code
-
ruff format across all files
-
Migrate parameter tools to modular tools structure
- Tools migrated: get_parameter, set_parameter, has_parameter, delete_parameter, get_parameters, inspect_all_parameters, get_parameter_details
-
Migrate image tools to modular structure and consolidate helpers
-
Migrate service tools: clean up services.py and remove from monolithic
-
Migrate action tools to modular structure
-
Migrate from server_monolithic.py to ros_mcp/main.py
- Update server.py to use ros_mcp.main instead of ros_mcp.server
- Remove server_monolithic.py (functionality fully migrated to modular structure)
- All functionality now consolidated in ros_mcp/main.py + server.py
- Restore missing topic tools
- Fix tool count from 38 to 39 by restoring get_topic_publishers and get_topic_subscribers
- Add get_topic_publishers_impl and get_topic_subscribers_impl functions
- Remove get_topic_details tool registration (was not in original 39 tools)
- Update resource imports to use ros_mcp.utils.websocket_manager
- Fix robot_specs.py path calculation for new location
- refactor: rename websocket_manager.py to websocket.py and remove base utils folder
- Rename ros_mcp/utils/websocket_manager.py to websocket.py
- Update all imports across codebase to use new module name
- Remove base utils/ folder (all functions migrated to ros_mcp/utils/)
- Consolidate utils structure to single location
-
removed root utils folder
-
ruff format
-
Updated plans
-
Fix robot_specifications path in config_utils.py
Fixed incorrect path resolution for robot_specifications directory.
Changed from parent.parent to parent.parent.parent to correctly
point to project root where robot_specifications/ is located.-
Commented out prompts implementation
-
Minor changes to resources
-
Bugfix: MCP tool parsing by replacing Any with dict and copying default arguments
-
Added server_monolithic for reference
-
ruff format
-
Bugfix: modified rosapi services types in mcp tool implementation
-
Fix parameter tools: merge implementations, use node-specific list_parameters service, fix service types
-
Fix parameter tools to handle non-existing parameters safely
- Add existence check before get/set/delete operations to prevent rosapi_node crashes
- Fix has_parameter to correctly detect non-existent parameters (handles '""' value case)
- Add _safe_check_parameter_exists helper that uses get_param instead of has_param service
- Remove redundant existence checks and error handling code
- Simplify has_parameter to use helper directly instead of calling get_parameter
- Add proper empty value detection for parameters with '""' string values
- All parameter tools now return structured responses instead of crashing
-
Added prompts for testing server tools
-
Add test_connection_tools prompt and rename test_server_capabilities to test_server_tools
- Add test_connection_tools.py prompt with comprehensive guide for connection tools
- Guide covers ping_robot, connect_to_robot, and detect_ros_version
- Include troubleshooting, examples, and best practices
- Rename test_server_capabilities to test_server_tools for consistency
- Update all imports and function names accordingly
- Register test_connection_tools in prompts __init__.py
-
Refactor nodes tools: inline implementations and move inspect_all_nodes to resources
-
Update test-nodes-tools prompts to use resource instead of inspect_all_nodes tool
- Replace inspect_all_nodes() tool references with ros-mcp://ros-metadata/nodes/all resource
- Update testing checklist and tips to reference the resource
- Complete migration of inspect_all_nodes from tool to resource
-
Added prompts to test parameters tools + registration
-
ruff format
-
Move inspect_all_services from tools to resources and add test_services_tools prompts
-
Refactor services tools: inline implementations and merge get_service_providers into get_service_details
-
Refactor topics tools: migrate inspect_all to resources, inline implementations, and add default values
-
Clean up and fix action tools + added prompt for test_actions_tools
-
Added resource to get actions details + minor ruff formt changes
-
Remove verbose sections from test prompts to keep prompts concise and focused on essential testing information.
-
Add comprehensive testing guide with complete instructions
- Include prerequisites and setup instructions
- Document how to use test prompts
- Document how to access and use resources
- Include complete testing workflow examples
- Add troubleshooting section
- Remove resource validation, focus on gathering resources
-
Fix documentation consistency and add architecture guide
-
Minor changes to documentation
-
Removed *_impl patter for connection tools module
-
Removed *_impl patter for images tools module
-
Removed *_impl patter for robot_config tools module
-
Added docstrings for each tool following Args/Results pattern
-
Added tool implementation template including decorator/docstrings/implementation details.
-
Remove Optional/union types from tool parameters, use None defaults and apply at runtime defaults.
- Update actions.py, services.py, and topics.py to use dynamic defaults
- Fixes MCP tool parameter validation issues for LLM clients (issue #140)
- Minor typo
Co-authored-by: Rohit John Varghese rohit@contoro.com
Co-authored-by: Rohit John Varghese 93564012+rjohn-v@users.noreply.github.com
Co-authored-by: Giovanni Toffetti toff@zhaw.ch- feat: add MCP tool annotations for improved LLM understanding
Add ToolAnnotations to all 31 tools across 8 modular tool files:
- topics.py: 8 tools (6 readOnlyHint, 2 destructiveHint)
- services.py: 4 tools (3 readOnlyHint, 1 destructiveHint)
- nodes.py: 2 tools (2 readOnlyHint)
- connection.py: 2 tools (1 readOnlyHint, 1 destructiveHint)
- actions.py: 5 tools (3 readOnlyHint, 2 destructiveHint)
- parameters.py: 6 tools (4 readOnlyHint, 2 destructiveHint)
- images.py: 1 tool (1 readOnlyHint)
- robot_config.py: 3 tools (3 readOnlyHint)
Tool annotations help LLMs understand tool behavior before execution,
enabling better tool selection and safety warnings for destructive operations.🤖 Generated with Claude Code
- Fix packaging configuration: add missing modules and correct entry point
- Add ros_mcp.prompts and ros_mcp.resources to packages list
- Fix entry point from ros_mcp.server:main to ros_mcp.main:main
- fix: update type annotations to use union syntax for optional parameters
- Replace 'float = None' with 'float | None = None' in topics.py, actions.py, and services.py
- Replace 'int = None' with 'int | None = None' in topics.py
- Replace 'Context = None' with 'Context | None = None' in actions.py
- Fixes 8 linter errors related to type annotations
- fix: resolve remaining linter errors in images, actions, and parameters
- images.py: Update return type to dict | Any to allow ImageContent return
- actions.py: Initialize action_interfaces before if/else block to fix scoping issue
- parameters.py: Move fallback return out of else block for clearer control flow
- Fix packaging configuration: add missing modules and correct entry point (#221)
- Add ros_mcp.prompts and ros_mcp.resources to packages list
- Fix entry point from ros_mcp.server:main to ros_mcp.main:main
-
feat: add integration.py for parent server registration (#223)
-
feat: add integration.py for parent server registration
Adds ros_mcp/integration.py that owns ROS configuration (rosbridge IP/port)
and provides register() function for submodule_integration.py to call.
This allows the parent server to be submodule-agnostic.Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com
- ruff errors
Co-authored-by: Claude Opus 4.5 noreply@anthropic.com
- fix: remove union types from tool signatures for MCP client compatibility
Remove union types (float | None, int | None, Context | None) from tool
function signatures and replace with simple types plus type ignore flags.
This ensures FastMCP generates simpler JSON schemas without anyOf unions,
which are incompatible with many MCP clients (Cursor, Home Assistant, etc.).Changes:
- services.py: call_service() timeout parameter
- actions.py: send_action_goal() timeout and ctx parameters
- topics.py: subscribe_once() and subscribe_for_duration() timeout,
queue_length, and throttle_rate_ms parameters
Runtime behavior unchanged - functions already handle None values correctly.
-
style: format call_service function parameters on separate lines
-
fix: improve type annotations in images.py
- Replace dict | Any with dict | ImageContent for accurate return type
- Add ImageContent import from mcp.types
- Add return type annotation to _encode_image_to_imagecontent()
- Remove unused Any import from typing
This provides better type safety and matches the actual return types.
- docs: add issue #140 references to all type ignore flags
Add '# See issue #140' comments to all type ignore flags to document
why they are needed. This provides context linking the type suppressions
to the MCP client compatibility issue discussed in issue #140.Updated files:
- actions.py: timeout and ctx parameters
- images.py: return type and return statement
- services.py: timeout parameter
- topics.py: timeout, queue_length, and throttle_rate_ms parameters
- feat: add Docker-based installation tests
Add installation tests that validate package installation across different
methods (pip, uvx, uv) and Python versions (3.10, 3.11, 3.12).Tests use Docker to create clean environments and install from git to catch
installation issues before PyPI release.Test files:
- test_pip_install.py: pip install from git and source
- test_uvx_install.py: uvx --from git+repo installation
- test_source_install.py: uv sync development workflow
Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com
- fix: Change connect_to_robot to destructiveHint=False
Address review feedback from @r-johnv. The connect_to_robot tool:
- Sets internal IP/port configuration in the WebSocket manager
- Tests connectivity (ping and port check)
- Does NOT send commands to the robot
- Does NOT modify robot state or behavior
This is a configuration/connectivity check, not a destructive action.
Per MCP spec, destructiveHint should only be true for tools that
perform destructive updates to external systems.-
fix: Sort imports in images.py to fix ruff linting
-
Fix type annotations and improve test configuration
- Fix type annotations in conftest.py (str|None, dict|None) to resolve linter errors
- Remove incorrect tests/ entry from .gitignore (test files should be tracked)
- Add 'slow' marker documentation to pyproject.toml
-
Format code with ruff
-
refactor: simplify installation tests per review feedback
Address review feedback from @r-johnv:
-
Remove redundant SUCCESS echo from Dockerfiles
- returncode == 0 already confirms all steps passed
- Hardcoded echo doesn't verify anything meaningful
-
Remove redundant SUCCESS assertion from tests
- The assertion just checked for hardcoded echo output
- returncode check is sufficient
-
Remove test_uvx_install_with_transport_flag
- Testing --transport=stdio is redundant (it's the default)
- Transport flag testing belongs in E2E tests, not installation tests
Installation tests now focus purely on verifying:
- Package installs successfully (pip/uvx/uv)
- CLI entry point works (ros-mcp --help)
- Package is importable (import ros_mcp)
Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com
- Add test for uvx install from local repository
- Add test_uvx_install_from_local to test uvx . installation method
- Create Dockerfile.uvx-local for local uvx installation testing
- Minor formatting fix in test_source_install.py
- chore: remove outdated files
- Remove server_monolithic.py (functionality migrated to modular structure)
- Remove docs/merge_plan_mok.md (completed planning document)
- Update docs/restructuring_plan.md to remove broken references
All functionality has been successfully migrated to ros_mcp/main.py and
ros_mcp/tools/ structure. The monolithic file is no longer needed.- Bump version to 3.0.0
Co-authored-by: Bharat Jain bharat.jain@plaksha.edu.in
Co-authored-by: Bharat Jain 152432505+itsbharatj@users.noreply.github.com
Co-authored-by: Yuta 120556494+Yutarop@users.noreply.github.com
Co-authored-by: Stefano Dalla Gasperina stefano.dallagasperina@austin.utexas.edu
Co-authored-by: Stefano Dalla Gasperina stefano.dallag@gmail.com
Co-authored-by: Luis Luna 158509707+luisluna01@users.noreply.github.com
Co-authored-by: Jungsoo Lee 69760395+lpigeon@users.noreply.github.com
Co-authored-by: Rohit John Varghese 93564012+rjohn-v@users.noreply.github.com
Co-authored-by: Giovanni Toffetti toff@zhaw.ch
Co-authored-by: triepod-ai 199543909+triepod-ai@users.noreply.github.com
Co-authored-by: Claude Opus 4.5 noreply@anthropic.com
Co-authored-by: mokcontoro mokcontoro@users.noreply.github.com下载附件