Annotating Digital Twin Models for AI
When an AI agent connects to the ScaleOut MCP server, it discovers
your digital twin models programmatically. The agent sees property names
and data types, but nothing about what those properties actually
mean. Two properties named Temperature on two different models
might represent different things, have different normal ranges,
or matter more or less to the overall health of the twin.
To close that gap, ScaleOut provides two attributes (available in C# and Java)
that developers can apply directly to their model classes and properties:
ModuleAiMetadata and PropertyAiMetadata.
These attributes let you attach human-readable descriptions, units,
and expected value ranges to your model, which the MCP server then
surfaces to AI agents.
The result is that agents can reason about your models with the same rich context that a developer or subject-matter expert would bring to them.
ModuleAiMetadata
Applied to a model class, ModuleAiMetadata describes the
model as a whole, and possibly its relationship with other models.
Property |
Description |
|---|---|
|
A description of the module and its purpose, or its relationship to other modules, to help AI agents understand the key components and logic it represents. The more context you provide here, the more information the AI agent will have use to understand your data. |
|
Not all properties are as meaningful. This lists specific properties that are most important to the module, pointing an agent toward the fields most likely to matter when reasoning about instances of this model. |
PropertyAiMetadata
Applied to an individual property (or field),
PropertyAiMetadata describes that property specifically.
Property |
Description |
|---|---|
|
A meaningful description of the property: its purpose, and its relationship to other properties on the model. |
|
The units the property is expressed in, if it is numerical
(e.g. |
|
The low boundary of the property’s normal operational range. |
|
The high boundary of the property’s normal operational range. |
Together, Units, MinValue, and MaxValue let an agent
recognize when a value is unusual or out of range without having to
be told explicitly — for example, distinguishing a normal
Temperature reading from one that signals a developing fault.
Code Samples
The examples below apply both attributes to a WindTurbine model
with three properties: RPM, Temperature, and Friction.
Note
The samples below are shown with fairly short descriptions for readability. The more descriptive your entries are, the better the AI agent will be able to understand the data and its relationship with other models.
[ModuleAiMetadata(
Description = "Represents a wind turbine and its live " +
"operational readings. Used to monitor " +
"rotational speed, temperature, and " +
"mechanical friction to detect abnormal " +
"or unsafe operating conditions. A WindTurbine instance" +
"is related to an instance of a WindFarm model.",
KeyProperties = "RPM,Temperature,Friction"
)]
public class WindTurbine : DigitalTwinBase<WindTurbine>
{
[PropertyAiMetadata(
Description = "Rotational speed of the turbine rotor.",
Units = "Rotations per minute",
MinValue = "0",
MaxValue = "20"
)]
public Single RPM { get; set; }
[PropertyAiMetadata(
Description = "Internal nacelle temperature, used to " +
"detect overheating.",
Units = "°C",
MinValue = "-10",
MaxValue = "85"
)]
public Single Temperature { get; set; }
[PropertyAiMetadata(
Description = "Measured mechanical friction in the " +
"main bearing, an early indicator of " +
"wear or lubrication issues.",
Units = "Newton",
MinValue = "0",
MaxValue = "50"
)]
public Single Friction { get; set; }
}
@ModuleAiMetadata(
description = "Represents a wind turbine and its live " +
"operational readings. Used to monitor " +
"rotational speed, temperature, and " +
"mechanical friction to detect abnormal " +
"or unsafe operating conditions. A WindTurbine instance" +
"is related to an instance of a WindFarm model.",
keyProperties = {"rpm", "temperature", "friction"}
)
public class WindTurbine extends DigitalTwinBase<WindTurbine> {
@PropertyAiMetadata(
description = "Rotational speed of the turbine rotor.",
units = "Rotations per minute",
minValue = "0",
maxValue = "20"
)
private double rpm;
@PropertyAiMetadata(
description = "Internal nacelle temperature, used to " +
"detect overheating.",
units = "°C",
minValue = "-10",
maxValue = "85"
)
private double temperature;
@PropertyAiMetadata(
description = "Measured mechanical friction in the " +
"main bearing, an early indicator of " +
"wear or lubrication issues.",
units = "Newton",
minValue = "0",
maxValue = "50"
)
private double friction;
// getters and setters omitted for brevity
}