Wyzer MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Wyzer MCP Serverturn on the living room plug"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Wyzer MCP Server
A Node.js MCP (Model Context Protocol) server that exposes Wyze smart home devices (plugs, switches, thermostats, air purifiers) for control via Claude Desktop or Home Assistant.
Features
Device Discovery: Automatically discovers all Wyze plugs, switches, thermostats, and air purifiers
Combined Devices: Intelligently combines thermostats and plugs with the same nickname for unified control
Online Detection: Tracks device availability based on last-seen timestamps (2-day threshold)
Dual Transport: Supports both stdio (Claude Desktop) and HTTP/SSE (Home Assistant)
Request Logging: Optional logging of all tool calls for debugging
Related MCP server: meticulous-mcp
Installation
cd wyzer-mcp
npm installConfiguration
Wyze Credentials
Wyze API credentials are managed by @caseman72/wyzer-api via .env.local. The file is searched in:
Current working directory
~/.config/wyze/.env.local~/.wyze.env.local
Create a .env.local file with your Wyze credentials:
WYZE_EMAIL=your-wyze-email@example.com
WYZE_PASSWORD_HASH=your-password-md5-hash
WYZE_KEY_ID=your-api-key-id
WYZE_API_KEY=your-api-key
WYZE_AUTH_API_KEY=your-auth-api-keyVisit the Wyze Developer Portal to create your API credentials. The password hash is the MD5 hash of your Wyze account password.
Server Configuration (Optional)
Copy config.example.json to config.json to customize server settings:
{
"server": {
"transport": "stdio",
"httpPort": 8000,
"httpHost": "127.0.0.1"
},
"devices": {
"refreshIntervalMinutes": 60
},
"monitoring": {
"enabled": false,
"logFile": "./wyzer-mcp-requests.log"
}
}Environment variable overrides:
WYZER_HTTP_PORT- HTTP server port (default: 8000)WYZER_HTTP_HOST- HTTP server host (default: 127.0.0.1)
Usage
stdio Transport (Claude Desktop)
node src/index.jsHTTP Transport (Home Assistant)
The HA custom component requires the MCP server to be exposed over HTTP/SSE. Use mcp-proxy to bridge the stdio server.
Install mcp-proxy
brew install mcp-proxyStart the proxy
# Binds to all interfaces so Docker can reach it
mcp-proxy --port 8081 --host 0.0.0.0 -- node /path/to/wyzer-mcp/src/index.jsHome Assistant Integration
Tested with Home Assistant 2026.1.3.
Copy the custom component to your HA config directory:
cp -r custom_components/wyzer_mcp ~/.home-assistant/custom_components/Restart Home Assistant
Add the integration: Settings → Devices & Services → Add Integration → "Wyze MCP"
Enter connection details:
Host:
host.docker.internal(for Docker) or your Mac's IPPort:
8081
Optional: Card-Mod and Theme
This repo includes a card-mod JS file and a clean theme for customizing the HA frontend. To install:
# Copy card-mod.js to HA www directory
mkdir -p ~/.home-assistant/www
cp card-mod.js ~/.home-assistant/www/
# Copy the clean theme
mkdir -p ~/.home-assistant/themes
cp themes/clean.yaml ~/.home-assistant/themes/Then add to your configuration.yaml:
frontend:
themes: !include_dir_merge_named themes
extra_module_url:
- /local/card-mod.jsThe included configuration.yaml shows a complete example with template sensors.
Configure Devices
Edit custom_components/wyzer_mcp/devices.yaml to define which devices appear in HA:
switches:
# Plugs
- id: my_plug
name: My Plug
device_id: "XXXXXXXXXXXX" # Wyze device ID (MAC address)
device_type: plug
# Wall Switches
- id: my_switch
name: My Switch
device_id: "LD_SS1_XXXXXXXXXXXX"
device_type: switch
purifiers:
# Air Purifiers (fan entity with preset modes + AQI sensor)
- id: my_purifier
name: My Purifier
device_id: "CO_AP1_XXXXXXXXXXXX"
thermostats:
# Combined thermostat + plug (for space heaters)
- id: my_thermostat
name: My Thermostat
device_id: "combined_CO_EA1_XXXXXXXXXXXXXXXXXXXXXXXX"
plug_id: "XXXXXXXXXXXX" # Creates a separate heater switch entityNotes:
Use the device ID (MAC address) rather than nickname for stability
device_typemust beplugorswitchto call the correct control APIFor combined thermostats with
plug_id, a separate "Heater" switch entity is created
Entity Types
The integration creates the following entity types:
Type | Platform | Description |
Plugs |
| On/off control for Wyze plugs |
Wall Switches |
| On/off control for Wyze wall switches |
Thermostats |
| Temperature control, HVAC mode |
Heater Switches |
| On/off control for plug in combined devices |
Air Purifiers |
| On/off + preset modes (auto/sleep/min/mid/max/turbo), AQI attribute |
AQI |
| Air quality index reading per purifier |
API Status |
| Shows API rate limit info |
Device Availability
Devices show as "Unavailable" in HA if they haven't reported to Wyze in over 2 days. This is determined by the RSSI timestamp from the Wyze API.
Auto-start mcp-proxy with launchd
Create ~/Library/LaunchAgents/com.wyzer.mcp-proxy.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.wyzer.mcp-proxy</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/mcp-proxy</string>
<string>--port</string>
<string>8081</string>
<string>--host</string>
<string>0.0.0.0</string>
<string>--</string>
<string>/opt/homebrew/bin/node</string>
<string>/path/to/wyzer-mcp/src/index.js</string>
</array>
<!-- Required: allows Wyze API to write token cache -->
<key>WorkingDirectory</key>
<string>/path/to/wyzer-mcp</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/wyzer-mcp-proxy.log</string>
<key>StandardErrorPath</key>
<string>/tmp/wyzer-mcp-proxy.err</string>
</dict>
</plist>Then load it:
launchctl load ~/Library/LaunchAgents/com.wyzer.mcp-proxy.plistTo stop/unload:
launchctl unload ~/Library/LaunchAgents/com.wyzer.mcp-proxy.plistManaging the service
# Check status
launchctl list | grep wyzer
# View logs
tail -f /tmp/wyzer-mcp-proxy.err
# Restart
launchctl unload ~/Library/LaunchAgents/com.wyzer.mcp-proxy.plist
launchctl load ~/Library/LaunchAgents/com.wyzer.mcp-proxy.plist
# Stop
launchctl unload ~/Library/LaunchAgents/com.wyzer.mcp-proxy.plistClaude Desktop Integration
Add to ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"wyzer": {
"command": "node",
"args": ["/path/to/wyzer-mcp/src/index.js"],
"env": {}
}
}
}MCP Tools
list_devices
List all discovered Wyze devices with their current status.
Parameters:
type(optional): Filter by device type -plug,switch,thermostat,purifier,combined, orallrefresh(optional): Force refresh device list from Wyze API
control_plug
Turn a Wyze plug on or off.
Parameters:
deviceId: Device ID (MAC) or nickname of the plugstate:onoroff
control_switch
Turn a Wyze wall switch on or off.
Parameters:
deviceId: Device ID (MAC) or nickname of the switchstate:onoroff
control_thermostat
Control a Wyze thermostat. For combined thermostat+plug devices, turn_on/turn_off controls the plug (heater power).
Parameters:
deviceId: Device ID (MAC) or nickname of the thermostataction:set_heat,set_cool,set_mode,turn_on, orturn_offtemperature(optional): Temperature setpoint (required forset_heatandset_cool)mode(optional): Thermostat mode (required forset_mode) -heat,cool,auto, oroff
control_purifier
Control a Wyze air purifier. Set power state and/or fan mode.
Parameters:
deviceId: Device ID (MAC) or nickname of the air purifierstate(optional):onorofffanMode(optional):auto,sleep,min,mid,max, orturbo
At least one of state or fanMode is required.
get_device_status
Get detailed status of any Wyze device. Returns online status, last seen timestamp, and current state.
Parameters:
deviceId: Device ID (MAC) or nickname of the device
Response includes:
is_online: Whether device has reported within 2 dayslast_seen: ISO timestamp of last device reportrssi: Signal strength (for plugs)is_on: Current on/off stateTemperature/humidity/setpoints (for thermostats)
AQI and fan mode (for air purifiers)
get_api_status
Get Wyze API rate limit status. Returns remaining calls, reset time, and cache info.
Combined Devices
When a thermostat and plug share the same nickname (case-insensitive), they are automatically combined into a single "combined" device. This is useful for space heaters controlled by smart plugs with thermostats for temperature sensing.
For combined devices:
turn_on/turn_offactions control the plug (heater power)set_heat/set_cool/set_modeactions control the thermostat
Request Monitoring
Enable request logging in config.json:
{
"monitoring": {
"enabled": true,
"logFile": "./wyzer-mcp-requests.log"
}
}Logs are written in JSON Lines format with timestamps, tool names, parameters, and results.
License
MIT
Available Tools
7 toolscontrol_plugC
Turn a Wyze plug on or off. Use device ID or nickname to identify the plug.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Desired state: "on" or "off" | |
| deviceId | Yes | Device ID (MAC) or nickname of the plug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool turns the plug on/off but doesn't describe what happens on failure (offline device, invalid ID/nickname), whether the operation is synchronous or returns confirmation, or any side effects. For a state-changing tool with zero annotation coverage, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence that packs the action, target resource, and the two parameters into minimal words. Zero waste, appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and a mutation action (on/off), the tool should disclose more about behavior like error handling and confirmation semantics. Sibling tools include control_switch and control_purifier, which raises ambiguity about which tool controls which device type. The description is technically complete for a simple two-param binary switch but lacks operational detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both deviceId and state are already described in the schema with clear descriptions and an enum for state. The description notes that deviceId accepts either a MAC or nickname, which does add minor value beyond the schema. This meets the baseline-3 threshold given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Turn a Wyze plug on or off.' The verb 'turn on/off' plus the resource 'Wyze plug' is specific. It doesn't explicitly distinguish from siblings like control_switch or control_purifier, but the resource (plug) provides differentiation, earning a 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes that either device ID or nickname can be used to identify the plug, which is mildly helpful for usage. However, it provides no guidance on when to use this tool vs alternatives like control_switch or control_thermostat, nor does it mention prerequisites like the plug needing to be online or paired.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_purifierB
Control a Wyze air purifier. Set power state (on/off) and/or fan mode. Use device ID or nickname to identify the purifier.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Desired power state: "on" or "off" | |
| fanMode | No | Fan mode to set | |
| deviceId | Yes | Device ID (MAC) or nickname of the air purifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. 'Control' implies mutation/destructive state changes, and the description is honest that it sets state. However, it doesn't disclose potential side effects, whether partial updates are allowed (e.g., setting only fan mode), or any connectivity/error behavior. It adequately signals it's a write operation but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that efficiently convey purpose and key usage detail (device identification methods). No wasted words. Slightly more explicit behavior detail could be added, but as written it's tight and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description could be more complete. It explains the core action and device identification but doesn't note whether state and fanMode can be combined, whether omitting fanMode preserves current fan setting, or what the return/response looks like. Adequate but leaves behavioral gaps for a 3-parameter control tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter having its own description in the schema. The description adds marginal value by noting devices can be identified by deviceId, MAC, or nickname, which clarifies the deviceId parameter's dual nature beyond the schema's 'MAC or nickname' text. However, this largely repeats schema content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Control a Wyze air purifier') and identifies the actions (set power state and/or fan mode), distinguishing it from sibling tools like control_plug and control_switch which target different device types. However, it doesn't explicitly name sibling alternatives for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating what can be controlled (power state and fan mode) and how to identify the device (device ID or nickname). It does not provide explicit when-to-use vs alternatives or exclusions, though the device-type-specific language in sibling names provides context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_switchB
Turn a Wyze wall switch on or off. Use device ID or nickname to identify the switch.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Desired state: "on" or "off" | |
| deviceId | Yes | Device ID (MAC) or nickname of the switch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description implies a state mutation (on/off) but doesn't mention confirmation of the action, error behavior when the device is offline/unreachable, latency expectations, or whether the tool returns a status result. For a control tool with zero annotation coverage, more behavioral detail is warranted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence carries the core purpose, and a second sentence covers identification. No wasted words. Could be slightly extended to include behavioral notes given the lack of annotations, but as written it is efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a device-control tool with no annotations and no output schema, the description is minimal. It doesn't explain what happens after the command (return value, confirmation), how to discover device IDs (though list_devices sibling exists), or handle failures. Among the sibling tools, this is a straightforward toggle, but the description still leaves the agent guessing about result semantics and failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (deviceId and state) are fully documented in the schema. The description adds minor value by clarifying the dual identification method (device ID or nickname) for deviceId, but doesn't add semantic depth beyond the schema's enum and descriptions. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb+resource construct: 'Turn a Wyze wall switch on or off.' It identifies the resource (wall switch) and the action (on/off toggle). However, it doesn't explicitly distinguish itself from the sibling control_plug or control_purifier beyond the word 'switch,' which creates minor ambiguity about which device type it controls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying it controls a wall switch and that device ID or nickname can identify the switch. However, it provides no guidance on when to choose this tool over control_plug or other siblings, nor any exclusions or prerequisites (e.g., device must be online).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_thermostatA
Control a Wyze thermostat. For combined thermostat+plug devices, "turn_on"/"turn_off" controls the plug (heater power). Temperature actions control the thermostat.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Thermostat mode (required for set_mode) | |
| action | Yes | Action to perform. turn_on/turn_off only work for combined devices. | |
| deviceId | Yes | Device ID (MAC) or nickname of the thermostat | |
| temperature | No | Temperature setpoint (required for set_heat and set_cool) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the dual-behavior nature of combined devices (plug vs thermostat), which is the key subtlety. However, it doesn't disclose the effect of turn_on/turn_off on non-combined thermostats, error behavior, or whether set_mode with 'off' disables the thermostat. Decent but not rich behavioral transparency for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. Every clause earns its place: the first states the tool's scope, the second clarifies the critical nuance about combined devices. Front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutating tool with no annotations and no output schema has gaps. The 100% schema coverage and enum-rich parameters help, and the combined-device clarification is valuable. However, missing guidance on what happens for turn_on/turn_off on non-combined devices, and no behavioral contract about setpoints (ranges, units like Celsius/Fahrenheit) leaves room for the agent to make wrong calls. Adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters thoroughly, including enums and per-parameter purpose. The description adds the plug-vs-thermostat semantic distinction for turn_on/turn_off, which is genuinely additive. Baseline 3 is appropriate since the schema does the heavy lifting and the description adds one useful clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool controls a Wyze thermostat with a specific verb (control) and resource (thermostat). It usefully differentiates the plug vs thermostat behavior for combined devices, which distinguishes this from control_plug/control_switch siblings. However, the purpose is somewhat generic ('Control a Wyze thermostat') without enumerating the specific actions supported, though those are in the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly clarifies when turn_on/turn_off applies (only combined devices, controlling the plug/heater power) versus temperature actions controlling the thermostat. This provides clear context on how to select actions. It doesn't explicitly name sibling tools for exclusion, but the wiring of action-to-device-type behavior is helpful guidance that reduces misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_statusA
Get Wyze API rate limit status and key expiration. Returns remaining calls, reset time, cache info, and API key expiration.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided (no readOnlyHint, no destructiveHint), so the description carries the burden of behavioral disclosure. The tool is clearly a read-only status query by nature, but the description doesn't explicitly state this or note whether it consumes API rate-limit quota itself, which would be useful context for a tool that reports rate limits. It does enumerate the returned fields, which is helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, dense, well-structured sentence that front-loads the action and then lists the specific returned information. Zero wasted words; every element contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only status tool, this is complete. It enumerates all returned categories (rate limit calls, reset time, cache info, key expiration). No output schema exists, so describing return values in prose is appropriate and adequate. A minor gap: it doesn't clarify whether calling this tool consumes rate-limit quota or how to interpret values, but for a status dashboard this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 0 parameters, and schema coverage is 100%, so the baseline of 4 applies for a zero-parameter tool. The description correctly explains what the tool reports (rate limits and key expiration), giving context for what this no-input tool does, which is all that's needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and specific resources (Wyze API rate limit status and key expiration). It also enumerates the returned values (remaining calls, reset time, cache info, API key expiration), which clearly distinguishes it from siblings like get_device_status and the control_* tools that deal with device operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys what the tool returns but does not give explicit guidance on when to use it versus alternatives. However, for a diagnostic/status tool, usage context is reasonably implied — checking rate limits before making API calls. There's no stated exclusion or alternative mention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_statusA
Get detailed status of any Wyze device. Returns temperature, humidity, setpoints for thermostats; on/off state for plugs and switches; AQI and fan mode for air purifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| deviceId | Yes | Device ID (MAC) or nickname of the device |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It states the tool reads status (a read operation) but does not explicitly disclose non-mutating behavior, permission/auth requirements, or what happens when the deviceId is invalid/unreachable. The device-type-specific output enumeration adds useful context, but for a tool without annotations there is room to more explicitly signal that this is a safe read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that efficiently packs the tool's purpose and device-type-specific outputs. Every clause adds value—the device-type enumeration distinguishes result shapes without waste. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, 100% schema coverage, and a good output enumeration, the description is mostly adequate. However, there is no output schema, and for a read tool the description could have disclosed the response format or behavior on invalid device IDs. Given the device-type diversity (thermostats, plugs, purifiers), a note on which device types are unsupported or the error behavior for unknown IDs would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%—the single parameter (deviceId) is well documented in the schema as 'Device ID (MAC) or nickname of the device.' The description adds context about what the tool returns but doesn't add parameter-level meaning beyond the schema. With full schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Get detailed status') and clearly identifies the resource (Wyze device). It distinguishes itself from siblings by enumerating device-type-specific return data: temperature/humidity/setpoints for thermostats, on/off for plugs/switches, AQI and fan mode for air purifiers. This clearly separates it from the control_* sibling tools in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it should be used to inspect device status, and the device-type-specific output lists hint at when each result would be relevant. However, it lacks explicit when-to-use guidance relative to alternatives—such as clarifying that this is the read-only counterpart to the control_* tools, or when get_api_status (a sibling API-level tool) would be more appropriate versus this device-level tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesB
List all discovered Wyze devices with their current status. Optionally filter by device type.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter devices by type. Defaults to "all". | |
| refresh | No | Force refresh device list from Wyze API |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The 'refresh' parameter implies a network call to the Wyze API, but the description doesn't disclose auth requirements, rate limits, potential latency of the refresh operation, or what 'current status' means (cached vs live). For a tool that hits an external API, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are concise and front-loaded with the primary action. The description is efficiently sized with zero filler. It loses a point only because mentioning the optional type filter in the description is somewhat redundant with the schema's enum documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a listing tool with no output schema and no annotations, the description is reasonably adequate but could do more. It doesn't describe the return format/structure of device data, doesn't mention pagination or volume concerns when listing 'all' devices, and doesn't explain what the refresh parameter actually changes behaviorally. Given it's a simple listing tool, this is minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (type and refresh) well documented in the schema. The description adds the 'filter by device type' context that maps to the type parameter, but doesn't add meaning beyond what the schema provides. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (List), the resource (all discovered Wyze devices), and what's returned (current status), with optional filtering by device type. It distinguishes the listing scope from the sibling control/status tools since none of the siblings list all devices. A 5 isn't earned because it doesn't explicitly differentiate from get_device_status, which is a related status-focused tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the entry-point tool for discovering devices, which differentiates it from the control_* and get_device_status siblings. However, it doesn't explicitly say WHEN to use this vs get_device_status (which also reports device status) or when-not to use it. The filter option hints at selective use but no explicit guidance on choosing alternatives is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
7 tool updates
v1.2.1- First observed
control_plug - First observed
control_purifier - First observed
control_switch - First observed
control_thermostat - First observed
get_api_status - First observed
get_device_status - First observed
list_devices
TDQS
Most tools are clearly distinct per device type (purifier, plug, switch, thermostat), and control_* vs get_device_status vs list_devices are well-separated. Minor potential confusion between control_plug and control_switch, and the special combined thermostat+plug behavior in control_thermostat could be overlooked, but descriptions mitigate this.
The control_* verb-noun pattern is used consistently for four device actions, and list_devices/get_device_status/get_api_status follow a verb_noun get_/list_ pattern. Minor deviation: control_thermostat spans two devices, and the get_/list_ mix is slight, but overall the schema is predictable and readable.
Seven tools is an appropriate, well-scoped surface for a home IoT control server covering discovery, per-device control, status retrieval, and API health—all within the ideal 3-15 tool range with no redundancy.
The surface covers discovery, status, and control for four device types, plus API health—a solid set. Minor gaps include no bulk control, no scheduling, and no device registration/removal, but core lifecycle (list, get status, control) is fully covered and agents won't dead-end.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol server that enables AI assistants like Claude to interact directly with Home Assistant, allowing them to query device states, control smart home entities, and perform automation tasks.16338MIT
- AlicenseAqualityDmaintenanceMCP server for controlling Meticulous espresso machines via Claude and other AI clients.22119MIT
- AlicenseAqualityCmaintenanceMCP server for controlling Elgato Key Lights. Enables turning lights on/off, adjusting brightness and color temperature, applying presets, and triggering effects via Claude.13Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that enables Claude to control SmartRent smart home devices such as locks, thermostats, light switches, and sensors through natural conversation.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/caseman72/wyzer-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server