Ros2 Exec MCP
An MCP server that executes ROS 2 (ros2) CLI commands
Installation
npx ros2-exec-mcpAsk AI about Ros2 Exec MCP
Powered by Claude Β· Grounded in docs
I know everything about Ros2 Exec MCP. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
ROS2 Exec MCP Server
A Model Context Protocol (MCP) server that executes ROS 2 (ros2) CLI commands.
Features
- Execute ROS 2 CLI commands (e.g.,
ros2 topic list,ros2 node list) - Configurable default timeout via environment variable
- Optional working directory control
- Secure by default: only allows commands starting with
ros2(overridable)
Usage
Below are examples for both stdio and streamable-http.
Stdio (default)
MCP client example:
{
"mcpServers": {
"ros2": {
"command": "uvx",
"args": ["takanarishimbo-ros2-exec-mcp"]
}
}
}
You can also configure timeout, default working directory, or allow non-ros2 commands:
{
"mcpServers": {
"ros2": {
"command": "uvx",
"args": ["takanarishimbo-ros2-exec-mcp"],
"env": {
"ROS2_EXEC_TIMEOUT": "60",
"DEFAULT_CWD": "/your/ros2/ws",
"ALLOW_NON_ROS2": "true",
"MCP_TRANSPORT": "stdio"
}
}
}
}
streamable-http
Start the MCP server on the robot side first:
# Optional: set host/port if needed
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 MCP_PORT=8000 \
uvx takanarishimbo-ros2-exec-mcp
MCP client example:
{
"mcpServers": {
"ros2": {
"url": "http://xxx.xxx.xxx.xxx:8000/mcp",
"env": {
"MCP_TRANSPORT": "streamable-http"
}
}
}
}
Environment Variables
ROS2_EXEC_TIMEOUT: Default timeout seconds for command execution (default:30)DEFAULT_CWD: Default working directory for command execution (optional)ALLOW_NON_ROS2: If set totrue, allows executing non-ros2commands (default:false)MCP_TRANSPORT: Transport mode.stdio(default) orstreamable-httpMCP_HOST: HTTP host/interface forstreamable-http(default:0.0.0.0)MCP_PORT: HTTP port forstreamable-http(default:8080)
Available Tools
ros2_exec
Execute a ROS 2 CLI command.
Parameters:
command(required): Full command string, e.g.,"ros2 topic list"timeout(optional): Timeout seconds (overridesROS2_EXEC_TIMEOUT)cwd(optional): Working directory (overridesDEFAULT_CWD)
Returns combined stdout/stderr and exit code.
Development
-
Clone and install dependencies with
uv:uv sync -
Run the server:
uv run takanarishimbo-ros2-exec-mcp -
Test with MCP Inspector (optional):
npx @modelcontextprotocol/inspector uv run takanarishimbo-ros2-exec-mcp
Publishing to PyPI
This project uses PyPI's Trusted Publishers feature for secure, token-less publishing via GitHub Actions.
1. Configure PyPI Trusted Publisher
-
Log in to PyPI (create account if needed)
- Go to https://pypi.org/
-
Navigate to Publishing Settings
- Go to your account settings
- Click on "Publishing" or go to https://pypi.org/manage/account/publishing/
-
Add GitHub Publisher
- Click "Add a new publisher"
- Select "GitHub" as the publisher
- Fill in:
- Owner:
TakanariShimbo(your GitHub username/org) - Repository:
ros2-exec-mcp - Workflow name:
pypi-publish.yml - Environment:
pypi(optional but recommended)
- Owner:
- Click "Add"
2. Configure GitHub Environment (Recommended)
-
Navigate to Repository Settings
- Go to your GitHub repository
- Click "Settings" β "Environments"
-
Create PyPI Environment
- Click "New environment"
- Name:
pypi - Configure protection rules (optional):
- Add required reviewers
- Restrict to specific branches/tags
3. Setup GitHub Personal Access Token (for release script)
The release script needs to push to GitHub, so you'll need a GitHub token:
-
Create GitHub Personal Access Token
- Go to https://github.com/settings/tokens
- Click "Generate new token" β "Generate new token (classic)"
- Set expiration (recommended: 90 days or custom)
- Select scopes:
- β
repo(Full control of private repositories)
- β
- Click "Generate token"
- Copy the generated token (starts with
ghp_)
-
Configure Git with Token
# Option 1: Use GitHub CLI (recommended) gh auth login # Option 2: Configure git to use token git config --global credential.helper store # Then when prompted for password, use your token instead
4. Release New Version
Use the release script to automatically version, tag, and trigger publishing:
# First time setup
chmod +x scripts/release.sh
# Increment patch version (0.1.0 β 0.1.1)
./scripts/release.sh patch
# Increment minor version (0.1.0 β 0.2.0)
./scripts/release.sh minor
# Increment major version (0.1.0 β 1.0.0)
./scripts/release.sh major
# Set specific version
./scripts/release.sh 1.2.3
5. Verify Publication
-
Check GitHub Actions
- Go to "Actions" tab in your repository
- Verify the "Publish to PyPI" workflow completed successfully
-
Verify PyPI Package
- Visit: https://pypi.org/project/takanarishimbo-ros2-exec-mcp/
- Or run:
pip show takanarishimbo-ros2-exec-mcp
Release Process Flow
release.shscript updates version in all files- Creates git commit and tag
- Pushes to GitHub
- GitHub Actions workflow triggers on new tag
- Workflow uses OIDC to authenticate with PyPI (no tokens needed!)
- Workflow builds project and publishes to PyPI
- Package becomes available globally via
pip installoruvx
Code Quality
Uses ruff for linting and formatting:
uv run ruff check
uv run ruff check --fix
uv run ruff format
Project Structure
ros2-exec-mcp/
βββ src/
β βββ __init__.py
β βββ __main__.py
β βββ server.py
βββ pyproject.toml
βββ uv.lock
βββ .github/
β βββ workflows/
β βββ pypi-publish.yml
βββ scripts/
β βββ release.sh
βββ docs/
β βββ README.md
β βββ README_ja.md
βββ .gitignore
License
MIT
