# mcp2mqtt: 连接物理世界与AI大模型的桥梁 

[English](README_EN.md) | 简体中文

<div align="center">
    <img src="docs/images/logo.png" alt="mcp2mqtt Logo" width="200"/>
    <p>通过自然语言控制硬件，开启物联网新纪元</p>
</div>

## 系统架构

<div align="center">
    <img src="docs/images/stru_chs.png" alt="系统架构图" width="800"/>
    <p>mcp2mqtt 系统架构图</p>
</div>

## 工作流程

<div align="center">
    <img src="docs/images/workflow_chs.png" alt="工作流程图" width="800"/>
    <p>mcp2mqtt 工作流程图</p>
</div>

## 项目愿景

mcp2mqtt 是一个将物联网设备接入AI大模型的项目，它通过 Model Context Protocol (MCP) 和 MQTT 协议将物理世界与 AI 大模型无缝连接。最终实现：
- 用自然语言控制你的硬件设备
- AI 实时响应并调整物理参数
- 让你的设备具备理解和执行复杂指令的能力
- 通过MQTT协议实现设备间的互联互通

## 主要特性

- **智能MQTT通信**
  - 支持MQTT协议的发布/订阅模式
  - 支持多种MQTT服务器（如Mosquitto、EMQ X等）
  - 支持QoS服务质量保证
  - 支持主题过滤和消息路由
  - 实时状态监控和错误处理

- **MCP 协议集成**
  - 完整支持 Model Context Protocol
  - 支持资源管理和工具调用
  - 灵活的提示词系统
  - 通过MQTT实现命令的发布与响应

## 配置说明

### MQTT配置
```yaml
mqtt:
  # MQTT服务器配置 - 使用EMQX公共测试服务器
  broker: "broker.emqx.io"  # EMQX公共测试服务器地址
  port: 1883  # TCP端口
  websocket_port: 8083  # WebSocket端口
  ssl_port: 8883  # SSL/TLS端口
  ws_ssl_port: 8084  # WebSocket Secure端口
  quic_port: 14567  # QUIC端口
  client_id: "mcp2mqtt_test_client"  # 测试客户端ID
  username: ""  # 公共测试服务器不需要认证
  password: ""  # 公共测试服务器不需要认证
  keepalive: 60
  response_start_string: "CMD"  # 应答的开始字符串，用于验证响应

# MCP工具定义
tools:
  set_pwm:
    name: "set_pwm"
    description: "设置PWM频率，范围0-100"
    parameters:
      - name: "frequency"
        type: "integer"
        description: "PWM频率值(0-100)"
        required: true
    mqtt_topic: "mcp2mqtt/pwm"
    response_topic: "mcp2mqtt/pwm/response"
    response_format: "CMD PWM {frequency} OK"
```
## MQTT 命令和响应

### 命令格式

命令使用简单的文本格式：

1. PWM 控制：
   - 命令：`PWM {值}`
   - 示例：
     - `PWM 100`（最大值）
     - `PWM 0`（关闭）
     - `PWM 50`（50%）
   - 响应：`CMD PWM {值} OK`

2. LED 控制：
   - 命令：`LED {状态}`
   - 示例：
     - `LED on`（打开）
     - `LED off`（关闭）
   - 响应：`CMD LED {状态} OK`

3. 设备信息：
   - 命令：`INFO`
   - 响应：`CMD INFO {设备信息}`

### 错误响应

如果发生错误，响应格式将为：
`ERROR: {错误信息}`

## 支持的客户端

mcp2mqtt 支持所有实现了 MCP 协议的客户端，以及支持MQTT协议的物联网设备：

| 客户端类型 | 特性支持 | 说明 |
|--------|----------|------|
| Claude Desktop | 完整支持 | 推荐使用，支持所有 MCP 功能 |
| Continue | 完整支持 | 优秀的开发工具集成 |
| Cline | 资源+工具 | 支持多种 AI 提供商 |
| MQTT设备 | 发布/订阅 | 支持所有MQTT协议的物联网设备 |

## 快速开始

### 1. 安装

#### Windows用户
下载 [install.py](https://raw.githubusercontent.com/mcp2everything/mcp2mqtt/main/install.py) 
```bash
python install.py
```
#### macOS用户
```bash
# 下载安装脚本
curl -O https://raw.githubusercontent.com/mcp2everything/mcp2mqtt/main/install_macos.py

# 运行安装脚本
python3 install_macos.py
```

#### Ubuntu/Raspberry Pi用户
```bash
# 下载安装脚本
curl -O https://raw.githubusercontent.com/mcp2everything/mcp2mqtt/main/install_ubuntu.py

# 运行安装脚本
python3 install_ubuntu.py
```

安装脚本会自动完成以下操作：
- 检查系统环境
- 安装必要的依赖
- 创建默认配置文件
- 配置Claude桌面版（如果已安装）

### 手动分步安装依赖
```bash
windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
MacOS
curl -LsSf https://astral.sh/uv/install.sh | sh
```
主要依赖uv工具，所以当python和uv以及Claude或Cline安装好后就可以了。

### 基本配置
在你的 MCP 客户端（如 Claude Desktop 或 Cline）配置文件中添加以下内容：
注意：如果使用的自动安装那么会自动配置Calude Desktop无需此步。
使用默认配置文件：
```json
{
    "mcpServers": {
        "mcp2mqtt": {
            "command": "uvx",
            "args": [
                "mcp2mqtt"
            ]
        }
    }
}
```
> 注意：修改配置后需要重启Cline或者Claude客户端软件
## 配置说明
### 配置文件位置
复制配置文件（`config.yaml`）可以放在位置：
用户主目录（推荐个人使用）
```bash
# Windows系统
C:\Users\用户名\.mcp2mqtt\config.yaml

# macOS系统
/Users/用户名/.mcp2mqtt/config.yaml

# Linux系统
/home/用户名/.mcp2mqtt/config.yaml
```
- 适用场景：个人配置
- 需要创建 `.mcp2mqtt` 目录：
  ```bash
  # Windows系统（在命令提示符中）
  mkdir "%USERPROFILE%\.mcp2mqtt"
  
  # macOS/Linux系统
  mkdir -p ~/.mcp2mqtt
  ```
 
指定配置文件：
比如指定加载Pico配置文件：Pico_config.yaml
```json
{
    "mcpServers": {
        "mcp2mqtt": {
            "command": "uvx",
            "args": [
                "mcp2mqtt",
                "--config",
                "Pico"  //指定配置文件名，不需要添加_config.yaml后缀
            ]
        }
    }
}
```
为了能使用多个mqtt，我们可以新增多个mcp2mqtt的服务 指定不同的配置文件名即可。
如果要接入多个设备，如有要连接第二个设备：
指定加载Pico2配置文件：Pico2_config.yaml
```json
{
    "mcpServers": {
        "mcp2mqtt2": {
            "command": "uvx",
            "args": [
                "mcp2mqtt",
                "--config",
                "Pico2"  //指定配置文件名，不需要添加_config.yaml后缀
            ]
        }
    }
}
```

### 硬件连接
1. 将你的设备通过网络连接到mqtt服务器
2. 也可以用tests目录下的responder.py来模拟设备

## 运行测试

### 启动设备模拟器

项目在 `tests` 目录中包含了一个设备模拟器。它可以模拟一个硬件设备，能够：
- 响应 PWM 控制命令
- 提供设备信息
- 控制 LED 状态

启动模拟器：
```bash
python tests/responder.py
```

你应该能看到模拟器正在运行并已连接到 MQTT 服务器的输出信息。

### 启动客户端Claude 桌面版或Cline
<div align="center">
    <img src="docs/images/test_output.png" alt="Cline Configuration Example" width="600"/>
    <p>Example in Cline</p>
</div>

### 从源码快速开始
1. 从源码安装
```bash
# 通过源码安装：
git clone https://github.com/mcp2everything/mcp2mqtt.git
cd mcp2mqtt

# 创建虚拟环境
uv venv .venv

# 激活虚拟环境
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate

# 安装开发依赖
uv pip install --editable .
```

### MCP客户端配置
在使用支持MCP协议的客户端（如Claude Desktop或Cline）时，需要在客户端的配置文件中添加以下内容：
直接自动安装的配置方式
源码开发的配置方式
#### 使用默认演示参数：
```json
{
    "mcpServers": {
        "mcp2mqtt": {
            "command": "uv",
            "args": [
                "--directory",
                "你的实际路径/mcp2mqtt",  // 例如: "C:/Users/Administrator/Documents/develop/my-mcp-server/mcp2mqtt"
                "run",
                "mcp2mqtt"
            ]
        }
    }
}
```
#### 指定参数文件名
```json
{
    "mcpServers": {
        "mcp2mqtt": {
            "command": "uv",
            "args": [
                "--directory",
                "你的实际路径/mcp2mqtt",  // 例如: "C:/Users/Administrator/Documents/develop/my-mcp-server/mcp2mqtt"
                "run",
                "mcp2mqtt",
                "--config", // 可选参数，指定配置文件名
                "Pico"  // 可选参数，指定配置文件名，不需要添加_config.yaml后缀
            ]
        }
    }
}
```
<div align="center">
    <img src="docs/images/config.png" alt="Cline Configuration Example" width="600"/>
    <p>Example in Cline</p>
</div>
### 配置文件位置
配置文件（`config.yaml`）可以放在不同位置，程序会按以下顺序查找：
#### 1. 当前工作目录（适合开发测试）
- 路径：`./config.yaml`
- 示例：如果你在 `C:\Projects` 运行程序，它会查找 `C:\Projects\config.yaml`
- 适用场景：开发和测试
- 不需要特殊权限

#### 2. 用户主目录（推荐个人使用）
```bash
# Windows系统
C:\Users\用户名\.mcp2mqtt\config.yaml

# macOS系统
/Users/用户名/.mcp2mqtt/config.yaml

# Linux系统
/home/用户名/.mcp2mqtt/config.yaml
```
- 适用场景：个人配置
- 需要创建 `.mcp2mqtt` 目录：
  ```bash
  # Windows系统（在命令提示符中）
  mkdir "%USERPROFILE%\.mcp2mqtt"
  
  # macOS/Linux系统
  mkdir -p ~/.mcp2mqtt
  ```

#### 3. 系统级配置（适合多用户环境）
```bash
# Windows系统（需要管理员权限）
C:\ProgramData\mcp2mqtt\config.yaml

# macOS/Linux系统（需要root权限）
/etc/mcp2mqtt/config.yaml
```
- 适用场景：多用户共享配置
- 创建目录并设置权限：
  ```bash
  # Windows系统（以管理员身份运行）
  mkdir "C:\ProgramData\mcp2mqtt"
  
  # macOS/Linux系统（以root身份运行）
  sudo mkdir -p /etc/mcp2mqtt
  sudo chown root:root /etc/mcp2mqtt
  sudo chmod 755 /etc/mcp2mqtt
  ```

程序会按照上述顺序查找配置文件，使用找到的第一个有效配置文件。根据你的需求选择合适的位置：
- 开发测试：使用当前目录
- 个人使用：建议使用用户主目录（推荐）
- 多用户环境：使用系统级配置（ProgramData或/etc）

3. 运行服务器：
```bash
# 确保已激活虚拟环境
.venv\Scripts\activate

# 运行服务器（使用默认配置config.yaml 案例中用的LOOP_BACK 模拟串口，无需真实串口和串口设备）
uv run src/mcp2mqtt/server.py
或
uv run mcp2mqtt
# 运行服务器（使用指定配置Pico_config.yaml）
uv run src/mcp2mqtt/server.py --config Pico
或
uv run mcp2mqtt --config Pico
```


## 文档

- [安装指南](./docs/zh/installation.md)
- [API文档](./docs/zh/api.md)
- [配置说明](./docs/zh/configuration.md)