MCP Designer Context
Purpose
This document provides essential knowledge for AI assistants working with ProView DS Designer through MCP (Model Context Protocol). It should be loaded at the start of each session.
What is ProView DS?
ProView DS is an industrial automation platform for building SCADA/HMI applications. It provides:
- Designer — Windows application for configuration (what you're connected to via MCP)
- Runtime — Cross-platform execution engine (Windows, Linux, Web, Mobile)
- Solution files — SQLite databases (.dbSLN) containing all configuration
The Four Pillars Architecture
ProView DS organizes functionality into four pillars:
| Data Foundation | UNS (Unified Namespace) | Central data layer — all Tags live here |
| Industrial Operations | Devices, Alarms, Historian | Field connectivity, monitoring, data logging |
| Business Operations | Datasets, Scripts, Reports | Database access, custom logic, documents |
| Operator Interface | Displays, Security | User screens, access control |
Object Model Summary
Hierarchy Pattern
All modules follow a three-level pattern:
- Module Container
- Collection Table (plural name)
- Object Instance (singular name)
- Collection Table (plural name)
Object Types by Module
UNS (Data Foundation)
| Tag | Process variable | Tag.{path}.{name} |
| TagProvider | External data source | Tag.{ProviderName}.{topic} |
| AssetTree | Folder organization | — |
| UserType | Data structure template | — |
| Enumeration | Number↔String mapping | — |
Devices (Industrial Operations)
| Channel | Protocol connection | Device.Channel.{name} |
| Node | Device address | Device.Node.{name} |
| Point | Tag↔Address mapping | — |
Alarms (Industrial Operations)
| AlarmGroup | Behavior settings | Alarm.Group.{name} |
| AlarmItem | Alarm definition | Alarm.Item.{name} |
| AlarmArea | Hierarchy organization | Alarm.Area.{name} |
Historian (Industrial Operations)
| StorageLocation | Database connection | Historian.StorageLocation.{name} |
| HistorianTable | Storage settings | Historian.Table.{name} |
| HistorianTag | Tag to log | — |
Datasets (Business Operations)
| DatasetDB | Database connection | Dataset.DB.{name} |
| DatasetQuery | SQL statement | Dataset.Query.{name} |
| DatasetTable | Direct table access | Dataset.Table.{name} |
| DatasetFile | File operations | Dataset.File.{name} |
Scripts (Business Operations)
| ScriptTask | Triggered code | Script.Task.{name} |
| ScriptClass | Reusable code library | Script.Class.{name} |
| ScriptExpression | One-line calculation | — |
Reports (Business Operations)
| ReportForm | Document template | Report.Form.{name} |
| WebData | JSON/XML data object | Report.WebData.{name} |
Security (Operator Interface)
| SecurityUser | User account | Security.User.{name} |
| SecurityPermission | Permission flag | Security.Permission.{name} |
| SecurityPolicy | Login rules | Security.Policy.{name} |
Displays (Operator Interface)
| Display | UI screen | Display.{name} |
| Layout | Frame organization | Layout.{name} |
| Symbol | Reusable component | Symbol.{name} |
Pre-defined Objects
These objects exist in every new solution:
| Alarms | Groups: Critical, Warning, AuditTrail |
| Historian | StorageLocation: Default, Table: Table1 |
| Datasets | DBs: TagHistorian, AlarmHistorian, RuntimeUsers, Retentive |
| Devices | AccessTypes: Read, Write, ReadWrite |
| Security | Users: Administrator, Guest, User; Permissions: Administrator, Guest, Operator, etc. |
Dependencies (What Requires What)
| Tag | Nothing (standalone) |
| Channel | Protocol selection |
| Node | Existing Channel |
| Point | Existing Node + Tag |
| AlarmItem | Existing Tag + AlarmGroup |
| HistorianTag | Existing Tag + HistorianTable |
| DatasetQuery | Existing DatasetDB |
| SecurityUser | Existing Permission(s) + Policy |
Runtime Namespace Syntax
By Context
| Scripts / Code | @ prefix required | @Tag.Temperature.Value |
| Expressions / Grids | Direct access | Tag.Temperature.Value |
| Display Bindings | Tag name only | Temperature |
Server vs Client Domain
| Server | Global, synchronized | Tag.*, Alarm.*, Device.* |
| Client | Local per client | @Client.Username, @Client.DisplayName |
Tag Types
Digital | 151 | Boolean (0/1) |
Integer | 152 | 32-bit signed integer |
Double | 153 | 64-bit floating point |
Text | 154 | String |
DateTime | 155 | Date and time |
Long | 156 | 64-bit signed integer |
Decimal | 157 | High-precision decimal |
TimeSpan | 158 | Duration |
Timer | 162 | Countdown/countup timer |
Counter | 163 | Increment/decrement counter |
DataTable | 164 | In-memory table |
Image | 165 | Binary image data |
Guid | 166 | Unique identifier |
Json | 167 | JSON data with parsing |
Reference | 170 | Dynamic tag reference |
| UserType | 201+ | Custom structure (ID assigned sequentially) |
JSON Format for Creating Objects
Use the standard JSON export format for import. The import process ignores metadata sections (ObjectIdentification, VersionInfo, ExportMetadata) and auto-generated fields (ID, DateCreated, DateModified, etc.).
Create Tags
json
{
"ObjectIdentification": {
"TableType": "UnsTags"
},
"Data": [
{
"Name": "Temperature",
"Type": 153,
"Path": "\\Line1\\Tank1",
"Description": "Tank temperature",
"Min": "0",
"Max": "100",
"Units": "°C"
},
{
"Name": "MotorRunning",
"Type": 151,
"Path": "\\Line1",
"Description": "Motor status"
}
]
}Tag Type Values: 151=Digital, 152=Integer, 153=Double, 154=Text, 155=DateTime, 156=Long, 157=Decimal, 158=TimeSpan, 162=Timer, 163=Counter, or UserType ID.
Create Channel and Node
json
{
"ObjectIdentification": {
"TableType": "DevicesChannels"
},
"Data": [
{
"Name": "ModbusPLC1",
"Protocol": "ModbusTCP",
"Description": "Main PLC"
}
]
}json
{
"ObjectIdentification": {
"TableType": "DevicesNodes"
},
"Data": [
{
"Name": "PLC1",
"Channel": "Channel.ModbusPLC1",
"PrimaryStation": "192.168.1.10:502"
}
]
}Create Alarm Items
json
{
"ObjectIdentification": {
"TableType": "AlarmsItems"
},
"Data": [
{
"TagName": "Tag.Line1.Tank1.Temperature",
"Group": "Alarm.Group.Critical",
"Condition": 0,
"Setpoint": "100",
"Message": "Temperature critical high!"
}
]
}Create Historian Tags
json
{
"ObjectIdentification": {
"TableType": "HistorianTags"
},
"Data": [
{
"TagName": "Tag.Line1.Tank1.Temperature",
"Table": "Historian.Table.Table1"
}
]
}Create Script Task
json
{
"ObjectIdentification": {
"TableType": "ScriptsTasks"
},
"Data": {
"Name": "StartupTask",
"Code": 2,
"Domain": 0,
"InitialState": 1,
"Description": "System initialization",
"Contents": "CSharp\r\n@Tag.SystemReady = true;\r\n@Tag.StartupTime = DateTime.Now;\r\n"
}
}Code Values: 0=VB.NET, 2=C#, 4=Python
Create Dataset Query
json
{
"ObjectIdentification": {
"TableType": "DatasetsQueries"
},
"Data": {
"Name": "GetAlarms",
"DB": "DB.AlarmHistorian",
"Contents": "SQL\r\nSELECT * FROM Alarms WHERE Timestamp > {Tag.StartTime}\r\n"
}
}Reference Format
When referencing objects in JSON, use runtime path format:
| Tag | Tag.{path}.{name} | "Tag.Line1.Tank1.Temperature" |
| Tag (root) | Tag.{name} | "Tag.SystemReady" |
| Channel | Channel.{name} | "Channel.ModbusPLC1" |
| Node | Node.{name} | "Node.PLC1" |
| AlarmGroup | Alarm.Group.{name} | "Alarm.Group.Critical" |
| Database | DB.{name} | "DB.TagHistorian" |
| HistorianTable | Historian.Table.{name} | "Historian.Table.Table1" |
Common Workflows
1. Connect to PLC and Read Data
- Create Channel (select protocol)
- Create Node (set device address)
- Create Tags for data points
- Create Points (map tags to addresses)
2. Connect to MQTT Broker (TagProvider - Recommended)
- Create TagProvider with MQTT connection
- Topics auto-discovered under provider namespace
- Access as
Tag.{ProviderName}.{topic.path} - Optionally create AssetTree folders for organization
TagProvider JSON:
json
{
"ObjectIdentification": {"TableType": "UnsTagProviders"},
"Data": [{
"Name": "ProductionMQTT",
"Protocol": "MQTT",
"PrimaryStation": "mqtt.factory.local;1883;ClientID;;;;;None;False;;AtLeastOnce;10;False;False;",
"Separators": "BranchSeparator=/;AttributeSeparator=/;",
"Description": "Production MQTT broker"
}]
}3. Connect to MQTT Broker (Device Module - Explicit)
- Create Tags for data points
- Create Channel with MQTT protocol
- Create Node with broker address
- Create Points mapping tags to topics
4. Add Alarms to Tags
- Ensure Tags exist
- Create AlarmItems referencing Tags and Groups
- Optionally create custom AlarmGroup first
5. Log Tags to Historian
- Ensure Tags exist
- Create HistorianTag entries (use pre-defined Table1)
6. Bulk Operations Pattern
- Use
search_tagsto select tags by criteria - Use
add_tags_to_historian,add_tags_to_alarms, orcreate_device_points
MCP Tools Available
list_objects | List objects with optional filtering |
get_object | Get details of specific object |
import_json | Create objects from JSON |
search_tags | Search tags, set session TagGroup |
add_tags_to_historian | Bulk add tags to historian |
add_tags_to_alarms | Bulk create alarm items |
create_device_points | Bulk create device points |
navigate_to | Navigate Designer UI |
get_current_view | Get current Designer state |
get_screenshot | Get Designer screenshot |
list_protocols | List available device protocols |
get_solution_info | Get solution statistics |
search_docs | Search documentation |
Best Practices
Do
- Use descriptive Tag names and descriptions
- Organize Tags in path hierarchy (
\Area\Equipment\Point) - Use UserTypes for repeated structures (Motors, Valves, Tanks)
- Use pre-defined AlarmGroups (Critical, Warning) when appropriate
- Use pre-defined HistorianTable (Table1) for simple logging
- Verify references exist before creating dependent objects
Don't
- Create Tags without meaningful names
- Hardcode device addresses in multiple places
- Create duplicate alarm items for same tag/condition
- Forget to set alarm messages
- Leave descriptions empty in production projects
Error Handling
When operations fail, errors indicate:
- Missing required fields
- Invalid references (with list of valid options)
- Duplicate names (for create operations)
- Permission issues
Example error:
json
{
"success": false,
"error": "Channel 'PLC99' does not exist. Available: ModbusPLC1, ControlLogix1"
}Documentation Links
Key Reference Pages
- Object Model Quick Reference — Complete object reference with TableTypes and Type IDs
- JSON Import/Export Specification — Detailed JSON format and field reference
- Git Integration and Export Reference — Version control and export configuration