loading…
Search for a command to run...
loading…
Enables natural language control of WeMo smart home devices for power, brightness, and device management through AI assistants. It features a high-reliability m
Enables natural language control of WeMo smart home devices for power, brightness, and device management through AI assistants. It features a high-reliability multi-phase discovery process to scan, monitor, and configure devices across a local network.
Control WeMo smart home devices through AI assistants using natural language.
mcp-name: io.github.apiarya/wemo
CI codecov Quality Gate Security Rating PyPI version Python 3.10+
Seamlessly integrate WeMo smart home devices with AI assistants through the Model Context Protocol. Built on pywemo, this server enables natural language control of your WeMo devices with intelligent multi-phase discovery.

Control WeMo devices through AI assistants with natural language - just ask in plain English!

"Goodnight" — one command turns off every device in the house
devices:// and device://{id} URIsAll configurations use uvx (from the uv Python package manager) to run the server. Install uv first:
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# macOS with Homebrew
brew install uv
# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
After installation, restart your terminal and verify:
uvx --version
Get started in seconds with Claude Code CLI:
claude mcp add wemo -- uvx wemo-mcp-server
Click your client to install instantly:
| Client | Install |
|---|---|
| Claude Desktop | Claude Desktop |
| Claude Code CLI | Run: claude mcp add wemo -- uvx wemo-mcp-server |
| VS Code | Install |
| Cursor | Add to Cursor |
| Cline | Manual config (VS Code extension) |
| Windsurf | Manual config |
| Zed | Manual config |
| Continue | Manual config (VS Code extension) |
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"wemo": {
"command": "uvx",
"args": ["wemo-mcp-server"],
"env": {
"WEMO_MCP_DEFAULT_SUBNET": "192.168.1.0/24"
}
}
}
}
Restart Claude Desktop after saving.
Edit ~/.vscode/mcp.json:
{
"servers": {
"wemo": {
"type": "stdio",
"command": "uvx",
"args": ["wemo-mcp-server"],
"env": {
"WEMO_MCP_DEFAULT_SUBNET": "192.168.1.0/24"
}
}
}
}
Reload VS Code after saving.
Edit ~/.cursor/mcp.json:
{
"servers": {
"wemo": {
"type": "stdio",
"command": "uvx",
"args": ["wemo-mcp-server"]
}
}
}
Restart Cursor after saving.
Cline is a VS Code extension. Add to VS Code's settings.json:
{
"mcp.servers": {
"wemo": {
"command": "uvx",
"args": ["wemo-mcp-server"]
}
}
}
Reload VS Code after saving.
Edit ~/.windsurf/mcp.json:
{
"mcpServers": {
"wemo": {
"command": "uvx",
"args": ["wemo-mcp-server"]
}
}
}
Restart Windsurf after saving.
Edit ~/.config/zed/settings.json:
{
"context_servers": {
"wemo": {
"command": "uvx",
"args": ["wemo-mcp-server"]
}
}
}
Restart Zed after saving.
Continue is a VS Code extension. Edit ~/.continue/config.json:
{
"mcpServers": [
{
"name": "wemo",
"command": "uvx",
"args": ["wemo-mcp-server"]
}
]
}
Reload VS Code after saving.
The WeMo MCP Server supports flexible configuration through YAML files and environment variables.
The most important setting is your network subnet — the server defaults to 192.168.1.0/24 but your devices may be on a different subnet (e.g. 192.168.86.0/24).
Set it directly in your MCP client config using env:
"env": {
"WEMO_MCP_DEFAULT_SUBNET": "192.168.86.0/24"
}
Or export it before starting the server:
Using Environment Variables (simplest):
export WEMO_MCP_DEFAULT_SUBNET="192.168.1.0/24"
export WEMO_MCP_CACHE_TTL=7200
export WEMO_MCP_LOG_LEVEL=DEBUG
Using YAML Config File:
# Copy example config and customize
cp config.example.yaml config.yaml
# Edit config.yaml with your settings
| Setting | Environment Variable | Default | Description |
|---|---|---|---|
| Network | |||
| Default subnet | WEMO_MCP_DEFAULT_SUBNET |
192.168.1.0/24 |
Network to scan for devices |
| Scan timeout | WEMO_MCP_SCAN_TIMEOUT |
0.6 |
Port probe timeout (seconds) |
| Max workers | WEMO_MCP_MAX_WORKERS |
60 |
Concurrent scanning threads |
| Cache | |||
| Enable cache | WEMO_MCP_CACHE_ENABLED |
true |
Persistent device caching |
| Cache file | WEMO_MCP_CACHE_FILE |
~/.wemo_mcp_cache.json |
Cache file location |
| Cache TTL | WEMO_MCP_CACHE_TTL |
3600 |
Cache lifetime (seconds) |
| Logging | |||
| Log level | WEMO_MCP_LOG_LEVEL |
INFO |
DEBUG, INFO, WARNING, ERROR |
Large Network (multiple subnets):
export WEMO_MCP_DEFAULT_SUBNET="10.0.0.0/16"
export WEMO_MCP_SCAN_TIMEOUT=1.0
export WEMO_MCP_MAX_WORKERS=100
Debug Mode:
export WEMO_MCP_LOG_LEVEL=DEBUG
export WEMO_MCP_CACHE_TTL=300 # 5 minutes
Disable Caching:
export WEMO_MCP_CACHE_ENABLED=false
See config.example.yaml and .env.example for complete configuration templates.
For detailed configuration guide, see CONFIGURATION.md.
Discover WeMo devices on your network using intelligent multi-phase scanning.
Example Prompts:
Example Response:
Found 12 WeMo devices in 23.5 seconds:
1. Office Light (Dimmer) - 192.168.1.100 - OFF
2. Living Room (Switch) - 192.168.1.101 - ON
3. Bedroom Lamp (Dimmer) - 192.168.1.102 - OFF
...
List all devices cached from previous scans.
Example Prompts:
Example Response:
12 devices in cache:
- Office Light (Dimmer) at 192.168.1.100
- Living Room (Switch) at 192.168.1.101
- Bedroom Lamp (Dimmer) at 192.168.1.102
...
Get current state and information for a specific device.
Example Prompts:
Example Response:
Office Light (Dimmer):
- State: OFF
- Brightness: 75%
- IP: 192.168.1.100
- Model: DimmerLongPress
Control a WeMo device (on/off/toggle/brightness).
Example Prompts:
Example Response:
✓ Office Light turned ON
Brightness set to 75%
Current state: ON
Rename a WeMo device (change its friendly name).
Example Prompts:
Example Response:
✓ Device renamed successfully
'Office Dimmer' → 'Office Light'
IP: 192.168.1.100
The new name will appear in the WeMo app and all control interfaces.
Get the HomeKit setup code for a WeMo device.
Example Prompts:
Example Response:
HomeKit Setup Code for 'Office Light':
123-45-678
Use this code to add the device to Apple Home.
Note: Not all WeMo devices support HomeKit. If a device doesn't support HomeKit, you'll get an error message.


Get information about the persistent device cache.
Example Prompts:
Example Response:
Device Cache Status:
✅ Cache exists
📁 Location: ~/.wemo_mcp_cache.json
📊 Devices: 12
⏰ Age: 1,234 seconds (20.6 minutes)
💾 TTL: 3,600 seconds (1 hour)
✅ Status: Valid (not expired)
Clear the persistent device cache to force a fresh scan.
Example Prompts:
Example Response:
✅ Cache cleared successfully
Next scan will discover devices fresh.
Run scan_network to rebuild the cache.
Note: This clears both the persistent cache file and in-memory cache. After clearing, run scan_network to rediscover devices.
View current server configuration settings.
Example Prompts:
Example Response:
Current Configuration:
Network:
• Default subnet: 192.168.1.0/24
• Scan timeout: 0.6 seconds
• Max workers: 60
Cache:
• Enabled: true
• File: ~/.wemo_mcp_cache.json
• TTL: 3600 seconds (1 hour)
Logging:
• Level: INFO
Note: Shows all configuration including defaults and environment variable overrides. Use environment variables with WEMO_MCP_ prefix to customize.
Beyond tools, this server exposes the full suite of MCP primitives.
Subscribe to live device data without calling a tool:
| URI | Description |
|---|---|
devices:// |
JSON index of all cached devices |
device://{name-or-ip} |
Live state for a specific device (URL-encoded name supported) |
Clients that support MCP Resources (VS Code, MCP Inspector) can read these directly.
Four built-in guided prompts available via / slash commands in supporting clients:
| Prompt | Description |
|---|---|
discover-devices |
Guided network scan with subnet selection |
device-status-report |
Summary report of all device states |
activate-scene |
Control multiple devices as a scene |
troubleshoot-device |
Step-by-step device troubleshooting |

All four prompts surfaced as /mcp.wemo.* slash commands in VS Code
The server proactively asks for missing information rather than failing silently:
scan_network — if no custom subnet is configured (default 192.168.1.0/24), asks which subnet to scan before proceedingcontrol_device — if a device name isn't found in cache, presents closest matches and asks which device was intended
Elicitation in action — server asks for the subnet rather than scanning the wrong network silently
| Feature | Claude Desktop | VS Code | Cursor | MCP Inspector |
|---|---|---|---|---|
| Tools | ✅ | ✅ | ✅ | ✅ |
| Resources | ⚠️ protocol only | ✅ | ✅ | ✅ |
| Prompts | ⚠️ no slash UI | ✅ / commands |
✅ | ✅ |
| Elicitations | ✅ v1.1+ | ❌ | ❌ | ✅ v0.20+ |
The server uses a three-phase discovery process optimized for reliability:
Phase 1 - UPnP/SSDP Discovery (Primary)
Phase 2 - Network Port Scanning (Backup)
Phase 3 - Device Verification (Backup)
This approach achieves 100% device discovery reliability while maintaining fast scan times (23-30 seconds for complete networks).
All device commands travel exclusively over your local network — no cloud hop required at any stage.
Voice path (Google Home + WeMo):
sequenceDiagram
participant U as User
participant GH as Google Home Hub
participant GC as Google Cloud (ASR only)
participant WD as WeMo Device
U->>GH: "Hey Google, turn on chandelier"
GH->>GC: Audio stream for speech-to-text
GC-->>GH: Intent: {action: ON, device: chandelier}
GH->>WD: Matter OnOff.On (UDP 5540, LAN)
WD-->>GH: ACK
GH-->>U: "OK, turning on chandelier"
MCP path (AI assistant + this server):
sequenceDiagram
participant U as User
participant AI as AI Assistant
participant MS as MCP Server
participant WD as WeMo Device
U->>AI: "Turn on the desk light"
AI->>MS: tools/call control_device("desk light", "on")
MS->>WD: UPnP/SOAP BinaryState=1 (TCP 49153, LAN)
WD-->>MS: HTTP 200 OK
MS-->>AI: {success: true, state: "on"}
AI-->>U: "Desk light is now on!"
Both paths use local protocols only after the initial voice recognition (Google Cloud handles speech-to-text; Belkin's cloud is never involved).
Comparison of features between this MCP server and the main wemo-ops-center project:
| Feature | wemo-ops-center | MCP Server | Notes |
|---|---|---|---|
| Device Discovery | ✅ UPnP + Port Scan | ✅ Implemented | Multi-phase discovery with 100% reliability |
| Device Control | ✅ On/Off/Toggle | ✅ Implemented | Includes brightness control for dimmers |
| Device Status | ✅ Real-time | ✅ Implemented | Query by name or IP address |
| Device Rename | ✅ Friendly names | ✅ Implemented | Updates device cache automatically |
| HomeKit Codes | ✅ Extract codes | ✅ Implemented | For HomeKit-compatible devices |
| Multi-subnet | ✅ VLAN support | ❌ Planned | Currently single subnet per scan |
| WiFi Provisioning | ✅ Smart setup | ❌ Not planned | Requires PC WiFi connection changes |
| Scheduling | ✅ Time + Solar | ❌ Not planned | Requires persistent daemon (incompatible with MCP model) |
| Maintenance Tools | ✅ Resets | ❌ Not planned | Factory reset, clear WiFi, clear data |
| Profile Management | ✅ Save/Load | ❌ Not planned | WiFi credential profiles for bulk setup |
| User Interface | ✅ GUI + Web | ❌ N/A | MCP uses AI assistant interface |
Legend:
Why some features aren't planned for MCP:
Current MCP Coverage: 5 of 11 core features (45%) - focused on device discovery, monitoring, and control use cases that fit the MCP model.
git clone https://github.com/apiarya/wemo-mcp-server.git
cd wemo-mcp-server
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv sync --dev
# Unit tests (CI-compatible, ~4 seconds, 128 tests)
.venv/bin/python -m pytest tests/test_server.py tests/test_phase2.py tests/test_models.py -v
# With coverage report
pytest tests/test_server.py tests/test_phase2.py tests/test_models.py --cov=wemo_mcp_server --cov-report=html
# E2E tests (requires WeMo devices on network)
python tests/test_e2e.py
In your MCP client config, use:
{
"command": "python",
"args": ["-m", "wemo_mcp_server"],
"env": {
"PYTHONPATH": "/path/to/mcp/src"
}
}
Contributions welcome! Please:
git checkout -b feature/amazing-feature)python tests/test_e2e.py)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)MIT License - see LICENSE file for details.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"wemo-mcp-server": {
"command": "npx",
"args": []
}
}
}Web content fetching and conversion for efficient LLM usage.
Retrieval from AWS Knowledge Base using Bedrock Agent Runtime.
Provides auto-configuration for setting up an MCP server in Spring Boot applications.
A very streamlined mcp client that supports calling and monitoring stdio/sse/streamableHttp, and can also view request responses through the /logs page. It also