Skip to main content
Glama
paztek

twinkly-mcp

by paztek

twinkly-mcp

A Model Context Protocol (MCP) server that gives AI agents control of your Twinkly lights.

Point an MCP-capable assistant (Claude Desktop, Claude Code, etc.) at this server and ask it to turn your lights on, set a color, change brightness, or switch effects — in plain language.

It's built on top of the @twinklyjs/twinkly library, which talks to Twinkly devices over their local network API.

What you can do

Ask your assistant things like:

  • "Turn the Christmas tree lights on / off"

  • "Make the lights warm white at 40% brightness"

  • "Set them to green"

  • "Switch to the sparkle effect"

  • "What are my lights doing right now?"

  • "Discover my Twinkly devices"

Related MCP server: elgato-keylight

Requirements

  • Node.js 20+

  • One or more Twinkly devices on the same local network

  • An MCP client (e.g. Claude Desktop or Claude Code)

Quick start

With Claude Code, one command:

claude mcp add twinkly --env TWINKLY_IP=192.168.1.50 -- npx -y twinkly-mcp

Replace the IP with your device's, or drop --env entirely and use --env TWINKLY_DISCOVERY=true to let the server find your lights on the network.

For other clients, see Connecting an MCP client below. Nothing to clone or build — npx fetches the package on first run.

To hack on the server itself, see Development.

Configuration

The server is configured via environment variables (CLI flags and an optional JSON config file are also supported — see CLAUDE.md).

Devices

Variable

Description

TWINKLY_IP

IP address of a single device (e.g. 192.168.1.50); registered as the device named default.

TWINKLY_DEVICES

JSON map of named devices, e.g. {"tree":"192.168.1.50","window":"192.168.1.51"}.

TWINKLY_DEFAULT_DEVICE

Name of the device to use when a request doesn't specify one.

TWINKLY_DISCOVERY

true to auto-discover devices on the network at startup.

Don't know your device's IP? Enable discovery, or just ask the assistant to "discover my Twinkly devices".

Transport, safety & diagnostics

Variable

Default

Description

TWINKLY_TRANSPORT

stdio

stdio (for local MCP clients) or http (Streamable HTTP on /mcp).

TWINKLY_PORT

3000

Port for the HTTP transport. Binds to 127.0.0.1.

TWINKLY_READONLY

false

true exposes only read tools — no changes to your lights.

TWINKLY_TOOLS

(all)

Comma-separated allow-list of tool groups: discovery,status,power,color,effects,movies,admin.

TWINKLY_ALLOW_ADMIN

false

true exposes the gated admin tools (set_name, set_timer, send_frame). Off by default.

TWINKLY_TIMEOUT_MS

10000

Per-request timeout.

TWINKLY_LOG_LEVEL

info

error | warn | info | debug. Logs go to stderr only.

Tools

Every device-targeting tool takes an optional device argument (a name from list_devices); omit it to use the default device.

Discovery & status (read-only)

Tool

What it does

list_devices

List the devices the server knows about.

discover_devices

Scan the network for Twinkly devices and add new ones.

get_device_details

Hardware/firmware details (product, model, LED count, MAC, uptime…).

get_summary

Quick overview: mode, color, timer, music, filters.

get_state

Current mode, brightness, saturation, and color in one call.

Control

Tool

What it does

set_power

Turn the lights on (movie mode) or off.

set_mode

Set the operation mode directly (off, color, demo, movie, effect, rt, playlist).

set_color

Set a static color (rgb or hsv) and switch to color mode.

set_brightness

Set brightness 0–100.

set_saturation

Set saturation 0–100.

list_effects / set_effect

List predefined effects / play one by id.

list_movies / set_movie

List saved movies / play one by id.

Admin (gated behind TWINKLY_ALLOW_ADMIN=true)

Tool

What it does

set_name

Rename a device.

set_timer

Schedule daily on/off times.

send_frame

Push one realtime frame of per-LED RGB values over UDP.

The riskier device operations the underlying library can do (firmware, WiFi/network, MQTT, mic, factory reset) are intentionally not exposed.

Connecting an MCP client

Claude Desktop, Cursor, and other stdio clients

Add the server to your client's MCP configuration — claude_desktop_config.json for Claude Desktop, .mcp.json in a project for Claude Code, .cursor/mcp.json for Cursor:

{
  "mcpServers": {
    "twinkly": {
      "command": "npx",
      "args": ["-y", "twinkly-mcp"],
      "env": {
        "TWINKLY_IP": "192.168.1.50"
      }
    }
  }
}

Restart the client, and the Twinkly tools will be available to the assistant. Keep the -y — without it npx may stall on an install prompt that the client can't answer.

Any variable from Configuration can go in that env block: TWINKLY_DISCOVERY instead of a fixed IP, TWINKLY_READONLY to expose only the read tools, and so on.

Streamable HTTP

Run the server with the HTTP transport:

TWINKLY_IP=192.168.1.50 TWINKLY_TRANSPORT=http TWINKLY_PORT=3000 npx -y twinkly-mcp

It serves the MCP endpoint at http://127.0.0.1:3000/mcp. Point an HTTP-capable MCP client at that URL.

How it works

AI assistant  ──MCP──>  twinkly-mcp  ──local HTTP/UDP──>  Twinkly device(s)

The server translates natural-language requests into MCP tool calls, which it maps onto the Twinkly device API on your local network. Your device IPs and tokens stay local — nothing is sent to the cloud by this server.

Development

git clone https://github.com/paztek/twinkly-mcp.git && cd twinkly-mcp
npm install
npm run dev          # run in watch mode (tsx)
npm run build        # compile to dist/
npm test             # run the test suite
npm run test:coverage

# Real-device smoke test (read-only; skipped without a device):
TWINKLY_IP=192.168.1.50 npx vitest run src/integration.test.ts

See CLAUDE.md for architecture, the full configuration reference, and the build history.

License

ISC

Available Tools

14 tools
discover_devicesDiscover Twinkly devicesA

Actively scan the local network (UDP) for Twinkly devices and add any newly found ones to the registry. Returns the full device inventory afterwards. Use this when a device is not yet listed by list_devices.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
devicesYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint: false, openWorldHint: true), the description adds concrete behavioral details: it scans via UDP, modifies the registry, and returns the full inventory afterward. This gives the agent a clear picture of side effects and output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both information-dense. The first explains what the tool does; the second gives usage context. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, an output schema, helpful annotations, and a clear usage note referring to list_devices, the description covers all needed context for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description doesn't need to explain any parameters, and no additional meaning is required beyond what the empty schema shows.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Actively scan the local network'), the target resource ('Twinkly devices'), and the effect ('add any newly found ones to the registry'). It also distinguishes itself from the sibling list_devices by noting this is for devices not yet listed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: 'Use this when a device is not yet listed by list_devices.' This names the alternative and provides a clear condition, which is strong guidance for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_detailsGet device detailsA
Read-only

Get static hardware/firmware details for a Twinkly device: product, model, LED count and profile, MAC, UUID, firmware family, and uptime. Use get_state for the current mode/color/brightness.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoName of the target device (see list_devices). Omit to use the default device.

Output Schema

ParametersJSON Schema
NameRequiredDescription
macYes
nameYes
uuidYes
modelYes
deviceYes
productYes
ledCountYes
frameRateYes
ledProfileYes
movieCapacityYes
uptimeSecondsYes
firmwareFamilyYes
hardwareVersionYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context that the data is static and lists the fields returned, complementing the readOnlyHint annotation. It also signals that the tool does not report dynamic state by pointing to get_state, which is useful behavioral context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff, front-loaded with the main purpose and ending with a pointer to an alternative. Excellent structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one optional parameter, output schema present, and annotations clarifying safety, the description fully covers usage, scoping, and alternatives. No gaps for normal use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description for the device parameter. The tool description adds no additional parameter information, but the schema already fully documents the optional parameter, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Get' and identifies the resource as static hardware/firmware details for a Twinkly device, enumerating product, model, LED count, and more. It also distinguishes itself from get_state by naming that sibling for current mode/color/brightness.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool (for static details) and directs to get_state for current mode/color/brightness, providing a clear alternative. This is sufficient guidance for the primary sibling relationship.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stateGet light stateA
Read-only

Get the current state of a Twinkly device in one call: operation mode, brightness, saturation, and color. This is the go-to read tool before changing anything.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoName of the target device (see list_devices). Omit to use the default device.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
colorYes
deviceYes
brightnessYes
saturationYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the agent knows it's a safe read. The description adds that the call returns state in one call and specifies the fields returned, which is useful but not extensive. No behavioral trade-offs, permissions, or side effects are mentioned, but the annotation covers the core safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the action and key content. The second sentence adds usage context without redundancy. Every word earns its place, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one optional parameter, output schema exists) and the description covers the purpose, key return fields, and usage context. With annotations declaring read-only and output schema handling return structure, the description is complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the only parameter 'device' is fully described in the schema with guidance to use list_devices and fallback to default. The description adds no additional parameter meaning, so it relies on the schema, which is already comprehensive. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get'), the resource ('current state of a Twinkly device'), and the specific contents (operation mode, brightness, saturation, color). It distinguishes itself from sibling read tools by positioning itself as 'the go-to read tool before changing anything', which implies it is the primary state-fetching tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: use this tool as the primary read before making any changes. It implies that set_* tools should follow. It does not explicitly name alternatives or exclusions, but the guidance is actionable and unambiguous for an agent deciding when to call this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_summaryGet device summaryA
Read-only

Get a quick overview of a Twinkly device: current mode, color, on/off timer, music state, and active filters (brightness/saturation). Available since firmware 2.5.6.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoName of the target device (see list_devices). Omit to use the default device.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
colorYes
musicYes
timerYes
deviceYes
filtersYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, which matches the description's 'Get' verb. The description adds useful behavioral context by listing the exact fields returned and the firmware version requirement (2.5.6), which goes beyond the annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero filler: the first sentence states the tool's purpose and contents, the second provides availability. It is front-loaded and efficiently structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one optional parameter and an output schema. The description covers the scope, key fields, and availability. It doesn't explicitly differentiate from get_state, but that is covered by purpose clarity. Overall, the description is complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the 'device' parameter fully described as 'Name of the target device (see list_devices). Omit to use the default device.' The description adds no additional parameter semantics, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a quick overview of a Twinkly device and enumerates specific data points (mode, color, timer, music state, filters). It uses a specific verb (Get) and resource (device summary), but does not explicitly differentiate from sibling tools like get_state or get_device_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (for a quick overview) but provides no explicit guidance on when not to use it or how it compares to alternatives such as get_state or list_devices. No exclusions or alternative tool references are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesList Twinkly devicesA
Read-only

List the Twinkly devices this server knows about (from configuration and any prior discovery). Returns each device name, IP, where it came from, and which one is used when a tool omits the device argument. Use these names as the device argument on other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
devicesYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and the description adds that the list comes from configuration and prior discovery (not a live scan), and explains the default device behavior when the `device` argument is omitted. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, followed by return contents and usage instruction. Every sentence contributes value with no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool, the output schema, and read-only annotations, the description fully covers what the tool does, what it returns, and how to use the result. It also aligns with the openWorldHint by explicitly stating the list is from configuration and prior discovery.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description adds context about the `device` argument used on other tools, which is helpful even though this tool itself takes no parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('the Twinkly devices this server knows about'), clearly distinguishing from sibling discover_devices by noting it draws from configuration and prior discovery. It also states what is returned, making the tool's function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear guidance on using the returned names as the `device` argument for other tools, which is actionable. It implies the tool is for listing known devices rather than discovering new ones, but it does not explicitly name discover_devices as the alternative for discovery.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_effectsList effectsA
Read-only

List the predefined effects available on a Twinkly device (count + unique ids) and which effect is currently selected. Some firmware cannot report a numeric id for the current effect, in which case only currentEffectUniqueId is set. Use set_effect with an effect id to play one.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoName of the target device (see list_devices). Omit to use the default device.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
deviceYes
effectIdsYes
currentEffectIdYes
currentEffectUniqueIdYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true. The description adds useful behavioral nuance: 'Some firmware cannot report a numeric id for the current effect, in which case only currentEffectUniqueId is set.' No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, a critical firmware caveat, and a pointer to set_effect. Every word earns its place; no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional param, an output schema, and annotations, the description covers purpose, output contents (count/ids/current), a firmware limitation, and an alternative action. It is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage for the only parameter (optional 'device' with description). The tool description adds no additional parameter semantics, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: 'List the predefined effects available on a Twinkly device (count + unique ids) and which effect is currently selected.' It clearly distinguishes from siblings like list_movies (effects vs movies) and set_effect (list vs play).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context is provided: listing effects and current selection. Explicitly mentions 'Use set_effect with an effect id to play one,' pointing to an alternative. However, no when-not-to-use exclusion is stated, so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_moviesList moviesA
Read-only

List the movies (saved animations) uploaded to a Twinkly device — id, name, frames, fps — and which movie is current. Use set_movie with an id to play one.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoName of the target device (see list_devices). Omit to use the default device.

Output Schema

ParametersJSON Schema
NameRequiredDescription
deviceYes
moviesYes
currentMovieIdYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description's 'List' action aligns with a read-only operation. The description adds minimal behavioral context beyond the annotations, such as the exact fields returned, but no details about pagination or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the main purpose. Every phrase adds value: the output fields and the cross-reference to set_movie. No waste or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool, the description fully captures what the tool does, what it returns, and the obvious next step. The output schema likely covers return details, so no further description is necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'device' is fully described in the schema (100% coverage), including the default-device behavior. The description does not add parameter details, but the schema covers semantics sufficiently, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'List' with the resource 'movies (saved animations)' and clearly states the output fields (id, name, frames, fps) plus the current movie, distinguishing it from sibling tools like list_effects and set_movie.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (to list movies and see which is current) and explicitly points to set_movie as the follow-up to play one. It does not explicitly state when not to use it, but the alternative is clearly named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_brightnessSet brightnessA

Set the overall brightness of a Twinkly device to an absolute level from 0 to 100.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesBrightness level, 0–100.
deviceNoName of the target device (see list_devices). Omit to use the default device.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description confirms a write operation (consistent with readOnlyHint=false), but does not disclose side effects, persistence, or prerequisites beyond the schema. The annotation already covers the non-read-only aspect, and the description adds the absolute scale but little else.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the action and object, with no unnecessary words. It is appropriately concise for a simple setter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple setter, covering the operation and range. Without an output schema, it doesn't explain the return value, but the device parameter's schema description ties into list_devices, providing contextual completeness. Minor gaps on prerequisites or return expectations keep it from a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters ('value' with range, 'device' with reference to list_devices). The description adds the term 'absolute', clarifying that the value is not relative, which is a useful extension beyond the schema's basic range.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Set'), the resource ('overall brightness of a Twinkly device'), and the range ('0 to 100'), distinguishing it from sibling tools like set_power or set_effect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for setting absolute brightness, but provides no explicit guidance on when to use this tool versus alternatives or any exclusions. The 'absolute level' wording hints at a key semantic, but no alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_colorSet colorA

Set a single static color and switch the device into color mode so it shows immediately. Provide exactly one of rgb ({r,g,b}, 0–255) or hsv ({h,s,v}; hue 0–359, sat/val 0–255).

ParametersJSON Schema
NameRequiredDescriptionDefault
hsvNoHSV color: hue 0–359, saturation 0–255, value 0–255.
rgbNoRGB color, each channel 0–255.
deviceNoName of the target device (see list_devices). Omit to use the default device.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnlyHint=false, so the description carries the transparency burden. It discloses a key behavioral trait: 'switch the device into color mode so it shows immediately,' which reveals a state change and immediate effect. It does not cover persistence or interaction with current effects, but the disclosed mode switch is a valuable addition beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, no redundant wording. Every clause earns its place, including the mode-switch behavior and the exactly-one constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two nested color objects and an optional device parameter, the description covers the main usage constraint (exactly one) and immediate effect. It does not mention return values or errors, but no output schema exists and this is a simple setter. It is mostly complete, with slight room for clarifying interactions with effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds crucial semantics: 'Provide exactly one of rgb or hsv' resolves the mutual exclusivity that the schema does not enforce (required is 0). It also clarifies the purpose of each color space with ranges, which reinforces schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb and resource: 'Set a single static color and switch the device into color mode.' It distinguishes itself from sibling tools like set_effect by emphasizing 'static' color and from set_brightness/set_saturation by targeting the full color.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for static color changes ('Set a single static color') and provides the critical constraint 'Provide exactly one of rgb or hsv', but it does not explicitly mention alternatives or exclusions. The sibling list suggests set_effect is for effects, but the description does not say 'use set_effect for dynamic effects'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_effectSet effectA

Select a predefined effect by its numeric id and switch the device into effect mode so it plays. Call list_effects first to see how many effects exist (ids start at 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoName of the target device (see list_devices). Omit to use the default device.
effectIdYesEffect id to play (0-based).

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals that the tool switches the device into effect mode and starts playback, adding context beyond the annotations (readOnlyHint=false). However, it doesn't disclose potential side effects like whether the current mode is interrupted or what happens on an invalid effect ID. With sparse annotations, the description partially compensates but not fully.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first states the purpose, the second gives a key prerequisite. No fluff, front-loaded, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter write tool with no output schema, the description covers the core usage, effect ID semantics, and a required lookup step. It doesn't mention response format or error handling, but it's sufficient for an agent to invoke it correctly given the schema and sibling context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both properties already described in the input schema. The description reinforces that IDs are 0-based and suggests listing effects, adding marginal value beyond the schema. The baseline of 3 applies because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool selects a predefined effect by numeric ID and switches the device into effect mode to play it. This differentiates it from sibling tools like set_color and set_movie by explicitly naming the effect mode and the list_effects prerequisite.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit usage guideline: 'Call list_effects first to see how many effects exist (ids start at 0).' This tells the agent when to use the tool (after listing effects) and implies the sequence. It doesn't explicitly mention alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_modeSet operation modeA

Set the LED operation mode directly. Modes: off, color (static color), demo (built-in loop), movie (a saved movie), effect (a predefined effect — pass effectId), rt (realtime), playlist. To pick which movie/effect plays, use set_movie / set_effect.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesThe operation mode to switch to.
deviceNoName of the target device (see list_devices). Omit to use the default device.
effectIdNoEffect id to play, only used when mode is "effect".

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnlyHint=false and openWorldHint=false, so the description carries the burden of behavioral disclosure. It adds value by explaining each mode's meaning, noting that effect mode requires an effectId, and directing users to sibling tools for movie/effect selection. It does not disclose potential side effects (e.g., resetting current settings), but the core behavior is clearly described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, packed with essential information. It leads with the primary action, lists modes compactly with parentheticals, and ends with a cross-reference to sibling tools. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three parameters (one required) and no output schema, the description covers the purpose, all modes, the effectId prerequisite, and the correct tool for selecting specific movies/effects. Combined with the schema, an agent has sufficient context to invoke the tool correctly without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides full coverage (100%) with descriptions for all parameters, but the tool description enriches meaning significantly: it explains each enum value in plain terms (e.g., 'demo (built-in loop)', 'movie (a saved movie)') and specifies that effectId is used with effect mode. This goes beyond the schema's simple 'The operation mode to switch to.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Set the LED operation mode directly' and enumerates all mode values with concise explanations. It also distinguishes itself from sibling tools by pointing to set_movie/set_effect for movie/effect selection, making the tool's specific responsibility unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'To pick which movie/effect plays, use set_movie / set_effect,' providing a direct alternative for a common sub-task. It also clarifies that this tool is for direct mode switching, implicitly distinguishing it from parameter-adjustment tools like set_color and set_brightness.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_movieSet movieA

Select a saved movie by its numeric id and switch the device into movie mode so it plays. Call list_movies first to see the available ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMovie id to play (see list_movies).
deviceNoName of the target device (see list_devices). Omit to use the default device.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as mutating (readOnlyHint=false), so the description doesn't need to re-state that. It adds value by explaining the device switches to movie mode and plays, which is beyond the annotation. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action and purpose, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with annotations and full schema coverage, the description is complete. It covers how to obtain the id, what the tool does, and the effect. No output schema needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptive parameter text, so the baseline is 3. The description doesn't add significant parameter semantics beyond referencing list_movies, which the schema already does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Select') and identifies the resource ('saved movie by numeric id') and the action ('switch device into movie mode and plays'), clearly distinguishing it from sibling tools like set_effect or set_mode.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit prerequisite ('Call list_movies first to see the available ids'), which is essential usage guidance. It doesn't explicitly exclude alternatives, but the context makes it clear when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_powerTurn lights on or offA

Turn a Twinkly device on or off. "off" stops the LEDs; "on" resumes movie playback (the usual powered-on state). For a specific mode like a static color or the demo loop, use set_mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
onYestrue to turn the lights on (movie mode), false to turn them off.
deviceNoName of the target device (see list_devices). Omit to use the default device.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint false), the description discloses exactly what happens: 'off' stops the LEDs, and 'on' resumes movie playback. This clarifies the powered-on state and prevents assumptions about restoring previous states. It adds valuable behavioral context not present in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the purpose, and no wasted words. Every sentence adds meaning: the first states the action, the second clarifies the behavior and directs to the correct alternative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple tool with two parameters (one required) and no output schema. The description fully explains what the tool does, the meaning of 'on' and 'off', and when to use a different tool. No return values are needed, and the device parameter is covered by the schema. The description is complete for this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with the 'on' parameter already explaining 'true to turn the lights on (movie mode), false to turn them off.' The description adds a bit of nuance ('on resumes movie playback') but does not significantly exceed what the schema already provides. The device parameter is also covered in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool turns a Twinkly device on or off, using a specific verb and resource. It also distinguishes itself from sibling tools by pointing to set_mode for specific modes, so there is no ambiguity about its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides an alternative when a specific mode is needed: 'For a specific mode like a static color or the demo loop, use set_mode.' This tells the agent when to use this tool versus a sibling, which is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_saturationSet saturationA

Set the color saturation of a Twinkly device to an absolute level from 0 (black-and-white) to 100 (full color).

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesSaturation level, 0–100.
deviceNoName of the target device (see list_devices). Omit to use the default device.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds the behavioral nuance 'absolute level', clarifying that the value is set directly rather than incrementally. However, it does not disclose permissions, reversibility, or possible interactions with device modes, and annotations provide only readOnlyHint: false, leaving room for more context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that conveys the core purpose and value range without any wasted words. It is concise yet informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple setter with full schema parameter documentation, the description is largely sufficient. It could mention device-mode dependencies or that the device must be reachable, but given the tool's low complexity and the presence of sibling tools, the current description covers the essential information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters (value and device), so the baseline is 3. The description enriches the value parameter with semantic extremes ('black-and-white' and 'full color'), adding meaning beyond the schema's plain 'Saturation level, 0–100'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Set') and the resource ('color saturation of a Twinkly device'), with a specific absolute level range. It distinguishes itself from sibling tools like set_brightness and set_color by targeting saturation uniquely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when the user wants to adjust color saturation, but it provides no explicit guidance on when to choose this tool over alternatives, nor does it mention any prerequisites or exclusions. The intended use case is reasonably communicated but not elaborated.

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.

  1. 14 tool updatesv0.1.0
    • First observeddiscover_devices
    • First observedget_device_details
    • First observedget_state
    • First observedget_summary
    • First observedlist_devices
    • First observedlist_effects
    • First observedlist_movies
    • First observedset_brightness
    • First observedset_color
    • First observedset_effect
    • First observedset_mode
    • First observedset_movie
    • First observedset_power
    • First observedset_saturation

TDQS

A4.2/5.0

Scored across 14 tools

Disambiguation3/5

Some tools have overlapping purposes (e.g., get_state vs get_summary, set_power vs set_mode, set_color vs set_mode), but descriptions help differentiate them by intent and use case. Most tools target a clear resource and action pair, so ambiguity is limited to a few pairs.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (get_, set_, list_, discover_) using snake_case. No mixing of styles or vague verbs, making the naming highly predictable.

Tool Count5/5

14 tools is well-scoped for a Twinkly device control server, covering discovery, state, effects, movies, and various settings. The count is not excessive or thin, fitting the domain appropriately.

Completeness4/5

Core workflows are covered (discover, list, get state, set power/color/brightness/effects/movies). Minor gaps exist, such as no playlist selection or on/off timer control, but these are workable and do not break main use cases.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that enables AI agents to control Xiaomi Mi Home smart devices through natural language, with support for listing devices, controlling properties, and running scenes.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for controlling Elgato Key Lights. Enables turning lights on/off, adjusting brightness and color temperature, applying presets, and triggering effects via Claude.
    13
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    A comprehensive MCP server that enables AI assistants to interact with Home Assistant, control smart home devices, query states, execute services, and manage automations via natural language.
    78
    4,732
    MIT