mcp2mqtt

# mcp2mqtt: Bridge Between Physical World and AI Large Models English | [简体中文](README.md) <div align="center"> <img src="docs/images/logo.png" alt="mcp2mqtt Logo" width="200"/> <p>Control Hardware Through Natural Language, Opening a New Era of IoT</p> </div> mcp2mqtt is a serial communication server based on the MCP service interface protocol, designed for communication with serial devices. It provides a simple configuration approach for defining and managing serial commands. ## Features - 🔌 Automatic serial port detection and connection management - 📝 Simple YAML configuration - 🛠️ Customizable commands and response parsing - 🌐 Multi-language prompt support - 🚀 Asynchronous communication support - Auto-detect and connect to serial ports at 115200 baud rate - Control PWM frequency (range: 0-100) - Compliant with Claude MCP protocol - Comprehensive error handling and status feedback - Cross-platform support (Windows, Linux, macOS) - **Smart MQTT Communication** - Support for MQTT protocol publish/subscribe model - Support for various MQTT servers (e.g., Mosquitto, EMQ X) - QoS (Quality of Service) guarantee - Topic filtering and message routing - Real-time status monitoring and error handling ## System Architecture <div align="center"> <img src="docs/images/stru_en.png" alt="System Architecture" width="800"/> <p>mcp2mqtt System Architecture</p> </div> ## Workflow <div align="center"> <img src="docs/images/workflow_en.png" alt="Workflow" width="800"/> <p>mcp2mqtt Workflow</p> </div> ## Project Vision mcp2mqtt is a project that connects IoT devices with AI large models through Model Context Protocol (MCP) and MQTT protocol, achieving seamless integration between the physical world and AI models. The ultimate goals are: - Control your hardware devices using natural language - Real-time AI response and physical parameter adjustment - Enable your devices to understand and execute complex instructions - Enable device interconnection through MQTT protocol ## Key Features - **MCP Protocol Integration** - Complete support for Model Context Protocol - Resource management and tool invocation support - Flexible prompt system - Command publishing and response through MQTT ## Configuration Guide ### MQTT Configuration ```yaml mqtt: broker: "localhost" # MQTT server address port: 1883 # MQTT server port client_id: "mcp2mqtt_client" # MQTT client ID username: "mqtt_user" # MQTT username password: "mqtt_password" # MQTT password keepalive: 60 # Keep-alive time topics: command: publish: "mcp/command" # Command publishing topic subscribe: "mcp/response" # Response subscription topic status: publish: "mcp/status" # Status publishing topic subscribe: "mcp/control" # Control command subscription topic ``` ### Command Configuration ```yaml commands: set_pwm: command: "CMD_PWM {frequency}" need_parse: false data_type: "ascii" prompts: - "Set PWM to maximum" - "Set PWM to minimum" mqtt_topic: "mcp/pwm" # MQTT publish topic response_topic: "mcp/pwm/response" # MQTT response topic ``` ## Supported Clients mcp2mqtt supports all clients implementing the MCP protocol and IoT devices supporting the MQTT protocol: | Client Type | Feature Support | Description | |------------|----------------|-------------| | Claude Desktop | Full Support | Recommended, supports all MCP features | | Continue | Full Support | Excellent development tool integration | | Cline | Resource + Tools | Supports multiple AI providers | | MQTT Devices | Pub/Sub | Supports all MQTT-compatible IoT devices | ## Quick Start ### Prepare Python>=3.11 Claude Desktop or Cline+Vscode ### Installation #### For Windows Users ```bash # Download the installation script curl -O https://raw.githubusercontent.com/mcp2everything/mcp2mqtt/main/install.py # Run the installation script python install.py ``` #### For macOS Users ```bash # Download the installation script curl -O https://raw.githubusercontent.com/mcp2everything/mcp2mqtt/main/install_macos.py # Run the installation script python3 install_macos.py ``` #### For Ubuntu/Raspberry Pi Users ```bash # Download the installation script curl -O https://raw.githubusercontent.com/mcp2everything/mcp2mqtt/main/install_ubuntu.py # Run the installation script python3 install_ubuntu.py ``` The installation script will automatically: - ✅ Check system environment - ✅ Install required dependencies - ✅ Create default configuration file - ✅ Configure Claude Desktop (if installed) - ✅ Check serial devices ### Configuration File Location The configuration file (`config.yaml`) can be placed in different locations depending on your needs: #### 1. Current Working Directory (For Development) - Path: `./config.yaml` - Example: If you run the program from `C:\Projects`, it will look for `C:\Projects\config.yaml` - Best for: Development and testing - No special permissions required #### 2. User's Home Directory (Recommended for Personal Use) ```bash # Windows C:\Users\YourName\.mcp2mqtt\config.yaml # macOS /Users/YourName/.mcp2mqtt/config.yaml # Linux /home/username/.mcp2mqtt/config.yaml ``` - Best for: Personal configuration - Create the `.mcp2mqtt` directory if it doesn't exist: ```bash # Windows (in Command Prompt) mkdir "%USERPROFILE%\.mcp2mqtt" # macOS/Linux mkdir -p ~/.mcp2mqtt ``` #### 3. System-wide Configuration (For Multi-user Setup) ```bash # Windows (requires admin rights) C:\ProgramData\mcp2mqtt\config.yaml # macOS/Linux (requires sudo/root) /etc/mcp2mqtt/config.yaml ``` - Best for: Shared configuration in multi-user environments - Create the directory with appropriate permissions: ```bash # Windows (as administrator) mkdir "C:\ProgramData\mcp2mqtt" # macOS/Linux (as root) sudo mkdir -p /etc/mcp2mqtt sudo chown root:root /etc/mcp2mqtt sudo chmod 755 /etc/mcp2mqtt ``` The program searches for the configuration file in this order and uses the first valid file it finds. Choose the location based on your needs: - For testing: use current directory - For personal use: use home directory (recommended) - For system-wide settings: use ProgramData or /etc ### Serial Port Configuration Configure serial port and commands in `config.yaml`: ```yaml # config.yaml serial: port: COM11 # or auto-detect baud_rate: 115200 commands: set_pwm: command: "PWM {frequency}\n" need_parse: false prompts: - "Set PWM to {value}%" ``` 3.MCP json Configuration Add the following to your MCP client (like Claude Desktop or Cline) configuration file, making sure to update the path to your actual installation path: ```json { "mcpServers": { "mcp2mqtt": { "command": "uvx", "args": ["mcp2mqtt"] } } } ``` if you want to develop locally, you can use the following configuration: ```json { "mcpServers": { "mcp2mqtt": { "command": "uv", "args": [ "--directory", "your project path/mcp2mqtt", // ex: "C:/Users/Administrator/Documents/develop/my-mcp-server/mcp2mqtt" "run", "mcp2mqtt" ] } } } ``` > **Important Notes:** > 1. Use absolute paths only > 2. Use forward slashes (/) or double backslashes (\\) as path separators > 3. Ensure the path points to your actual project installation directory 4. launch your client(claude desktop or cline): ## Interacting with Claude Once the service is running, you can control PWM through natural language conversations with Claude. Here are some example prompts: - "Set PWM to 50%" - "Turn PWM to maximum" - "Turn off PWM output" - "Adjust PWM frequency to 75%" - "Can you set PWM to 25%?" Claude will understand your intent and automatically invoke the appropriate commands. No need to remember specific command formats - just express your needs in natural language. <div align="center"> <img src="docs/images/pwm.png" alt="Cline Configuration Example" width="600"/> <p> Example in Claude</p> </div> <div align="center"> <img src="docs/images/test_output.png" alt="Cline Configuration Example" width="600"/> <p>Example in Cline</p> </div> ## Documentation - [Installation Guide](./docs/en/installation.md) - [API Documentation](./docs/en/api.md) - [Configuration Guide](./docs/en/configuration.md) ## Examples ### 1. Simple Command Configuration ```yaml commands: led_control: command: "LED {state}\n" need_parse: false prompts: - "Turn on LED" - "Turn off LED" ``` ### 2. Command with Response Parsing ```yaml commands: get_temperature: command: "GET_TEMP\n" need_parse: true prompts: - "Get temperature" ``` Response example: ```python { "status": "success", "result": { "raw": "OK TEMP=25.5" } } ``` ## Requirements - Python 3.11+ - pyserial - mcp ## Installation from source code #### Manual Installation ```bash # Install from source: git clone https://github.com/mcp2everything/mcp2mqtt.git cd mcp2mqtt # Create virtual environment uv venv .venv # Activate virtual environment # Windows: .venv\Scripts\activate # Linux/macOS: source .venv/bin/activate # Install development dependencies uv pip install --editable . ``` ## Running the Service Use the `uv run` command to automatically build, install, and run the service: ```bash uv run src/mcp2mqtt/server.py ``` This command will: 1. Build the mcp2mqtt package 2. Install it in the current environment 3. Start the server ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate. ### Development Setup 1. Fork and clone the repository 2. Create a virtual environment: ```bash uv venv # Windows: .venv\Scripts\activate # Linux/macOS: source .venv/bin/activate ``` 3. Install development dependencies: ```bash uv pip install -e ".[dev]" ``` ### Running Tests ```bash uv pytest tests/ ``` ## License [MIT](LICENSE) ## Acknowledgments - Thanks to the [Claude](https://claude.ai) team for the MCP protocol - [pySerial](https://github.com/pyserial/pyserial) for serial communication - All contributors and users of this project ## Support If you encounter any issues or have questions: 1. Check the [Issues](https://github.com/mcp2everything/mcp2mqtt/issues) page 2. Read our [Wiki](https://github.com/mcp2everything/mcp2mqtt/wiki) 3. Create a new issue if needed