hue-mcp
This server lets Claude control Philips Hue lights through a local Hue Bridge via MCP, covering light state, scenes, effects, power budgets, and timers.
Inspect home: list rooms/zones, their lights' current state, scenes, and estimated watts (
get_home).Control lights: turn on/off; set brightness, relative brightness, color hex, white temperature, and fades up to 100 min (
set_lights).Set by power: light a target to an approximate total wattage (
set_power).Scenes: activate a saved scene, optionally dynamic and with transitions (
activate_scene); save the current room/zone look as a new scene (create_scene).Effects: start/stop looping effects like candle, fire, prism, sparkle, etc.; run sunrise/sunset over a duration (
set_effect).Timers: schedule bridge-run off/on/scene actions after a delay; list and cancel pending timers (
set_timer,list_timers,cancel_timer).
Allows control of Philips Hue lights through a Hue Bridge on the local network, providing tools for setting power, brightness, color, white tone, scenes, effects, and timers via the bridge's CLIP v2 and v1 schedules APIs.
Click on "Deploy 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., "@hue-mcpdim the living room to 30% and make it warm"
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.
hue-mcp
An MCP server that lets Claude control Philips Hue lights through a Hue Bridge on your local network. Ask in plain language: "dim the living room to 30% and make it warm", "candle effect in the bedroom", "turn everything off in 30 minutes".
It talks to the bridge directly over your LAN (no Hue cloud account involved) using the bridge's CLIP v2 API, plus the v1 schedules API for timers.
Install
Needs Python 3.12 or newer and a Hue Bridge. Tested with the square Hue Bridge (v2); the Bridge Pro speaks the same API.
git clone https://github.com/mdlopezme/hue-mcp.git && cd hue-mcp
python3 -m venv .venv
.venv/bin/python -m pip install -e .On Debian/Ubuntu without the python3-venv package, create the venv with --without-pip and
bootstrap pip into it with the system pip (package python3-pip):
python3 -m pip --python .venv/bin/python install pip.
Related MCP server: Hue MCP Server
Pair with the bridge
.venv/bin/hue-mcp setup # or: setup --ip 192.168.1.20Setup finds the bridge (mDNS, falling back to Signify's discovery service), asks you to press
the round link button on top of it, and saves an app key to ~/.config/hue-mcp/bridge.json,
readable only by you. Every connection verifies the bridge's certificate against Signify's root
CAs (bundled in src/hue_mcp/hue_roots.pem) and, from the first contact on, that it names the
bridge's id. (setup --ip learns that id from the bridge itself, over a connection whose
certificate must still chain to Signify's roots.)
Use it from Claude Code
claude mcp add --scope user hue -- /absolute/path/to/hue-mcp/.venv/bin/hue-mcpTool | Does |
| Rooms and zones, their lights' state, their scenes, and estimated watts |
| On/off, brightness (absolute or relative), color, white tone, fades of up to 100 min |
| "Use 20 watts": one brightness for every light in the target, to fit the budget |
| Recall a scene, or save a room's current look as a new one |
| candle, fire, prism and other looping effects; sunrise/sunset over up to 6 h; |
| "Turn the bedroom off in 30 minutes", run by the bridge |
| Adaptive focus rounds whose looks follow the sun; see Pomodoro |
Good to know:
Fades and timers run on the bridge, so they finish even after the Claude session ends.
Timers use the bridge's v1 schedules (API v2 has none), so the Hue app doesn't show them. At most 10 can be pending at once; the bridge's schedule slots are shared with other apps.
list_timerscounts down with this computer's clock; the bridge fires them by its own.Scenes made with
create_scenestay on the bridge; delete them in the Hue app.Names match exactly or by a unique part ("living" finds "Living room"). Misspellings are only suggested, never acted on, and
allmust be spelled out.Partial success: when a light in a group doesn't respond, the command still reaches the others and Claude is told which part may not have taken effect.
Hue bulbs sometimes switch themselves back on right after being turned off, mostly after a fade or a room-wide off. It's a known quirk of the bulbs, not of this server (see zigbee2mqtt #20336); asking again turns them off.
Watts are estimates. Hue bulbs don't report their draw, so
get_homeandset_powermodel it: about 0.5 W standby while off, rising linearly with brightness to the bulb's rating. Ratings for known models are insrc/hue_mcp/power.py; other bulbs are assumed to be 9 W.
Pomodoro
start_pomodoro runs focus rounds (25 minutes by default) with breaks between them, told apart by
the room's lights:
Focus looks follow the part of the day at your location: fresh blues in the morning, sunny yellows at midday, golden oranges in the afternoon, sunset rose in the evening, and a dim, blue-free red at night. A task light, such as a desk lamp, stays a white to read by, warming as the day goes.
Short breaks are greens (5 minutes), and the long break after the last round is violet (30 minutes). At night both turn dimmer and warmer.
When a break ends and you're away from the computer, the room keeps the break look and pulses red every 30 seconds. The next round starts when you're back: a mouse move or a key press. If you keep working through a break, the lights breathe brighter to send you off, and a minute before a break ends they dip as a heads-up (breaks of two minutes or less skip both).
A session ends when you ask Claude to stop it; when someone changes the room's lights at the switch or in the Hue app while it waits for you (the lights stay as they set them); or after two hours away (the room fades off).
get_pomodorotells the current phase and counts the rounds completed each day. Desktop notifications mark each switch.
A background service, the watcher, runs the sessions: it notices when you're at the computer and
switches the lights. It needs a Wayland compositor that offers the input idle notifications of
ext-idle-notify-v1 version 2 (tested on KDE Plasma 6), and it only ever learns whether you're
using the computer, never what you type. Set it up once:
.venv/bin/hue-mcp set-location "Lisbon" # where the lights are, for the sun times
.venv/bin/hue-mcp install-watcher # a systemd user service, started at every login;
# run it again after an update to restart it
.venv/bin/hue-mcp watch --print-activity # optional: check it sees you go idle and come backset-location looks the city up once with Open-Meteo's free place
search and saves its coordinates to ~/.config/hue-mcp/location.json; the sun times are then
computed locally. The first session in a room creates nine scenes there ("Pomodoro morning",
"Pomodoro short break", ...). Change one in the Hue app, or ask Claude to tweak the lights
mid-session: the change lasts until the next switch or nudge, unless save_pomodoro_look keeps
it in the look showing. Naming a task light later gives it its white in the existing looks, and
a light added to the room joins them. The watcher keeps its state and the
rounds log in ~/.local/state/hue-mcp/; its log is journalctl --user -u hue-mcp-watch.
Permissions
Claude Code asks before each tool call. You can allow mcp__hue in /permissions to skip the
prompts, but note that light, room and scene names come from the bridge and are shown to Claude
as-is: anyone who can rename your lights can put text in front of Claude.
Development
.venv/bin/python -m pip install -e '.[dev]'
make check # ruff (lint + format), mypy --strict, pytest with branch coverage
make format # apply ruff's fixes and formattingCI runs make check on Python 3.12, 3.13 and 3.14 for pushes to main and for every pull
request, and weekly to catch breaking upstream releases. Dependabot proposes dependency and
action updates.
The tests use a fake bridge, so they can't prove the real bridge agrees. Before releasing a change to what is sent to the bridge, run the hardware check. It drives every tool through the installed server against the lights you pick, checks what each light actually does, and puts them back afterwards (about eight minutes; the lights change, flicker and switch on and off). Its pomodoro step runs the watcher's logic with second-long phases, so it needs a location set:
.venv/bin/python scripts/live_check.py --light "Desk" # or --all, or --light repeatedA fade or timer failure that doesn't reproduce is most likely a bulb, not the code: bulbs with a weak Zigbee link drop the odd command, and Hue bulbs sometimes switch back on after an off.
License
MIT; see LICENSE.
Available Tools
9 toolsactivate_sceneC
Activate a saved scene.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | The scene's room or zone, when names repeat. | |
| scene | Yes | ||
| dynamic | No | Slowly cycle through the scene's colors. | |
| transition_seconds | No | Fade to the new state over this many seconds (at most 100 minutes; set_effect sunset dims to off more slowly). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Activate' implies a state-mutating operation affecting lights, but the description never states the side effects, whether it overrides current settings, permission requirements, or reversibility. The useful behavioral context (fade timing, sunset dimming) lives in the schema, not the description.
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 front-loaded sentence with zero filler. It is efficient, though its brevity reflects under-specification rather than disciplined concision.
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 state-mutating tool with no annotations and no stated side effects, one sentence is insufficient. An output schema exists so return values need not be explained, but the description omits essential behavioral context an agent needs (what activation changes, interaction with current light state).
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 75%, so three of four parameters are already documented in the schema (room disambiguation, dynamic color cycling, transition_seconds fading). The description adds nothing beyond the generic 'saved scene', so the baseline of 3 applies.
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 clear verb ('Activate') and resource ('saved scene'), which implicitly distinguishes it from the sibling create_scene (the scene must already exist). However, it does not explicitly name alternatives or contrast with set_lights/set_effect, so it falls short of full sibling 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?
There is no explicit guidance on when to use this tool versus create_scene, set_effect, or set_lights. The word 'saved' weakly implies the scene must already exist, but no conditions, prerequisites, or alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_timerB
Cancel a timer from list_timers.
| Name | Required | Description | Default |
|---|---|---|---|
| timer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 does not state whether cancellation is immediate, whether it is idempotent, what happens if the timer already fired or the ID is invalid, or what the response contains. For a state-mutating tool, 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 short sentence with zero filler, and the action is front-loaded. It is efficient, though the brevity leans toward under-specification rather than disciplined conciseness.
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?
An output schema exists, so return values need not be described, but with no annotations and an undocumented required parameter, the definition should disclose mutation semantics and failure behavior. As written it leaves the agent without enough context for a destructive operation.
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 is a single parameter with 0% schema description coverage, so the description must compensate. It partially does by indicating the timer_id originates from list_timers, but adds no format or type detail beyond the schema's string type.
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?
States a specific verb (cancel) and resource (timer), and implicitly separates itself from the read-oriented list_timers and the create/modify-oriented set_timer in the sibling set. It does not explicitly name an alternative to use instead, but the action is unambiguous.
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?
"from list_timers" implies the prerequisite that the timer_id must first be obtained via list_timers, which is useful implied guidance. However, there is no explicit statement of when to cancel versus modify a timer with set_timer, nor any error/exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sceneB
Save the current look of a room or zone's lights as a new scene.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| room | Yes | The room or zone to save. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 does disclose that the current look is captured, but says nothing about whether an existing scene with the same name is overwritten, what permissions are required, or whether creating a scene affects the live lights. For a mutation tool with zero annotation coverage this is a real 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 front-loaded sentence with no filler; the verb and the resulting resource are the first things the reader sees.
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?
An output schema exists, so return values need not be explained, and the two-parameter surface is small. However, for a write/create tool with no annotations, the description omits conflict/overwrite behavior and permissions, leaving the agent short of what it needs to call it safely.
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 50%: 'room' is documented in the schema, while 'name' has only type/length constraints. The description adds marginal meaning by clarifying that the room/zone's lights are the source and that the result is a new scene, but adds no format or constraint detail beyond the schema.
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 ('Save ... as a new scene') and clarifies scope ('a room or zone's lights'). It implicitly distinguishes itself from the sibling activate_scene (which applies an existing scene rather than creating one), but never names or contrasts with that sibling explicitly.
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?
There is no when-to-use guidance, no mention of alternatives like activate_scene, and no stated prerequisites. The agent must infer that this is the creation counterpart to activation from the wording alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_homeBRead-only
Rooms and zones, with their lights' current state and their scenes.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | Only this room or zone. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds useful context about the breadth of the read (whole-home structure plus current light state and scenes), but says nothing about freshness, size, or performance implications of an unfiltered call.
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 tight sentence with no padding, and the resource scope is front-loaded. It loses a point only because the sentence fragment omits an explicit verb, which would have made the action unmistakable.
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-required-argument read tool with a full output schema, the description need not explain return values, and it still summarizes what is included in the payload. It is sufficient to call the tool correctly, with the only real gap being absent usage context.
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% and the single optional 'room' parameter is documented in the schema as 'Only this room or zone.' The description's phrase 'Rooms and zones' loosely echoes that scoping but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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 is a noun phrase rather than a verb+resource statement, but it clearly enumerates what is retrieved: rooms and zones together with their lights' current state and their scenes. It stands apart from the sibling set (set_lights, set_power, activate_scene, etc.), which are all actions, though it never explicitly says it is a read/retrieval.
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?
No when-to-use guidance is given. The description does not state whether it should be called to bootstrap state before issuing set_* commands, nor does it name any alternative (there is no sibling read tool, but the agent is left to infer that).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_timersBRead-only
Timers set with set_timer that haven't fired yet.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, covering the safety profile. The description contributes the meaningful constraint that only unfired timers are returned, but says nothing about ordering, count limits, or timing semantics – useful but modest added context.
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, tightly scoped sentence with no waste. The scoping qualifier ('haven't fired yet') is front-loaded and does real work, though it is clipped to the point of omitting an explicit verb.
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?
An output schema exists, so return values need not be described, and the no-parameter signature keeps the surface small. For such a simple read tool with annotation coverage, the description is adequate, missing only explicit routing guidance.
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?
The tool takes zero parameters, so the schema carries no semantic burden the description needs to compensate for. Baseline 4 applies with no parameter gaps.
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 identifies the resource (timers) and narrows it precisely: those created by set_timer that are still pending. It implicitly conveys the list/read operation and distinguishes itself from cancel_timer or a general timer view, though the verb itself must be inferred from the name.
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?
It implies the context of checking pending timers, but gives no explicit when-to-use guidance and names no alternative (e.g., cancel_timer or get_home). The agent must infer usage from the scope statement alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_effectA
Start a light effect, or stop effects with "none".
candle, fire, prism, sparkle, opal, glisten, underwater, cosmos, sunbeam and enchant loop until stopped. sunrise and sunset brighten or dim gradually over duration_minutes (wake-up light, falling asleep). Lights that don't support the effect are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| speed | No | Looping effects only: 0 slowest to 1 fastest. | |
| effect | Yes | ||
| target | Yes | A light, room or zone name, or "all" for every light. | |
| target_type | No | Only needed when a light and a room share a name. | |
| duration_minutes | No | Required for sunrise and sunset only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses that ten effects loop until stopped, that sunrise/sunset ramp over duration_minutes, and that unsupported lights are silently skipped. It still omits whether effects persist across restarts or require specific permissions, but the operational behavior is well covered.
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?
Front-loaded with the core action and stop condition, then the effect taxonomy. The run-on list of looping effects is a bit dense but every clause conveys non-obvious behavior; no filler sentences.
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?
An output schema exists, so return values need not be described. For a 5-parameter tool with no annotations, the description covers effect behavior, stopping, and unsupported-light handling adequately; only permissions and persistence are unaddressed.
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 coverage is 80% and already documents speed's range and duration_minutes' requirement, so the baseline would be 3. The description adds genuine meaning beyond the schema by classifying which enum values loop (candle, fire, ... enchant) versus ramp (sunrise, sunset) and by giving the semantic meaning of "none" as the stop command.
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?
States a specific verb+resource: start a light effect, or stop effects with "none". It enumerates the effect vocabulary and distinguishes the two behavior families (looping vs. gradual), so an agent can tell it apart from set_lights, set_power, and activate_scene without opening 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 implies when to use it via the effect list and the parenthetical use cases ("wake-up light, falling asleep"), and it clarifies that "none" is the stop mechanism. However, it never says when to prefer this over set_lights, set_power, or activate_scene, nor any prerequisites, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_lightsB
Turn lights on or off, or change their brightness, color or white tone.
Setting brightness, a color or a white tone also turns the lights on.
| Name | Required | Description | Default |
|---|---|---|---|
| on | No | ||
| target | Yes | A light, room or zone name, or "all" for every light. | |
| color_hex | No | A color like #ff8800. Convert color names to hex yourself. | |
| brightness | No | Percent. Use on=false, not 0, to turn off. | |
| target_type | No | Only needed when a light and a room share a name. | |
| brightness_change | No | Relative change in percentage points, for lights that are on. | |
| transition_seconds | No | Fade to the new state over this many seconds (at most 100 minutes; set_effect sunset dims to off more slowly). | |
| color_temperature_kelvin | No | White tone: 2200 candle, 2700 warm, 4000 neutral, 6500 daylight. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose one important behavioral trait beyond the schema: supplying brightness/color/white tone implicitly turns the lights on. It omits other relevant behavior such as what happens with conflicting color parameters, partial failure across a multi-light target, or permission requirements.
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 short sentences, zero waste, with the core capability front-loaded and the non-obvious implicit-on behavior placed second. Nothing is padded or repeated.
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?
An output schema exists, so return values need not be explained, and the schema covers most parameters. For an 8-parameter mutation tool with no annotations, however, the description leaves real gaps: no guidance on argument combinations, multi-target semantics, or error behavior.
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 88%, so the schema already documents target, brightness range, color hex conversion and transition limits. The description only restates the implicit-on rule for brightness/color, adding little semantics beyond what the structured fields already provide; baseline 3 applies.
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?
Specific verb+resource: it turns lights on/off and changes brightness, color or white tone, which distinguishes it from scene/timer/effect siblings. It does not, however, differentiate itself from the sibling set_power, which plausibly overlaps with the on/off portion of this 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 never says when to prefer set_lights over set_power, set_effect or activate_scene, nor does it state prerequisites (e.g. target must exist). The second sentence describes a side effect rather than selection guidance, so usage must be inferred from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_powerA
Light the target with about this many watts in total, e.g. "use 20 watts".
Every light in the target is turned on at the same brightness; colors and white tones stay as they are.
| Name | Required | Description | Default |
|---|---|---|---|
| watts | Yes | Total draw for the target's lights. | |
| target | No | A light, room or zone name, or "all" for every light. | all |
| target_type | No | Only needed when a light and a room share a name. | |
| transition_seconds | No | Fade to the new state over this many seconds (at most 100 minutes; set_effect sunset dims to off more slowly). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden, and it does disclose genuine behavioral traits: every light in the target is set to the same brightness and existing colors/white tones are preserved. It still omits permissions, error/rejection behavior, and whether the value is a hard cap or merely approximate ("about this many watts" stays vague).
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?
Short and front-loaded, with the watts example leading and the side-effect note following. The phrasing "about this many watts" and the two-line break add minor slack but nothing is wasted.
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?
An output schema exists, so return values need no explanation, and the description covers the key side effects. For a 4-parameter mutation tool with no annotations, more on permissions and on how this differs from brightness-setting siblings would complete it.
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 watts, target, target_type, and transition_seconds. The description restates watts as a total for the target and adds that uniformity applies across the target's lights, but contributes no syntax, range, or format detail beyond the schema.
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?
States a specific verb and resource: set a target's total power draw in watts, with a concrete example. It is clearly distinguishable from a brightness-oriented sibling like set_lights, but it never names an alternative, so an agent must infer the boundary itself.
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 phrase "e.g. use 20 watts" implies when this tool applies (you want to cap/express a target's draw in watts), but there is no explicit when-to-use vs when-not, and no routing to set_lights, set_effect, or activate_scene. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_timerA
Do something after a delay, e.g. turn the bedroom off in 30 minutes.
The timer runs on the bridge, so it fires even after this conversation ends.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | "off", "on", or a scene name in the target room or zone. | off |
| target | Yes | A light, room or zone name, or "all" for every light. | |
| minutes | Yes | ||
| target_type | No | Only needed when a light and a room share a name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a genuinely important behavioral trait: the timer runs on the bridge and fires even after the conversation ends. It stops short of stating that the timer fires once, or how it relates to cancel_timer, which would complete the picture.
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, front-loaded with a concrete example followed by the persistence caveat. No filler, though the second sentence could be tightened slightly.
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?
An output schema exists so return values need no explanation, and the description covers the key non-obvious behavior of bridge-side persistence. It leaves gaps on interaction with cancel_timer/list_timers and whether the timer is one-shot, but is largely sufficient for correct invocation.
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 coverage is 75%: target, action, and target_type are documented in the schema, and minutes carries explicit bounds. The description only echoes 'bedroom' and 'off' through its example, adding no format or syntax detail beyond what the schema already provides, so the baseline 3 applies.
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 conveys the core function through a concrete example ('turn the bedroom off in 30 minutes') — scheduling a device action after a delay. It is clear but never names the operation type or distinguishes itself from timer siblings like list_timers and cancel_timer.
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?
Usage is only implied through the example; there is no explicit when-to-use guidance or mention of alternatives such as cancel_timer or list_timers for managing the created timer. The agent must infer from the example when this tool applies.
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.
9 tool updates
v0.1.0- First observed
activate_scene - First observed
cancel_timer - First observed
create_scene - First observed
get_home - First observed
list_timers - First observed
set_effect - First observed
set_lights - First observed
set_power - First observed
set_timer
TDQS
Scored across 9 tools
Most tools target distinct actions or resources: get_home is read-only, scene tools, timer tools, and set_effect are clearly separate. The main overlap is set_lights vs set_power, since both affect brightness, but set_power uses total wattage and preserves color, making misselection unlikely though possible.
All nine tools use a consistent snake_case verb_noun pattern (get_home, set_lights, activate_scene, list_timers, etc.). The convention is predictable and easy to follow.
Nine tools is well within the ideal 3-15 range for a smart-lighting controller. Each tool earns its place by covering state read, light control, power, scenes, effects, and timers.
Core Hue workflows are covered: state inspection, on/off, brightness/color/white tone, wattage, scenes, effects, and timers. Minor gaps include no delete/update for scenes and no update for timers, though agents can work around by cancelling and recreating.
Maintenance
Related MCP Connectors
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Manage your IoT device fleet directly from Claude. Create device templates with datastreams and events, provision new devices, read live sensor data, and control outputs. The Blynk connector integrates with the Blynk IoT platform, enabling direct configuration and monitoring of connected devices and infrastructure.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
- Gigi AIOAuthai.usegigi
LinkedIn outreach from Claude with a human veto. Gigi researches each prospect and drafts the connection request and follow-ups; from Claude you review, edit and approve drafts, triage replies, create and manage campaigns, and read outreach reports. Nothing is sent without an approval, every write tool asks first, and the connector cannot bypass LinkedIn caps or sending windows. Sign-in: OAuth with your Gigi account. Setup: https://usegigi.ai/connect-claude?ref=glama
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables control of Philips Hue lights through Claude and other LLM interfaces using the OpenHue CLI.610MIT
- FlicenseAqualityDmaintenanceEnables control of Philips Hue lights through VS Code Copilot or Claude Desktop using natural language commands. Supports turning lights on/off, adjusting brightness, changing colors, and listing available lights on your Hue Bridge.2-
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Philips Hue smart lighting systems, including individual lights, groups, scenes, brightness, and color adjustments through natural language commands.-
- AlicenseAqualityDmaintenanceEnables control of Philips Hue lights via Bluetooth LE directly from Claude, without requiring a Hue Bridge or internet connection.844 PyPI1MIT