Skip to content

Releases: renanlido/tia-openness

TIAOpenness 1.7.0

Choose a tag to compare

@renanlido renanlido released this 23 Oct 00:56
fbd223d

What's new in TIAOpenness 1.7.0

Added

  • Project objects can now be exported to a Version Control Interface workspace, compared with their files and imported
    back (ADR 0029).
    A VCI workspace is a folder on the serve host that mirrors objects as files, so that git or a
    diff tool can version them. GET /vci/workspaces lists the workspaces of the system group and of the workspace user
    groups, nested groups included without a depth limit (name, group, rootPath, mappedObjects); a name found in two groups is 409 workspace_ambiguous, and a workspace group reached twice, so that the list would be partial, is 409 vci_inventory_incomplete.
    POST /vci/workspaces {name, rootPath} creates one in the system group, or reuses the same name with the same root
    (the existing root is the one reported), and creates the root folder when it is missing (a UNC, device, relative or
    drive-less path, a . or .. segment, a reserved name, a path over 160 characters, and a root that is an existing file or lies below one are 400 invalid_workspace_path; a name that exists with another root is 409 workspace_exists, a root another workspace of
    any group uses, also written as a short 8.3 name, is 409 workspace_root_in_use; roots are compared ignoring case
    and without Unicode normalization). POST /vci/workspaces/{workspace}/export writes PLC blocks, PLC data types and
    tag tables to the workspace files and POST /vci/workspaces/{workspace}/import writes a workspace file back into the
    project. Only those leaf objects are accepted: a device, a PLC, a block group, a library object or any other kind is
    refused with 400 bad_request, and a mapped or resolved container with 409 vci_not_leaf, before any Version
    Control Interface call is made; the same refusal covers the generic /obj path. A call takes 1 to 50 objects (400 batch_too_large above that), and dryRun in the JSON body (a strict boolean; dryRun in the query string of a POST
    is 400) runs every guard in the same order and lists what would be written without changing anything. A refusal
    decided before the first write changes nothing. A batch is not a transaction and stops at the first failure: 409 vci_batch_incomplete says which objects were written, while a 504 worker_restarted, a lost connection or a lost
    session during a write leaves an unknown, possibly partial outcome (check the status before repeating). An export
    checks every target before it writes: a path over the Windows limit is 409 vci_path_too_long, and two objects,
    another mapped object or an existing file (also under its short 8.3 name; when the short name of an existing file cannot be read,
    a collision cannot be excluded and the export is refused with reason: "alias_unverifiable") sharing a target, ignoring case and with
    any extension, is 409 vci_path_collision, for an object that is already mapped as much as for a new one; so are two
    targets whose paths differ only in segments where one has the shape of an 8.3 short name (VERYLO~1) and the other
    is stored under a generated short name (VeryLongBlockName, which Windows also answers to as VERYLO~1; folder names
    included), whether both are in the call or one is another mapped object of the workspace, and a file that appeared
    under a target's name or alias after the plan (the folder is listed again before every write, the first into each
    folder included) stops that object and the rest of the call instead of being overwritten; a mapping
    that is not below the workspace root, or a reparse point on the way to its file, is 409 vci_mapping_outside_workspace (nothing written, or, when a NEW export
    reports a location outside the root, the file was written there and the answer says so); names are made safe for
    Windows and never truncated. An object that is already mapped is synchronized in place and its workspace file is
    overwritten with the project content, which destroys a change made only in that file; it keeps its own location and
    format, and format chooses the file format of an object that is not mapped yet only. To compare without replacing
    anything, read the status. An import needs the object to be mapped (409 not_mapped) and its file to exist (409 workspace_file_missing), skips an object that is already equal, shows in the dry run its statusBefore and whether
    it overwritesProjectChanges, honors the optional expectedContentHash of the stale-write guard for blocks and types
    (a tag table has no hash and one is 400), and ends every imported object with a mandatory postcheck (status equal,
    consistency, compile errors, and for SimaticML the hash of the file against a fresh export): an object whose postcheck
    does not verify is 409 import_unverified, and the object was already written. GET /vci/workspaces/{workspace}/status answers the state of each mapped object (equal, projectChanged,
    workspaceChanged, conflict, workspaceFileMissing, unknown, unequal, statusFailed or unsupported) in a
    stable order, with a summary and a coverage that say what was compared; only equal is a verified match, and a
    row that is unsupported or statusFailed, or coverage.complete: false, means those objects were not verified.
    Add limit (1 to 1000) and cursor to read it page by page: the comparison runs only for the rows of the page, so
    paging bounds the time of the call, summary and coverage describe the rows of that response, and a mapping that
    appears, disappears or moves answers 409 cursor_stale. The export, the import and the status use the long timeout
    (3600 s by default); listing and creating a workspace use the standard one. A new export creates its target folder
    when it is missing (the dry run lists willCreateDirectory per object), an import replaces the project object (a
    handle read before it is stale), and regenerating a block from SCL drops its mapping, so a later import is
    409 not_mapped. These routes were run against a real project on the bench of 2026-10-19 (live-13-vci, 30 passed).
  • The session is now bound to the exact project it connected (ADR 0028). serve records the canonical path of the
    project of the session and, before every operation that works on the project, checks that the project open in the
    bound TIA is still that one. When it is not (the project was closed in the TIA window, another project was opened
    there, or File > Save as... changed its path) the operation is refused with 409 binding_conflict and details
    {bound, actual, reason}, where reason is project_closed, other_project or project_object_stale; nothing is
    done. POST /connect with the project to work on (the bound path to go back, the actual path to adopt it) restores
    the binding. The binding is recorded only with a readable path: while the path of the project cannot be read the
    session is unbound and its operations are not checked, and serve tries again after every operation until the read
    succeeds. GET /status and GET /project now return boundProjectPath (null while nothing is bound), and
    GET /tia returns boundProjectPath plus bindingDrift (null, or {actual, reason}: it reports the drift and
    never fails). GET /project and the answers of POST /connect and POST /project/create also return modified,
    whether the project has unsaved changes: true, false, or null when TIA could not answer the read.
  • A write can now refuse to overwrite a change made in TIA Portal after the object was read.
    GET /plcs/{plc}/blocks/{block}/xml and GET /plcs/{plc}/types/{type}/xml answer a contentHash
    and a contentHashError
    (lower-case SHA-256 of the SimaticML export with default options, normalized so volatile export
    noise such as <Created>, line endings and the layout between the tags of an element that holds
    only elements never changes it, while whitespace inside text is part of it: a multi-line comment,
    the text of a leaf such as <ConstantValue>, and every text node of an element that mixes text and
    elements (an element that holds a CDATA section keeps its layout exactly too); UId attributes are renumbered
    canonically instead of dropped, so a renumbering by TIA never changes it but a rewired LAD/FBD
    network does; it is the same for any options). It is a different contract from the
    normalizedSha256 of tia_block_compare and from the sha256 of the raw text: never substitute
    one for another, and pass only the contentHash of a fresh read as expectedContentHash. The hash
    exists only for a well-formed XML document (one root element, balanced tags, legal characters and
    references, no DOCTYPE: DTD processing is prohibited and nothing external is ever resolved): for an
    export that is not well-formed the XML reads still answer the xml, with contentHash: null and
    contentHashError: "not well-formed: <reason>" (the reason is English whatever the UI language of
    the machine; the XML declaration encoding value must be an XML EncName, so encoding="" or
    encoding="not an encoding" is not well-formed, and names follow the XML 1.0
    fourth-edition character tables of the .NET reader).
    GET /plcs/{plc}/blocks/{block}/source and GET /plcs/{plc}/types/{type}/source
    answer the hash of the same object's SimaticML export and a contentHashError; the block read
    compiles nothing, so an inconsistent, know-how protected, unexportable or not well-formed block still answers its
    code with contentHash: null and the reason in contentHashError. POST /plcs/{plc}/source,
    POST /plcs/{plc}/import and POST /plcs/{plc}/types/import take an optional
    expectedContentHash: when the object in the project no longer has that hash (or no longer
    exists) the write is refused with 409 state_changed and details {object, expected, actual},
    and nothing is written; when it matches, the wr...
Read more

Claude Desktop bundle for the MCP 1.11.0

Choose a tag to compare

@renanlido renanlido released this 23 Oct 13:44
fbd223d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.11.0.

SHA-256, to check the download before you install it:

c0eadadafe099ca1315e741f3c3725454aa5057c2cc587f270ecc8a2b8cd5656  tia-openness-mcp-1.11.0.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.11.0.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.11.0.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

Claude Desktop bundle for the MCP 1.10.7

Choose a tag to compare

@renanlido renanlido released this 22 Oct 18:58
fbd223d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.10.7.

SHA-256, to check the download before you install it:

83ac2882e9766c49b1276382adef30cb27f2bcd379dcf65f5fc71bdbc3679d76  tia-openness-mcp-1.10.7.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.10.7.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.10.7.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

Claude Desktop bundle for the MCP 1.10.6

Choose a tag to compare

@renanlido renanlido released this 22 Oct 18:28
fbd223d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.10.6.

SHA-256, to check the download before you install it:

268324510c8bbde3ca91f1b9cb02fd040aabce2dc354c6f93b61f9a38f265311  tia-openness-mcp-1.10.6.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.10.6.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.10.6.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

Claude Desktop bundle for the MCP 1.10.5

Choose a tag to compare

@renanlido renanlido released this 22 Oct 17:13
fbd223d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.10.5.

SHA-256, to check the download before you install it:

fd62676c9afeca22b1fab69f241f9f00cb4b9e80a176feef84114703c1b8cc82  tia-openness-mcp-1.10.5.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.10.5.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.10.5.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

TIAOpenness 1.7.1-beta.1

Pre-release

Choose a tag to compare

@renanlido renanlido released this 24 Oct 22:13
fbd223d

What's new in TIAOpenness 1.7.1-beta.1 (beta)

Beta build. A pre-release for testing, offered only to installations that turned on Receive beta versions in the app (Updates tab). It is not the stable release: it may have defects. Report them with the support report in the app. The notes below are what has changed since the last stable release.

Added

  • Linked the welcome window, license tab, and tray menu to the 30-day trial and plans when a license is missing or expired.

  • The “Connect your AI agents” screen is now available on the stable channel.

  • The Windows installer embeds the MCP runtime for supported app-managed routes. The app uses its pinned Node/package
    for Claude Code and Codex file-config; Claude Desktop opens the matching .mcpb. The Codex CLI plugin, Gemini extension,
    and manual/macOS/Linux/remote workflows keep using npx. The app-managed Claude Code plugin receives the embedded
    launcher on a fresh install; existing connections switch with Disconnect then Connect.

Fixed

  • Update checks refetch a replaced release manifest. Cached manifests are reused only when the manifest asset ID stays the same; a replacement under the same tag is downloaded and verified again.

  • Claude Desktop settings updates require a full quit before the write. The setup wizard shows this before its yes/no
    confirmation; the app screen shows it before Connect. After applying, reopen and verify with doctor or Refresh.

  • The setup guidance now identifies TIA_CONNECT_TIMEOUT_MS as the tia_local_session_open G6 logon timeout only. It
    does not change connection lifecycle or imply G1.

Install or update

  • Beta channel: open the app, turn on Receive beta versions in the Updates tab, then choose Install update. Nothing changes for installations that did not opt in.
  • Fresh install of this beta: run TIAOpenness-Setup-1.7.1-beta.1.exe.
  • Back to stable: turn the setting off. Nothing is downgraded: the installed beta stays until a stable release newer than it is published.

Requires Windows x64, .NET Framework 4.8 and Siemens TIA Portal V21 with TIA Openness. The API needs an activation license.

Verify the download

File Size SHA-256
TIAOpenness-Setup-1.7.1-beta.1.exe 28,819,373 bytes 2efaf2e5d500623ac82939ce5dff0db7e1f216b0a9a104cb6052873b33f85d59
TIAOpenness-app-v1.7.1-beta.1.zip 3,296,485 bytes 074995cb12fd3f72f9b120ffa343e5a33dedddc475b650e8505c6018e6d4928e

The in-app updater accepts this release only through update-manifest.json, signed with key u1.

Questions or problems: support@plcware.io

Claude Desktop bundle for the MCP 1.9.2

Pre-release

Choose a tag to compare

@renanlido renanlido released this 18 Oct 17:30
705cf6d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.9.2.

SHA-256, to check the download before you install it:

985b966d676ecfc1b8accca710b8f4dcbcbdc4639a18ad26592537f7e98f26dd  tia-openness-mcp-1.9.2.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.9.2.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.9.2.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

Claude Desktop bundle for the MCP 1.10.4

Choose a tag to compare

@renanlido renanlido released this 21 Oct 16:56
705cf6d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.10.4.

SHA-256, to check the download before you install it:

8fa37712eb980342879d1b8226e64a66fc8625583c1864221184e59094e57252  tia-openness-mcp-1.10.4.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.10.4.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.10.4.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

Claude Desktop bundle for the MCP 1.10.3

Choose a tag to compare

@renanlido renanlido released this 21 Oct 00:53
705cf6d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.10.3.

SHA-256, to check the download before you install it:

bd888f984261a6398ff4142928f51749ba37d9e6656a5cf81feaf0076c18a217  tia-openness-mcp-1.10.3.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.10.3.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.10.3.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.

Claude Desktop bundle for the MCP 1.10.2

Choose a tag to compare

@renanlido renanlido released this 20 Oct 20:00
705cf6d

Claude Desktop bundle (.mcpb) of the PLCWare tia MCP server, version 1.10.2.

SHA-256, to check the download before you install it:

66419a8939af9a593c9e9816c17097894f87732dd5dd694abc857650bb32d87a  tia-openness-mcp-1.10.2.mcpb
  • Windows (PowerShell): Get-FileHash tia-openness-mcp-1.10.2.mcpb -Algorithm SHA256
  • macOS / Linux: shasum -a 256 tia-openness-mcp-1.10.2.mcpb

Install: open the file (double click), or in Claude Desktop go to Settings > Extensions > Advanced settings > Install Extension... and pick it. Fill in the PLCWare API URL (http://localhost:5000 when PLCWare Desktop runs on the same machine). Claude Desktop does not update a bundle installed from a file: to move to a newer version, download its file and install it again.

The bundle is unsigned and has not been verified on every Claude Desktop build yet (the .exe and the Microsoft Store build). Report problems as an issue on this repository.

The Pre-release label is only a means: it keeps this release from becoming the repository's latest release, which is where PLCWare Desktop is downloaded. It says nothing about the maturity of the bundle. PLCWare Desktop updates itself from the app-v* releases and ignores this one.