mcp-xiaomi-server
Enables control of local Xiaomi smart home devices via MCP, allowing reading real-time status and setting properties through natural language, without relying on the Xiaomi cloud.
README
MCP Xiaomi Server
为 LLM 大模型提供本地米家设备读取能力的 MCP (Model Context Protocol) Server。通过 python-miio 在局域网内直连米家 WiFi 设备(UDP:54321),读取实时状态(开关、温度、湿度、功率等);并可对摄像头抓拍照片、录制短视频。本 Server 只读,不含任何写入/控制设备的工具;设备的 IP/token 只保存在本地配置文件里,运行时完全不走小米云。
部署后,支持 MCP 的大模型客户端可以直接问:"客厅插座现在开着吗""卧室湿度多少""工作室摄像头现在拍到了什么"。
功能
- 列出已配置设备及在线状态
- 读取设备全部实时属性 / 单个属性
- 获取设备硬件信息(型号、固件、MAC)
- 摄像头抓拍照片(返回 JPEG 图片)、录制 N 秒视频(保存为 MP4)
- 支持 MIoT 协议(siid/piid)与传统 miIO 协议(get_prop)两类设备
- 两种传输模式:
stdio(本地)和sse(远程 HTTP)
只读设计:本 Server 刻意不提供任何写入/控制工具(不能开关设备、不能改参数、无原始命令透传),避免大模型误操作家里的电器。
前置条件:获取设备 IP 与 token
本地直连每个设备都需要 IP + 32 位 token + model。token 需一次性从小米云获取(之后运行时纯本地):
pip install python-miio
miiocli cloud # 用小米账号登录,列出所有设备的 IP / token / model
将结果填入设备清单文件(见下)。建议在路由器为设备保留固定 IP,避免 DHCP 变化。
设备清单配置
复制示例并填入你的真实设备(参考 devices.example.json):
cp devices.example.json devices.json
格式为设备数组。普通 miIO/MIoT 设备:
[
{
"id": "living_room_plug",
"name": "客厅插座",
"ip": "192.168.31.100",
"token": "0123456789abcdef0123456789abcdef",
"model": "cuco.plug.v3",
"protocol": "miot",
"properties": {
"switch_on": { "siid": 2, "piid": 1, "desc": "开关" },
"temperature": { "siid": 2, "piid": 6, "desc": "设备温度(°C)" }
}
}
]
protocol:miot(新设备,用 siid/piid)或legacy(老设备,properties为属性名数组)- MIoT 设备的
siid/piid可在 spec.miot-spec.com 按型号查到
摄像头(protocol: "camera")不走 python-miio,而是从一条本地 RTSP 流抓帧/录制,只需填 rtsp_url:
{
"id": "study_cam",
"name": "工作室摄像头",
"protocol": "camera",
"rtsp_url": "rtsp://127.0.0.1:8554/camera_1"
}
⚠️
devices.json含 token,已在.gitignore中排除,切勿提交到仓库。
摄像头的 RTSP 从哪来
米家摄像头不走 UDP:54321,本 Server 只负责用 ffmpeg 从一个现成的 RTSP 地址抓帧/录制。你需要另有一个把摄像头发布成本地 RTSP 的网关(例如把小米 P2P 流通过 MediaMTX 重发布为 rtsp://127.0.0.1:8554/camera_x),把该地址填进 rtsp_url 即可。运行本 Server 的机器需能访问该 RTSP,且已安装 ffmpeg。
快速开始
本地开发运行
pip install -e ".[sse]"
cp .env.example .env # 按需修改
cp devices.example.json devices.json && vim devices.json
export MCP_XIAOMI_DEVICES=$PWD/devices.json
# stdio 模式(本地 MCP 客户端)
MCP_TRANSPORT=stdio python -m mcp_xiaomi_server.server
# SSE 模式(远程 MCP 客户端)
MCP_TRANSPORT=sse python -m mcp_xiaomi_server.server
摄像头抓拍/录制依赖
ffmpeg,请确保已安装(Docker 镜像已内置)。
Docker 部署
本地控制需容器与设备同一局域网,compose 使用
network_mode: host(仅 Linux 宿主机)。
cp devices.example.json devices.json && vim devices.json
docker compose up -d
CI/CD 自动构建发布
在仓库 Settings → Secrets and variables → Actions 添加:
| Secret | 说明 |
|---|---|
HARBOR_USERNAME |
Harbor 用户名 |
HARBOR_PASSWORD |
Harbor 密码或访问令牌 |
镜像仓库地址已固定为
harbor.zkjgy.online/library(写死在 workflow 中)。
打 tag 触发构建:
git tag v1.1.0
git push origin v1.1.0
自动构建 amd64(x86 runner)+ arm64(原生 ARM runner)多架构镜像,推送 Harbor 并创建 GitHub Release。
MCP 客户端配置
SSE(远程)
{
"mcpServers": {
"xiaomi": {
"url": "http://<your-server-ip>:8092/sse"
}
}
}
stdio(本地)
{
"mcpServers": {
"xiaomi": {
"command": "python",
"args": ["-m", "mcp_xiaomi_server.server"],
"env": {
"MCP_TRANSPORT": "stdio",
"MCP_XIAOMI_DEVICES": "/path/to/devices.json"
}
}
}
}
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
MCP_IMAGE |
harbor.zkjgy.online/library/mcp-xiaomi-server:latest |
Docker 镜像地址 |
MCP_TRANSPORT |
sse |
传输模式:stdio 或 sse |
MCP_HOST |
0.0.0.0 |
SSE 模式监听地址 |
MCP_PORT |
8092 |
SSE 模式监听端口 |
MCP_XIAOMI_DEVICES |
~/.config/mcp-xiaomi-server/devices.json |
设备清单文件路径 |
MCP_XIAOMI_TIMEOUT |
5 |
单次设备通信超时(秒) |
MCP_XIAOMI_FFMPEG |
ffmpeg |
ffmpeg 可执行文件路径(摄像头抓拍/录制用) |
MCP_XIAOMI_CLIP_DIR |
系统临时目录 | 摄像头录制 MP4 的保存目录 |
MCP 工具列表
| 工具 | 说明 |
|---|---|
xiaomi_list_devices |
列出设备(含摄像头)及在线状态 |
xiaomi_get_status |
读取某设备全部实时属性(主力工具) |
xiaomi_get_property |
读取单个属性实时值 |
xiaomi_device_info |
设备硬件信息与在线判断 |
xiaomi_camera_snapshot |
抓取摄像头当前画面,返回 JPEG 图片 |
xiaomi_camera_clip |
录制摄像头一段视频(默认 10 秒),返回 MP4 路径 |
xiaomi_get_server_status |
服务器与配置状态 |
本 Server 为只读:不提供设置属性、开关设备或原始命令透传等写入工具。
工具调用示例
列出设备: xiaomi_list_devices()
读实时状态:xiaomi_get_status(device_id="living_room_plug")
读单个属性:xiaomi_get_property(device_id="bedroom_humidifier", property="humidity")
摄像头抓拍:xiaomi_camera_snapshot(device_id="study_cam")
摄像头录制:xiaomi_camera_clip(device_id="study_cam", seconds=10)
项目结构
mcp-xiaomi-server/
├── src/mcp_xiaomi_server/
│ ├── server.py # MCP 服务器入口,工具定义与分发
│ ├── camera.py # 摄像头抓拍/录制(ffmpeg 拉本地 RTSP)
│ └── mihome/
│ ├── base.py # 设备配置与数据模型
│ ├── local.py # python-miio 本地只读封装
│ └── registry.py # 设备清单加载与管理
├── devices.example.json # 设备清单示例
├── Dockerfile
├── docker-compose.yaml
├── .github/workflows/
│ └── build-release.yaml # CI/CD 工作流
├── requirements.txt
├── pyproject.toml
└── .env.example
局限与说明
- 本 Server 只读,不含任何控制/写入设备的工具。
- 普通设备仅覆盖 WiFi 直连设备。Zigbee/BLE 子设备(挂在小米网关下)需另走网关方案,不在本项目范围。
- 普通设备的 MCP 服务器必须与设备处于同一局域网;token 变更(设备重置/重新配网)后需更新
devices.json。 - 摄像头能力依赖一个外部的 RTSP 网关(把摄像头发布成本地 RTSP)与
ffmpeg;本 Server 本身不直接对接摄像头 SDK/云。
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。