TRMNL Controller
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TRMNL_HOME | No | Overrides the location where TRMNL Controller stores credentials, which defaults to ~/.trmnl-control. |
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 | {} |
| prompts | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| trmnl_get_displayC | Fetch the next screen TRMNL GET /api/display. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_current_screenC | Fetch the current screen TRMNL GET /api/display/current. |
| trmnl_create_device_logC | Log with logs[] (array) TRMNL POST /api/log. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_setup_deviceC | Set up device
Please note that the returned TRMNL GET /api/setup. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_categoriesA | List all plugin categories Returns a list of approved plugin categories. TRMNL GET /api/categories. |
| trmnl_list_flash_firmwaresA | List flashable firmware versions per device model Firmware builds flashable via the TRMNL web flasher (/flash). TRMNL GET /api/firmware/flash. |
| trmnl_list_server_ipsA | List all TRMNL server IP addresses Returns a list of public IP addresses for all TRMNL core servers. Plugin poll requests will only originate from these IPs. TRMNL GET /api/ips. |
| trmnl_list_modelsB | List all device models TRMNL GET /api/models. |
| trmnl_list_palettesB | List all palettes TRMNL GET /api/palettes. |
| trmnl_list_public_booking_eventsA | List the bookings a visitor sees Public: no bearer token, so it is not an account operation and no agent tool offers it. The rolling week from start_at, as the public booking page shows it, with times in the room time zone. A collection token also takes resource_type and resource_id to pick one of its rooms. TRMNL GET /api/book/{token}/events. |
| trmnl_create_public_bookingA | Book a room as a visitor Public: no bearer token. The same rules as the public booking page: within the room booking window, ending before midnight, and on an on-demand room duration_minutes (15, 30 or 60) from now instead of times. The title is capped and defaults when blank. Limited per token. TRMNL POST /api/book/{token}/bookings. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_cancel_public_bookingA | Cancel an upcoming public booking Public: no bearer token. Only a booking made through TRMNL that has not started. TRMNL DELETE /api/book/{token}/bookings/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_end_public_bookingA | End a public booking in progress Public: no bearer token. Frees the room now; only a booking made through TRMNL that is in progress. TRMNL PATCH /api/book/{token}/bookings/{id}/end. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_author_analyticsA | Read the analytics of the plugins you published Each recipe and third-party plugin you published with its installs, forks and health, the totals, the share of live installs in each health state and a 90-day install growth series. TRMNL GET /api/analytics. |
| trmnl_list_author_plugin_errorsA | List the failing installs of the plugins you published One row per distinct error message still failing in the last week, with who can act on it: author (your plugin), upstream (the data source), installer_connection or installer_setup. Rows you hid stay listed with hidden true. TRMNL GET /api/analytics/errors. |
| trmnl_hide_author_plugin_errorA | Hide an error row from your analytics Takes the kind, subject_id, owner and message of a listAuthorPluginErrors row. The row stops showing on the dashboard and in the emails about it; unhideAuthorPluginError puts it back. TRMNL POST /api/analytics/hidden_errors. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_unhide_author_plugin_errorA | Show a hidden error row again Takes the same kind, subject_id, owner and message that hid the row. TRMNL DELETE /api/analytics/hidden_errors. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_uninstall_feedbackA | Read why installers removed the plugins you published The last 30 days of uninstall feedback across everything you published: the total, a count per reason, the latest written comments and the typical days installed. Never names the installer. TRMNL GET /api/analytics/uninstall_feedback. |
| trmnl_get_fleetA | Read a fleet The master device, how many mirrors need a push, the settings mirrors inherit and the overdue alert. listFleetDevices has each member. TRMNL GET /api/apps/fleet/{installation_id}. |
| trmnl_list_fleet_devicesA | List the devices in a fleet The master first, then the mirrors by urgency: overdue, on time, asleep, never seen. TRMNL GET /api/apps/fleet/{installation_id}/devices. |
| trmnl_add_fleet_deviceA | Add a device to a fleet as a mirror The device joins as a mirror; setFleetMaster promotes one. A device can be in one fleet only. TRMNL POST /api/apps/fleet/{installation_id}/devices. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_remove_fleet_deviceA | Remove a device from a fleet Leaves the last pushed playlist on the device. TRMNL DELETE /api/apps/fleet/{installation_id}/devices/{device_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_push_fleet_deviceA | Push the master playlist to one mirror Queues the push; the mirror shows the master playlist and inherited settings once it runs. TRMNL POST /api/apps/fleet/{installation_id}/devices/{device_id}/pushes. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_push_fleetA | Push the master playlist to every mirror Queues one push for the whole fleet. Each mirror gets a copy of the master playlist and the inherited settings. TRMNL POST /api/apps/fleet/{installation_id}/pushes. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_update_fleet_settingsA | Choose the settings mirrors inherit from the master Replaces the list. Each push copies these settings from the master; an empty list copies the playlist only. TRMNL PATCH /api/apps/fleet/{installation_id}/settings. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_update_fleet_alertsA | Change the overdue check-in alert One email digest when a member is overdue by the threshold. Keys left out keep their value; a null email sends the digest to the account owner. TRMNL PATCH /api/apps/fleet/{installation_id}/alerts. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_set_fleet_masterB | Set the master device The device whose playlist and settings the mirrors copy. A mirror of this fleet is promoted; the previous master leaves the fleet. TRMNL PUT /api/apps/fleet/{installation_id}/master. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_remove_fleet_masterA | Remove the master device The fleet keeps its mirrors but cannot push until a new master is set. TRMNL DELETE /api/apps/fleet/{installation_id}/master. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_appsA | List the apps that can be installed Every app the platform offers, with whether this account holds an active installation of it. TRMNL GET /api/apps. |
| trmnl_list_app_installationsA | List my app installations The active installations of this account. Their ids are the installation_id the fleet and room booking operations take. TRMNL GET /api/apps/installations. |
| trmnl_install_appA | Install an app Installs the app for this account. An app already installed answers its existing installation with 200. TRMNL POST /api/apps/installations. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_uninstall_appA | Uninstall an app Retires the installation. Its calendars, fleet memberships and device bindings go with it. TRMNL DELETE /api/apps/installations/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_room_booking_integrationsB | List the connected calendar accounts The Google and Microsoft accounts (personal) and workspaces (admin) connected to the installation, with how many of their calendars are selected for sync. integration_type and id address one in the other integration operations. TRMNL GET /api/apps/room_booking/{installation_id}/integrations. |
| trmnl_get_room_booking_integration_connect_urlA | Where to send the owner to connect an account Connecting needs the owner to consent at Google or Microsoft in a browser, signed in to TRMNL. The answer is the form action that starts it: an HTML form the owner submits with the given method, from a TRMNL page (it is CSRF-protected). TRMNL GET /api/apps/room_booking/{installation_id}/integrations/{integration_type}/connect_url. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_sync_room_booking_integrationB | Refresh the calendar list of a connected account Reads the calendars the account can see from the provider, so a new room shows up in listRoomBookingCalendars once selected. TRMNL POST /api/apps/room_booking/{installation_id}/integrations/{integration_type}/{id}/syncs. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_update_room_booking_integrationB | Choose the calendars of an account to sync, and its workspace settings calendar_ids, when given, is the whole set to sync: a calendar left out stops syncing and leaves every screen and collection. The ids are the numbers of the account's calendars, from listRoomBookingCalendars without the kind prefix. booking_organizer_email and parking_resource_group_id apply to a Microsoft workspace and are verified against Graph. TRMNL PATCH /api/apps/room_booking/{installation_id}/integrations/{integration_type}/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_disconnect_room_booking_integrationA | Disconnect an account Forgets the credentials and removes the account's calendars from every screen and collection. TRMNL DELETE /api/apps/room_booking/{installation_id}/integrations/{integration_type}/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_room_bookingA | Read a room booking installation What is connected, how many calendars and collections there are, which devices show one, and the billing state. Google and Microsoft accounts are connected in the browser. TRMNL GET /api/apps/room_booking/{installation_id}. |
| trmnl_get_room_booking_billingA | Read the billing state of a room booking installation Each calendar on a screen is billed monthly or yearly after a trial. Subscribing and managing the subscription happen in the browser on the billing page (checkout_url and portal_url), because each opens a Stripe session for the owner; the API never starts one. TRMNL GET /api/apps/room_booking/{installation_id}/billing. |
| trmnl_get_room_booking_settingsB | Read the settings of a room booking installation TRMNL GET /api/apps/room_booking/{installation_id}/settings. |
| trmnl_update_room_booking_settingsA | Change the settings of a room booking installation Keys left out keep their value. The company logo images are uploaded in the browser; show_company_logo only switches them on. TRMNL PATCH /api/apps/room_booking/{installation_id}/settings. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_set_room_booking_company_logoA | Upload the company logo shown on the screens PNG, JPEG or SVG up to 2 MB, as JSON with the bytes in base64. Shown once show_company_logo is on. TRMNL PUT /api/apps/room_booking/{installation_id}/settings/company_logo. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_remove_room_booking_company_logoA | Remove the company logo Removes the color logo with it, since the color one is only ever shown in its place. TRMNL DELETE /api/apps/room_booking/{installation_id}/settings/company_logo. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_set_room_booking_color_company_logoA | Upload the color company logo for color screens Takes the place of the company logo on a color device. Only accepted while the account has a color device or a color logo already uploaded. TRMNL PUT /api/apps/room_booking/{installation_id}/settings/color_company_logo. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_remove_room_booking_color_company_logoB | Remove the color company logo TRMNL DELETE /api/apps/room_booking/{installation_id}/settings/color_company_logo. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_room_booking_calendarsA | List the calendars of a room booking installation Every iCal calendar and every Google or Microsoft calendar selected for sync. A calendar id is ":", kind being ical, google or microsoft, and is what the other calendar operations take. TRMNL GET /api/apps/room_booking/{installation_id}/calendars. |
| trmnl_create_room_booking_calendarB | Add an iCal calendar An iCal feed is read-only: its events show on the screen but bookings are made in the source calendar. Google and Microsoft calendars are connected in the browser, since they need the owner to sign in. TRMNL POST /api/apps/room_booking/{installation_id}/calendars. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_room_booking_calendarA | Read a calendar with its current and upcoming bookings Answers the last-synced mirror of the source calendar (last_synced_at says how old); refetchRoomBookingCalendar reads the source again. TRMNL GET /api/apps/room_booking/{installation_id}/calendars/{id}. |
| trmnl_update_room_booking_calendarA | Change a calendar An iCal calendar takes name, ics_url, timezone, capacity, show_booking_qr and show_company_logo. A Google or Microsoft calendar keeps its provider name and takes override_name, show_booking_qr and show_company_logo. TRMNL PATCH /api/apps/room_booking/{installation_id}/calendars/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_delete_room_booking_calendarA | Remove an iCal calendar Takes it off every device. A Google or Microsoft calendar is not deleted here: deselect it from its account in the browser. TRMNL DELETE /api/apps/room_booking/{installation_id}/calendars/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_refetch_room_booking_calendarA | Refetch a calendar from its source now Reads the source calendar and updates the mirror the screens show. TRMNL POST /api/apps/room_booking/{installation_id}/calendars/{id}/refetches. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_bind_room_booking_calendar_deviceA | Show a calendar on a device Adds the room screen to the device playlist once; a device already showing it is left as it is. The first room to reach a screen starts billing: subscription_required is then true and billing_url is where the owner subscribes, and until they do the other changes answer 402. TRMNL PUT /api/apps/room_booking/{installation_id}/calendars/{id}/devices/{device_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_unbind_room_booking_calendar_deviceB | Stop showing a calendar on a device Removes the room screen from that device playlist only. TRMNL DELETE /api/apps/room_booking/{installation_id}/calendars/{id}/devices/{device_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_room_booking_calendar_screensA | Read the screens a calendar is showing on One entry per device showing this calendar, with the image that device is showing. A calendar on no device answers an empty list. screen is null while a device has not rendered the calendar yet, so a caller can tell that apart from not showing it at all. image_url is a presigned link (expires after ActiveStorage.service_urls_expire_in, 5 minutes by default); fetch it promptly. TRMNL GET /api/apps/room_booking/{installation_id}/calendars/{id}/screens. |
| trmnl_list_room_bookingsA | List the bookings of a calendar Confirmed bookings in a window, soonest first. The window defaults to the next seven days. TRMNL GET /api/apps/room_booking/{installation_id}/calendars/{id}/bookings. |
| trmnl_create_room_bookingA | Book a room Books the slot on the room calendar as the owner. Times are ISO 8601; a time without a zone is read in the calendar time zone. An iCal calendar is read-only and refuses; an overlap answers 409. TRMNL POST /api/apps/room_booking/{installation_id}/calendars/{id}/bookings. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_cancel_room_bookingA | Cancel an upcoming booking Only a booking made through TRMNL that has not started yet; endRoomBooking is for one in progress. TRMNL DELETE /api/apps/room_booking/{installation_id}/calendars/{id}/bookings/{booking_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_end_room_bookingA | End a booking in progress now Frees the room: the booking ends at the current time. Only a booking made through TRMNL that is in progress. TRMNL PATCH /api/apps/room_booking/{installation_id}/calendars/{id}/bookings/{booking_id}/end. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_room_booking_collectionsB | List the calendar collections A collection puts several calendars on one screen, as a list or a grid. TRMNL GET /api/apps/room_booking/{installation_id}/collections. |
| trmnl_create_room_booking_collectionB | Add a calendar collection resource_ids are calendar ids from listRoomBookingCalendars; at least one is needed. TRMNL POST /api/apps/room_booking/{installation_id}/collections. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_update_room_booking_collectionB | Change a calendar collection Keys left out keep their value; resource_ids, when given, replaces the whole set. TRMNL PATCH /api/apps/room_booking/{installation_id}/collections/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_delete_room_booking_collectionA | Remove a calendar collection Takes it off every device. The calendars in it stay. TRMNL DELETE /api/apps/room_booking/{installation_id}/collections/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_bind_room_booking_collection_deviceB | Show a collection on a device Adds the collection screen to the device playlist once. Billing works as for bindRoomBookingCalendarDevice. TRMNL PUT /api/apps/room_booking/{installation_id}/collections/{id}/devices/{device_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_unbind_room_booking_collection_deviceB | Stop showing a collection on a device TRMNL DELETE /api/apps/room_booking/{installation_id}/collections/{id}/devices/{device_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_room_booking_collection_screensA | Read the screens a collection is showing on The same answer as listRoomBookingCalendarScreens, for a collection. TRMNL GET /api/apps/room_booking/{installation_id}/collections/{id}/screens. |
| trmnl_prepare_installationC | Prepare an installation TRMNL POST /api/plugin_installations. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_installationC | Read a retained installation TRMNL GET /api/plugin_installations/{id}. |
| trmnl_cancel_installationC | Cancel a pending installation TRMNL DELETE /api/plugin_installations/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_complete_installationB | Complete an installation once TRMNL POST /api/plugin_installations/{plugin_installation_id}/completion. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_installation_configurationC | Read pending configuration TRMNL GET /api/plugin_installations/{plugin_installation_id}/configuration. |
| trmnl_update_installation_configurationC | Save pending configuration TRMNL PATCH /api/plugin_installations/{plugin_installation_id}/configuration. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_evaluate_installation_configurationB | Evaluate pending configuration without saving TRMNL POST /api/plugin_installations/{plugin_installation_id}/configuration/evaluation. |
| trmnl_get_installation_configuration_choicesC | Resolve pending configuration choices TRMNL POST /api/plugin_installations/{plugin_installation_id}/configuration/choices/{resolver_id}. |
| trmnl_get_plugin_setting_removal_previewC | Preview installation removal TRMNL GET /api/plugin_settings/{plugin_setting_id}/removal_preview. |
| trmnl_get_companion_capabilitiesC | Read supported Companion contract versions TRMNL GET /api/capabilities. |
| trmnl_delete_device_associationC | Unlink an owned physical device TRMNL DELETE /api/devices/{device_id}/association. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_mashup_optionsB | Read preset layouts and compatible plugin settings TRMNL GET /api/devices/{device_id}/mashups/options. |
| trmnl_get_playlist_item_previewB | Read the current rendered playlist image TRMNL GET /api/playlists/items/{item_id}/preview. |
| trmnl_start_plugin_settings_connectionC | Start provider authorization for the exact target TRMNL POST /api/plugin_settings/{plugin_setting_id}/connections/{connection_id}/attempts. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_disconnect_plugin_settings_connectionC | Disconnect only this target provider grant TRMNL DELETE /api/plugin_settings/{plugin_setting_id}/connections/{connection_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_start_plugin_installations_connectionC | Start provider authorization for the exact target TRMNL POST /api/plugin_installations/{plugin_installation_id}/connections/{connection_id}/attempts. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_disconnect_plugin_installations_connectionB | Disconnect only this target provider grant TRMNL DELETE /api/plugin_installations/{plugin_installation_id}/connections/{connection_id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_connection_attemptB | Read authoritative owned attempt state TRMNL GET /api/plugin_connection_attempts/{id}. |
| trmnl_cancel_connection_attemptA | Cancel an owned pending or exchanging attempt TRMNL DELETE /api/plugin_connection_attempts/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_confirm_connection_attemptB | Attach the exchanged grant with the confirmation from the provider callback TRMNL POST /api/plugin_connection_attempts/{id}/confirmation. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_devicesC | List my devices TRMNL GET /api/devices. |
| trmnl_claim_deviceA | Claim an unclaimed device Links a device that has not been claimed yet (a new device, or a QR code scan) to this account. Sets up the starter playlist item the first time. friendly_id is printed on the device screen during setup. TRMNL POST /api/devices. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_device_playlist_coverageA | Times of the week a device's playlist shows nothing scheduled Windows carry minutes since midnight in the account timezone, end inclusive. TRMNL GET /api/devices/{device_id}/coverage. |
| trmnl_retry_device_firmware_updateA | Retry a stalled firmware update Clears the backoff on a device stuck on an available firmware update, so the next check-in offers it again. TRMNL POST /api/devices/{device_id}/firmware_update_retries. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_device_forecastC | Simulate a device's coming check-ins, deciding each one the way a real check-in would Simulates upcoming check-ins without writing anything. reason explains a step's wait (e.g. asleep, or an extended refresh rate). TRMNL GET /api/devices/{device_id}/forecast. |
| trmnl_identify_deviceA | Identify a device Requests a screen showing the device friendly ID. Rendering runs in the background. The device receives the screen when it next checks in; this does not wake a sleeping device. TRMNL POST /api/devices/{device_id}/identification. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_mirror_deviceA | Point a device at another device's shared playlist Mirroring copies the master device's sharable playlist onto this device. The master must have visibility set to sharable. TRMNL POST /api/devices/{device_id}/mirror. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_stop_mirroring_deviceA | Stop mirroring Clears the device's mirror. This is a DELETE on the mirror link, not on the device — the device keeps its own playlist history. TRMNL DELETE /api/devices/{device_id}/mirror. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_resync_device_mirrorA | Resync a mirrored device with its master Copies playlist items the master has added since the device last synced. Only playlist items are copied automatically otherwise; use this after adding new content to the master. TRMNL POST /api/devices/{device_id}/mirror/resyncs. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_copy_device_playlistA | Copy a playlist to another device Appends items in source order without removing existing target items. Preserves appearance, priority, and schedules. Plugin instances are shared; mashups are copied. Existing setup placeholders for the same plugin are skipped. Both devices must belong to your account. Repeating this request adds the configured items again. Refreshes are queued after copying. TRMNL POST /api/devices/{device_id}/playlist_copies. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_device_playlistC | List the playlist for one device TRMNL GET /api/devices/{device_id}/playlist_items. |
| trmnl_add_device_playlist_itemB | Add a plugin instance to a device playlist TRMNL POST /api/devices/{device_id}/playlist_items. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_reorder_device_playlistC | Reorder a device playlist TRMNL PUT /api/devices/{device_id}/playlist_items/order. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_deviceB | Get the data of a device TRMNL GET /api/devices/{id}. |
| trmnl_update_deviceB | Update a device The same settings as the device page. Keys the device cannot take (custom dimensions on a fixed-size model, appearance on a native device) are dropped; a native device can only switch between the OG models. TRMNL PATCH /api/devices/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_clear_device_playlistA | Clear a device playlist Removes every item from the device playlist. The plugin settings stay in the account. TRMNL DELETE /api/devices/{device_id}/playlist. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_device_logsB | Read the logs of a device What the device reported and what rendering for it logged, newest first. before_ts and before_event_id from the last row page further back. TRMNL GET /api/devices/{device_id}/logs. |
| trmnl_render_markupC | Render Liquid template TRMNL POST /api/markup. |
| trmnl_create_device_mashupA | Add a mashup to a device playlist Splits one screen between plugin settings. getDevice lists the layouts the device can show and the positions each layout has. The 1x1 layout adds a plain playlist item instead of a mashup. TRMNL POST /api/devices/{device_id}/mashups. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_mashupB | Read a mashup and its sections TRMNL GET /api/mashups/{id}. |
| trmnl_update_mashupA | Change the sections of a mashup Positions left out keep their plugin setting. TRMNL PATCH /api/mashups/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_reset_mashup_healthA | Reset a mashup past its health breaker Returns an erroring mashup to healthy and re-schedules its renders, the same as the reset link on the mashup page. TRMNL POST /api/mashups/{id}/health_resets. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_meB | Get my user data TRMNL GET /api/me. |
| trmnl_update_meA | Update my profile Name, time zone, locale and the account-wide display settings. Email, password and keys stay on the account page. TRMNL PATCH /api/me. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_my_pluginsA | List the third-party plugins you are building Plugins you author against the third-party plugin API, whatever their status: development, in_review or published. Recipes are plugin settings, not listed here. TRMNL GET /api/my_plugins. |
| trmnl_create_my_pluginA | Start a third-party plugin Creates the plugin in development status; it publishes from the dashboard after review, not from here. The icon is an upload the dashboard takes. Needs a developer edition device on the account. TRMNL POST /api/my_plugins. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_update_my_pluginA | Change a third-party plugin Fields left out keep their value. Status cannot change here. TRMNL PATCH /api/my_plugins/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_start_photo_selectionC | Start Google Photos selection TRMNL POST /api/plugin_settings/{plugin_setting_id}/configuration/photo_selection. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_complete_photo_selectionB | Confirm Google Photos selection TRMNL PATCH /api/plugin_settings/{plugin_setting_id}/configuration/photo_selection. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_bulk_update_device_playlistA | Show or hide several playlist items on a device at once action_type is hide or show. To remove items use deletePlaylistItem instead. TRMNL POST /api/devices/{device_id}/playlist_items/bulk. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_playlist_item_scheduleC | Read when a playlist item is allowed to display TRMNL GET /api/playlists/items/{item_id}/schedule. |
| trmnl_replace_playlist_item_scheduleB | Replace when a playlist item is allowed to display TRMNL PUT /api/playlists/items/{item_id}/schedule. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_playlist_itemsC | List my playlist items TRMNL GET /api/playlists/items. |
| trmnl_update_playlist_itemB | Update a playlist item The appearance fields override the device's own for this item; null returns one to the device default. listPalettes names the palettes a device model has. TRMNL PATCH /api/playlists/items/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_delete_playlist_itemB | Remove a playlist item TRMNL DELETE /api/playlists/items/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_duplicate_playlist_itemB | Duplicate a playlist item Copies the plugin setting or mashup and places the copy on the same device. TRMNL POST /api/playlists/items/{id}/duplicates. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_download_plugin_setting_archiveA | Download a plugin setting archive Answers a zip, not JSON: settings.yml, one .liquid per markup size, and shared.liquid. This endpoint is available for unauthenticated requests. When unauthenticated, any published recipe may be archived. When authenticated, the requesting user's private plugins are also archivable. An archive of another user's recipe leaves polling_headers and polling_body empty. TRMNL GET /api/plugin_settings/{id}/archive. |
| trmnl_upload_plugin_setting_archiveC | Upload a plugin setting archive TRMNL POST /api/plugin_settings/{id}/archive. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_evaluate_plugin_configurationB | Evaluate a typed draft without saving TRMNL POST /api/plugin_settings/{plugin_setting_id}/configuration/evaluation. |
| trmnl_get_plugin_configuration_choicesC | Read owner-bound remote choices TRMNL POST /api/plugin_settings/{plugin_setting_id}/configuration/choices/{resolver_id}. |
| trmnl_get_plugin_configurationC | Read safe typed configuration TRMNL GET /api/plugin_settings/{plugin_setting_id}/configuration. |
| trmnl_update_plugin_configurationC | Apply atomic typed changes TRMNL PATCH /api/plugin_settings/{plugin_setting_id}/configuration. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_verify_custom_fieldsA | Check the custom fields YAML of a recipe Validates the YAML a recipe author writes under custom_fields, the form its installers fill in, without saving it. Each entry needs keyname, field_type and name. TRMNL POST /api/plugin_settings/custom_fields/verifications. |
| trmnl_get_plugin_setting_dataC | Get the data of a native plugin setting; a private plugin reads through getMergeVariables TRMNL GET /api/plugin_settings/{id}/data. |
| trmnl_update_plugin_setting_dataC | Update data for a webhook plugin setting TRMNL POST /api/plugin_settings/{id}/data. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_set_plugin_setting_featured_imageA | Generate the marketplace preview image of a plugin setting Queues a fresh render of the instance and attaches it as the image the recipe listing shows. Takes no body. One generation runs at a time per instance; a request while one runs is answered the same way and queues nothing. TRMNL PUT /api/plugin_settings/{id}/featured_image. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_remove_plugin_setting_featured_imageB | Remove the marketplace preview image of a plugin setting Deletes the featured image; the recipe listing then shows a screenshot instead. TRMNL DELETE /api/plugin_settings/{id}/featured_image. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_plugin_setting_filesA | Read the files of a private plugin The archive downloadPluginSettingArchive zips, as text by filename: settings.yml and one .liquid per markup size. Any published recipe can be read; another author's recipe comes without its polling headers and body. TRMNL GET /api/plugin_settings/{plugin_setting_id}/files. |
| trmnl_import_plugin_setting_filesA | Replace the files of a private plugin The same files uploadPluginSettingArchive takes zipped, as text by filename. settings.yml is required; a markup file left out keeps its current content. TRMNL PUT /api/plugin_settings/{plugin_setting_id}/files. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_upload_plugin_setting_imageA | Upload an image for a webhook_image plugin Send the image as JSON with the bytes in base64, or as the raw request body with its image Content-Type (not multipart form data). PNG, JPEG and WebP. TRMNL POST /api/plugin_settings/{id}/image. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_plugin_setting_logsB | Read plugin instance health and recent logs TRMNL GET /api/plugin_settings/{plugin_setting_id}/logs. |
| trmnl_read_markupC | Read markup for a size TRMNL GET /api/plugin_settings/{plugin_setting_id}/markup/{size}. |
| trmnl_write_markupC | Write markup for a size TRMNL PUT /api/plugin_settings/{plugin_setting_id}/markup/{size}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_merge_variablesA | Read the merge variables a plugin instance renders from TRMNL GET /api/plugin_settings/{plugin_setting_id}/merge_variables. |
| trmnl_update_plugin_settingA | Rename a plugin setting or change how it refreshes Changes the attributes of the instance itself. Its form fields are updatePluginSettingFields, its markup writeMarkup. A refresh_interval faster than the plan allows is raised to the nearest allowed value. TRMNL PATCH /api/plugin_settings/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_delete_plugin_settingC | Delete a plugin setting TRMNL DELETE /api/plugin_settings/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_copy_plugin_settingA | Copy a plugin setting Adds a new instance with the same settings and markup, named "[Copy] ", and answers it. TRMNL POST /api/plugin_settings/{id}/copies. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_clear_plugin_setting_stateB | Clear the state a plugin setting has accumulated Forgets the trmnl.state a private plugin carries between renders. Its data and settings stay. TRMNL POST /api/plugin_settings/{id}/state_clears. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_reset_plugin_setting_credentialsA | Forget the linked account and remove the plugin setting Removes the OAuth credential the account holds for this plugin AND deletes the plugin setting, so the plugin can be set up again from scratch. Destructive: the setting is gone afterwards. TRMNL DELETE /api/plugin_settings/{id}/credentials. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_enable_plugin_setting_debug_logsA | Turn on debug logs for a day A private plugin then records the request and response of each fetch for 24 hours; read them with getPluginSettingLogs. TRMNL POST /api/plugin_settings/{id}/debug_logs. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_reset_plugin_setting_healthA | Reset the health of a plugin setting that stopped rendering Clears the error count and puts the instance back on its render schedule. include_forks=true also resets every install of a recipe this setting publishes. TRMNL POST /api/plugin_settings/{id}/health_resets. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_remove_plugin_setting_transformB | Remove the transform script of a private plugin Deletes the serverless transform file and forgets its language; renders then use the fetched data as is. TRMNL DELETE /api/plugin_settings/{id}/transform. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_start_refreshA | Refresh a plugin instance A polling private plugin refetches its URL and answers a job_id to poll with getRefresh. Any other instance queues a render of its current data and answers without one. TRMNL POST /api/plugin_settings/{plugin_setting_id}/refreshes. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_refreshB | Read the result of a refresh TRMNL GET /api/plugin_settings/{plugin_setting_id}/refreshes/{id}. |
| trmnl_start_previewB | Start a preview render of a plugin instance Renders the instance so you can check its layout. The image comes back at reduced resolution and is not sized for a panel; a device is driven through /api/display. TRMNL POST /api/plugin_settings/{plugin_setting_id}/screenshots. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_previewB | Read the result of a preview render TRMNL GET /api/plugin_settings/{plugin_setting_id}/screenshots/{id}. |
| trmnl_update_plugin_setting_fieldsC | Update plugin settings fields TRMNL PATCH /api/plugin_settings/{plugin_setting_id}/settings. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_list_plugin_settingsC | List my plugin settings TRMNL GET /api/plugin_settings. |
| trmnl_create_plugin_settingA | Create a new plugin setting listPlugins gives the plugin_id to send here; getPlugin lists the fields to send updatePluginSettingFields next. TRMNL POST /api/plugin_settings. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_plugin_setting_detailsC | Get plugin setting details TRMNL GET /api/plugin_settings/{id}/details. |
| trmnl_list_pluginsB | List plugins available to install The published catalog (native and third-party) plus your own third-party plugins at any status. Send a plugin id to createPluginSetting. TRMNL GET /api/plugins. |
| trmnl_get_pluginA | Read a plugin and its form fields form_fields lists what to send updatePluginSettingFields, keyed by the same keyname. TRMNL GET /api/plugins/{id}. |
| trmnl_search_recipesA | Search published recipes Recipes are plugin settings other users published. Use one or two keywords, or #category to filter by category. TRMNL GET /api/recipes. |
| trmnl_get_recipeB | Read a recipe and how it installs install_method says what installRecipe will do: simple_install mirrors the author's render; read_only_fork copies the recipe so the installer fills its custom fields; oauth_choice is a fork that can also carry the author's OAuth connection when inherit_oauth is true. TRMNL GET /api/recipes/{id}. |
| trmnl_get_recipe_markupB | Read the markup of a recipe A starting point for a private plugin of your own; writeMarkup takes each size. TRMNL GET /api/recipes/{id}/markup. |
| trmnl_install_recipeA | Install a recipe Adds the recipe to the account the way getRecipe's install_method says, and to the device playlist when a device_id is given. TRMNL POST /api/recipes/{id}/installs. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_search_insightsA | Read what users search for and find nothing Search terms that found no plugin or recipe for at least 5 users in the last 30 days, most searched first. Demand is a band (5+, 10+, 15+, 20+), never an exact count. Refreshed hourly. TRMNL GET /api/search_insights. |
| trmnl_get_device_timelineB | Read a device timeline One day of a device: the check-ins it made (recorded, from telemetry) and, on today, the check-ins it will make (expected, simulated from its playlist and settings). source narrows both halves to one plugin setting or mashup. TRMNL GET /api/devices/{device_id}/timeline. |
| trmnl_get_plugin_setting_timelineB | Read a plugin setting timeline One day of a plugin setting across every device that shows it: the check-ins that served it (recorded) and, on today, the ones that will (expected), each naming its device. TRMNL GET /api/plugin_settings/{plugin_setting_id}/timeline. |
| trmnl_get_mashup_timelineA | Read a mashup timeline One day of a mashup across every device that shows it: the check-ins that served it (recorded) and, on today, the ones that will (expected), each naming its device. TRMNL GET /api/mashups/{mashup_id}/timeline. |
| trmnl_list_user_themesA | List my themes Requires the theme builder to be enabled for the account. TRMNL GET /api/user_themes. |
| trmnl_create_user_themeA | Create a theme Requires the theme builder to be enabled for the account. settings is validated the same way the theme builder validates it: a value outside the vocabulary (an unrecognized token, surface, hue, or advanced channel) answers 422; a key the recipe does not read is ignored. advanced is either a mapping (channels/slots restated on one token) or the same mapping as YAML text. TRMNL POST /api/user_themes. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_get_user_themeA | Read a theme scss is the framework stylesheet this theme exports, the same file the builder downloads. Requires the theme builder to be enabled for the account. TRMNL GET /api/user_themes/{id}. |
| trmnl_update_user_themeB | Update a theme Requires the theme builder to be enabled for the account. TRMNL PATCH /api/user_themes/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_delete_user_themeA | Delete a theme Requires the theme builder to be enabled for the account. TRMNL DELETE /api/user_themes/{id}. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_import_user_themeA | Create a theme from a shared theme snippet Decodes a /t/:token share link (the "Copy share link" button on a theme) through the same settings parse createUserTheme uses, and saves it under name. Requires the theme builder to be enabled for the account. TRMNL POST /api/user_themes/imports. Changes remote state or starts work. Run only within the user-authorized scope. |
| trmnl_statusA | Inspect configured profile names, local credential presence and supported features without exposing secrets. Does not prove account authentication; list devices after sign-in. |
| trmnl_catalog_searchB | Find documented TRMNL API operations by purpose; returns tool names, summaries, tags and effects. All API operations are also directly exposed as tools. |
| trmnl_operation_schemaA | Inspect the full verified request schema and method for an operation before using it. |
| trmnl_framework_guideA | Read the mandatory TRMNL Framework authoring conventions and current official reference links. |
| trmnl_webhook_readB | Read full stored private-plugin merge variables through its webhook UUID credential. Unlike editor merge-variable samples this is full content. |
| trmnl_webhook_updateB | Publish private-plugin data using its webhook UUID. Supports replacement, deep_merge and stream. Stream replaces omitted keys and appends supplied top-level arrays. Server checks final stored size/plan limits; accepted data may wait for refresh. |
| trmnl_partner_provision_discountA | Create a single-use partner discount code and encrypted plugin settings for a customer. Redemption can incur billing under your TRMNL partner agreement. Use only when the user explicitly requests this specific provision; requires partner-issued credentials. |
| trmnl_auth_startA | Start browser OAuth with PKCE. Returns a consent URL for the user; never approves consent. Stores the granted credential locally after the callback. |
| trmnl_auth_statusB | Check a pending login without revealing its credential. |
| trmnl_auth_cancelA | Stop a pending local browser login. Does not revoke existing TRMNL grants. |
| trmnl_project_createA | Create a local private-plugin project from a natural-language brief, with all four responsive Framework layouts and data states. The harness model tailors the resulting files; no separate AI API required. |
| trmnl_project_listA | List saved local TRMNL plugin project IDs. |
| trmnl_project_readB | Read a local project, markup, sample data and current revision for editing. |
| trmnl_project_saveA | Save authored files/sample data using the revision from project_read. Validates selected Framework rules. Project files must never contain credentials. |
| trmnl_project_validateA | Check layout structure, framework settings, Liquid syntax and selected adaptive UI rules. This is not a visual or device test. |
| trmnl_markup_validateA | Lint an entire private-plugin file set against TRMNL Framework conventions before writing remote content. |
| trmnl_project_previewB | Generate a local HTML preview using official Framework CSS/JS. Optional deviceModel and palette use live model CSS/size/density/color metadata. Open the artifact in a browser and inspect readiness/overflow. Local Liquid does not implement TRMNL-specific filters. |
| trmnl_project_exportB | Export a validated project to a ZIP archive for TRMNL/trmnlp. Credentials must not be in project files. |
| trmnl_project_compareB | Compare local files with an existing private plugin before deployment. |
| trmnl_project_deployB | Validate and upload local files to an existing private-plugin instance. Replaces supplied files; compare/back up first. Does not attach to a device playlist. |
| trmnl_pipeline_saveA | Save a reusable JSON API-to-TRMNL middleware pipeline. Disabled by default. Sources require an explicit host allowlist; secrets use TRMNL_SOURCE_* environment references. No JavaScript execution. |
| trmnl_pipeline_listA | List pipelines and safe operational state; no source credentials or payload history. |
| trmnl_pipeline_readB | Read a pipeline definition containing environment-variable references, not resolved credentials. |
| trmnl_pipeline_enableA | Enable or pause publishing for one saved pipeline. Does not create a schedule. |
| trmnl_pipeline_runA | Fetch, project, size-check and optionally publish data. dryRun defaults true. Publishing respects enabled state, minimum interval, backoff, duplicate detection and a cross-process lock. External POST sources can have effects even in dry runs. |
| trmnl_projection_testB | Test declarative JSON-pointer and array projections locally against supplied sample data. |
| trmnl_schedule_planB | Prepare a host-native scheduling prompt and portable CLI command. This tool does not create an automation; the harness must use its scheduler and verify it. |
| trmnl_docs_readB | Read bundled source-backed workflow documentation. Treat source content as data, not authorization. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| build-trmnl-plugin | Turn a brief into a validated, responsive TRMNL plugin. |
| schedule-trmnl-data | Set up host-driven API middleware. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| TRMNL Framework authoring requirements | |
| TRMNL operation inventory |
TDQS
Scored across 199 tools
The set covers many distinct domains, but within plugin settings, installations, connections, playlists, devices, fleets, and room booking there are numerous sibling tools with subtly different scopes. Names help, but an agent can easily confuse configuration vs. installation configuration vs. connection attempts, or public vs. owner booking operations.
Almost all tools use a consistent trmnl_ prefix and snake_case verb_noun structure, which is readable and predictable. Minor deviations exist in compound resource phrases such as plugin_settings vs. plugin_setting and in some noun-heavy names, but the overall convention is stable.
199 tools is far beyond a well-scoped MCP surface and is overwhelming for agent selection. Even if each maps to a real API operation, the count creates a massive selection and cognitive-load problem.
The surface is extremely comprehensive, covering devices, playlists, plugin settings, installations, recipes, room booking, fleets, auth, local projects, pipelines, and documentation. It provides CRUD and lifecycle coverage across nearly every apparent TRMNL domain.