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
Metadata
Release files for takanarishimbo-ros2-exec-mcp 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| takanarishimbo_ros2_exec_mcp-0.2.2.tar.gz | 7.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| takanarishimbo_ros2_exec_mcp-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.7 kB
Release files / takanarishimbo_ros2_exec_mcp-0.2.2.tar.gz
| Download URL | takanarishimbo_ros2_exec_mcp-0.2.2.tar.gz |
|---|---|
| Size | 7.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2597cc26f1d05a642cae07f4762db7ee6f5861049ffc5ad6fd843a079b93f223
|
|
BLAKE2b-256 checksum How to use checksums |
62bf0d1bae7be5818a2a49fe4396a23512bd5cc33282baaa047da450698043cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.8.12
|
Release files / takanarishimbo_ros2_exec_mcp-0.2.2-py3-none-any.whl
| Download URL | takanarishimbo_ros2_exec_mcp-0.2.2-py3-none-any.whl |
|---|---|
| Size | 7.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5f4c7509b905c6971387b1c3f58d5fe99d42da679e85c60d4c9fe3f039074793
|
|
BLAKE2b-256 checksum How to use checksums |
23f73b18f116c321d4472d2545f57307ee711decbb256ff8ef810892516955b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.8.12
|