--- alias: operation-guide-messtackcomponents tags: - containerized environments description: "This document details the container-based Critical Manufacturing MES stack, including its components and configurations for network routing and authentication" --- # Customer Environment MES Stack This page lists all the containers that are running inside the Critical Manufacturing MES stack, with an explanation of its purpose as well as specific configurations for each container. !!! info There can be multiple environments deployed for any infrastructure belonging to a single customer, each with its own URL. ```mermaid graph LR subgraph Customer Environment Env[Environment Manager] UI[UI] Host[Host] Help[Project Help] Grafana[Grafana] Postgres[PostgreSQL] SecurityPortal[Security Portal] Traefik[Traefik] TraefikForwardAuth[Traefik Forward Auth] Bus[MessageBus] DiscoveryService[Discovery Service] SQL[SQL Server] ConnectIoTManager2[Automation Manager Controller] IoTEventProcessor[IoT Event Processor] MCAD[MCAD] LBOGenerator[LBO Generator] MESScheduler[MES Scheduler] end subgraph DataPlatform direction RL ClickHouse[ClickHouse] Kafka[Kafka] RabbitMQ[RabbitMQ] S3[Storage] DataManager[Data Manager] HouseKeeper[HouseKeeper] AggregationEngine[Aggregation Engine] Cube[Cube] EDPConnector[EDP Connector] IoTEventRules[IoT Event Rules] UNSConnector[UNS Connector] MLAgent[ML Platform Agent] MLPlatformTraining[ML Platform Training] end subgraph GenAI RAG[RAG Service] Ollama[Ollama] LibreChat[LibreChat] MCPServers[MCP Servers] end Traefik --> TraefikForwardAuth TraefikForwardAuth --> Traefik Traefik --> UI Traefik --> Host Traefik --> Help Traefik --> Grafana Traefik --> SecurityPortal Traefik --> Bus Traefik --> DataPlatform Traefik --> GenAI Traefik --> LBOGenerator Traefik --> Env Host -.-> SQL SQL -.-> Env Host -.-> Env UI -.-> Env Help -.-> Env Grafana -.-> Env Grafana -.-> Postgres SecurityPortal -.-> Env Bus -.-> Env DataPlatform -.-> Env ConnectIoTManager2 -.-> Env IoTEventProcessor -.-> Env MCAD -.-> Env GenAI -.-> Env DiscoveryService -.-> Env LBOGenerator -.-> Env MESScheduler -.-> Env classDef mermaid_title color:#000, fill:#fafafa, stroke:#fafafa, stroke-width:0x, font-size:100%, font-weight:200; classDef mermaid_start color:#000, fill:#fafafa, stroke:#fafafa, color:#fafafa, stroke-width:0x, font-size:100%, visibility: hidden; classDef mermaid_businessdata color:#000, fill:#65CDE8, stroke:#65CDE8, stroke-width:0px, font-size:100%; classDef mermaid_nonbusinessdata color:#000, fill:#B7DEE8, stroke:#B7DEE8, stroke-width:0px, font-size:100%; classDef mermaid_entity color:#000, fill:#FB9F53, stroke:#FB9F53, stroke-width:0px, font-size:100%; classDef mermaid_entitylinked color:#000, fill:#FCD5B5, stroke:#FCD5B5, stroke-width:0px, font-size:100%; classDef mermaid_context color:#000, fill:#B9CDE5, stroke:#B9CDE5, stroke-width:0px, font-size:100%; classDef mermaid_optional color:#000, fill:#B7DEE8, stroke:#65CDE8, stroke-width:1px, font-size:100%, stroke-dasharray: 5 5; classDef mermaid_state color:#000, fill:#d7e4bd, stroke:#000, stroke-width:1px, font-size:100%, font-weight:300; class UI,Host,Help,SecurityPortal,ConnectIoTManager2,IoTEventProcessor,MCAD,Bus,Grafana,DiscoveryService,LBOGenerator,MESScheduler mermaid_businessdata class Env,Traefik,TraefikForwardAuth mermaid_entitylinked class ClickHouse,Kafka,RabbitMQ,S3,DataManager,HouseKeeper,AggregationEngine,Cube,EDPConnector,IoTEventRules,UNSConnector,MLAgent,MLPlatformTraining,RAG,Ollama,LibreChat,MCPServers mermaid_nonbusinessdata class SQL mermaid_optional class Postgres mermaid_nonbusinessdata click Traefik "#traefik" click TraefikForwardAuth "#traefik-forward-auth" click Bus "#mes-message-bus" click Host "#mes-host" click Env "#environment-manager" click SecurityPortal "#security-portal" click UI "#mes-gui" click Help "#project-help" click Grafana "#grafana" click Postgres "#postgresql" click SQL "#sql-server" click ClickHouse "#clickhouse" click Kafka "#kafka" click RabbitMQ "#rabbitmq" click S3 "#storage" click ConnectIoTManager2 "#automation-manager-controller" click IoTEventProcessor "#iot-event-processor" click MCAD "#mcad" click LBOGenerator "#lbo-generator" click MESScheduler "#mes-scheduler" click DataManager "#data-manager" click DiscoveryService "#discovery-service" click HouseKeeper "#housekeeper" click AggregationEngine "#aggregation-engine" click Cube "#cube" click EDPConnector "#edp-connector" click IoTEventRules "#iot-event-rules" click UNSConnector "#uns-connector" click MLAgent "#ml-platform-agent" click MLPlatformTraining "#ml-platform-training" click RAG "#rag-service" click Ollama "#ollama" click LibreChat "#librechat" click MCPServers "#mcp-servers" ``` ## Core Components ### Traefik Manages incoming network traffic, acting as a reverse proxy by forwarding requests to services based on routing rules. For more information, see . Each MES environment includes a Traefik instance that is entirely responsible for that same stack. A top-level Ingress Controller is required in order to route incoming traffic to the appropriate MES stack's Traefik. Security must be dealt with at this first level, such as handling certificate validations and ensuring secure connections. !!! note The ingress controller is customer-managed: you are responsible for installing, configuring, and maintaining it, together with its external endpoint, DNS, and TLS certificates. For more information, see [Ingress Controller Requirements](https://portal.criticalmanufacturing.com/Help/devops-center/deployment-targets/kubernetes-section/ingress-controller/). !!! warning If your ingress controller is **Traefik**, you must define an entrypoint named `web-secure`, for example: ```yaml spec: containers: - args: - --entrypoints.web-secure.address=:8443 ``` This is required because our MES stack references `web-secure` in `traefik.ingress.kubernetes.io/router.entrypoints`. If the entrypoint is missing or named differently, HTTPS traffic will fail. Example: * `http:///` - the Traefik instance inside the MES stack sends this request to the proper container inside the MES stack for `domain_one` that handles the `/` path, which in this case is the `UI`. * `http:///api` - the Traefik instance inside the MES stack sends this request to the proper container inside the MES stack for `domain_one` that handles the `api` path, which in this case is the `host`. * `http:///Help` - the Traefik instance inside the MES stack sends this request to the container for `domain_two` that handles the `Help` path, which provides project-specific documentation. ```mermaid graph LR subgraph Cluster Traefik[Ingress Controller] end subgraph mes_instance_two Traefik3[Traefik] ui3["UI"] api3["Host"] help3["Project Help"] end subgraph mes_instance_one Traefik2[Traefik] ui2["UI"] api2["Host"] help2["Project Help"] end Traefik --->|https://mes_instance_one.domain.local/|Traefik2 Traefik --->|https://mes_instance_one.domain.local/api|Traefik2 Traefik --->|https://mes_instance_two.domain.local/Help|Traefik3 Traefik2 -.->|/|ui2 Traefik2 -.->|/api|api2 Traefik3 -.->|/Help|help3 classDef mermaid_title color:#000, fill:#fafafa, stroke:#fafafa, stroke-width:0x, font-size:100%, font-weight:200; classDef mermaid_start color:#000, fill:#fafafa, stroke:#fafafa, color:#fafafa, stroke-width:0x, font-size:100%, visibility: hidden; classDef mermaid_businessdata color:#000, fill:#65CDE8, stroke:#65CDE8, stroke-width:0px, font-size:100%; classDef mermaid_nonbusinessdata color:#000, fill:#B7DEE8, stroke:#B7DEE8, stroke-width:0px, font-size:100%; classDef mermaid_entity color:#000, fill:#FB9F53, stroke:#FB9F53, stroke-width:0px, font-size:100%; classDef mermaid_entitylinked color:#000, fill:#FCD5B5, stroke:#FCD5B5, stroke-width:0px, font-size:100%; classDef mermaid_context color:#000, fill:#B9CDE5, stroke:#B9CDE5, stroke-width:0px, font-size:100%; classDef mermaid_optional color:#000, fill:#B7DEE8, stroke:#65CDE8, stroke-width:1px, font-size:100%, stroke-dasharray: 5 5; classDef mermaid_state color:#000, fill:#d7e4bd, stroke:#000, stroke-width:1px, font-size:100%, font-weight:300; class Traefik,Traefik2,Traefik3 mermaid_entity class api2,api3,help2,help3,ui2,ui3 mermaid_businessdata ``` !!! info These rules and the configurations of which addresses are mapped to which internal containers are defined in Traefik Ingress Routes and Middlewares (for Kubernetes) and Traefik configuration file (for DockerSwarm). Both can be accessed through any container orchestrator management tool. ### Traefik Forward Auth Provides support to authentication through Critical Manufacturing Security Portal, equivalent to an IIS module that is installed and running in traditional installations. Every request to a protected route is forwarded by Traefik to Traefik Forward Auth to ascertain whether that request has valid authentication. Relevant folders in container volumes: | Path | Description | | ----------- | --------------------------- | | `/opt/app/` | Main application directory. | Table: Traefik Forward Auth relevant folders for containerized environments ### Environment Manager The Environment Manager works as an overseer of the entire MES stack and coordinates as a primary information point from which all other containers depend. It performs operations like the actual installation setup application of the traditional environments, with added functionality, wherein every time the stack is started, all containers have the same entrypoint (a small piece of executable code) that queries the Environment Manager container to see whether the system is installed and running and also if there are any customization packages that need to be installed for any specific container. When the Environment Manager responds to the queries from all other containers to indicate that the system has been installed, the other containers can safely run. !!! note If outbound access to the Customer Portal's DevOps Center requires a proxy, configure the **HTTP Proxy URL** and **HTTPS Proxy URL** settings (**Outbound Proxy** group) when creating the environment. ```mermaid sequenceDiagram Container in MES Stack->>Environment Manager: Is MES installed? activate Environment Manager Environment Manager-->>Container in MES Stack: Not yet, checking Environment Manager-->>Container in MES Stack: Yes, it is, you can run safely deactivate Environment Manager activate Container in MES Stack Container in MES Stack->>+Environment Manager: Are there any custom components I should know about? deactivate Container in MES Stack Environment Manager-->>Container in MES Stack: Yes, here they are activate Environment Manager Container in MES Stack->>Environment Manager: Ok, installing before running the main application deactivate Environment Manager ``` Customization packages are usually stored in one of the volumes bound by the Environment Manager and are accessible through it. Relevant folders in container volumes: | Path | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------- | | `/opt/app/` | Main application directory. | | `/var/opt/envmanager/installation/` | Installation data (volume `installation_data`). Includes a folder per system, named after the system name. | | `/opt/connectiot/` | Connect IoT repository share (volume `connect_iot_repo`), shared between the Host and the Environment Manager. | | `/var/log/cmf/` | If the volume type selected for logs is 'None', applications will not log to a file, and therefore, this location will be empty. Otherwise, the location will be shared with several containers, with each container having its own separate folder inside it. | Table: Environment Manager relevant folders for containerized environments ### Security Portal A multi-tenant application that acts as an identity management system. For more information, see [Security Portal](../security/security-portal/index.md). Relevant folders in container volumes: | Path | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------- | | `/opt/app/` | Main application directory. | | `/var/opt/app/*.pem` | Token signing key pairs (mounted as secrets). | Table: Critical Manufacturing MES Security Portal relevant folders for containerized environments ### MES Host The set of services that operate the core of Critical Manufacturing MES services and orchestration, exposing a public API for external access. Since version 12.0, documents and attachments are stored in the S3-compatible object storage instead of a volume mounted by the Host. Relevant folders in container volumes: | Path | Description | | ------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `/opt/app/` | Main application directory (includes Host config file and customization libraries). | | `/opt/connectiot/` | Connect IoT repository share (volume `connect_iot_repo`), shared between the Host and the Environment Manager. | | `/var/log/cmf/` | Logging location, shared with several containers, where each container will have its own separate folder inside this one. | Table: Critical Manufacturing MES Host relevant folders for containerized environments ### MES GUI Web server used as the main visual entrypoint for the Critical Manufacturing MES. Relevant folders in container volumes: | Path | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------ | | `/opt/app/` | Main application directory. | Table: Critical Manufacturing MES GUI relevant folders for containerized environments ### Project Help Optional project-specific documentation for the local Critical Manufacturing MES installation, exposed under the `Help` path. Relevant folders in container volumes: | Path | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------- | | `/app/` | Main application directory. | | `/var/log/cmf/` | Logging location, shared with several containers, where each container will have its own separate folder inside this one. | Table: Project Help relevant folders for containerized environments ### MES Message Bus A high-performance publish and subscribe message bus. For more information, see [Message Bus](../../application-administration/messagebus.md). Relevant folders in container volumes: | Path | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------- | | `/opt/app/` | Main application directory. | | `/var/log/cmf/` | Logging location, shared with several containers, where each container will have its own separate folder inside this one. | Table: Critical Manufacturing MES Message Bus relevant folders for containerized environments ### Grafana Visualization framework that allows you to query, visualize metrics from the Critical Manufacturing MES through widgets and dashboards. Grafana has no volume of its own: its configuration (users, dashboards, and data sources) is stored in a dedicated database in the [PostgreSQL](#postgresql) container, and users authenticate through the Security Portal. ### PostgreSQL PostgreSQL database server that stores the Grafana configuration database. When the GenAI package is installed, it also stores the LibreChat data through the `ferretdb` container. Relevant folders in container volumes: | Path | Description | | --------------------- | -------------------------------------- | | `/var/lib/postgresql` | Database data (volume `postgres-storage`). | Table: PostgreSQL relevant folders for containerized environments ### SQL Server Installed optionally through DevOps Center, this container holds an instance of SQL Server that can be used only with the Online database. It is lacking: * Reports * ODS database * DWH database * Analysis Services !!! info This container is the only one that can be configured to have an open port for the outside world. This port is used to access the database through SQL Server Management Studio, which can access the server through the name: `machine_name,[port]`. !!! warning Be aware that the character separator between machine name and port is a comma (`,`) and not the traditional colon (`:`). Relevant folders in container volumes: | Path | Description | | ---------------------- | --------------------------------------------------------------------------------------- | | `/var/opt/mssql/data/` | MSSQL Data files. | Table: SQL Server relevant folder for containerized environments ### Discovery Service Enables the Message Bus gateway replicas to discover each other: each replica registers with the Discovery Service and receives the addresses of the other replicas to form the Message Bus cluster. It is an internal component of the stack and is not exposed externally through the ingress router. Relevant folders in container volumes: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app/` | Main application directory. | | `/var/log/cmf/` | Logging location, shared with several containers, where each container will have its own separate folder inside this one. | Table: Discovery Services relevant folders for containerized environments ### LBO Generator The service responsible for generating and serving LBOs. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app` | Main application directory. | | `/opt/lbogen/output` | Intermediate artifacts location. | | `/opt/lbogen/assemblies` | Host assemblies location. | | `/opt/lbogen/lbos` | Generated LBO packages (zip files) available for download. | Table: LBO Generator relevant folders for containerized environments ### MES Scheduler :lock: Basic Scheduling The service responsible for MES Scheduling operations. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app` | Main application directory (Scheduling Engine API). | | `/opt/app/Scheduling` | Scheduling Engine binaries. | Table: MES Scheduler relevant folders for containerized environments ### Automation Manager Controller :lock: Connect IoT A Kubernetes controller that watches the **Automation Managers** with the AutomaticDeploy deployment mode and deploys or undeploys their containers inside the cluster. Only the managers in the configured worker pool (`General` by default) are handled. It runs with a dedicated service account and role. For more information, see [[user-guide-automation-manager-deploy]]. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app` | Main application directory. | Table: Automation Manager Controller relevant folders for containerized environments ### IoT Event Processor A Connect IoT Automation Manager deployed in standalone mode from the `criticalmanufacturing/ioteventprocessor` image. In the MES stack, this container is named `connectiot-manager`. It consumes the IoT event topics from Kafka, uses RabbitMQ for its job queue, and runs the Data Platform workflows of the Automation Controllers that subscribe to each **IoT Event Definition**. The same image is deployed twice more by the Data Platform package, as the [IoT Event Rules](#iot-event-rules) and [UNS Connector](#uns-connector) containers, each with its own standalone configuration. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/iot/manager/` | Manager configuration and standalone templates. | | `/usr/iot/manager/` | Generated manager configuration and standalone file. | | `/tmp/ConnectIoT` | Persisted data, job data, and logs (not on a volume). | Table: IoT Event Processor relevant folders for containerized environments ### MCAD :lock: New Product Introduction Service that performs the mechanical CAD (MCAD) operations of the New Product Introduction module on behalf of the **Host**. The related ECAD integration does not run as a container: the ECAD package only configures Traefik routes to the external ECAD service endpoints defined during installation. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app` | Main application directory. | Table: MCAD relevant folders for containerized environments ## Data Platform ### ClickHouse :lock: Data Platform From [ClickHouse](https://clickhouse.com/clickhouse): *ClickHouse is a column-oriented database that enables its users to generate powerful analytics, using SQL queries, in real-time.* Relevant folders in container volumes: | Path | Description | | --------------------- | -------------------------------------- | | `/var/lib/clickhouse/` | Application data (volume `clickhouse-data`). | Table: ClickHouse relevant folders for containerized environments ClickHouse logs are written to the console (container output); file logging is disabled. The stack also deploys the `clickhouse-ui` container, a web interface for ClickHouse. ### Kafka :lock: Data Platform From [Apache Kafka](https://kafka.apache.org/): *Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.* A single Kafka node (container `kafka1`), running as both broker and controller (KRaft mode), is used for streaming operations. The stack also deploys the `kafka-ui` container, a web interface for Kafka. Relevant folders in container volumes: | Path | Description | | --------------------- | -------------------------------------- | | `/var/lib/kafka/data` | Application data. | Table: Kafka relevant folders for containerized environments ### RabbitMQ From [RabbitMQ](https://www.rabbitmq.com/): *RabbitMQ is a reliable and mature messaging and streaming broker.* RabbitMQ is the message queue used by the Host and the IoT Event Processor. It is not part of the Data Platform package. Relevant folders in container volumes: | Path | Description | | --------------------- | -------------------------------------- | | `/var/lib/rabbitmq/mnesia` | Application data. | | `/var/log/rabbitmq` | Log folder. | Table: RabbitMQ relevant folders for containerized environments ### Storage :lock: Data Platform S3-compatible object storage used by the Data Platform and the Host for large IoT events, exported data sets, and documents. In version 12.0 the in-cluster storage is provided by a Silo-based, MinIO-compatible image (`silo-distroless`), which replaces MinIO. It is intended for development and test environments only; staging and production environments must use an external S3-compatible service. Relevant folders in container volumes: | Path | Description | | --------------------- | -------------------------------------- | | `/bitnami/minio/data` | Application data (volume `storage-data`). | Table: Storage relevant folders for containerized environments ### Data Manager :lock: Data Platform The Data Manager acts as the manager of all Data Stores. A Data Store is a physical data repository, typically a database of a certain technology that is abstracted by a Data Store Driver. Data Sets (structured tabular grid of rows (records) and columns (fields)) are written and read from a Data Store. For internally managed Data Sets, the system takes care of the schema creation, space provisioning and overall data set management (e.g.: purging). The Data Manager provides a central access to Data in the platform, enabling data security and also exposing the Data via an OData interface or by using the Grafana interface. The Data Manager container has no persistent volume. ### HouseKeeper :lock: Data Platform Replicates the Online and ODS databases to the ClickHouse ODS database, builds the Canonical Data Model (CDM) events, and materializes all IoT events in ClickHouse. It is deployed as several containers from the same image, each running a subset of the HouseKeeper services: `housekeeper`, `housekeeper-cdm-builder`, `housekeeper-cdm-builder-light`, and, for the Enterprise Data Platform, `housekeeper-edp` and `housekeeper-edp-cdm-builder`. The HouseKeeper containers have no persistent volume. ### Aggregation Engine :lock: Data Platform Runs Dagster and dbt to aggregate the data of the CDM database into the Data Warehouse tables in ClickHouse. The Dagster UI is exposed under the `3rdparty/dagster` path of the environment. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app` | Main application directory. Customization packages are deployed to this directory. | Table: Aggregation Engine relevant folders for containerized environments ### Cube :lock: Data Platform Semantic layer over the Data Warehouse tables, exposing the cubes through GraphQL and REST under the `datamanager/cube` path. It is deployed together with the `cubestore` container, which caches pre-aggregations. The `cube-playground` container, running Cube in development mode, exposes the Cube Playground under the `3rdparty/cube-playground` path. Relevant folders in the container: | Path | Description | | --------------------- | -------------------------------------- | | `/opt/app/model` | Cube model directory. Customization packages can deliver new cube models to this directory. | Table: Cube relevant folders for containerized environments ### EDP Connector :lock: Data Platform Connects a data silo to the Enterprise Data Platform (EDP), forwarding its replication and Service History IDs events. It is deployed only in Enterprise Data Platform scenarios. ### IoT Event Rules :lock: Data Platform A standalone Connect IoT Automation Manager, from the IoT Event Processor image, that evaluates the event rules over the incoming IoT events and triggers the associated notifications and actions. It replaces the EPF Alarm Management containers of previous versions. ### UNS Connector :lock: Data Platform A standalone Connect IoT Automation Manager, from the IoT Event Processor image, that publishes Light CDM events to an MQTT broker as a Unified Namespace (UNS). It is deployed only when the UNS and the Light CDM events are enabled, and requires the **IoT Data Platform Advanced** license. For more information, see [[user-guide-data-platform-uns-connectivity]]. ### ML Platform Agent :lock: Data Platform Interacts with the application, providing values extracted from trained models. The deployed model revisions are read from the S3-compatible storage configured for the environment; the container has no persistent volume. ### ML Platform Training :lock: Data Platform Performs model training from events gathered by the Data Platform. Exported data sets, training data, and trained models are stored in the S3-compatible storage configured for the environment; the container has no persistent volume. ## GenAI The GenAI package is optional and adds the following containers. ### RAG Service The `core-rag` container coordinates the indexing of MES content and the retrieval of relevant content for Generative AI requests. It reads entities from the MES Host, consumes MES operation events from Kafka, generates embeddings through the `core-ollama` container, and stores them in ClickHouse. It has no persistent volume. ### Ollama The `core-ollama` container generates embeddings locally for the RAG service, using the embedding model bundled in the image. Language-model inference uses the provider selected during installation. It has no persistent volume. ### LibreChat The `librechat` container is the chat interface for the Generative AI features, exposed under the `GenAI` path of the environment and authenticated through the Security Portal. It stores its data in the `ferretdb` container (volume `ferret-data`), which persists it in the [PostgreSQL](#postgresql) container. ### MCP Servers Model Context Protocol (MCP) servers that expose MES capabilities to AI agents: * `mcp-mes` exposes MES entities, documents, attachments, Analytics Views, maintenance data, and UI pages on `/mcp`, and the Query Object MCP server on `/queryobjects/mcp`. * `mcp-analytics` hosts the Cube.js MCP server on `/cubejs/mcp`, the ClickHouse MCP server on `/clickhouse/mcp`, and the OData MCP server on `/odata/mcp`. It is deployed only with the Data Platform. * `mcp-grafana` is a third-party MCP server that interacts with the Grafana dashboards. It requires the **IoT Data Platform Premium** license. The MCP servers are internal to the stack and are not exposed through Traefik.