halo-light
This MCP server lets an assistant read and control Philips Hue lights, rooms/zones, and scenes through the local Hue CLIP v2 API, with optional music-sync controls.
List lights with room, power, brightness, color, and capabilities; get or search lights by ID/name.
List rooms, zones, and the whole home; get groups by ID/name.
List scenes and their room/zone.
Turn lights on/off, set brightness, color (name/hex/RGB/xy), color temperature, presets, effects, or alert/flash.
Perform the same controls for rooms/zones.
Activate scenes by name in their own room, or by ID.
Use optional
hue_beattools to start/stop/status/configure external audio synchronization when configured.
Controls Philips Hue lights through the bridge's local CLIP v2 API, allowing an assistant to read lights, rooms, zones and scenes and to command them by id or by name: turning lights and groups on/off, setting brightness, color (by name, hex, RGB or xy) and color temperature, triggering alerts, and activating scenes within their own room.
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., "@halo-lightTurn on the living room lights and set them to a warm white"
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.
halo-light
Serveur MCP pour les lumières Philips Hue, écrit à neuf sur l'API locale CLIP v2 du pont (https, en-tête hue-application-key). Un assistant (Claude, Lyra, etc.) peut lire l'état des lumières, des pièces et des scènes, puis les commander par identifiant ou par nom.
Fonctionnalités
Lumières, pièces, zones et scènes de l'API v2 (
light,grouped_light,room,zone,scene).Adressage par identifiant (UUID v2, ou ancien identifiant numérique v1 comme
12) ou par nom.Noms insensibles à la casse et aux accents : correspondance exacte d'abord, partielle seulement si elle est unique, sinon une erreur liste les candidats.
Une scène est activée dans sa propre pièce : aucun groupe n'est codé en dur.
Couleur par nom (
rouge,bleu,orange...), hexadécimal (#ff8800), RGB ou xy ; température de blanc en Kelvin.Erreurs remontées comme erreurs MCP (
isError) avec un message exploitable par le modèle.Annotations MCP sur chaque outil (
readOnlyHint,destructiveHint,idempotentHint).Extension optionnelle
hue_beat(synchronisation lumière / musique) via un script externe.
Related MCP server: Philips Hue MCP Service
Installation
Prérequis : Python 3.10 ou plus récent et un pont Hue sur le réseau local.
git clone https://github.com/amineutron/halo-light.git
cd halo-light
uv syncConfiguration
L'application a besoin de l'adresse du pont (facultative : elle est découverte automatiquement s'il n'y a qu'un pont) et d'une clé d'application.
Appairage
uv run halo-light pair # adresse découverte automatiquement
uv run halo-light pair --host <adresse-du-pont>Appuyez sur le bouton du pont quand la commande le demande. La clé est enregistrée dans ~/.config/halo-light/config.json, créé en mode 0600 (dossier en 0700). La clé n'est jamais affichée.
uv run halo-light discover liste les ponts connus du service de découverte de Philips.
Variables d'environnement (prioritaires sur le fichier)
Variable | Rôle |
| clé d'application |
| adresse du pont (sinon découverte via |
| fichier PEM pour vérifier le certificat du pont (facultatif) |
| autre chemin pour le fichier de configuration |
Le pont présente un certificat signé par une autorité privée de Signify : par défaut il n'est pas vérifié (réseau local). Pour l'épingler, fournissez l'autorité avec HUE_BRIDGE_CA_CERT.
Brancher le serveur à un client MCP
{
"mcpServers": {
"hue": {
"command": "uv",
"args": ["--directory", "/chemin/vers/halo-light", "run", "halo-light"],
"env": { "HUE_APP_KEY": "<cle>" }
}
}
}Évitez d'écrire la clé en clair : préférez le fichier en 0600 ou un gestionnaire de secrets.
Outils exposés
Tous les outils d'action acceptent light_id ou light_name (lumières), group_id ou group_name (pièces et zones). Si les deux sont fournis, l'identifiant l'emporte.
Outil | Rôle | Nature |
| lire les lumières | lecture seule |
| lire pièces, zones et maison | lecture seule |
| lire les scènes et leur pièce | lecture seule |
| allumer / éteindre | écriture, idempotent |
| luminosité 0-100 (allume ; 0 éteint) | écriture, idempotent |
| couleur par nom ou hexadécimal / RGB / xy | écriture, idempotent |
| blanc en Kelvin (2000 à 6500) | écriture, idempotent |
| préréglage nommé : | écriture, idempotent |
| effet dynamique : | écriture, idempotent |
| clignotement d'identification | écriture |
| allumer / éteindre une pièce ou zone | écriture, idempotent |
| idem pour un groupe | écriture, idempotent |
| active une scène par nom dans sa pièce ( | écriture, idempotent |
| active une scène par identifiant | écriture, idempotent |
| extension optionnelle | voir ci-dessous |
Aucun outil n'est destructif : les changements d'état sont réversibles et rien n'est supprimé sur le pont.
Exemples de résolution de noms
light_name="cafe"trouve « Lampe Café » (accents et casse ignorés).light_name="salon"avec « Salon Plafond » et « Salon Lampadaire » renvoie une erreur qui liste les deux.scene_name="relax"existant dans deux pièces renvoieRelax (Salon), Relax (Chambre): ajoutezgroup_name="chambre".
Extension optionnelle hue_beat
Les outils hue_beat_* pilotent un script externe de synchronisation lumière / musique (par exemple via l'Entertainment API). Ce script n'est pas fourni ici. Indiquez son chemin :
export HUE_BEAT_PATH=/chemin/vers/hue_beat.pyContrat attendu du script :
lancé en arrière-plan avec
python <script> --palette=P [--mode=M] [--bass-only];écrit son PID dans
HUE_BEAT_PID_FILEet un état JSON (mode,palette,bpm...) dansHUE_BEAT_STATE_FILE;lit des commandes JSON (
palette,mode,brightness,floor,sensitivity) dansHUE_BEAT_CTRL_FILE;s'arrête proprement sur
SIGTERM.
Les trois fichiers sont par défaut dans le dossier temporaire du système (hue_beat.pid, hue_beat.state.json, hue_beat.ctrl) ; adaptez les variables aux chemins réels du script. Sans HUE_BEAT_PATH, ces outils répondent par une erreur claire et le reste du serveur fonctionne normalement. HUE_BEAT_PYTHON (facultatif) désigne l'interpréteur qui lance le script, utile quand celui-ci a besoin de paquets (numpy, audio) absents de l'environnement du serveur ; sinon c'est l'interpréteur du serveur. Pendant la synchronisation, le pont peut ignorer les commandes sur les lumières de la zone de divertissement.
Brancher Lyra
Le script ironman-hue (hue_beat.py) de Lyra utilise des chemins fixes, définis par les constantes PID_FILE, STATE_FILE et CTRL_FILE en tête du script. Pour que les outils hue_beat_* les retrouvent, posez ces variables dans l'environnement du serveur avec les mêmes valeurs :
export HUE_BEAT_PATH=<chemin du script hue_beat.py>
export HUE_BEAT_PID_FILE=<valeur de PID_FILE>
export HUE_BEAT_STATE_FILE=<valeur de STATE_FILE>
export HUE_BEAT_CTRL_FILE=<valeur de CTRL_FILE>Les valeurs par défaut du serveur (hue_beat.pid, etc.) ne correspondent pas à celles du script : sans ces variables, le statut et les réglages ne l'atteignent pas.
La synchronisation en streaming (DTLS) demande en plus un utilisateur « entertainment », sa clé client et la zone de divertissement. Plutôt que de les écrire dans la configuration du client MCP, ajoutez une section beat au fichier ~/.config/halo-light/config.json (mode 0600) ; le serveur les transmet au script sous les noms HUE_USER, HUE_CLIENTKEY et HUE_AREA_ID, sans jamais les afficher :
{
"bridge_ip": "<adresse-du-pont>",
"app_key": "<cle>",
"beat": { "username": "<utilisateur>", "clientkey": "<cle-client>", "area_id": "<zone>" }
}Sans section beat, HUE_USER reprend la clé d'application. Une variable d'environnement déjà définie l'emporte toujours.
Développement
uv sync
uv run ruff check . && uv run ruff format --check .
uv run pytestLes tests s'exécutent contre un faux pont en mémoire (httpx.MockTransport, voir tests/fake_bridge.py) et ne touchent jamais un vrai pont. Voir CONTRIBUTING.md.
Inspiration et remerciements
Ce projet est une réécriture indépendante, inspirée par l'interface du serveur ThomasRohde/hue-mcp (licence MIT, © Thomas Rohde), lui-même construit sur la bibliothèque phue de Nathanael Lecaude. Les noms de la plupart des outils sont conservés pour rester compatibles avec les assistants qui les appellent déjà.
Aucune ligne de code d'implémentation n'est reprise de ces projets : tout est écrit à partir de la documentation officielle de l'API Hue (CLIP v2). Merci à Thomas Rohde pour le point de départ. Contrairement à ces projets, qui reposent sur l'API v1, celui-ci utilise l'API v2 (identifiants UUID, scènes rattachées à leur pièce).
Différences avec hue-mcp
API v2 au lieu de v1 (
phuen'est plus nécessaire) ;httpxasynchrone.Pas de groupe par défaut codé en dur (l'ancien groupe 81) : un groupe ou une pièce doit être désigné, sauf pour les scènes qui portent leur propre pièce.
Pas de cache à rafraîchir : l'état est lu en direct (
refresh_lightsn'existe plus).Non repris pour l'instant :
create_group,quick_scene, les préréglages de couleur et les effets (set_light_effect).set_colorremplace les préréglages.Nouveautés :
set_color,set_color_xy, groupes par nom, appairage et découverte en ligne de commande.
Licence
MIT. Les projets dont ce serveur s'inspire sont cités dans NOTICE.
Available Tools
29 toolsactivate_scene_by_nameAIdempotent
Activate a scene by name (case and accent insensitive), in the room it belongs to.
If several rooms have a scene with that name, the error lists them: pass group_name (or group_id) to pick one.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| group_name | No | ||
| scene_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive, closed-world behavior; the description adds real context beyond that — matching is case- and accent-insensitive, and ambiguity surfaces as an error listing candidate rooms. It does not describe the return payload, but an output schema exists to cover that.
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 the primary action, then the error/disambiguation path. No redundant restatement of the name or title.
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 three-parameter mutation with full annotation coverage and an output schema, the agent has everything needed: what it does, how names are matched, and how to recover from ambiguous names.
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?
With 0% schema description coverage, the description carries the burden and does so: scene_name is defined as a case/accent-insensitive name match, and group_name/group_id are framed as the disambiguation selectors for duplicate scene names across rooms. Only the type difference between group_id (string or integer) is left unexplained.
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 ('Activate a scene') plus a distinguishing lookup strategy ('by name, case and accent insensitive') that separates it from id-based siblings like set_scene. It also scopes the operation to 'the room it belongs to', which is meaningful in a multi-room system.
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?
Explicitly tells the agent what to do when several rooms contain a scene of that name: re-call with group_name or group_id. It does not name a sibling alternative (e.g. set_scene for id-based activation), so the routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alert_lightB
Make a light flash briefly so it can be identified.
| Name | Required | Description | Default |
|---|---|---|---|
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, non-read-only, non-idempotent operation, so the safety profile is covered. The description adds that the effect is a brief flash, but says nothing about duration, whether the light's prior on/off/brightness state is restored, or whether the command blocks until the flash completes.
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 the effect and its purpose, with no wasted wording.
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 is present, so return values need no explanation, but with two entirely undocumented parameters and zero schema coverage the description leaves the core invocation question of id-versus-name unresolved. For a tool that mutates visible device state, the absence of state-restoration or duration detail is also a meaningful gap.
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 0% and neither parameter is documented in the schema. The description never mentions light_id or light_name, so an agent gets no guidance on selecting between the two or on what happens when neither optional parameter is supplied (both default to empty strings).
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 gives a specific verb and effect ("make a light flash briefly") plus the identifying purpose, which clearly separates it from siblings like turn_on_light or set_brightness. It does not explicitly name the alternatives, but no sibling performs a flash, so ambiguity is low.
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 clause "so it can be identified" implies when to use it: locating a physical bulb. That is inferred rather than stated, and there is no guidance on when not to use it or on preconditions such as the light being reachable or powered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_light_by_nameARead-onlyIdempotent
Search lights whose name contains the text (case and accent insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely result-shaping behavior beyond that: matching is substring-based and tolerant of case and accents, which an agent could not infer from the annotations or schema. No return-format detail is needed because an output schema exists.
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 parenthetical-qualified sentence with the matching rule front-loaded and zero filler. Every clause carries meaning.
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 one-parameter read tool with full annotations and an output schema, the definition supplies what is needed to call it correctly. Minor residual gaps (whether multiple matches are returned and in what order) are partly absorbed by the output schema.
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 0%, so the schema alone leaves 'name' completely unannotated. The description partially compensates by framing it as text to match against a name with case/accent-insensitive substring semantics rather than an exact identifier, but it says nothing about escaping, empty strings, or result limits.
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 ('Search') and resource ('lights') plus precise match scope ('name contains the text'), which differentiates it from get_light (single lookup) and get_all_lights (unfiltered list) among the siblings. It stops short of naming any sibling explicitly, so it lands at 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 phrase 'name contains' implies usage for partial/unknown names rather than exact IDs, but there is no explicit when-to-use statement, no exclusion, and no pointer to get_light or get_all_lights as alternatives. Usage must be inferred from the matching semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_groupsARead-onlyIdempotent
List rooms and zones (plus the whole home) with their lights and state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior, so the safety profile is covered. The description adds genuinely new behavioral detail beyond that: results are grouped per room/zone and include nested lights and state, and the whole home is returned as an aggregate entity.
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 short sentence with zero filler; the resource (rooms and zones) and the payload (lights and state) are front-loaded. Nothing is repeated from the annotations or schema.
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 parameterless read with a rich annotation set and an output schema, the description covers what the agent needs to decide and call. It lacks only a brief note on how this differs from the per-light listing tools, a small gap given the crowded sibling set.
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 baseline is 4; there is nothing for the description to compensate for. The empty schema leaves no ambiguity about arguments.
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 ('List') and resource ('rooms and zones (plus the whole home) with their lights and state'), so an agent knows exactly what it retrieves. It does not explicitly contrast itself with siblings like get_group or get_all_lights, though the 'all' framing implies the distinction.
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 when-to-use guidance and no mention of alternatives; the only signal is the implicit 'all' vs. the singular get_group sibling name. An agent must infer that this is the bulk-enumeration call for groups rather than for lights.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_lightsARead-onlyIdempotent
List every light with room, power, brightness (0-100), color and capabilities.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish a safe, read-only, idempotent operation, while the description adds full-inventory scope, the reported state and metadata, and the 0-100 brightness scale. It provides no details about pagination, snapshot consistency, or bridge errors, though those are less critical for this simple listing 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?
One compact sentence front-loads the operation and scope, then lists only useful result attributes. The inline brightness range adds practical detail without introducing filler or unnecessary structure.
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-argument read-only listing with annotations and an output schema, the description provides what is needed to select and invoke it: complete inventory scope and the kind of light state returned. Additional error or pagination details would be optional at this level of complexity.
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 no parameters, so the zero-parameter baseline applies and no argument syntax needs explanation. The wording also correctly confirms that the listing requires no identifier or filter.
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 and resource and scopes the operation to every light, distinguishing this inventory listing from get_light, find_light_by_name, and the group or scene listings. Naming room, power, brightness, color, and capabilities further clarifies the information being retrieved.
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 'every light' establishes a clear use case: obtaining the complete lighting inventory and its state rather than looking up one light. It does not explicitly direct agents to get_light or find_light_by_name for targeted lookups, so alternatives and exclusions remain implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_scenesARead-onlyIdempotent
List scenes with the room or zone each one belongs to.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered and the description does not contradict them. The one piece of added behavioral value is that results are enriched with room/zone association, but nothing is said about ordering, volume, or filtering across bridges.
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 most useful detail (room/zone association) sits at the end but is still immediately readable. It is arguably under-specified rather than bloated.
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?
This is a simple read-only listing with an output schema, so the description does not need to explain return structure — and indeed it does not. Combined with annotations covering safety, the definition supplies enough for correct invocation; only cross-tool routing guidance is missing.
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 and the description correctly implies a no-argument, whole-collection listing with no hidden filters. Baseline for a parameterless tool applies, with no gap to compensate for.
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 ('List scenes') and adds that each entry carries its room or zone, which tells an agent what data the listing yields. It is clearly distinct from the mutation siblings (set_scene, activate_scene_by_name) by name alone, though it never explicitly contrasts itself with them.
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: an agent can infer this is the discovery step before calling activate_scene_by_name or set_scene. There is no explicit statement of when to call this instead of get_all_groups or get_group, and no preconditions or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupBRead-onlyIdempotent
Get one room or zone, by id or by name.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety and locality profile is fully covered by structured data. The description adds nothing behavioral on top: it does not say what happens if neither identifier matches, whether name matching is exact or fuzzy, or what occurs when both identifiers are supplied.
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, and the differentiating detail (id or name) arrives before the agent needs to choose parameters. Nothing is wasted or buried.
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 tool has only two optional parameters, which keeps the burden low. However, the ambiguity created by two optional identifiers with empty defaults and no stated precedence or not-found behavior leaves a real gap for a lookup 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 0% and both parameters are optional with empty-string defaults, so the description must carry the meaning. It does partially: it explains that the lookup is keyed either by id or by name, which is the intent behind group_id and group_name. It does not state precedence when both are passed, nor whether the name must match exactly, nor why group_id accepts both string and integer.
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?
"Get one room or zone, by id or by name" pairs a specific verb (get) with a specific resource and clarifies that Hue "groups" are rooms/zones, which the parameter names alone would not reveal. The singular "one" implicitly contrasts with the sibling get_all_groups, though that sibling is never named 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?
Usage is only implied: the singular "one" plus "by id or by name" suggests this is the single-resource lookup versus get_all_groups. There is no explicit when-to-use or when-not-to-use statement, no mention of the alternative lookup path (e.g. find_light_by_name equivalent for groups), and no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lightARead-onlyIdempotent
Get one light, by id or by name (case and accent insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavior — case- and accent-insensitive matching — but says nothing about precedence when both identifiers are supplied, behavior when neither is given, or what happens on a miss.
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, front-loaded with the verb and resource, with the matching rule appended where it is immediately useful. Nothing is redundant or padded.
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 an output schema present and annotations covering safety and idempotency, the description needn't explain return values. The remaining gap is modest but real: for a two-optional-parameter lookup tool, the resolution order and empty-input behavior should be stated.
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 0%, so the description must carry the load, and it does partially: it maps "by id" and "by name" onto light_id and light_name and explains the case/accent-insensitive matching rule. It leaves the bigger ambiguities unaddressed — both parameters are optional with empty-string defaults, and the description does not state which one wins or what an empty call returns.
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?
"Get one light, by id or by name" gives a specific verb and resource and signals single-item retrieval, which distinguishes it from get_all_lights. It does not, however, distinguish it from the sibling find_light_by_name, which appears to cover overlapping lookup-by-name behavior.
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: an agent can infer this is the single-light fetch versus the list tools, but the description never says when to prefer it over find_light_by_name or what to do if a lookup fails. No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hue_beat_setBIdempotent
Change hue_beat settings live. Empty or -1 means unchanged.
brightness 0.1-1.0 (peak on beats), floor 0.0-0.9 (ambient level between beats), sensitivity 0.5-3.0 (beat detection multiplier).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| floor | No | ||
| palette | No | ||
| brightness | No | ||
| sensitivity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as a non-destructive, idempotent mutation, so the safety profile is covered. The description adds real value by disclosing the sentinel semantics: empty string or -1 leaves a field unchanged, which governs how a partial update behaves. It does not say whether changes take effect immediately on a running effect or whether settings persist across hue_beat_stop/start cycles.
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 primary action is front-loaded in the first sentence, followed by a compact per-parameter reference. The fragmentary formatting is efficient and each line carries information, though the closing blank line and telegraphic style are slightly rough.
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. Still, for a five-parameter mutation tool with zero schema descriptions, missing coverage of the mode and palette parameters and the absence of any prerequisite or effect-application note leave the definition only partially complete.
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?
With schema coverage at 0%, the description carries the burden and does document brightness (0.1-1.0, peak on beats), floor (0.0-0.9, ambient between beats), and sensitivity (0.5-3.0, beat detection multiplier), including ranges the schema omits. However, mode and palette — two of the five parameters — receive no explanation at all, leaving a substantial gap.
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 opens with a specific verb and resource: "Change hue_beat settings live." That distinguishes it from the hue_beat_start/stop/status siblings, which control lifecycle rather than settings. It never names those siblings, so the differentiation is inferred rather than stated.
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 explains the partial-update convention ("Empty or -1 means unchanged") but gives no guidance on when to call this versus hue_beat_start or hue_beat_status, and never states whether the beat effect must already be running. An agent must guess at the sequencing and prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hue_beat_startA
Start the external hue_beat audio sync (optional extension, needs HUE_BEAT_PATH).
While it runs, REST commands on the lights of its entertainment area may be ignored. mode: pulse | ambiant. palette: ironman | fire | neon | cool | sunset | arctic | auto.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| palette | No | auto | |
| bass_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is not read-only, not idempotent, not destructive; the description adds substantive context they cannot convey, namely that while running, REST commands on the lights in its entertainment area may be ignored. It does not say whether the process persists across calls or what happens when HUE_BEAT_PATH is missing, which keeps it below a 5.
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 action and prerequisite, then the interference caveat, then the option lists. The telegraphic fragments and the misspelling "ambiant" cost a little polish, but there is no wasted prose.
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 main operational hazard is disclosed. However, bass_only is undefined and the failure mode when HUE_BEAT_PATH is unset is not stated, so an agent calling it blind still has unknowns.
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 0%, so the description must carry the load, and it does supply the real value sets for mode (pulse/ambiant) and palette (ironman/fire/neon/cool/sunset/arctic/auto), which are absent from the schema. The third parameter, bass_only, is never mentioned, leaving a gap.
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 ("Start the external hue_beat audio sync") and immediately marks it as an optional extension with an environment prerequisite (HUE_BEAT_PATH). Against siblings like hue_beat_stop, hue_beat_status, and hue_beat_set, 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?
Gives a clear precondition for use (the extension must be installed and HUE_BEAT_PATH set) and a warning about when its effects interfere with other tools. It stops short of explicitly routing to hue_beat_stop/hue_beat_status, though those names are self-evident counterparts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hue_beat_statusARead-onlyIdempotent
Report whether hue_beat is running, with mode, palette and BPM (optional extension).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is covered. The description adds useful context by naming the fields returned (mode, palette, BPM), but the phrase '(optional extension)' is cryptic and it says nothing about behavior when hue_beat is not running.
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?
It is a single front-loaded sentence with no filler, and the returned fields are packed into the same clause. The parenthetical '(optional extension)' is slightly ambiguous and is the only part that does not fully earn its place.
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 tool with an output schema and full annotation coverage, the description supplies enough to call it correctly and know roughly what comes back. Only edge-case behavior (e.g., hue_beat inactive) is left unstated.
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, which is the baseline-4 case, and the description correctly implies a no-argument status query without inventing inputs.
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 ('Report') and a named resource ('hue_beat') and lists exactly what is returned: running state, mode, palette and BPM. This clearly separates it from the mutation siblings hue_beat_start, hue_beat_stop and hue_beat_set, though it never names them 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?
Usage is only implied: an agent can infer this is the tool for checking status before or after calling start/stop/set, but the description never states when to use it, when not to, or which sibling to prefer in a given situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hue_beat_stopBIdempotent
Stop hue_beat (optional extension).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, idempotent mutation, so the safety profile is covered. The description adds one genuinely useful behavioral fact: the feature is an "optional extension", implying it may be unavailable on some setups. It does not say whether stopping restores prior light state or merely halts the loop, which is the main behavioral question for a stop 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?
Six words, verb-first, zero filler. It is efficient but so terse that the key term ("hue_beat") is left as unexplained jargon rather than being briefly glossed.
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 and there are no parameters, so the description need not explain returns or inputs. What is still missing for a mutation tool is what stopping actually does to the lights and whether a failure mode exists when the extension is absent.
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 there is nothing for the description to disambiguate. Baseline 4 applies since the schema is empty and fully described.
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 ("Stop") and resource ("hue_beat"), making it distinguishable from hue_beat_start in the sibling list. However, "hue_beat" itself is never defined, so an agent must infer that it is a running effect or loop.
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 guidance on when to call this versus hue_beat_set or hue_beat_status, and no statement about what happens if hue_beat is not currently running. The "optional extension" note hints at availability conditions but does not say when the tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_brightnessBIdempotent
Set a light's brightness (0-100, turns it on; 0 turns it off).
| Name | Required | Description | Default |
|---|---|---|---|
| light_id | No | ||
| brightness | Yes | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, idempotent, non-destructive profile, and the description usefully adds the value range (0-100), the side effect that any nonzero value powers the light on, and the boundary case where 0 turns it off. It does not disclose what happens for an unknown or ambiguous light target, which is the remaining behavioral 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 compact sentence with the resource, the range, and the two side effects front-loaded; there is no redundant wording to remove.
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?
The output schema and annotations cover return values and safety, and the brightness semantics are well covered. However, for a 3-parameter tool offering two ways to identify the target light, the total absence of target-selection guidance leaves a meaningful hole.
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 0%, so the description must carry the parameter burden, and it only clarifies one of three parameters (brightness, with its 0-100 range). The light_id and light_name parameters — both optional with empty-string defaults — are never explained, leaving the agent with no idea which identifier to supply or how precedence is resolved.
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 ("set a light's brightness") and the possessive "a light's" implicitly distinguishes it from the sibling set_group_brightness. It does not explicitly name that sibling, so the differentiation is inferred rather than stated.
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: nothing tells the agent when to prefer this over turn_on_light, turn_off_light, or set_group_brightness. The note that 0 turns the light off hints at overlap with turn_off_light but never routes the agent explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_colorBIdempotent
Set a light's color by name (rouge, bleu, orange, ...) or hex (#rrggbb).
| Name | Required | Description | Default |
|---|---|---|---|
| color | Yes | ||
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the important behavior: non-read-only, idempotent, non-destructive, closed-world. The description adds only the color value formats and gives no information about how the target light is resolved (light_id vs light_name), what happens with an unrecognized color name, or whether the call blocks. Beyond annotations, the added behavioral detail is thin.
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 written sentence, front-loading the action and then the value formats. Nothing redundant; every clause carries information.
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 annotations cover the safety profile. The remaining gap is the targeting mechanism for the two optional light parameters, which for a 0%-coverage schema is the main thing the description should have resolved.
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 0% and there are 3 parameters, so the description must carry the burden. It meaningfully explains only the `color` parameter (names such as rouge/bleu/orange, or #rrggbb hex); lig ht_id and light_name, both defaulting to empty strings and both used for targeting, are entirely undocumented — it is unclear which takes precedence or what an empty value does.
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?
A specific verb and resource ('Set a light's color') plus the accepted value formats (name or #rrggbb). It does not distinguish itself from the several color-setting siblings (set_color_rgb, set_color_xy, set_color_temperature, set_group_color), so an agent cannot infer from the description alone which one to pick.
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 implied by the name and the listed color formats — an agent knows this sets a named/hex color rather than an RGB tuple or a color temperature. However, there is no explicit statement like 'use this for named or hex colors; use set_color_xy for precise chromaticity,' and no prerequisites or when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_color_presetCIdempotent
Apply a named preset to a light: warm, cool, daylight, concentration, relax, reading, energize, red, green, blue, purple, orange.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | ||
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond the preset list: it does not say what happens when both light_id and light_name are omitted (both default to empty strings), which identifier wins if both are supplied, or what an invalid preset does.
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 the action first and the allowed values after; no filler. The trailing list is long but each item is load-bearing since the schema provides no enum.
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. Still, for a three-parameter mutation tool with zero schema coverage, the description should resolve how light_id and light_name interact and what happens on a bad preset name; those gaps keep it at minimum-viable.
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 0% and the preset parameter has no enum in the schema, so the description's enumeration of the twelve valid preset names is genuinely valuable and compensates for part of the gap. However, the light_id/light_name pair is left unexplained despite both defaulting to empty strings, leaving the targeting semantics ambiguous.
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 ('Apply a named preset to a light') and enumerates the preset vocabulary, which lets an agent distinguish it from set_color_rgb, set_color_xy, and set_color_temperature. It does not explicitly name those siblings, so differentiation is inferred rather than stated.
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 at all: nothing says to prefer this over set_color_rgb, set_color_temperature, or set_scene, and no prerequisites or exclusions are given. The only implicit signal is the word 'preset', which an agent must interpret on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_color_rgbCIdempotent
Set a light's color from RGB components (0-255).
| Name | Required | Description | Default |
|---|---|---|---|
| red | Yes | ||
| blue | Yes | ||
| green | Yes | ||
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, and closed-world, so the safety profile is covered. The description adds one genuinely useful behavioral detail the annotations lack: the valid component range (0-255), which is absent from the schema. It says nothing about targeting behavior, invalid-value handling, or what happens when both or neither identifier is supplied.
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 range constraint is attached directly to the parameter it governs. It is efficient, though the terseness comes at the cost of the targeting and alternative-selection information noted above.
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, but the input side is under-specified for a 5-parameter tool at 0% schema coverage. An agent cannot tell how to identify the target light, whether the identifiers are mutually exclusive or which wins, or what the empty-string defaults imply.
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 0% across 5 parameters, so the description carries the full burden and only partly meets it: it documents the red/green/blue range but not their individual meaning. The two optional targeting parameters (light_id, light_name) and their interaction are entirely unaddressed in both schema and description.
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 and resource ("Set a light's color") plus the input mode (RGB components 0-255), which implicitly separates it from set_color_xy and set_color_temperature. It never names those siblings explicitly, so the agent must infer the distinction from the parameter vocabulary alone.
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 or when-not-to-use guidance: nothing says to prefer set_color_xy for gamut-accurate colors or set_color for named colors. It also gives no hint about choosing between light_id and light_name, so targeting must be inferred entirely from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_color_temperatureBIdempotent
Set a light's white color temperature in Kelvin (about 2000 warm to 6500 cool).
| Name | Required | Description | Default |
|---|---|---|---|
| light_id | No | ||
| light_name | No | ||
| temperature | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a non-read-only, idempotent, non-destructive, closed-world mutation, so the safety profile is covered. The description usefully adds the Kelvin range (~2000 warm to ~6500 cool), but says nothing about what happens on bulbs lacking a color-temperature capability or on invalid values — the main behavioral failure mode for this 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?
One sentence, front-loaded with the action and target, with the unit and range as a parenthetical. Nothing extraneous and nothing buried.
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 and rich annotations remove the burden of describing return values and safety, so the remaining gaps are narrow but real. For a mutation on a device that may not support the capability, the description should say how the two identifier parameters interact and how unsupported lights are handled.
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 0%, so the description carries the load and it only partially does: it defines the required 'temperature' meaning with a concrete range, which is genuinely valuable. It adds nothing about the two light-identification parameters (light_id and light_name, both defaulting to empty) or which one takes precedence when both are supplied.
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 light's white color temperature') and clarifies the unit and range, which lets an agent distinguish this from set_color_rgb. It does not explicitly name the sibling it competes with (set_group_color_temperature for groups, set_color for generic color), so differentiation is implied rather than stated.
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 word 'white' hints that this is the tunable-white path versus set_color_rgb/set_color_xy, but there is no explicit when-to-use, when-not-to-use, or fallback guidance. An agent must infer from the name alone that group targets require set_group_color_temperature instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_color_xyCIdempotent
Set a light's color from CIE 1931 xy coordinates (0-1).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true, destructive=false and readOnly=false, so the safety profile is covered; the description adds only the 0-1 range of the coordinates. It says nothing about targeting behavior, what happens if the light does not support xy color, or error behavior for plugs/white-only bulbs — meaningful gaps for a state-changing 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?
One front-loaded sentence with no filler, and the coordinate range is placed immediately after the key term. It is efficient but arguably too terse, since nothing follows to cover targeting or capability caveats.
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 four-parameter mutation tool with zero schema description coverage, the definition leaves the light-targeting semantics (two optional, string-defaulted identifiers) unexplained. Return values are covered by the output schema, so that omission is fine, but the input-side ambiguity and missing color-capability caveat keep this well short of complete.
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 0% across four parameters, so the description must compensate, and it only partly does: it clarifies that x and y are fractional CIE coordinates in 0-1. The two targeting parameters (light_id, light_name — both defaulting to empty string) get no explanation of precedence or what an empty pair means.
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 gives a specific verb ('Set') and resource ('a light's color') plus the exact color space (CIE 1931 xy), which implicitly separates it from set_color_rgb, set_color_temperature and set_color. It stops short of naming those siblings explicitly, but the coordinate-space detail is enough for an agent to tell them apart.
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?
Nothing states when to prefer xy over RGB, temperature, or the generic set_color sibling, nor any exclusion such as lights that do not support color. The agent is left to infer selection entirely from the coordinate system mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_brightnessAIdempotent
Set the brightness (0-100, turns it on; 0 turns it off) of a room or zone.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| brightness | Yes | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose idempotent, non-destructive, and non-read-only behavior. The description adds useful behavioral detail beyond annotations: brightness is 0-100, a nonzero value turns the group on, and 0 turns it off.
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 wasted wording. The parenthetical efficiently carries the essential range and on/off behavior.
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?
The output schema covers return values and the annotations cover safety, but for a three-parameter group-control tool the description omits critical group identification semantics and guidance on alternative tools.
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 0%, so the description must carry parameter meaning. It clarifies brightness range and off behavior, but group_id and group_name are completely undocumented, including how to choose between them or what their empty defaults mean.
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 and resource ("Set the brightness") plus the target scope ("room or zone") and the 0-100 effect. It implicitly distinguishes group control from single-light siblings via "room or zone," but does not explicitly name an alternative 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?
Usage is implied by "room or zone," but there is no explicit guidance on when to use this versus turn_on_group, turn_off_group, or set_brightness. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_colorBIdempotent
Set the color of a room or zone by name (rouge, bleu, ...) or hex (#rrggbb).
| Name | Required | Description | Default |
|---|---|---|---|
| color | Yes | ||
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, non-destructive, closed-world mutation, so the safety profile is covered. The description adds the accepted color input formats, which is genuine value, but it says nothing about how the target group is resolved or what happens when neither group_id nor group_name is supplied.
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 input-format examples are the most decision-relevant detail and appear inline. The ellipsis in the color examples is slightly loose but not wasteful.
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, but this is a three-parameter mutation tool with zero schema documentation and the description never addresses group_id versus group_name or failure behavior. What remains missing is exactly what an agent needs to invoke it reliably.
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 0%, so the description carries the full burden, yet it only clarifies the color parameter (names like rouge/bleu or #rrggbb). The two group-identification parameters are undocumented, and their empty-string defaults with no stated precedence between them leave a real ambiguity unresolved.
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 the color of a room or zone. The mention of color-name-or-hex input implicitly separates it from the rgb, xy, and temperature siblings, but the description never names those alternatives, so an agent must infer the boundary.
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: 'room or zone' signals this targets groups rather than individual lights, which is the distinction from set_color. There is no explicit when-to-use or when-not statement, and nothing tells the agent which of the group-targeting siblings to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_color_presetBIdempotent
Apply a named preset to a room or zone: warm, cool, daylight, concentration, relax, reading, energize, red, green, blue, purple, orange.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | ||
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation non-read-only, non-destructive, idempotent and closed-world, so the safety profile is covered. The description adds genuinely useful behaviour context by listing the twelve accepted preset names, which the schema does not enumerate at all. It stops short of stating that the whole group is affected uniformly, that existing brightness/temperature may be overridden, or what the response confirms.
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 front-loaded sentence; the long preset list is load-bearing information rather than padding. Nothing could be removed without losing content.
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?
The tool is simple, an output schema exists so return values need no explanation, and annotations carry the safety profile. The remaining gap is target selection: with 0% schema coverage, the description should have said how a room or zone is identified when every targeting parameter is optional.
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 0% for three parameters, and the description only compensates for one of them: the valid values of the required 'preset' string. It never explains the group_id vs group_name pair, that group_id accepts string or integer, or what happens when both are left at their empty defaults — the riskiest ambiguity in this 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 gives a specific verb and resource ("apply a named preset") plus the target scope ("a room or zone"), which aligns with the group-oriented name. It implicitly separates itself from the light-level set_color_preset, but never names that sibling, so the differentiation relies on the agent noticing the 'group' prefix.
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 guidance on when to choose this over set_group_color, set_group_color_rgb, or set_scene, nor any note about precedence (e.g. whether a preset overrides a previously set scene or effect). Usage is only inferable from the enumeration of preset names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_color_rgbBIdempotent
Set the color of a room or zone from RGB components (0-255).
| Name | Required | Description | Default |
|---|---|---|---|
| red | Yes | ||
| blue | Yes | ||
| green | Yes | ||
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a non-read-only, idempotent, non-destructive mutation. The description adds the useful RGB range of 0-255, but does not explain target resolution, error behavior, or what happens when a room/zone is not found.
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 definition is a single front-loaded sentence with no filler. It communicates the operation and RGB range efficiently.
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?
The annotations and output schema reduce the description burden, and the RGB range is covered. However, the critical question of how the room or zone is selected through group_id or group_name is left to the bare schema titles.
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 0%, so the description must explain five parameters. It only clarifies the red, green, and blue range, and says nothing about group_id versus group_name, their optionality, or precedence when both are supplied.
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 and resource: set the color of a room or zone from RGB components. It distinguishes the group target from an individual light, but does not explicitly contrast with siblings such as set_color_rgb or set_group_color.
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 gives no guidance on when to use RGB rather than named colors, XY, or color temperature, and does not mention when to prefer set_group_color or set_color_rgb. Usage is only implied by the operation itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_color_temperatureBIdempotent
Set the white color temperature (Kelvin) of a room or zone.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| group_name | No | ||
| temperature | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety and repeat-safety profile is covered. The description adds only the Kelvin unit, leaving out the behavior that matters for a mutation: whether the group must be powered on, what an out-of-range temperature does, and what happens if neither group_id nor group_name resolves.
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, and the key identifying detail (Kelvin) is placed early. It is well sized; the only issue is that the space saved was not spent on the group-identification ambiguity.
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 annotations cover the safety profile, which lowers the bar. Still, for a tool with two competing group-identification parameters at 0% schema coverage, the description should have resolved how the target is chosen — that gap is what keeps it at a minimum-viable level.
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 0% across three parameters, so the description carries the full burden and largely fails it. It clarifies that 'temperature' is in Kelvin (real added value) but says nothing about acceptable Kelvin range, nor does it explain that group_id and group_name are alternative ways to identify the same target group or what the empty-string defaults mean.
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 the white color temperature') and scopes it to 'a room or zone', which implicitly separates it from the light-level sibling set_color_temperature. It stops short of naming that sibling explicitly, so an agent must infer the distinction from 'room or zone'.
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 'of a room or zone' implies this is the group-scoped variant, which is useful routing context against the many light-level siblings. However, there is no explicit when-to-use/when-not-to-use statement, no mention of prerequisites such as the group needing to be on or reachable, and no guidance on choosing group_id versus group_name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_light_effectAIdempotent
Set a dynamic effect on a light: none, candle, fire, prism, sparkle, opal, glisten, underwater, cosmos, sunbeam, enchant.
| Name | Required | Description | Default |
|---|---|---|---|
| effect | Yes | ||
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clarifies that the effect is 'dynamic' and provides the list of recognized effects, adding functional context beyond the structural information in the annotations. It does not reveal backend behavioral traits (e.g., latency, persistence) that are not already covered by the 'idempotent' annotation.
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 definition is a single, highly optimized sentence, immediately stating the core function and following up with the complete domain of accepted values. There is no extraneous wording.
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 configuration setter with few parameters, the definition is quite complete as it provides the necessary domain constraints for the required 'effect' parameter. The complexity of the tool is low, making the description 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?
Given that schema description coverage is 0%, the description provides the critical semantic value for the 'effect' parameter by enumerating all valid strings (e.g., 'candle', 'fire'). Without this list, the agent would only know it needs a string and not what values are permissible.
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 explicitly states the action ('Set a dynamic effect') and provides an exhaustive list of acceptable effect values, clearly defining its purpose as a specific visual modification 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 tool provides inherent usage guidance by listing all possible effects, implying that this is the tool to use whenever a specific visual pattern is desired. However, it does not explicitly guide the agent on when to prefer this over other related tools like set_color.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_sceneAIdempotent
Activate a scene by id. group_id, if given, must be the scene's own room or zone.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| scene_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description adds one genuinely useful behavioral detail — the group_id precondition tied to the scene's own room/zone — but says nothing about what activation does to lights, what happens if the precondition is violated, or whether errors are returned.
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, front-loaded with the action and followed by the one non-obvious constraint. Nothing is wasted or buried.
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?
The tool is simple, annotations cover the safety profile, and an output schema exists, so the bar is modest. Still missing is any signal distinguishing this from activate_scene_by_name and any hint about the effect of activation, which matters for an idempotent-but-mutating scene call.
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 0%, so the description must carry parameter meaning. It does explain group_id's constraint (must be the scene's own room or zone), which is not in the schema, but scene_id is left as bare "by id" with no note on accepted string vs integer forms or where the id comes from (e.g., get_all_scenes).
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 names a specific verb and resource ("Activate a scene by id"), which is clearly distinguishable from read siblings like get_all_scenes. However, it does not differentiate itself from the sibling activate_scene_by_name, leaving the agent to infer that this variant is the id-based one.
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: "by id" hints at when to prefer this over the name-based sibling, but there is no explicit statement of when to use it or when to avoid it. The one conditional it does state (group_id must be the scene's own room or zone) is a constraint, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
turn_off_groupCIdempotent
Turn off a room or zone, by id or by name.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. However, the description leaves a real behavioral gap unaddressed: both group_id and group_name are optional with empty-string defaults, so it never says what happens when both are supplied or neither is — a case an agent will hit.
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 the resource and the addressing modes front-loaded and no filler. It could have used the saved space to resolve the id/name ambiguity, but nothing present is wasteful.
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 an output schema and rich annotations, the definition only needs to cover targeting and edge cases, and the targeting hint is there. Given two fully optional parameters at 0% schema coverage, the unresolved both/neither case keeps it at minimum viable rather than complete.
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 0%, so the description must carry the parameter burden and it partially does by signalling that id and name are alternative addressing modes. It adds no detail on precedence, format of the id, or case/naming behaviour for group_name, leaving half the semantics to guesswork.
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 gives a specific verb and resource ("Turn off a room or zone") and clarifies the target is a group, which separates it from the light-level siblings like turn_off_light. It stops short of naming the complementary sibling turn_on_group, but the opposite-action pairing is obvious.
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 framing: nothing says to use this instead of turn_off_light when the target is a room, nor any prerequisite about the group existing or being reachable. The only guidance is the implicit "by id or by name" targeting hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
turn_off_lightCIdempotent
Turn a light off, by id or by name.
| Name | Required | Description | Default |
|---|---|---|---|
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds nothing beyond that — it does not say what happens if the light is already off, what occurs when both or neither identifier is supplied, or how targeting failures are reported.
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 the action front-loaded and no padding. It is efficient, though the brevity leaves little room for the addressing rules an agent would need.
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. However, for a mutation tool with two entirely undocumented, optional parameters and empty-string defaults, the description should clarify how a target light is resolved and what happens when no identifier is provided; that gap is material.
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 0%, so the two parameters carry no documented meaning at the schema level. The phrase "by id or by name" maps loosely onto light_id and light_name but does not state precedence when both are given, what the empty-string defaults mean, or that light_id accepts both string and integer.
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 and resource ("Turn a light off") and clarifies the addressing mode ("by id or by name"). This implicitly separates it from turn_off_group and turn_on_light, though it never names those siblings 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 or when-not-to-use guidance, and no routing to alternatives such as turn_off_group for grouped lights or turn_on_light for the inverse. The only usable hint is the choice between id and name addressing, which is inferred rather than stated as a rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
turn_on_groupCIdempotent
Turn on a room or zone, by id or by name.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | ||
| group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds no behavioral context beyond that: it does not say what happens when both group_id and group_name are supplied (both default to empty string), what error occurs when neither resolves, or whether all member lights change state.
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, which is the right shape for a simple toggle tool. It is arguably over-terse, but that gap is charged against parameter semantics and completeness rather than 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 no explanation, but this is still a state-mutating tool with two optional, undocumented, empty-defaulted parameters. The description leaves the agent without enough to decide which identifier to pass or how conflicts are resolved, which is a meaningful gap for a write 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?
Schema description coverage is 0%, so the description must carry the burden, and it only weakly does: 'by id or by name' implies the two addressing modes but never maps them onto group_id vs group_name, never states precedence when both are provided, and never states that at least one is effectively required despite the schema marking neither as required.
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?
Names a specific verb ('Turn on') and resource ('a room or zone'), which also disambiguates it from the sibling turn_on_light by making clear this operates on a group/room rather than an individual light. It stops short of naming turn_on_light explicitly as the alternative, but the light-vs-group distinction is legible.
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 or when-not-to-use guidance: nothing tells the agent to prefer turn_on_group over turn_on_light per bulb, nor how to resolve a scene already active, nor what happens if the group is already on. The only hint ('by id or by name') describes addressing mode, not usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
turn_on_lightBIdempotent
Turn a light on, by id or by name.
| Name | Required | Description | Default |
|---|---|---|---|
| light_id | No | ||
| light_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, non-read-only behavior, so the safety profile is covered. The description adds nothing behavioral beyond them — no statement about what state the light returns to (last brightness, default level), no precedence rule when both identifiers are present, and no note on the empty-string defaults in the schema.
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 the action front-loaded and no filler. It borders on under-specification, but there is no wasted wording to trim.
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?
The tool is simple, an output schema exists to describe return values, and annotations cover the safety profile, so the description does not need to be long. The remaining gap is the unresolved id-vs-name resolution rule in a zero-required-parameter schema, which is a real but modest omission.
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 0%, so the description must carry the parameter burden, and "by id or by name" is genuinely useful — it tells the agent the two params are alternative addressing modes rather than complementary fields. However, it does not clarify precedence, whether name matching is exact or fuzzy, or that both default to empty strings.
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 gives a specific verb and resource ("Turn a light on") that cleanly separates it from turn_off_light and from the group-scoped turn_on_group. It stops short of any explicit sibling differentiation, so it is clear but not maximally distinguishing.
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 "by id or by name" implies the two addressing modes an agent may choose between, but there is no guidance on which to prefer, what happens if both are supplied, or when to reach for turn_on_group instead. 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- Added
set_color_preset - Added
set_group_color_preset - Added
set_light_effect
26 tool updates
v0.1.0- First observed
activate_scene_by_name - First observed
alert_light - First observed
find_light_by_name - First observed
get_all_groups - First observed
get_all_lights - First observed
get_all_scenes - First observed
get_group - First observed
get_light - First observed
hue_beat_set - First observed
hue_beat_start - First observed
hue_beat_status - First observed
hue_beat_stop - First observed
set_brightness - First observed
set_color - First observed
set_color_rgb - First observed
set_color_temperature - First observed
set_color_xy - First observed
set_group_brightness - First observed
set_group_color - First observed
set_group_color_rgb - First observed
set_group_color_temperature - First observed
set_scene - First observed
turn_off_group - First observed
turn_off_light - First observed
turn_on_group - First observed
turn_on_light
TDQS
Scored across 29 tools
The light-vs-group parallel families (set_brightness/set_group_brightness, set_color_rgb/set_group_color_rgb, turn_on_light/turn_on_group) are clearly scoped by target resource, and the color tools are distinguished by input format (RGB, xy, Kelvin, name/hex, preset). A few pairs genuinely overlap: get_light already accepts a name so find_light_by_name is nearly redundant, and set_scene vs activate_scene_by_name do the same thing via different keys.
Most names follow verb_noun_qualifier, but the resource token is applied unevenly: set_brightness and set_color omit 'light' while set_group_brightness names 'group', and some tools put the resource first (alert_light, set_light_effect) instead of the verb. Scene activation uses two different verb schemes (set_scene vs activate_scene_by_name).
At 29 tools the surface is heavy, and much of the bulk is mechanical duplication: every light operation is mirrored for groups, and five separate color tools exist for one light plus four for groups. Several entries (find_light_by_name, activate_scene_by_name, the three hue_beat tools) could be collapsed into existing tools or optional parameters.
The lighting-control domain is well covered: enumeration and lookup for lights, rooms, zones and scenes, power/brightness/color/effects/alerts, plus an optional audio-sync extension. Gaps are minor but real — effects and alerts exist only per light, not per room/zone, and there is no group-level effect or group-scene listing operation.
Maintenance
Related MCP Connectors
Control your existing Philips lights, Sonos speakers, Roborock vacuums and other supported devices through Port OS cloud. Give ChatGPT, Claude and other MCP-compatible assistants access to the devices you connect. Turn off the living room lights, play music on your speakers, adjust the thermostat, run a vacuum in a room, check a camera snapshot or find a connected tracker. Available actions depend on your linked provider accounts and each device’s supported capabilities. Port OS runs in the cloud; no local server is required. You choose the account, device and capability permissions each assistant receives. Device operations require user OAuth; public tool discovery does not grant device access. Port OS is in alpha. Setup: https://portoperatingsystem.com/docs/getting-started/ Support: https://portoperatingsystem.com/contact/
Yeelight device discovery, state, control, and scene execution.
Control your Tesla from your AI assistant - climate, charging, access, and security.
Home energy for AI assistants: live Power flow, Energy history, solar forecast, and device control.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Philips Hue smart lighting systems, including individual lights, groups, scenes, brightness, and color adjustments through natural language commands.-
- AlicenseNot gradedqualityDmaintenanceEnables control of Philips Hue lights through the Model Context Protocol, providing tools for turning lights on/off, setting brightness and color, and retrieving light status.1Apache 2.0
- AlicenseAqualityDmaintenanceEnables discovery and control of Philips Hue lighting devices via a local bridge using the CLIP v2 API, without any cloud dependency.10MIT
- AlicenseAqualityCmaintenanceEnables users to control Philips Hue lights through natural language, set moods, save favorites, and learn preferences over time.216 npmMIT