get_litmusedge_driver_listLABSCO SUMMARY
Built for the questions an OT engineer actually asks.
Several tools exist because of how this data behaves rather than how the API is shaped. get_all_tags_status defaults to showing only non-OK tags, because a plant has thousands and you want the broken ones. get_device_connection_status distinguishes stale from no_data, which is the difference between a dead sensor and a dead gateway. And get_device_data_for_inference bundles metadata, per-tag statistics and recent samples in a single payload so a model can reason about a machine without ten round trips.
What it is
Litmus Automation's official server for Litmus Edge. It covers device configuration, tag management, live and historical data, digital twins, Docker deployment on the edge, and the network and system layer around them.
What you get
- 62 tools across 13 categories, taking structured arguments and returning JSON
- DeviceHub:
get_devicehub_devices,create_devicehub_device,get_litmusedge_driver_listfor the supported drivers such as ModbusTCP, OPCUA and BACnet, andget_device_connection_statusfor connected / stale / no_data - Tags:
get_devicehub_device_tagspaginates with limit and offset,create_devicehub_tag,update_devicehub_tag,delete_devicehub_tag,get_current_value_of_devicehub_tag, andget_all_tags_statuswhich defaults to non-OK so problems surface first - Time series:
get_historical_data_from_influxdb,list_influxdb_measurements,query_tag_data,get_tag_statisticsfor mean, min, max, stddev and count with a baseline range, andget_device_data_for_inferencewhich packs metadata, tags, stats and recent samples into one payload - NATS topics:
list_nats_topics,get_current_value_from_topic,get_multiple_values_from_topicfor trend analysis - Network and system:
get_firewall_rules,get_network_interface_info,start_packet_capture,stop_packet_capture,get_packet_capture_status,get_system_events,get_system_event_stats - Digital twins and Docker:
list_digital_twin_models,create_digital_twin_model,get_all_containers_on_litmusedge,run_docker_container_on_litmusedge
Requirements
Docker: docker run -d --name litmus-mcp-server -p 8000:8000 ghcr.io/litmusautomation/litmus-mcp-server:latest. The image is built for linux/amd64, so on ARM64 pass --platform linux/amd64. Port 8000 serves both transports — /mcp for Streamable HTTP and /sse for older clients. HTTPS is available through a TLS-terminating reverse proxy or native TLS with your own certificate. A stdio path exists for Claude Desktop, installed from a clone with uv.
Setup effort
One command plus credentials — docker run -d --name litmus-mcp-server -p 8000:8000 ghcr.io/litmusautomation/litmus-mcp-server:latest, then supply credentials
USE CASES
Finding which devices stopped reporting
Check connection status across devices and separate stale data from no data at all.
Reading what a sensor says right now
Look up the tag and pull its current value, or subscribe to the topic for the next message.
Deciding whether a reading is abnormal
Get mean, min, max, stddev and a baseline range for the tag rather than eyeballing a chart.
Diagnosing a network problem on the edge box
Read firewall rules and interface details, then run a bounded packet capture and collect the file.
62 tools
Listed in project docs. Your client may show a different list.
get_devicehub_devicescreate_devicehub_deviceget_device_connection_statusget_devicehub_device_tagsget_current_value_of_devicehub_tagcreate_devicehub_tagupdate_devicehub_tagdelete_devicehub_tagget_tag_statusget_all_tags_statusget_litmusedge_friendly_nameset_litmusedge_friendly_nameget_cloud_activation_statusget_all_containers_on_litmusedgerun_docker_container_on_litmusedgelist_nats_topicsget_current_value_from_topicget_multiple_values_from_topicget_historical_data_from_influxdblist_influxdb_measurementsget_device_historical_dataquery_tag_dataget_tag_statisticsget_device_data_for_inferenceget_system_eventsget_system_event_statsget_mcp_server_infoget_firewall_rulesget_network_interface_infoget_packet_capture_interfacesget_packet_capture_statusstart_packet_capturestop_packet_capturelist_digital_twin_modelscreate_digital_twin_modellist_digital_twin_instancescreate_digital_twin_instancelist_static_attributeslist_dynamic_attributeslist_transformationsget_digital_twin_hierarchysave_digital_twin_hierarchylem_list_deviceslem_get_device_detailslem_list_device_versionslem_list_device_groupslem_get_license_expirylem_get_expired_licenseslem_dashboard_usagelem_get_project_alertslem_list_companieslem_get_company_detailslem_list_company_projectslem_get_project_detailslem_deployment_infolem_get_system_timelem_bridge_list_devicehub_deviceslem_bridge_get_le_infolitmus_sdk_discoverlitmus_sdk_readlitmus_sdk_writeBEFORE YOU INSTALL
What to know first
Tools you get
62 tools named in the project's documentation. All 62 register, but some need extra credentials: NATS subscribe tools need the Access Control token, InfluxDB tools need port 8086 and DataHub credentials, and the 16 lem_* tools need an Edge Manager tenant and EDGE_API_TOKEN. Stdio needs ENABLE_STDIO=true.
Requires
- A Litmus Edge instance — its base URL with https:// (EDGE_URL) and OAuth2 client credentials from Litmus Edge (EDGE_API_CLIENT_ID, EDGE_API_CLIENT_SECRET)
- A linux/AMD64 host — on ARM64, run the Docker image with --platform linux/amd64
- Python 3.12+ for the stdio route from a clone
- For the topic-value tools, an access token from Litmus Edge → System → Access Control → Tokens (NATS_PASSWORD)
- For the historical-data tools, TCP port 8086 allowed in the Litmus Edge firewall and DataHub user credentials (INFLUX_USERNAME, INFLUX_PASSWORD)
- For the Litmus Edge Manager tools, an API token issued by LEM (EDGE_API_TOKEN)
- On hosts without GitHub access, the litmus-cli binary installed beforehand (or LITMUS_CLI_PATH pointing at one)
INSTALLATION
Connect your client
Server setup
From source
git clone https://github.com/litmusautomation/litmus-mcp-server.git
cd litmus-mcp-server
# Using uv
uv sync
# Otherwise
pip install -e .docker
Docker
docker run -d --name litmus-mcp-server -p 8000:8000 ghcr.io/litmusautomation/litmus-mcp-server:latestMCP Clients
Claude Code
{
"mcpServers": {
"litmus-mcp-server": {
"type": "http",
"url": "http://localhost:8000/mcp",
"headers": {
"EDGE_URL": "${EDGE_URL}",
"EDGE_API_CLIENT_ID": "${EDGE_API_CLIENT_ID}",
"EDGE_API_CLIENT_SECRET": "${EDGE_API_CLIENT_SECRET}",
"NATS_SOURCE": "${NATS_SOURCE}",
"NATS_PORT": "${NATS_PORT:-4222}",
"NATS_PASSWORD": "${NATS_PASSWORD}",
"INFLUX_HOST": "${INFLUX_HOST}",
"INFLUX_PORT": "${INFLUX_PORT:-8086}",
"INFLUX_DB_NAME": "${INFLUX_DB_NAME:-tsdata}",
"INFLUX_USERNAME": "${INFLUX_USERNAME}",
"INFLUX_PASSWORD": "${INFLUX_PASSWORD}"
}
}
}
}Cursor
{
"mcpServers": {
"litmus-mcp-server": {
"url": "http://<YOUR_MCP_SERVER_IP>:8000/sse",
"headers": {
"EDGE_URL": "https://<YOUR_LITMUSEDGE_IP>",
"EDGE_API_CLIENT_ID": "<YOUR_EDGE_API_CLIENT_ID>",
"EDGE_API_CLIENT_SECRET": "<YOUR_EDGE_API_CLIENT_SECRET>",
"NATS_SOURCE": "<YOUR_LITMUSEDGE_IP>",
"NATS_PORT": "4222",
"NATS_PASSWORD": "<YOUR_NATS_PASSWORD>",
"INFLUX_HOST": "<YOUR_LITMUSEDGE_IP>",
"INFLUX_PORT": "8086",
"INFLUX_DB_NAME": "tsdata",
"INFLUX_USERNAME": "<YOUR_INFLUX_USERNAME>",
"INFLUX_PASSWORD": "<YOUR_INFLUX_PASSWORD>"
}
}
}
}VS Code
{
"servers": {
"litmus-mcp-server": {
"url": "http://<YOUR_MCP_SERVER_IP>:8000/sse",
"headers": {
"EDGE_URL": "https://<YOUR_LITMUSEDGE_IP>",
"EDGE_API_CLIENT_ID": "<YOUR_EDGE_API_CLIENT_ID>",
"EDGE_API_CLIENT_SECRET": "<YOUR_EDGE_API_CLIENT_SECRET>",
"NATS_SOURCE": "<YOUR_LITMUSEDGE_IP>",
"NATS_PORT": "4222",
"NATS_PASSWORD": "<YOUR_NATS_PASSWORD>",
"INFLUX_HOST": "<YOUR_LITMUSEDGE_IP>",
"INFLUX_PORT": "8086",
"INFLUX_DB_NAME": "tsdata",
"INFLUX_USERNAME": "<YOUR_INFLUX_USERNAME>",
"INFLUX_PASSWORD": "<YOUR_INFLUX_PASSWORD>"
}
}
}
}Windsurf
{
"mcpServers": {
"litmus-mcp-server": {
"serverUrl": "http://<YOUR_MCP_SERVER_IP>:8000/sse",
"headers": {
"EDGE_URL": "https://<YOUR_LITMUSEDGE_IP>",
"EDGE_API_CLIENT_ID": "<YOUR_EDGE_API_CLIENT_ID>",
"EDGE_API_CLIENT_SECRET": "<YOUR_EDGE_API_CLIENT_SECRET>",
"NATS_SOURCE": "<YOUR_LITMUSEDGE_IP>",
"NATS_PORT": "4222",
"NATS_PASSWORD": "<YOUR_NATS_PASSWORD>",
"INFLUX_HOST": "<YOUR_LITMUSEDGE_IP>",
"INFLUX_PORT": "8086",
"INFLUX_DB_NAME": "tsdata",
"INFLUX_USERNAME": "<YOUR_INFLUX_USERNAME>",
"INFLUX_PASSWORD": "<YOUR_INFLUX_PASSWORD>"
}
}
}
}Claude Desktop (stdio)
{
"mcpServers": {
"litmus-mcp-server": {
"command": "<YOUR_PATH_TO_VENV>/bin/python3",
"args": [
"<YOUR_PATH_TO_LITMUS_MCP_SERVER>/src/server.py"
],
"env": {
"ENABLE_STDIO": "true",
"PYTHONPATH": "<YOUR_PATH_TO_LITMUS_MCP_SERVER>/src",
"EDGE_URL": "https://<YOUR_LITMUSEDGE_IP>",
"EDGE_API_CLIENT_ID": "<YOUR_EDGE_API_CLIENT_ID>",
"EDGE_API_CLIENT_SECRET": "<YOUR_EDGE_API_CLIENT_SECRET>",
"NATS_SOURCE": "<YOUR_LITMUSEDGE_IP>",
"NATS_PORT": "4222",
"NATS_PASSWORD": "<YOUR_NATS_PASSWORD>",
"INFLUX_HOST": "<YOUR_LITMUSEDGE_IP>",
"INFLUX_PORT": "8086",
"INFLUX_DB_NAME": "tsdata",
"INFLUX_USERNAME": "<YOUR_INFLUX_USERNAME>",
"INFLUX_PASSWORD": "<YOUR_INFLUX_PASSWORD>"
}
}
}
}Other routes
Docker (arm64)
docker run -d --name litmus-mcp-server --platform linux/amd64 -p 8000:8000 ghcr.io/litmusautomation/litmus-mcp-server:mainThe ARM64-specific part is --platform linux/amd64 (the image is built for linux/amd64). The README prints this line with the :main tag — the image built from the main branch — while its other commands use :latest; both tags are published on ghcr.io.