Skip to main content
Glama

Nanoleaf MCP Server

A Model Context Protocol (MCP) server for controlling Nanoleaf smart lights. This server provides tools to control your Nanoleaf devices through Warp terminal or any MCP-compatible client.

Features

  • πŸ” Auto-discovery of Nanoleaf devices on your network

  • πŸ”— Direct IP connection for specific device targeting

  • πŸ” Authorization support for secure device pairing

  • πŸ’‘ Full control of lights, brightness, colors, and effects

  • 🐳 Dockerized for easy deployment

  • πŸ–₯️ Warp terminal integration

  • πŸ”’ Security-audited dependencies with regular vulnerability checks

Related MCP server: lifx-mcp-server

Available Tools

  • get_nanoleaf_info - Get detailed device information

  • turn_on_nanoleaf / turn_off_nanoleaf - Control power state

  • set_brightness - Adjust brightness (0-100)

  • set_color - Set color using hue (0-360) and saturation (0-100)

  • set_effect - Apply lighting effects

  • get_effects - List all available effects

  • discover_nanoleaf - Discover devices on network

  • connect_to_ip - Connect to specific IP address

  • authorize_nanoleaf - Authorize with device in pairing mode

Quick Setup Guide

For the easiest setup experience, use the included setup script:

./setup.sh

This script will:

  1. Build the Docker image

  2. Scan for Nanoleaf devices on your network

  3. Help you get the authorization token

  4. Create all configuration files

  5. Test the setup

  6. Generate your Warp configuration

Manual Setup

Prerequisites

  • Docker installed on your system

  • Nanoleaf device(s) on your network

  • Warp terminal (optional, for MCP integration)

Step 1: Clone and Build

git clone <repository-url>
cd nanoleaf-mcp-server
docker build -t nanoleaf-mcp-server-nanoleaf-mcp-server .

Step 2: Find Your Nanoleaf Device

Option A: Auto-discovery

docker run --rm -i --network=host nanoleaf-mcp-server echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "discover_nanoleaf", "arguments": {}}}'

Option B: Manual IP scan

# Scan your network for devices responding on Nanoleaf port
nmap -p 16021 192.168.1.0/24

Option C: Check router admin panel for connected devices

Step 3: Get Authorization Token

  1. Put your Nanoleaf device in pairing mode:

    • Hold the power button on your Nanoleaf device for 5-7 seconds

    • Look for pairing indicator (usually a flashing light)

  2. Get the auth token immediately (within 30 seconds):

    # Replace 192.168.1.100 with your device's IP
    curl -X POST http://192.168.1.100:16021/api/v1/new

    You should get a response like:

    {"auth_token":"YourAuthTokenHere123456789"}

Step 4: Configure Environment

Create a .env file in the project directory:

NANOLEAF_IP=192.168.1.100
NANOLEAF_AUTH_TOKEN=YourAuthTokenHere123456789
NANOLEAF_PORT=16021
NANOLEAF_PROTOCOL=http

Step 5: Test Your Setup

# Test with environment variables
docker run --rm -i --network=host --env-file .env nanoleaf-mcp-server echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "get_nanoleaf_info", "arguments": {}}}'

If successful, you'll see detailed information about your Nanoleaf device!

Step 6: Run Examples (Optional)

Test all functionality with the example script:

./examples.sh

This will demonstrate all available features including turning lights on/off, changing colors, and applying effects.

Working Example

Here's a complete working example with real values (replace with your own):

  1. Device discovered at: <DEVICE_IP>:16021

  2. Auth token obtained: <AUTH_TOKEN>

  3. Warp configuration:

{
  "mcpServers": {
    "nanoleaf": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i", "--network=host",
        "-e", "NANOLEAF_IP=<DEVICE_IP>",
        "-e", "NANOLEAF_AUTH_TOKEN=<AUTH_TOKEN>",
        "-e", "NANOLEAF_PORT=16021",
        "-e", "NANOLEAF_PROTOCOL=http",
        "nanoleaf-mcp-server-nanoleaf-mcp-server"
      ],
      "env": {}
    }
  }
}
  1. Test command:

echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "set_effect", "arguments": {"effect": "Cyberpunk 2077"}}}' | docker run --rm -i --network=host -e NANOLEAF_IP=<DEVICE_IP> -e NANOLEAF_AUTH_TOKEN=<AUTH_TOKEN> nanoleaf-mcp-server-nanoleaf-mcp-server

Warp Terminal Integration

Add to Warp MCP Configuration

Add this to your Warp MCP servers configuration (replace the values with your actual device IP and auth token):

{
  "mcpServers": {
    "nanoleaf": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i", "--network=host",
        "-e", "NANOLEAF_IP=192.168.1.100",
        "-e", "NANOLEAF_AUTH_TOKEN=YourAuthTokenHere123456789",
        "-e", "NANOLEAF_PORT=16021",
        "-e", "NANOLEAF_PROTOCOL=http",
        "nanoleaf-mcp-server-nanoleaf-mcp-server"
      ],
      "env": {}
    }
  }
}

Important:

  • Replace 192.168.1.100 with your Nanoleaf device's IP address

  • Replace YourAuthTokenHere123456789 with your actual auth token

  • Make sure you've built the Docker image with tag nanoleaf-mcp-server-nanoleaf-mcp-server

Alternative Configuration (if path issues occur)

If you encounter path-related issues, you can also use this alternative approach:

{
  "mcpServers": {
    "nanoleaf": {
      "command": "bash",
      "args": ["-c", "cd /path/to/nanoleaf-mcp-server && docker run --rm -i --network=host --env-file .env nanoleaf-mcp-server-nanoleaf-mcp-server"],
      "env": {}
    }
  }
}

Using in Warp

Once configured, you can use the Nanoleaf tools directly in Warp:

  • Ask to turn lights on/off

  • Change brightness and colors

  • Apply cool effects like "Northern Lights" or "Cyberpunk"

  • Get device information

Manual Usage Examples

Turn lights on/off

# Turn on
curl -X PUT http://your-ip:16021/api/v1/your-token/state \
  -H "Content-Type: application/json" \
  -d '{"on":{"value":true}}'

# Turn off  
curl -X PUT http://your-ip:16021/api/v1/your-token/state \
  -H "Content-Type: application/json" \
  -d '{"on":{"value":false}}'

Set brightness

curl -X PUT http://your-ip:16021/api/v1/your-token/state \
  -H "Content-Type: application/json" \
  -d '{"brightness":{"value":50}}'

Apply an effect

curl -X PUT http://your-ip:16021/api/v1/your-token/effects \
  -H "Content-Type: application/json" \
  -d '{"select":"Northern Lights"}'

Troubleshooting

Device Not Found

  • Ensure device is on the same network

  • Check firewall settings

  • Try manual IP scanning: nmap -p 16021 192.168.1.0/24

Authorization Failed

  • Device must be in pairing mode (hold power button 5-7 seconds)

  • Pairing mode only lasts ~30 seconds

  • Make sure no other devices are already controlling it

Connection Issues

  • Verify IP address is correct

  • Check if device uses HTTPS (some newer models)

  • Ensure Docker has network access (--network=host)

Environment Variables Not Working

  • Check .env file exists and has correct values

  • Verify Docker command includes --env-file .env

  • Make sure file paths are absolute in Warp config

Warp Terminal Issues

"The system cannot find the path specified" error

  • Use the direct environment variable configuration instead of --env-file

  • Make sure your Docker image tag matches exactly: nanoleaf-mcp-server-nanoleaf-mcp-server

  • Try the alternative bash configuration if path issues persist

MCP server not responding in Warp

  • Verify the Docker image is built with the correct tag

  • Check that your IP address and auth token are correct in the configuration

  • Test the Docker command manually first:

    echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "get_nanoleaf_info", "arguments": {}}}' | docker run --rm -i --network=host -e NANOLEAF_IP=your-ip -e NANOLEAF_AUTH_TOKEN=your-token nanoleaf-mcp-server-nanoleaf-mcp-server

"MCP server exited" in logs

  • This usually indicates a configuration issue

  • Check that all environment variables are properly set

  • Ensure the Docker image exists: docker images | grep nanoleaf

Device Compatibility

Tested with:

  • Nanoleaf Canvas

  • Nanoleaf Light Panels

  • Nanoleaf Hexagons

Should work with most Nanoleaf devices that support the v1 API.

Documentation

  • Dependency Audit Report - Detailed security audit and dependency update information

  • Setup Scripts - Automated setup and testing scripts included

  • Docker Configuration - Containerized deployment for easy management

Contributing

Feel free to submit issues, feature requests, or pull requests!

License

MIT License - see LICENSE file for details.

Available Tools

10 tools
authorize_nanoleafA

Authorize connection to Nanoleaf device (device must be in pairing mode)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It mentions the pairing requirement, which is useful context, but doesn't disclose other behavioral traits such as whether this is a one-time setup, if it requires specific permissions, what happens on failure, or if it returns credentials. For an authorization tool with zero annotation coverage, this is inadequate.

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 a single, efficient sentence with zero waste. It front-loads the core purpose and includes essential context (pairing mode) without unnecessary details, making it highly concise and well-structured.

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

Completeness3/5

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

Given the tool's complexity (authorization with no parameters) and lack of annotations/output schema, the description is minimally adequate. It covers the pairing requirement but misses details like return values, error handling, or dependencies on other tools (e.g., 'discover_nanoleaf'). For a setup tool, this leaves gaps.

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 has 0 parameters with 100% coverage, so no parameter documentation is needed. The description adds value by specifying the pairing mode requirement, which compensates for the lack of parameters. Baseline 4 is appropriate for zero-parameter tools when the description provides context.

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 action ('Authorize connection') and target resource ('Nanoleaf device'), distinguishing it from sibling tools like 'connect_to_ip' or 'discover_nanoleaf'. However, it doesn't explicitly differentiate from all siblings (e.g., 'connect_to_ip' might also involve authorization).

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 ('device must be in pairing mode'), which implicitly distinguishes it from tools like 'get_effects' or 'set_brightness'. It doesn't explicitly state when not to use it or name alternatives, but the pairing requirement offers practical guidance.

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

connect_to_ipC

Connect to a Nanoleaf device at a specific IP address

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesIP address of the Nanoleaf device
portNoPort number (default: 16021)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('connect to') but doesn't explain what this entailsβ€”whether it establishes a persistent session, validates connectivity, requires authentication, has side effects like network changes, or what happens on failure. For a connection tool with zero annotation coverage, this leaves critical behavior unspecified.

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 a single, direct sentence with zero wasted words. It's front-loaded with the core action and resource, making it highly efficient and easy to parse.

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

Completeness2/5

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

Given the complexity of a connection operation (likely involving network interaction and potential prerequisites), no annotations, and no output schema, the description is inadequate. It doesn't cover behavioral aspects like error handling, session management, or integration with sibling tools, leaving significant gaps for an AI agent to use it 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%, with clear descriptions for both parameters (IP address and port with default). The description adds no additional meaning beyond the schema, such as IP format examples or port usage context. Baseline 3 is appropriate when the schema fully documents parameters.

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 action ('connect to') and target resource ('Nanoleaf device at a specific IP address'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'discover_nanoleaf' or 'authorize_nanoleaf', which might also involve connection-related operations.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., whether authorization is required first), when this connection is needed (e.g., before controlling the device), or how it relates to siblings like 'discover_nanoleaf' (which might find IPs).

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

discover_nanoleafB

Discover Nanoleaf devices on the network

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action ('Discover') but lacks details on how it works (e.g., network scanning method, timeouts, permissions required), what it returns (e.g., list of devices, errors), or side effects (e.g., network traffic). This is a significant gap for a tool with zero annotation coverage.

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 a single, clear sentence that directly states the tool's purpose with no wasted words. It is front-loaded and efficiently communicates the core functionality, making it easy for an agent to parse and understand quickly.

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

Completeness2/5

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

Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what the discovery entails (e.g., returns device IDs, IPs), how results are formatted, or error handling. For a tool in a suite with multiple device interaction siblings, more context on its role and output is needed to guide the agent effectively.

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 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and it appropriately doesn't mention any. A baseline score of 4 is applied as it meets the requirement for a parameterless tool without unnecessary information.

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's purpose with a specific verb ('Discover') and resource ('Nanoleaf devices on the network'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'connect_to_ip' or 'get_nanoleaf_info', which might involve device discovery or information retrieval, leaving some ambiguity about its unique role.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., network setup), when it's appropriate (e.g., initial setup vs. runtime), or how it relates to siblings like 'connect_to_ip' or 'authorize_nanoleaf', leaving the agent to infer usage context.

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

get_effectsB

Get list of available effects

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries full burden but only states it 'gets' a list, implying a read-only operation. It lacks details on behavior such as whether it returns all effects, if there's pagination, error handling, or if it requires prior setup (e.g., connection). No contradictions exist, but it's minimal.

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 a single, efficient sentence with no wasted words. It's front-loaded and directly states the tool's function, making it highly concise and well-structured for its simplicity.

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

Completeness3/5

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

Given the tool's low complexity (0 parameters, no output schema), the description is minimally adequate. However, it lacks context about the Nanoleaf system (e.g., that effects are for lighting) and doesn't explain the return format, which could be important since there's no output schema.

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 has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add parameter details, but this is acceptable given the schema's completeness, warranting a baseline score above 3 for a parameterless tool.

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 verb ('Get') and resource ('list of available effects'), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'get_nanoleaf_info' or specify what 'effects' are in this context (e.g., visual effects for Nanoleaf lights).

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., whether authorization or connection is needed first), nor does it clarify if this is for querying effects before applying them with 'set_effect'.

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

get_nanoleaf_infoB

Get information about the Nanoleaf device

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool 'Get information,' implying a read-only operation, but does not specify what information is returned, potential errors (e.g., if device is offline), or any side effects. For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior and reliability.

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 a single, clear sentence with no wasted words. It is front-loaded with the core purpose ('Get information about the Nanoleaf device'), making it easy to parse. Every part of the sentence contributes directly to understanding the tool's function, achieving ideal conciseness.

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

Completeness2/5

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

Given the lack of annotations and output schema, the description is insufficient for a complete understanding. It does not explain what information is retrieved (e.g., device state, settings, capabilities) or the return format, leaving the agent uncertain about the tool's output. For a tool with no structured output documentation, the description should compensate more to ensure usability.

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 0 parameters, and the input schema has 100% description coverage (though empty). The description does not need to add parameter details, as there are none to explain. It appropriately avoids unnecessary parameter information, earning a high baseline score for parameter clarity in this context.

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 action ('Get information') and target resource ('Nanoleaf device'), making the purpose understandable. It distinguishes from siblings like 'get_effects' or 'set_brightness' by focusing on general device info rather than specific attributes or controls. However, it lacks specificity about what information is retrieved (e.g., device status, settings, capabilities), which prevents a perfect score.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., device must be connected or authorized), nor does it differentiate from siblings like 'discover_nanoleaf' (for finding devices) or 'get_effects' (for listing effects). Without such context, the agent must infer usage from tool names alone.

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

set_brightnessC

Set the brightness of the Nanoleaf lights

ParametersJSON Schema
NameRequiredDescriptionDefault
brightnessYesBrightness level (0-100)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden for behavioral disclosure. It states the tool sets brightness but doesn't mention whether this requires prior authentication/connection, what happens if lights are off, or any side effects. For a mutation tool with zero annotation coverage, this leaves significant behavioral gaps.

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 a single, efficient sentence that directly states the tool's purpose without any wasted words. It's appropriately sized and front-loaded, making it easy to parse quickly.

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

Completeness2/5

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

Given this is a mutation tool with no annotations, no output schema, and multiple sibling tools, the description is incomplete. It doesn't address prerequisites (like needing authorization), behavioral implications, or how it differs from similar tools like 'set_color'. For a tool that modifies device state, more context is 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?

The description mentions 'brightness' but doesn't add meaningful semantics beyond what the schema already provides (brightness level 0-100). With 100% schema description coverage and only one parameter, the baseline is 3 since the schema does the heavy lifting, and the description doesn't compensate with additional context.

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 action ('Set') and target resource ('brightness of the Nanoleaf lights'), making the purpose immediately understandable. It doesn't explicitly distinguish from siblings like 'set_color' or 'set_effect', but the specificity of 'brightness' provides implicit differentiation. This is clear but lacks explicit sibling comparison.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'set_color' or 'set_effect', nor does it mention prerequisites such as needing authorization or connection first. It simply states what the tool does without contextual usage information.

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

set_colorC

Set the color of the Nanoleaf lights

ParametersJSON Schema
NameRequiredDescriptionDefault
hueYesHue value (0-360)
saturationYesSaturation value (0-100)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Set' implies a mutation operation, but the description doesn't mention whether this requires authentication, what happens if lights are off, rate limits, or error conditions. For a mutation tool with zero annotation coverage, this is a significant gap in transparency.

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 a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded, with every word earning its place. No structural issues or redundancy are present.

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

Completeness2/5

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

Given this is a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't cover behavioral aspects like authentication needs, error handling, or what happens on success. For a tool that changes device state, more context is needed for safe and effective use.

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 hue and saturation parameters fully documented in the schema (including ranges and descriptions). The description adds no additional parameter semantics beyond what the schema provides, so it meets the baseline of 3 where the schema does the heavy lifting.

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 action ('Set') and target resource ('color of the Nanoleaf lights'), making the purpose immediately understandable. It distinguishes this from siblings like set_brightness or set_effect by specifying color manipulation. However, it doesn't explicitly contrast with all siblings, so it's not a perfect 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like set_effect or set_brightness. It doesn't mention prerequisites (e.g., lights must be on or connected) or exclusions. Without any usage context, the agent must infer when this tool is appropriate.

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

set_effectC

Set an effect on the Nanoleaf lights

ParametersJSON Schema
NameRequiredDescriptionDefault
effectYesName of the effect to apply

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It states the tool sets an effect but doesn't describe what happens (e.g., whether it changes light patterns immediately, requires specific permissions, has side effects on other settings, or what happens if the effect name is invalid). For a mutation tool with zero annotation coverage, this leaves significant behavioral gaps.

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 a single, clear sentence with zero wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly. Every word earns its place without redundancy or unnecessary elaboration.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't address what the tool returns, error conditions, or behavioral nuances like whether the effect persists after power cycles. Given the sibling tools include get_effects, more context on effect availability or dependencies would be helpful.

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 input schema has 100% description coverage, with the single parameter 'effect' documented as 'Name of the effect to apply'. The description adds no additional parameter semantics beyond what the schema provides, such as examples of effect names or format requirements. Baseline 3 is appropriate when the schema does the heavy lifting.

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 action ('Set') and target resource ('effect on the Nanoleaf lights'), making the purpose immediately understandable. It distinguishes from siblings like set_brightness and set_color by specifying 'effect' rather than other light properties. However, it doesn't specify what an 'effect' entails compared to basic color/brightness changes.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like set_color or set_brightness. It doesn't mention prerequisites (e.g., whether the device must be connected or turned on first) or indicate what effects are available (though get_effects exists as a sibling). Usage context is implied but not explicitly stated.

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

turn_off_nanoleafB

Turn off the Nanoleaf lights

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden but only states the basic action. It doesn't disclose whether this requires authentication, what happens if lights are already off, whether it affects all lights or specific ones, or any error conditions. 'Turn off' implies mutation but lacks behavioral details.

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 a single, clear sentence with zero wasted words. It's perfectly front-loaded with the core action and target, making it immediately understandable without any structural issues.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what 'turning off' entails (power state change? brightness to 0?), doesn't mention prerequisites like authorization or connection, and provides no information about the expected outcome or potential errors.

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 with 100% schema description coverage, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, earning a baseline score of 4 for correctly matching the parameter-free nature of the tool.

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 action ('turn off') and target resource ('Nanoleaf lights'), making the purpose immediately understandable. However, it doesn't differentiate from its sibling 'turn_on_nanoleaf' beyond the obvious on/off distinction, missing an opportunity to clarify scope or limitations.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives or prerequisites. While the name implies it's for turning lights off, there's no mention of when this is appropriate versus using set_brightness to 0% or whether the tool requires prior connection/authorization steps.

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

turn_on_nanoleafB

Turn on the Nanoleaf lights

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It states the action ('turn on') but doesn't describe what this entails operationallyβ€”whether it requires specific permissions, if it affects all lights or specific ones, what happens if lights are already on, or any error conditions. For a mutation tool with zero annotation coverage, this leaves significant gaps in understanding the tool's behavior.

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 a single, clear sentence with zero wasted words. It's front-loaded with the core action and resource, making it immediately scannable and efficient. Every word earns its place by conveying essential information without redundancy or fluff.

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

Completeness2/5

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

Given the tool's simplicity (0 parameters, no output schema), the description is minimally adequate but incomplete. It lacks context about prerequisites (e.g., needing authorization or connection), behavioral details (like what 'turn on' means operationally), and relationships to sibling tools. For a mutation tool in a suite with multiple setup tools, this leaves the agent guessing about proper usage flow.

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 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to compensate for any parameter gaps, and it correctly implies no inputs are required. This meets the baseline for tools with no parameters, though it doesn't add extra context about implicit assumptions (like which lights are affected).

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 action ('turn on') and target resource ('Nanoleaf lights'), making the purpose immediately understandable. It distinguishes from sibling tools like 'turn_off_nanoleaf' by specifying the opposite action, though it doesn't explicitly differentiate from other power-related tools. The description avoids tautology by not just restating the tool name.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (like needing authorization or connection first), when not to use it (e.g., if lights are already on), or relationships to sibling tools like 'authorize_nanoleaf' or 'connect_to_ip'. The agent must infer usage from context alone.

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

TDQS

A3.6/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose with no ambiguity. Tools cover separate aspects like device discovery, connection, control (brightness, color, effects), and power management, making it easy for an agent to select the right tool.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case, such as 'authorize_nanoleaf', 'set_brightness', and 'turn_on_nanoleaf'. This predictability enhances usability and clarity.

Tool Count5/5

With 10 tools, the server is well-scoped for controlling Nanoleaf devices. Each tool serves a specific function in the device lifecycle, from discovery to operation, without being excessive or insufficient.

Completeness5/5

The toolset provides complete coverage for the Nanoleaf domain, including device discovery, connection, information retrieval, and full control over lighting (power, brightness, color, effects). There are no obvious gaps in the surface.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server for controlling LIFX smart lights, enabling AI assistants to manage power, color, brightness, effects, and scenes.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for controlling WiZ smart lights locally via UDP: discover bulbs, power control, color, temperature, and 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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/srnetadmin/nanoleaf-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server