LacyLights MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CHROMA_HOST | No | ChromaDB host for enhanced RAG functionality | localhost |
| CHROMA_PORT | No | ChromaDB port | 8000 |
| OPENAI_API_KEY | Yes | OpenAI API key for AI-powered lighting generation | |
| LACYLIGHTS_GRAPHQL_ENDPOINT | No | GraphQL endpoint for your lacylights-node backend | http://localhost:4000/graphql |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_projectsA | List all projects with optional detail level. Parameters:
Returns:
Use includeDetails=false for quick project listing. Use includeDetails=true when you need to understand project sizes. |
| create_projectC | Create a new lighting project |
| get_projectA | Get high-level project information including metadata and counts. Returns:
Does NOT include:
Use this tool first to understand project scope before drilling down into specific resources. |
| get_project_detailsA | Get detailed information about a specific project including all fixtures, looks, and cue lists. This returns a lot of data and should only be used when you need comprehensive project information. |
| delete_projectC | Delete a project and all its data |
| bulk_create_projectsC | Create multiple projects in a single operation. |
| bulk_delete_projectsB | Delete multiple projects in a single operation. Returns count of successfully deleted projects and any failed IDs. |
| qlc_import_guidanceB | Get information about importing QLC+ (.qxw) files into LacyLights |
| import_eos_asciiA | Import an ETC Eos ASCII (.asc) showfile into LacyLights. Creates a new project (or appends into an existing one if targetProjectId is given) populated with the patch, cues, palettes, and groups from the Eos showfile. EOS-only concepts (effects, partitions, magic sheets, action triggers, curves, submasters) are skipped and surfaced as structured warnings. Palettes/presets are imported as standalone Looks in dedicated cue lists ("Color Palettes", "Beam Palettes", etc.). Returns:
Provide either newProjectName or targetProjectId, not both. If both are omitted, the project name comes from the showfile's $$Title. |
| export_eos_asciiA | Export a LacyLights project as an ETC Eos ASCII (.asc) showfile. Returns the file content as a string along with a suggested filename suffix and any export warnings. LacyLights-only concepts (Look Boards, per-channel fade behaviors, synthesized definitions) ride along as $$ LACYLIGHTS: comment lines at the end of file so a subsequent re-import preserves them. EOS itself ignores those comments. Output is deterministic: the same project produces byte-identical output across runs. |
| list_data_export_tablesA | List the data tables that can be exported as CSV or Excel (XLSX), with their column headers and scope. Each table has a scope that says which IDs export_data_table needs:
Requires LacyLights backend v0.4.0 or newer. |
| export_data_tableA | Export one data table (fixtures, looks, cue lists, look details, ...) as CSV or Excel.
Files are written to outputDirectory, else the LACYLIGHTS_EXPORT_DIR environment variable, else a private lacylights-exports folder in the system temp directory. Existing files are never overwritten; a numeric suffix is added instead. Use list_data_export_tables to see the tables and which need scopeId. |
| export_data_workbookA | Export several project tables as one multi-sheet Excel (XLSX) workbook, one sheet per table. Writes the file to disk and returns its path, total row count and size. Omit tables to export the backend's default set of project-level tables. FIXTURE_LIBRARY and scoped tables (LOOK_DETAILS, CUE_LIST_DETAILS, LOOK_BOARD_ENTRIES) cannot be included. |
| list_fixturesA | List fixtures in a project with pagination and filtering. Returns lightweight fixture information:
Does NOT include:
Pagination:
Filtering:
Example workflow:
|
| get_fixtureA | Get full details for a specific fixture. Returns:
Use this tool when you need:
Use list_fixtures instead if you only need basic fixture information. |
| get_fixture_inventoryB | Get available lighting fixtures and their capabilities for a project or globally |
| analyze_fixture_capabilitiesC | Analyze specific fixtures to understand their lighting capabilities |
| create_fixture_instanceC | Create a new fixture instance in a project with manufacturer/model details |
| get_channel_mapC | Get the DMX channel usage map for a project |
| suggest_channel_assignmentC | Suggest optimal channel assignments for multiple fixtures |
| update_fixture_instanceC | Update an existing fixture instance with new properties |
| delete_fixture_instanceB | Delete a fixture instance from a project (will remove it from all looks) |
| bulk_update_fixturesA | Update multiple fixture instances in a single atomic operation. All updates succeed or fail together. Useful for batch renaming, repositioning, or re-tagging fixtures. |
| bulk_create_fixturesA | Create multiple fixture instances with best-effort approach. Each fixture is processed individually, allowing partial success if some fixtures fail. Returns detailed success/failure information for each fixture. Automatically assigns DMX channels if not specified. Validates channel availability before creation. |
| bulk_delete_fixturesA | Delete multiple fixture instances in a single operation. Returns count of successfully deleted fixtures and any failed IDs. |
| bulk_create_fixture_definitionsB | Create multiple fixture definitions in a single operation. Use this to efficiently add multiple fixture types (manufacturer/model combinations) to the system at once. |
| list_looksA | List looks in a project with pagination and filtering. Returns lightweight look summaries:
Does NOT include:
This is the most efficient way to browse available looks. Filtering:
Sorting:
|
| get_lookA | Get full details for a specific look. Parameters:
Set includeFixtureValues=false if you only need to know which fixtures are in the look, not their specific values. This is much faster for large looks. Use get_look_fixtures instead if you only need fixture metadata. |
| get_look_fixturesA | Get just the fixtures used in a look without their values. Returns:
This is the fastest way to understand look composition without loading full DMX channel data. Use cases:
|
| generate_lookC | Generate a lighting look based on script context and design preferences |
| analyze_scriptC | Analyze a theatrical script to extract lighting-relevant information |
| optimize_lookC | Optimize an existing look for specific goals |
| update_lookC | Update an existing look with new values |
| activate_lookC | Activate a lighting look by name or ID |
| fade_to_blackC | Fade all lights to black (turn off) |
| get_current_active_lookA | Get the currently active look if any |
| add_fixtures_to_lookC | Safely add fixtures to a look without affecting existing fixtures |
| remove_fixtures_from_lookB | Safely remove specific fixtures from a look |
| get_look_fixture_valuesB | Get current fixture values for a look (read-only) |
| ensure_fixtures_in_lookA | Ensure specific fixtures exist in a look with given values, adding only if missing |
| update_look_partialC | Safely update look metadata and optionally merge fixture values |
| bulk_create_looksB | Create multiple looks in a single operation. Returns all created looks with their IDs. |
| bulk_update_looksC | Update multiple looks in a single operation. Supports updating name, description, and fixture values. |
| bulk_update_looks_partialA | Update multiple looks with partial fixture value merging support. Each look can independently specify name, description, fixtureValues, and mergeFixtures. Unlike bulk_update_looks, this preserves existing fixtures not mentioned in the update (when mergeFixtures=true). This is useful for batch operations like changing a channel value across many looks without affecting other fixtures. |
| bulk_delete_looksA | Delete multiple looks in a single operation. Returns count of successfully deleted looks and any failed IDs. |
| copy_fixtures_to_looksB | Copy fixture channel values from a source look to multiple target looks. This is an atomic operation that supports undo/redo. Useful for propagating lighting changes across multiple looks efficiently. |
| create_cue_sequenceC | Create a sequence of lighting cues from existing looks |
| generate_act_cuesC | Generate cue suggestions for an entire act based on script analysis |
| optimize_cue_timingC | Optimize the timing of cues in a cue list |
| analyze_cue_structureC | Analyze the structure and timing of a cue list |
| update_cue_listC | Update cue list name or description |
| add_cue_to_listC | Add a new cue to an existing cue list |
| remove_cue_from_listC | Remove a cue from a cue list |
| update_cueC | Update properties of an existing cue |
| toggle_cue_skipA | Toggle the skip status of a cue. Skipped cues remain visible but are bypassed during playback. |
| bulk_update_cuesB | Update fade times and follow times for multiple cues in a single operation |
| bulk_create_cuesC | Create multiple cues in a single operation. All cues are created in one GraphQL call for efficiency. |
| bulk_delete_cuesA | Delete multiple cues in a single operation. Returns count of successfully deleted cues and any failed IDs. |
| reorder_cuesC | Reorder multiple cues by assigning new cue numbers |
| list_cue_listsA | List all cue lists in a project with lightweight summaries. Returns:
Does NOT include:
This is the most efficient way to browse available cue lists. Projects typically have < 10 cue lists, so no pagination needed. Use cases:
|
| get_cue_list_detailsA | Get cue list with its cues, optionally paginated. Parameters:
By default, each cue includes lookId and lookName but NOT full look fixture values. Set includeLookDetails=true only if you need full look data for every cue (this can be very large). For large cue lists (50+ cues), use pagination to avoid context overflow. Returns:
Example workflow:
|
| get_cueA | Get full details for a specific cue by ID. Returns:
Use this when you need to inspect a single cue in detail. Use cases:
Note: To look up a cue by number or name, use get_cue_list_details with filters and lookup tables instead. |
| delete_cue_listB | Delete a cue list and all its cues |
| bulk_create_cue_listsC | Create multiple cue lists in a single operation. |
| bulk_update_cue_listsC | Update multiple cue lists in a single operation. |
| bulk_delete_cue_listsB | Delete multiple cue lists in a single operation. Returns count of successfully deleted cue lists and any failed IDs. |
| start_cue_listC | Start playing a cue list from the beginning or a specific cue |
| next_cueB | Advance to the next cue in the currently playing cue list |
| previous_cueB | Go back to the previous cue in the currently playing cue list |
| go_to_cueB | Jump to a specific cue by number or name in the currently playing cue list |
| stop_cue_listB | Stop the currently playing cue list |
| get_cue_list_statusB | Get information about the currently playing cue list and navigation options |
| get_fade_update_rateA | Get the current fade engine update rate in Hz. The fade update rate controls how frequently the fade engine updates DMX channel values during look transitions. Higher rates provide smoother fades but use more CPU. Returns:
Typical values:
|
| set_fade_update_rateA | Set the fade engine update rate in Hz. The fade update rate controls how frequently the fade engine updates DMX channel values during look transitions. Valid range: 10-120 Hz Guidelines:
Note: Changes take effect immediately for new look transitions. |
| get_build_infoA | Get build information for the backend server. Returns version, git commit hash, and build timestamp for the running lacylights-go server. This is useful for:
Returns:
|
| list_look_boardsB | List all look boards in a project. Returns lightweight look board summaries with button counts. |
| get_look_boardA | Get a specific look board with all its buttons and layout information. |
| create_look_boardC | Create a new look board for organizing looks with custom layout. |
| update_look_boardC | Update an existing look board's metadata and settings. |
| delete_look_boardB | Delete a look board and all its buttons. |
| bulk_create_look_boardsC | Create multiple look boards in a single operation. |
| bulk_update_look_boardsC | Update multiple look boards in a single operation. |
| bulk_delete_look_boardsC | Delete multiple look boards in a single operation. |
| add_look_to_boardC | Add a look as a button to a look board at a specific position. |
| update_look_board_buttonC | Update a look board button's properties (position, size, color, label). |
| remove_look_from_boardC | Remove a button from a look board. |
| update_look_board_button_positionsB | Update positions of multiple buttons in a single operation (useful for drag-and-drop). |
| bulk_create_look_board_buttonsC | Create multiple buttons in a single operation. |
| bulk_update_look_board_buttonsC | Update multiple buttons in a single operation. |
| bulk_delete_look_board_buttonsC | Delete multiple buttons in a single operation. |
| activate_look_from_boardA | Activate a look from a board (uses board's default fade time unless overridden). |
| create_look_board_with_buttonsC | Create a complete look board with buttons in a single operation. Allows defining an entire look board layout in one command. |
| undoA | Undo the last operation in a project. Reverts the most recent change made to the project. Operations that can be undone include:
Returns:
Use get_undo_redo_status to check if undo is available. |
| redoA | Redo a previously undone operation in a project. Re-applies an operation that was previously undone. Only available after an undo operation. If a new operation is performed after undo, the redo history is cleared. Returns:
Use get_undo_redo_status to check if redo is available. |
| get_undo_redo_statusA | Get the current undo/redo status for a project. Returns information about available undo/redo operations:
Use this to determine if undo/redo buttons should be enabled and to show tooltips. |
| get_operation_historyA | Get the operation history for a project with pagination. Returns a list of all recorded operations that can be navigated via undo/redo. Each operation includes:
Use this to display an operation history timeline and allow jumping to specific points. |
| jump_to_operationA | Jump to a specific operation in the history. This allows navigating directly to any point in the operation history, effectively performing multiple undos or redos to reach the target state. Parameters:
Returns:
Use get_operation_history to get available operation IDs. |
| clear_operation_historyA | Clear all operation history for a project. WARNING: This is a destructive operation that cannot be undone. All undo/redo history will be permanently deleted. Parameters:
Returns:
|
| list_groupsA | List groups accessible to this device/user. Shows group names, member counts, and device counts. Groups determine which projects you can access. |
| get_group_detailsB | Get full details of a group including its members, projects, and assigned devices. Requires the group ID. |
| list_my_invitationsA | List pending group invitations for the current user/device. Shows which groups you've been invited to, who invited you, and the offered role. |
| invite_to_groupA | Invite a user to join a group by their email address. Requires GROUP_ADMIN role in the target group. The invited user will receive a pending invitation they can accept or decline. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 102 tools
Many tools target distinct resources, but the set contains numerous near-duplicate pairs such as update_look vs update_look_partial, bulk_update_looks vs bulk_update_looks_partial, and get_look vs get_look_fixtures vs get_look_fixture_values. Long descriptions often help, but the sheer number of bulk_-prefixed variants and subtle semantic differences creates real misselection risk.
Nearly all tool names use snake_case with a consistent verb_noun or verb_noun_prep_noun pattern, including the bulk_ prefix. A few names deviate from the pattern (undo, redo, next_cue, previous_cue, qlc_import_guidance), but the overall convention is predictable.
102 tools is far beyond a reasonable scope for an MCP server and is bloated with redundant bulk operations and many near-duplicate single/bulk/partial variants. This extreme count creates severe cognitive load and makes tool selection unnecessarily difficult.
Core lighting entities (projects, fixtures, looks, cues, cue lists, look boards) have extensive CRUD, bulk, import/export, undo/redo, and playback coverage. However, there are notable gaps: group invitations cannot be accepted or declined, and descriptions reference get_fixture_usage and get_look_usage tools that are not present, leaving dead ends in access-control and usage analysis.