Skip to main content

English | 日本語 | README

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 to true, allows executing non-ros2 commands (default: false)
  • MCP_TRANSPORT: Transport mode. stdio (default) or streamable-http
  • MCP_HOST: HTTP host/interface for streamable-http (default: 0.0.0.0)
  • MCP_PORT: HTTP port for streamable-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 (overrides ROS2_EXEC_TIMEOUT)
  • cwd (optional): Working directory (overrides DEFAULT_CWD)

Returns combined stdout/stderr and exit code.

Development

  1. Clone and install dependencies with uv:

    uv sync
    
  2. Run the server:

    uv run takanarishimbo-ros2-exec-mcp
    
  3. 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

  1. Log in to PyPI (create account if needed)

  2. Navigate to Publishing Settings

  3. 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)
    • Click "Add"

2. Configure GitHub Environment (Recommended)

  1. Navigate to Repository Settings

    • Go to your GitHub repository
    • Click "Settings" → "Environments"
  2. 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:

  1. 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_)
  2. 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

  1. Check GitHub Actions

    • Go to "Actions" tab in your repository
    • Verify the "Publish to PyPI" workflow completed successfully
  2. Verify PyPI Package

Release Process Flow

  1. release.sh script updates version in all files
  2. Creates git commit and tag
  3. Pushes to GitHub
  4. GitHub Actions workflow triggers on new tag
  5. Workflow uses OIDC to authenticate with PyPI (no tokens needed!)
  6. Workflow builds project and publishes to PyPI
  7. Package becomes available globally via pip install or uvx

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)

Source distribution for takanarishimbo-ros2-exec-mcp 0.2.2
File Size Uploaded
takanarishimbo_ros2_exec_mcp-0.2.2.tar.gz 7.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for takanarishimbo-ros2-exec-mcp 0.2.2
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.2.2 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page