{
  "markdown": "# WeMo MCP Server\n\nControl WeMo smart home devices through AI assistants using natural language.\n\n**mcp-name: io.github.apiarya/wemo**\n\n[![CI](https://github.com/apiarya/wemo-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/apiarya/wemo-mcp-server/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/apiarya/wemo-mcp-server/branch/main/graph/badge.svg)](https://codecov.io/gh/apiarya/wemo-mcp-server)\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=apiarya_wemo-mcp-server&metric=alert_status)](https://sonarcloud.io/project/overview?id=apiarya_wemo-mcp-server)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=apiarya_wemo-mcp-server&metric=security_rating)](https://sonarcloud.io/project/overview?id=apiarya_wemo-mcp-server)\n[![PyPI version](https://img.shields.io/pypi/v/wemo-mcp-server)](https://pypi.org/project/wemo-mcp-server/)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)\n\n[![MCP Registry](https://img.shields.io/badge/MCP_Registry-Registered-green)](https://registry.modelcontextprotocol.io/?q=apiarya/wemo)\n[![MCP](https://img.shields.io/badge/MCP-Tools%20%7C%20Resources%20%7C%20Prompts%20%7C%20Elicitations-blue)](https://modelcontextprotocol.io)\n[![Transport](https://img.shields.io/badge/Transport-stdio-lightblue)](https://modelcontextprotocol.io/docs/concepts/transports)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Prerequisites](#prerequisites)\n- [Quick Start](#quick-start)\n- [Connect](#connect)\n- [Configuration](#configuration)\n- [MCP Tools](#mcp-tools)\n  - [scan_network](#1-scan_network)\n  - [list_devices](#2-list_devices)\n  - [get_device_status](#3-get_device_status)\n  - [control_device](#4-control_device)\n  - [rename_device](#5-rename_device)\n  - [get_homekit_code](#6-get_homekit_code)\n  - [get_cache_info](#7-get_cache_info)\n  - [clear_cache](#8-clear_cache)\n  - [get_configuration](#9-get_configuration)\n- [MCP Capabilities](#mcp-capabilities)\n  - [Resources](#resources)\n  - [Prompts](#prompts)\n  - [Elicitations](#elicitations)\n- [How It Works](#how-it-works)\n  - [Local Control Signal Flow](#local-control-signal-flow)\n- [Feature Comparison](#feature-comparison)\n- [Development](#development)\n- [Contributing](#contributing)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n\n## Overview\n\nSeamlessly integrate WeMo smart home devices with AI assistants through the Model Context Protocol. Built on [pywemo](https://github.com/pywemo/pywemo), this server enables natural language control of your WeMo devices with intelligent multi-phase discovery.\n\n### Example Usage\n\n![Turning on lights with natural language](https://raw.githubusercontent.com/apiarya/wemo-mcp-server/main/assets/turn-on.png)\n\n*Control WeMo devices through AI assistants with natural language - just ask in plain English!*\n\n![Goodnight scene turns off all devices](https://raw.githubusercontent.com/apiarya/wemo-mcp-server/main/assets/goodnight.png)\n\n*\"Goodnight\" — one command turns off every device in the house*\n\n### Key Features\n\n- **🔍 Smart Discovery** - Multi-phase scanning (UPnP/SSDP + network ports) with 100% reliability\n- **⚡ Fast Scanning** - Parallel probes with 60 concurrent workers (~23-30s for full subnet)\n- **🎛️ Full Control** - On/off/toggle/brightness control for all device types\n- **✏️ Device Management** - Rename devices and extract HomeKit setup codes\n- **📊 Real-time Status** - Query device state and brightness\n- **💾 Smart Caching** - Persistent device cache with 1-hour TTL survives restarts\n- **🔧 Configurable** - YAML config files + environment variables for all settings\n- **🔄 Auto-Retry** - Automatic retry with exponential backoff for network errors\n- **🛡️ Error Handling** - Detailed error messages with actionable suggestions\n- **🔌 Universal** - Works with any MCP client (Claude, VS Code, Cursor, etc.)\n- **📡 MCP Resources** - Live device state via `devices://` and `device://{id}` URIs\n- **💬 MCP Prompts** - Built-in guided prompts: discover, status report, scene control, troubleshoot\n- **🗣️ MCP Elicitations** - Interactive clarification when subnet or device name is ambiguous\n\n---\n\n## Prerequisites\n\nAll configurations use `uvx` (from the `uv` Python package manager) to run the server. Install [uv](https://docs.astral.sh/uv/) first:\n\n```bash\n# macOS/Linux\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# macOS with Homebrew\nbrew install uv\n\n# Windows\npowershell -c \"irm https://astral.sh/uv/install.ps1 | iex\"\n```\n\nAfter installation, restart your terminal and verify:\n```bash\nuvx --version\n```\n\n## Quick Start\n\nGet started in seconds with Claude Code CLI:\n\n```bash\nclaude mcp add wemo -- uvx wemo-mcp-server\n```\n\n---\n\n## Connect\n\n### One-Click Installation\n\nClick your client to install instantly:\n\n| Client | Install |\n|--------|---------|\n| **Claude Desktop** | [![Claude Desktop](https://img.shields.io/badge/Setup_Guide-5436DA?style=flat-square&logo=anthropic&logoColor=white)](https://modelcontextprotocol.io/quickstart/user) |\n| **Claude Code CLI** | Run: `claude mcp add wemo -- uvx wemo-mcp-server` |\n| **VS Code** | [![Install](https://img.shields.io/badge/One_Click_Install-007ACC?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect/mcp/install?name=wemo&config=%7B%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22wemo-mcp-server%22%5D%7D) |\n| **Cursor** | [![Add to Cursor](https://img.shields.io/badge/Add_to_Cursor-000000?style=flat-square&logo=cursor&logoColor=white)](cursor://anysphere.cursor-deeplink/mcp/install?name=wemo&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJ3ZW1vLW1jcC1zZXJ2ZXIiXX0%3D) |\n| **Cline** | [Manual config](#cline) (VS Code extension) |\n| **Windsurf** | [Manual config](#windsurf) |\n| **Zed** | [Manual config](#zed) |\n| **Continue** | [Manual config](#continue) (VS Code extension) |\n\n### Manual Configuration\n\n#### Claude Desktop\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"wemo\": {\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"],\n      \"env\": {\n        \"WEMO_MCP_DEFAULT_SUBNET\": \"192.168.1.0/24\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop after saving.\n\n#### VS Code\n\nEdit `~/.vscode/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"wemo\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"],\n      \"env\": {\n        \"WEMO_MCP_DEFAULT_SUBNET\": \"192.168.1.0/24\"\n      }\n    }\n  }\n}\n```\n\nReload VS Code after saving.\n\n#### Cursor\n\nEdit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"wemo\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"]\n    }\n  }\n}\n```\n\nRestart Cursor after saving.\n\n#### Cline\n\nCline is a VS Code extension. Add to VS Code's `settings.json`:\n\n```json\n{\n  \"mcp.servers\": {\n    \"wemo\": {\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"]\n    }\n  }\n}\n```\n\nReload VS Code after saving.\n\n#### Windsurf\n\nEdit `~/.windsurf/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"wemo\": {\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"]\n    }\n  }\n}\n```\n\nRestart Windsurf after saving.\n\n#### Zed\n\nEdit `~/.config/zed/settings.json`:\n\n```json\n{\n  \"context_servers\": {\n    \"wemo\": {\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"]\n    }\n  }\n}\n```\n\nRestart Zed after saving.\n\n#### Continue\n\nContinue is a VS Code extension. Edit `~/.continue/config.json`:\n\n```json\n{\n  \"mcpServers\": [\n    {\n      \"name\": \"wemo\",\n      \"command\": \"uvx\",\n      \"args\": [\"wemo-mcp-server\"]\n    }\n  ]\n}\n```\n\nReload VS Code after saving.\n\n---\n\n## Configuration\n\nThe WeMo MCP Server supports flexible configuration through YAML files and environment variables.\n\n### Quick Configuration\n\nThe 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`).\n\nSet it directly in your MCP client config using `env`:\n\n```json\n\"env\": {\n  \"WEMO_MCP_DEFAULT_SUBNET\": \"192.168.86.0/24\"\n}\n```\n\nOr export it before starting the server:\n\n**Using Environment Variables** (simplest):\n```bash\nexport WEMO_MCP_DEFAULT_SUBNET=\"192.168.1.0/24\"\nexport WEMO_MCP_CACHE_TTL=7200\nexport WEMO_MCP_LOG_LEVEL=DEBUG\n```\n\n**Using YAML Config File**:\n```bash\n# Copy example config and customize\ncp config.example.yaml config.yaml\n# Edit config.yaml with your settings\n```\n\n### Configuration Options\n\n| Setting | Environment Variable | Default | Description |\n|---------|---------------------|---------|-------------|\n| **Network** ||||\n| Default subnet | `WEMO_MCP_DEFAULT_SUBNET` | `192.168.1.0/24` | Network to scan for devices |\n| Scan timeout | `WEMO_MCP_SCAN_TIMEOUT` | `0.6` | Port probe timeout (seconds) |\n| Max workers | `WEMO_MCP_MAX_WORKERS` | `60` | Concurrent scanning threads |\n| **Cache** ||||\n| Enable cache | `WEMO_MCP_CACHE_ENABLED` | `true` | Persistent device caching |\n| Cache file | `WEMO_MCP_CACHE_FILE` | `~/.wemo_mcp_cache.json` | Cache file location |\n| Cache TTL | `WEMO_MCP_CACHE_TTL` | `3600` | Cache lifetime (seconds) |\n| **Logging** ||||\n| Log level | `WEMO_MCP_LOG_LEVEL` | `INFO` | DEBUG, INFO, WARNING, ERROR |\n\n### Example Configurations\n\n**Large Network** (multiple subnets):\n```bash\nexport WEMO_MCP_DEFAULT_SUBNET=\"10.0.0.0/16\"\nexport WEMO_MCP_SCAN_TIMEOUT=1.0\nexport WEMO_MCP_MAX_WORKERS=100\n```\n\n**Debug Mode**:\n```bash\nexport WEMO_MCP_LOG_LEVEL=DEBUG\nexport WEMO_MCP_CACHE_TTL=300  # 5 minutes\n```\n\n**Disable Caching**:\n```bash\nexport WEMO_MCP_CACHE_ENABLED=false\n```\n\nSee [config.example.yaml](config.example.yaml) and [.env.example](.env.example) for complete configuration templates.\n\nFor detailed configuration guide, see [CONFIGURATION.md](CONFIGURATION.md).\n\n---\n\n## MCP Tools\n\n### 1. scan_network\n\nDiscover WeMo devices on your network using intelligent multi-phase scanning.\n\n**Example Prompts:**\n- \"Scan for WeMo devices on my network\"\n- \"Find all WeMo devices\"\n- \"Discover devices on 192.168.1.0/24\"\n\n**Example Response:**\n```\nFound 12 WeMo devices in 23.5 seconds:\n\n1. Office Light (Dimmer) - 192.168.1.100 - OFF\n2. Living Room (Switch) - 192.168.1.101 - ON\n3. Bedroom Lamp (Dimmer) - 192.168.1.102 - OFF\n...\n```\n\n### 2. list_devices\n\nList all devices cached from previous scans.\n\n**Example Prompts:**\n- \"List all my WeMo devices\"\n- \"Show me all devices\"\n- \"What devices do you know about?\"\n\n**Example Response:**\n```\n12 devices in cache:\n\n- Office Light (Dimmer) at 192.168.1.100\n- Living Room (Switch) at 192.168.1.101\n- Bedroom Lamp (Dimmer) at 192.168.1.102\n...\n```\n\n### 3. get_device_status\n\nGet current state and information for a specific device.\n\n**Example Prompts:**\n- \"Is the office light on?\"\n- \"What's the status of the bedroom lamp?\"\n- \"Check the living room switch\"\n- \"What's the brightness of office light?\"\n\n**Example Response:**\n```\nOffice Light (Dimmer):\n- State: OFF\n- Brightness: 75%\n- IP: 192.168.1.100\n- Model: DimmerLongPress\n```\n\n### 4. control_device\n\nControl a WeMo device (on/off/toggle/brightness).\n\n**Example Prompts:**\n- \"Turn on the office light\"\n- \"Turn off the living room\"\n- \"Toggle the bedroom lamp\"\n- \"Set office light to 75%\"\n- \"Dim the bedroom lamp to 50%\"\n\n**Example Response:**\n```\n✓ Office Light turned ON\n  Brightness set to 75%\n  Current state: ON\n```\n\n### 5. rename_device\n\nRename a WeMo device (change its friendly name).\n\n**Example Prompts:**\n- \"Rename Office Dimmer to Office Light\"\n- \"Change the name of the bedroom device to Bedroom Lamp\"\n- \"Call the living room switch 'Main Light'\"\n\n**Example Response:**\n```\n✓ Device renamed successfully\n  'Office Dimmer' → 'Office Light'\n  IP: 192.168.1.100\n\nThe new name will appear in the WeMo app and all control interfaces.\n```\n\n### 6. get_homekit_code\n\nGet the HomeKit setup code for a WeMo device.\n\n**Example Prompts:**\n- \"Get the HomeKit code for Office Light\"\n- \"What's the HomeKit setup code for the bedroom lamp?\"\n- \"Show me the HomeKit code for all devices\"\n\n**Example Response:**\n```\nHomeKit Setup Code for 'Office Light':\n  123-45-678\n\nUse this code to add the device to Apple Home.\n```\n\n**Note:** Not all WeMo devices support HomeKit. If a device doesn't support HomeKit, you'll get an error message.\n\n![HomeKit code retrieval step 1](https://raw.githubusercontent.com/apiarya/wemo-mcp-server/main/assets/homekit-1.png)\n\n![HomeKit code retrieval step 2](https://raw.githubusercontent.com/apiarya/wemo-mcp-server/main/assets/homekit-2.png)\n\n### 7. get_cache_info\n\nGet information about the persistent device cache.\n\n**Example Prompts:**\n- \"Show me cache information\"\n- \"Is the device cache expired?\"\n- \"How many devices are cached?\"\n\n**Example Response:**\n```\nDevice Cache Status:\n  ✅ Cache exists\n  📁 Location: ~/.wemo_mcp_cache.json\n  📊 Devices: 12\n  ⏰ Age: 1,234 seconds (20.6 minutes)\n  💾 TTL: 3,600 seconds (1 hour)\n  ✅ Status: Valid (not expired)\n```\n\n### 8. clear_cache\n\nClear the persistent device cache to force a fresh scan.\n\n**Example Prompts:**\n- \"Clear the device cache\"\n- \"Reset the cache and rescan\"\n- \"Delete cached devices\"\n\n**Example Response:**\n```\n✅ Cache cleared successfully\nNext scan will discover devices fresh.\nRun scan_network to rebuild the cache.\n```\n\n**Note:** This clears both the persistent cache file and in-memory cache. After clearing, run `scan_network` to rediscover devices.\n\n### 9. get_configuration\n\nView current server configuration settings.\n\n**Example Prompts:**\n- \"Show me the server configuration\"\n- \"What are the current settings?\"\n- \"Display configuration\"\n\n**Example Response:**\n```\nCurrent Configuration:\n  Network:\n    • Default subnet: 192.168.1.0/24\n    • Scan timeout: 0.6 seconds\n    • Max workers: 60\n  Cache:\n    • Enabled: true\n    • File: ~/.wemo_mcp_cache.json\n    • TTL: 3600 seconds (1 hour)\n  Logging:\n    • Level: INFO\n```\n\n**Note:** Shows all configuration including defaults and environment variable overrides. Use environment variables with `WEMO_MCP_` prefix to customize.\n\n---\n\n## MCP Capabilities\n\nBeyond tools, this server exposes the full suite of MCP primitives.\n\n### Resources\n\nSubscribe to live device data without calling a tool:\n\n| URI | Description |\n|-----|-------------|\n| `devices://` | JSON index of all cached devices |\n| `device://{name-or-ip}` | Live state for a specific device (URL-encoded name supported) |\n\nClients that support MCP Resources (VS Code, MCP Inspector) can read these directly.\n\n### Prompts\n\nFour built-in guided prompts available via `/` slash commands in supporting clients:\n\n| Prompt | Description |\n|--------|-------------|\n| `discover-devices` | Guided network scan with subnet selection |\n| `device-status-report` | Summary report of all device states |\n| `activate-scene` | Control multiple devices as a scene |\n| `troubleshoot-device` | Step-by-step device troubleshooting |\n\n![MCP prompts in VS Code](https://raw.githubusercontent.com/apiarya/wemo-mcp-server/main/assets/prompts.png)\n\n*All four prompts surfaced as `/mcp.wemo.*` slash commands in VS Code*\n\n### Elicitations\n\nThe server proactively asks for missing information rather than failing silently:\n\n- **`scan_network`** — if no custom subnet is configured (default `192.168.1.0/24`), asks which subnet to scan before proceeding\n- **`control_device`** — if a device name isn't found in cache, presents closest matches and asks which device was intended\n\n![MCP elicitation prompting for subnet](https://raw.githubusercontent.com/apiarya/wemo-mcp-server/main/assets/elicitation.png)\n\n*Elicitation in action — server asks for the subnet rather than scanning the wrong network silently*\n\n### Client Support Matrix\n\n| Feature | Claude Desktop | VS Code | Cursor | MCP Inspector |\n|---------|:--------------:|:-------:|:------:|:-------------:|\n| Tools | ✅ | ✅ | ✅ | ✅ |\n| Resources | ⚠️ protocol only | ✅ | ✅ | ✅ |\n| Prompts | ⚠️ no slash UI | ✅ `/` commands | ✅ | ✅ |\n| Elicitations | ✅ v1.1+ | ❌ | ❌ | ✅ v0.20+ |\n\n---\n\n## How It Works\n\n### Multi-Phase Discovery\n\nThe server uses a three-phase discovery process optimized for reliability:\n\n1. **Phase 1 - UPnP/SSDP Discovery (Primary)**\n   - Multicast discovery finds all responsive devices (~12s)\n   - Most reliable method, finds devices that don't respond to port probes\n   - Uses pywemo's built-in discovery mechanism\n\n2. **Phase 2 - Network Port Scanning (Backup)**\n   - Parallel probing of WeMo ports (49152-49155) across subnet\n   - 60 concurrent workers for fast scanning (~10s for 254 IPs)\n   - Catches devices missed by UPnP\n\n3. **Phase 3 - Device Verification (Backup)**\n   - HTTP verification of active IPs via /setup.xml\n   - Parallel verification with 60 workers\n   - Validates and extracts device information\n\nThis approach achieves **100% device discovery reliability** while maintaining fast scan times (23-30 seconds for complete networks).\n\n### Local Control Signal Flow\n\nAll device commands travel exclusively over your **local network** — no cloud hop required at any stage.\n\n**Voice path (Google Home + WeMo):**\n```mermaid\nsequenceDiagram\n    participant U as User\n    participant GH as Google Home Hub\n    participant GC as Google Cloud (ASR only)\n    participant WD as WeMo Device\n\n    U->>GH: \"Hey Google, turn on chandelier\"\n    GH->>GC: Audio stream for speech-to-text\n    GC-->>GH: Intent: {action: ON, device: chandelier}\n    GH->>WD: Matter OnOff.On (UDP 5540, LAN)\n    WD-->>GH: ACK\n    GH-->>U: \"OK, turning on chandelier\"\n```\n\n**MCP path (AI assistant + this server):**\n```mermaid\nsequenceDiagram\n    participant U as User\n    participant AI as AI Assistant\n    participant MS as MCP Server\n    participant WD as WeMo Device\n\n    U->>AI: \"Turn on the desk light\"\n    AI->>MS: tools/call control_device(\"desk light\", \"on\")\n    MS->>WD: UPnP/SOAP BinaryState=1 (TCP 49153, LAN)\n    WD-->>MS: HTTP 200 OK\n    MS-->>AI: {success: true, state: \"on\"}\n    AI-->>U: \"Desk light is now on!\"\n```\n\nBoth paths use **local protocols only** after the initial voice recognition (Google Cloud handles speech-to-text; Belkin's cloud is never involved).\n\n## Feature Comparison\n\n### MCP Server vs wemo-ops-center\n\nComparison of features between this MCP server and the main [wemo-ops-center](https://github.com/qrussell/wemo-ops-center) project:\n\n| Feature | wemo-ops-center | MCP Server | Notes |\n|---------|-----------------|------------|-------|\n| **Device Discovery** | ✅ UPnP + Port Scan | ✅ Implemented | Multi-phase discovery with 100% reliability |\n| **Device Control** | ✅ On/Off/Toggle | ✅ Implemented | Includes brightness control for dimmers |\n| **Device Status** | ✅ Real-time | ✅ Implemented | Query by name or IP address |\n| **Device Rename** | ✅ Friendly names | ✅ Implemented | Updates device cache automatically |\n| **HomeKit Codes** | ✅ Extract codes | ✅ Implemented | For HomeKit-compatible devices |\n| **Multi-subnet** | ✅ VLAN support | ❌ Planned | Currently single subnet per scan |\n| **WiFi Provisioning** | ✅ Smart setup | ❌ Not planned | Requires PC WiFi connection changes |\n| **Scheduling** | ✅ Time + Solar | ❌ Not planned | Requires persistent daemon (incompatible with MCP model) |\n| **Maintenance Tools** | ✅ Resets | ❌ Not planned | Factory reset, clear WiFi, clear data |\n| **Profile Management** | ✅ Save/Load | ❌ Not planned | WiFi credential profiles for bulk setup |\n| **User Interface** | ✅ GUI + Web | ❌ N/A | MCP uses AI assistant interface |\n\n**Legend:**\n- ✅ **Implemented** - Feature is available\n- ❌ **Not planned** - Feature conflicts with MCP architecture or use case\n- ❌ **Planned** - Feature could be added in future\n\n**Why some features aren't planned for MCP:**\n- **Scheduling**: Requires 24/7 background daemon polling. MCP servers are typically invoked on-demand by AI assistants, not run as persistent services.\n- **WiFi Provisioning**: Requires changing the host PC's WiFi connection to device setup networks, which is disruptive and platform-specific.\n- **Maintenance Tools**: Destructive operations (factory reset, etc.) better suited for dedicated GUI with confirmation dialogs.\n\n**Current MCP Coverage:** 5 of 11 core features (45%) - focused on device discovery, monitoring, and control use cases that fit the MCP model.\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/apiarya/wemo-mcp-server.git\ncd wemo-mcp-server\nuv venv\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\nuv sync --dev\n```\n\n### Running Tests\n\n```bash\n# Unit tests (CI-compatible, ~4 seconds, 128 tests)\n.venv/bin/python -m pytest tests/test_server.py tests/test_phase2.py tests/test_models.py -v\n\n# With coverage report\npytest tests/test_server.py tests/test_phase2.py tests/test_models.py --cov=wemo_mcp_server --cov-report=html\n\n# E2E tests (requires WeMo devices on network)\npython tests/test_e2e.py\n```\n\n### Using Development Version\n\nIn your MCP client config, use:\n```json\n{\n  \"command\": \"python\",\n  \"args\": [\"-m\", \"wemo_mcp_server\"],\n  \"env\": {\n    \"PYTHONPATH\": \"/path/to/mcp/src\"\n  }\n}\n```\n\n## Contributing\n\nContributions welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes with tests\n4. Run the test suite (`python tests/test_e2e.py`)\n5. Commit your changes (`git commit -m 'Add amazing feature'`)\n6. Push to the branch (`git push origin feature/amazing-feature`)\n7. Open a Pull Request\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- Built with [Model Context Protocol SDK](https://github.com/modelcontextprotocol/python-sdk)\n- Uses [pywemo](https://github.com/pywemo/pywemo) for WeMo device communication\n- Related to the [wemo-ops-center](https://github.com/qrussell/wemo-ops-center) project (desktop and server applications)\n",
  "bytes": 21715,
  "sha": "5d7058ea6bd5f5400b14bcc2078e6234bfa3486d99db5be573fb1190275bd62a",
  "repo_slug": "apiarya/wemo-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_apiarya_wemo_15dc71a4/readme"
}