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 FoundationUNS (Unified Namespace)Central data layer — all Tags live here
Industrial OperationsDevices, Alarms, HistorianField connectivity, monitoring, data logging
Business OperationsDatasets, Scripts, ReportsDatabase access, custom logic, documents
Operator InterfaceDisplays, SecurityUser 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)

Object Types by Module

UNS (Data Foundation)

TagProcess variableTag.{path}.{name}
TagProviderExternal data sourceTag.{ProviderName}.{topic}
AssetTreeFolder organization—
UserTypeData structure template—
EnumerationNumber↔String mapping—


Devices (Industrial Operations)

ChannelProtocol connectionDevice.Channel.{name}
NodeDevice addressDevice.Node.{name}
PointTag↔Address mapping—


Alarms (Industrial Operations)

AlarmGroupBehavior settingsAlarm.Group.{name}
AlarmItemAlarm definitionAlarm.Item.{name}
AlarmAreaHierarchy organizationAlarm.Area.{name}


Historian (Industrial Operations)

StorageLocationDatabase connectionHistorian.StorageLocation.{name}
HistorianTableStorage settingsHistorian.Table.{name}
HistorianTagTag to log—


Datasets (Business Operations)

DatasetDBDatabase connectionDataset.DB.{name}
DatasetQuerySQL statementDataset.Query.{name}
DatasetTableDirect table accessDataset.Table.{name}
DatasetFileFile operationsDataset.File.{name}


Scripts (Business Operations)

ScriptTaskTriggered codeScript.Task.{name}
ScriptClassReusable code libraryScript.Class.{name}
ScriptExpressionOne-line calculation—


Reports (Business Operations)

ReportFormDocument templateReport.Form.{name}
WebDataJSON/XML data objectReport.WebData.{name}


Security (Operator Interface)

SecurityUserUser accountSecurity.User.{name}
SecurityPermissionPermission flagSecurity.Permission.{name}
SecurityPolicyLogin rulesSecurity.Policy.{name}


Displays (Operator Interface)

DisplayUI screenDisplay.{name}
LayoutFrame organizationLayout.{name}
SymbolReusable componentSymbol.{name}



Pre-defined Objects

These objects exist in every new solution:

AlarmsGroups: Critical, Warning, AuditTrail
HistorianStorageLocation: Default, Table: Table1
DatasetsDBs: TagHistorian, AlarmHistorian, RuntimeUsers, Retentive
DevicesAccessTypes: Read, Write, ReadWrite
SecurityUsers: Administrator, Guest, User; Permissions: Administrator, Guest, Operator, etc.



Dependencies (What Requires What)


TagNothing (standalone)
ChannelProtocol selection
NodeExisting Channel
PointExisting Node + Tag
AlarmItemExisting Tag + AlarmGroup
HistorianTagExisting Tag + HistorianTable
DatasetQueryExisting DatasetDB
SecurityUserExisting Permission(s) + Policy

Runtime Namespace Syntax

By Context


Scripts / Code@ prefix required@Tag.Temperature.Value
Expressions / GridsDirect accessTag.Temperature.Value
Display BindingsTag name onlyTemperature

Server vs Client Domain


ServerGlobal, synchronizedTag.*, Alarm.*, Device.*
ClientLocal per client@Client.Username, @Client.DisplayName

Tag Types


Digital151Boolean (0/1)
Integer15232-bit signed integer
Double15364-bit floating point
Text154String
DateTime155Date and time
Long15664-bit signed integer
Decimal157High-precision decimal
TimeSpan158Duration
Timer162Countdown/countup timer
Counter163Increment/decrement counter
DataTable164In-memory table
Image165Binary image data
Guid166Unique identifier
Json167JSON data with parsing
Reference170Dynamic tag reference
UserType201+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:

TagTag.{path}.{name}"Tag.Line1.Tank1.Temperature"
Tag (root)Tag.{name}"Tag.SystemReady"
ChannelChannel.{name}"Channel.ModbusPLC1"
NodeNode.{name}"Node.PLC1"
AlarmGroupAlarm.Group.{name}"Alarm.Group.Critical"
DatabaseDB.{name}"DB.TagHistorian"
HistorianTableHistorian.Table.{name}"Historian.Table.Table1"



Common Workflows

1. Connect to PLC and Read Data

  1. Create Channel (select protocol)
  2. Create Node (set device address)
  3. Create Tags for data points
  4. Create Points (map tags to addresses)

2. Connect to MQTT Broker (TagProvider - Recommended)

  1. Create TagProvider with MQTT connection
  2. Topics auto-discovered under provider namespace
  3. Access as Tag.{ProviderName}.{topic.path}
  4. 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)

  1. Create Tags for data points
  2. Create Channel with MQTT protocol
  3. Create Node with broker address
  4. Create Points mapping tags to topics

4. Add Alarms to Tags

  1. Ensure Tags exist
  2. Create AlarmItems referencing Tags and Groups
  3. Optionally create custom AlarmGroup first

5. Log Tags to Historian

  1. Ensure Tags exist
  2. Create HistorianTag entries (use pre-defined Table1)

6. Bulk Operations Pattern

  1. Use search_tags to select tags by criteria
  2. Use add_tags_to_historian, add_tags_to_alarms, or create_device_points

MCP Tools Available


list_objectsList objects with optional filtering
get_objectGet details of specific object
import_jsonCreate objects from JSON
search_tagsSearch tags, set session TagGroup
add_tags_to_historianBulk add tags to historian
add_tags_to_alarmsBulk create alarm items
create_device_pointsBulk create device points
navigate_toNavigate Designer UI
get_current_viewGet current Designer state
get_screenshotGet Designer screenshot
list_protocolsList available device protocols
get_solution_infoGet solution statistics
search_docsSearch 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

Module References