TiaCommander MCP Server

official

MCP server for Siemens TIA Portal — AI-assisted PLC programming, hardware config, cross-references, deployment via the Openness API. 16 tools, 166 actions.

Documentation

TiaCommander — MCP Server for Siemens TIA Portal

Version2.26.3
ProtocolMCP 2024-11-05 (stdio)
Runtime.NET Framework 4.8
TIA PortalV15.1 – V21* (Openness API, tested on V19)
LicenseProprietary (free beta)

*V15.1–V18 and V20–V21 are expected to work as TIA Portal maintains backward-compatible Openness APIs across versions, but have not been tested. Only V19 is fully tested.


Overview

TiaCommander is an MCP server that connects AI assistants to Siemens TIA Portal via the Openness API. It enables AI-assisted PLC programming, project management, library operations, hardware configuration, cross-reference analysis, and deployment — all through natural language.

Tested AI clients: Claude Desktop, Claude Code, VS Code (Copilot), Cursor, Windsurf, Codex CLI, Gemini CLI.

16 tools, 166 actions covering the full TIA Portal project lifecycle.


What's in the download?

TiaCommander-v2.26.3-portable/
├── docs/
│   ├── configs/
│   │   ├── claude_code.txt
│   │   ├── claude_desktop_config.json
│   │   ├── codex_cli_config.toml
│   │   ├── cursor_mcp.json
│   │   ├── gemini_cli_settings.json
│   │   ├── generic_stdio.json
│   │   ├── vscode_copilot_mcp.json
│   │   └── windsurf_mcp_config.json
│   ├── 1-QUICKSTART.md
│   ├── KNOWN_LIMITATIONS.md
│   ├── LICENSE.txt
│   └── README.md
├── data/
│   └── exports/                       ← Export output folders
│       ├── alarm_text/
│       ├── hardware/
│       ├── tag/
│       └── watch/
├── help/
│   ├── github-offline.html
│   └── readme-offline.html
├── Resources/
│   ├── logoBlack.png
│   └── tiacommander.png
├── runtimes/                          ← WebView2 native loaders
├── Templates/                         ← Block XML + alarm templates
├── x64/                               ← SQLite native library (64-bit)
├── x86/                               ← SQLite native library (32-bit)
├── CHANGELOG.md
├── EPPlus.dll
├── EPPlus.Interfaces.dll
├── LICENSE.txt
├── Microsoft.Bcl.AsyncInterfaces.dll
├── Microsoft.IO.RecyclableMemoryStream.dll
├── Microsoft.Web.WebView2.Core.dll
├── Microsoft.Web.WebView2.WinForms.dll
├── QUICKSTART.md
├── README.md
├── System.Buffers.dll
├── System.ComponentModel.Annotations.dll
├── System.Data.SQLite.dll
├── System.IO.Pipelines.dll
├── System.Memory.dll
├── System.Numerics.Vectors.dll
├── System.Runtime.CompilerServices.Unsafe.dll
├── System.Security.Cryptography.Xml.dll
├── System.Text.Encodings.Web.dll
├── System.Text.Json.dll
├── System.Threading.Tasks.Extensions.dll
├── TiaCommander.exe                   ← MCP server + Manager GUI
└── TiaCommander.exe.config

No installer, no registry changes, no system modifications. Extract, configure, and run. Download the latest .zip from GitHub Releases.

Claude Desktop users: Download the .mcpb bundle from Releases and install via Settings → Extensions → Advanced Settings → Install Extension. No config file editing needed. See the Quick Start Guide for details.

Prerequisite: Siemens TIA Portal V15.1 or later must be installed on your machine. TiaCommander loads Siemens Openness libraries directly from your TIA Portal installation at runtime — it will not start without TIA Portal.


Why this tool exists?

First things first — we are software developers and automation engineers who use Siemens products daily — in our own facilities, at client sites, and in every project that needs industrial automation. We love it. With Siemens, it's simple — it just works. Every time. All the time.

During years of hands-on programming, wiring, testing, debugging and making things happen with Siemens PLCs, we have built TiaCommander just for our own internal needs. That's the honest reason why it exists — we built it for ourselves, and we find it awesome. It speeds things up tenfold, sometimes twentyfold, and sometimes more — until you ask yourself: how the hell were we getting things done before?!

You can get full project context through your AI assistant in under a minute. Create any block in seconds — SCL, LAD, FBD, DB — get interface structures, build multi-instance DBs, run cross-references, compile, debug, retrieve errors, and a lot more.

Every tool you see in the tool map below is built from what we actually need or use in our daily operations with Siemens PLCs. Whether you're working with S7-1200 or S7-1500 series — it doesn't matter. If Siemens TIA Portal supports it, you can use TiaCommander to manage it.

Now that we're making this tool public — we're genuinely keen on what features you're missing for your development workflow. Don't be shy — submit a feature request, file a bug report, or just tell us what you think. As an Engineer to Engineer — we read every line of feedback.

Enjoy TiaCommander.


Architecture

AI Clients
  Claude Desktop / Code · Cursor · VS Code / Copilot · Windsurf · Codex CLI · Gemini CLI
    │
    │  JSON-RPC 2.0 · stdio
    ▼
TiaCommander MCP Server
  16 tools · 166 actions · standalone I/O · .NET Framework 4.8
    │
    │  Siemens Openness API
    ▼
TIA Portal  (V15.1 – V21*, tested on V19)
    │
    ▼
S7-1200 · S7-1500 · S7-300 · S7-400 · ET 200

Tool Map

Tool / Action#Description
open_managerLaunch Manager GUI for registration, license, configuration
get_infoServer version, tool count, license status
session15Entry point — connect to TIA Portal, manage projects
    connectAttach to running TIA Portal (withUI=true by default)
    launchStart new TIA Portal instance (withUI=true by default)
    disconnectRelease handle, optionally close TIA
        ↳ closeTiaAlso terminate TIA Portal process
        ↳ saveChangesprompt / save / discard / auto
    openOpen .ap19 project (auto-launch TIA if needed, idempotent)
    close_projectClose with save/discard/auto
    get_projectCurrent project name, path, version
    list_devicesEnumerate devices — needed by all other tools
    saveSave project
    is_dirtyCheck unsaved changes
    createCreate new project (withUI=true by default)
    save_asSave under new name/location
    archiveExport .zap19 archive
        ↳ archivationModeNone / Compressed / DiscardRestorableData
    configureSet default paths (projects, archives, exports, libraries)
    list_archivesList .zap* archives from configured root
blocks_read14Inspect, compile, export blocks
    listList all blocks with type/number/language
        ↳ typeFilterall / code / OB / FB / FC / DB / GlobalDB / InstanceDB
        ↳ includeInstanceDbsExpand instance DB roll-up
    get_detailsBlock info, size, timestamps
    get_interfaceFull interface structure (In/Out/Static/Temp)
    get_all_interfaces_summarySummary across all blocks
    get_xml_rawRaw XML content inline
    export_xml_inlineParsed XML structure inline
    export_xml_fileExport XML to file or inline (returnInline)
    export_sourceExport SCL/STL source
    export_all_xmlExport all blocks to directory or inline
    compile_blockCompile single block
    compile_allCompile all blocks
    check_consistencyBlock consistency status
    get_compiler_messagesAll compiler messages
    get_compiler_errorsErrors only
blocks_write15Create, delete, import, modify blocks
    create_fbCreate function block (number auto-assigned if omitted)
    create_fcCreate function (number auto-assigned if omitted)
    create_obCreate organization block (number auto-assigned if omitted)
    create_blockFull block creation with interface + logic
        ↳ blockTypeFB / FC / OB
        ↳ languageLAD / SCL / FBD / STL (69 LAD/FBD instruction types)
        ↳ memoryLayoutOptimized (default) / Standard
        ↳ interfaceCustom In/Out/InOut/Static/Temp/Constant sections
        ↳ networks[]Multi-network blocks with per-network SCL/title/comment
    delete_blockDelete any block (optional force for orphaned instance DBs)
    import_xml_inlineImport block from XML string
    import_xml_fileImport block from file or export DB (exportId)
    add_multi_instance_memberAdd static member to FB (bulk: members[])
    remove_multi_instance_memberRemove static member from FB
    rename_blockRename block and/or change number
    update_networkUpdate network title/comment
    update_network_elementSurgical edit of Call elements
        ↳ newTargetRetarget to different FB/FC
        ↳ newInstanceSwap instance DB
        ↳ pinWiresRewire input/output pins to tags
    add_networkInsert empty network at position
    delete_networkRemove network by index
    replace_networkReplace network title/comment
db9Data block operations
    listList all global and instance DBs
    get_structureFull DB structure via XML parse
    createCreate new global DB (number auto-assigned if omitted)
    create_instance_dbCreate instance DB for an FB
    deleteDelete data block
    add_memberAdd member to global DB (bulk: members[])
    delete_memberRemove member from global DB (bulk: memberNames[])
    update_memberUpdate member type, start value, comment, access flags
    update_member_commentUpdate member comment only
tag12Tag tables, tags, assignment list
    list_tablesList all tag tables
    get_table_detailsTags in a table with addresses/types
    searchSearch tags by name (partial match)
    create_tableCreate new tag table
    delete_tableDelete tag table
    add_tagAdd tag to table (bulk: tags[])
    delete_tagRemove tag from table (bulk: tagNames[])
    update_commentUpdate tag comment
    set_accessSet external access flags (accessible, visible, writable)
    get_assignment_listAddress occupancy for M/I/Q areas + HW I/O
        ↳ mode=declaredAll declared tag addresses (default)
        ↳ mode=usedOnly addresses referenced in block code
        ↳ mode=conflictsDetect addresses in 2+ blocks (Q=error, M=info, I=hidden)
    find_next_freeNext free address with alignment (Bool/Byte/Word/DWord)
        ↳ mode=declaredSkip all declared tag addresses (default, safest)
        ↳ mode=usedSkip only code-referenced addresses
    export_tag_table_dataExport tag table to CSV or XLSX
udt10User-defined type operations
    listList all UDTs
    get_structureUDT member structure
    createCreate new UDT
    deleteDelete UDT
    add_memberAdd member to UDT (bulk: members[])
    delete_memberRemove member (bulk: memberNames[])
    update_memberUpdate member type, initial value, comment
    update_member_commentUpdate member comment
    export_xmlExport UDT to XML (file or inline)
    import_xmlImport UDT from XML (filePath / xmlContent / exportId)
watch13Watch and force table debugging
    list_tablesList all watch + force tables
    create_tableCreate watch table
    delete_tableDelete watch table
    rename_tableRename watch table
    clear_tableRemove all entries
    import_tableImport from XML (filePath / xmlContent / exportId)
    get_entriesList entries with addresses/formats
    add_entryAdd watch/force entry
    update_entryUpdate entry fields
    delete_entryRemove entry by address
    export_tableExport to XML (file or inline)
    export_watch_dataExport watch table to CSV or XLSX
    export_force_dataExport force table to CSV or XLSX
hardware12Hardware config, network, I/O
    get_deviceSingle device configuration
    get_rack_slot_detailsRack/slot topology + I/O assignments
    get_full_configAll devices configuration
    get_networkSubnets, nodes, IO systems
    get_io_mapFull I/O address map
    compile_deviceCompile single device HW
    compile_allCompile all HW
    export_csvDevice list to CSV
    export_xlsxDevice list to Excel
    export_io_mapFull device I/O map (rack/slot + tags) to CSV or XLSX
    export_hardware_mapRaw CAx/AML hardware data to CSV or XLSX
    set_network_configSet IP, subnet, PROFINET name, station name
library26Library types, master copies, lifecycle
    list_librariesList project + open global libraries
    get_infoLibrary details + counts
    list_folderBrowse folder contents
        ↳ sectiontypes / master_copies / both
    get_treeRecursive tree dump
        ↳ sectiontypes / master_copies / both
        ↳ nestedFlat list (default) or indented hierarchy
        ↳ includeItemsfalse = folder structure only (fast orientation)
    findSearch by glob pattern (* and ?)
        ↳ sectiontypes / master_copies / both
    get_typeType details + version list
        ↳ includeXmlInline XML body (capped ~30KB)
        ↳ versionlatest_committed (default) / explicit / latest_any
    get_master_copyMaster copy metadata
    publish_block_as_master_copyPublish FB/FC/OB to library
        ↳ onCollisionautoRename / replace / fail
    publish_plc_type_as_master_copyPublish UDT to library
    delete_master_copyDelete master copy
    instantiate_master_copyCopy master copy into project
    instantiate_library_typeInstantiate versioned type
    add_to_multi_instance_fbAdd type as multi-instance member
    create_library_folderCreate folder in library
    delete_library_folderDelete folder (recursive option)
    export_type_xmlExport type version to XML file
    open_global_libraryOpen .al19 file
        ↳ openModeReadOnly (default) / ReadWrite
    close_global_libraryClose global library
    create_global_libraryCreate new .al19
    save_global_librarySave global library
    archive_global_libraryArchive to .zal19
    update_checkPreview what update_project would change
    update_projectApply library updates to project (destructive)
        ↳ deleteUnusedVersionsAuto-delete versions with no instances
    promote_to_globalCopy types to global library
        ↳ forceUpdateModeSetOnlyHigher / ForceSetAny / NoDefaultVersionChange
        ↳ structureConflictModeCancelIfConflicts / UpdateStructure / RetainStructure
    compare_to_targetDiff two libraries
    delete_unused_typesRemove types with no instances (dry-run + confirm)
xref4Cross-reference analysis
    get_referencesCross-refs for one block (who it calls, what it reads/writes)
        ↳ filterall / with_refs / without_refs / unused
    find_unusedAll blocks not called from any OB chain
    find_callersWhich blocks call/reference a target block
    find_orphaned_instance_dbsInstance DBs whose owning FB is missing
alarm_text15PLC alarm text lists, entries, alarm classes
    list_textlistsList system + user text lists
    create_textlistCreate text list (optionally with entries)
        ↳ listRangeDecimal (default) / Binary / Bit
    get_entriesRead entries for a text list
    add_entriesAdd entries to text list
    update_entriesUpdate entries by From value
    delete_entriesDelete entries by From value
    update_textlist_commentUpdate comment (direct API)
    delete_textlistDelete user text list
    export_alarm_textsExport alarm instance texts to XLSX
    import_alarm_textsImport alarm texts from XLSX
    export_textlistsExport text lists to XLSX
    import_textlistsImport text lists from XLSX
    export_alarm_classesExport alarm class definitions
    import_alarm_classesImport alarm class definitions
    export_alarm_dataExport alarm data to CSV or XLSX (scope: texts/lists/classes)
admin11Server administration, usage analytics, export storage
    get_statsCall statistics per tool+action (counts, errors, avg duration)
    get_recent_errorsLast N failed calls with device/firmware context
    get_device_profilesAll unique devices seen (order number, firmware, TIA version)
    get_versionServer version, DB path, DB size
    get_system_infoOS, .NET, TIA Portal version, uptime, memory
    list_exportsRecent exports stored in DB (with size, format, timestamp)
    get_exportRetrieve export content with paging
        ↳ rawContent only, no metadata header
    delete_exportDelete single export
    clear_exportsDelete expired exports
    save_exportSave export to file (auto-decodes base64 for XLSX)
    open_fileOpen exported file with default Windows application
diagnostics6Runtime PLC state, network scan, connection config, compare
    scan_devicesNetwork scan — discover accessible PLCs
    configure_connectionSet up download connection programmatically
    get_plc_statusOnline/offline state
    go_onlineConnect to PLC
    go_offlineDisconnect from PLC
    compare_online_offlineCompare project vs PLC — all blocks, tags, UDTs
download_upload4Download to PLC, upload station into project
    download_checkPre-flight: connection, compile status
    download_to_deviceDownload to PLC (requires confirm)
        ↳ modesoftware_changes (default) / software / hardware_software / hardware
        ↳ stopModulesStop PLC before download (default: false)
    upload_checkEnumerate upload connection options
    upload_stationUpload PLC station into project (requires confirm)

Total: 16 tools (14 meta-tools + 2 standalone), 166 actions

Each meta-tool groups related actions behind a single action parameter. get_info and open_manager are standalone utilities that work without a license. Start with session to connect, then use any other tool.


Tested Hardware

TiaCommander should work with any PLC supported by TIA Portal and the Openness API. The following devices have been tested in-house with full tool coverage:

DeviceOrder NumberFirmwareTIA Portal
S7-1200 CPU 1212C DC/DC/Rly6ES7 212-1BE31-0XB0V3.0V19
S7-1200 CPU 1214C DC/DC/DC6ES7 214-1AG31-0XB0V3.0V19
S7-1200 CPU 1214C DC/DC/DC6ES7 214-1HG40-0XB0V4.5V19
S7-1200 CPU 1215C DC/DC/DC6ES7 215-1AG31-0XB0V3.0V19
S7-1200 CPU 1215C DC/DC/Rly6ES7 215-1BG31-0XB0V3.0V19
S7-1200 CPU 1217C DC/DC/DC6ES7 217-1AG40-0XB0V4.2V19

This list will grow as we collect telemetry data from users and expand testing across more device families, firmware versions, and TIA Portal editions.


Block Creation

TiaCommander creates complete PLC blocks from structured JSON descriptions:

  • SCL blocks — via External Source API (firmware-agnostic)
  • LAD/FBD blocks — via FlgNet XML builder with 69 verified instruction types:
    • Bit logic, timers (TON/TOF/TP), counters (CTU/CTD/CTUD)
    • Math (Add, Sub, Mul, Div, Mod, Abs, Sqrt, Sin, Cos, etc.)
    • Comparators (EQ, NE, GT, GE, LT, LE)
    • Move & conversion, word logic, shift & rotate, selection
    • Program flow (FB/FC calls with parameter wiring, JMP/JMPN, RET, LABEL)
  • Block numbers — auto-assigned if omitted, or explicit
  • Custom interfaces — Input, Output, InOut, Static, Temp, Constant sections

Safety

The MCP server treats PLC deployment operations as destructive. These actions require explicit confirmation strings before execution:

ActionWhat it does
download_to_deviceDownloads software/hardware to a live PLC
upload_stationUploads a PLC station into the project
delete_unused_typesRemoves library types with zero instances

All other operations work within the TIA Portal project and are reversible before download.


Standalone I/O

TiaCommander works fully standalone — no external file management tools required.

Three input modes for every import: file path, inline content, or export database reference.

Three output modes for every export: inline (default), export database, or file.

Exports auto-expire after 24 hours. Manage via admin tool actions.

However, we strongly recommend pairing TiaCommander with Desktop Commander (GitHub) for your daily AI agent workflow. Desktop Commander gives your AI assistant terminal access, file management, and code editing capabilities across your entire OS. This is not a paid promotion — we use Desktop Commander every day in our own work, and it happens to be created by our fellow Latvian, Eduards Ruzga. It's free, open-source, and it makes everything better.


Data & Privacy

All data stays on your machine. The local SQLite database stores tool call statistics, device profiles, error log, and temporary export cache.

TiaCommander collects limited telemetry to improve the product:

  • Error reports — when a tool call fails, the error type and context are sent so we can identify and fix issues.
  • Tool usage statistics — which tools and actions are used most often, to understand what is most valuable.
  • AI client information — which AI assistant is connected (client name and version), to ensure compatibility.

No PLC program data, project files, or block contents are ever transmitted.

Your personal information (name, surname, email) provided during registration is governed by European Union GDPR rules. We do not share, sell, or disclose your data to third parties. We will never send you marketing materials or anything not directly relevant to your use of TiaCommander — unless you explicitly ask us to.


What's Next

TiaCommander is actively developed. Here's what we're working on:

  • HMI integration — Openness API access to HMI screens, tags, and alarm views
  • Runtime monitoring — live PLC data via Web API and OPC UA (S7-1200 V4.4+, S7-1500)
  • TIA Portal V20 support — updated Openness DLLs and new API features
  • PLCSIM Advanced — simulation control for offline development and testing
  • S7-1500 expanded testing — broader device family coverage with telemetry-driven validation

Have a feature idea? Submit it on GitHub.


Quick Start

Claude Desktop (one-click): Download TiaCommander.mcpb from Releases, then install via Settings -> Extensions -> Advanced Settings -> Install Extension. Done.

All other AI clients: Download the portable ZIP and see the Quick Start Guide -- everything you need to get up and running in 5 minutes: extract, Openness group setup, AI client configuration for all 7 tested clients, license activation, and first commands.

Ready-to-use config files for each AI client are in the configs/ folder.


License & Feedback

TiaCommander is proprietary software published by SIA A4 Studio. During the beta period, the tool is completely free with unlimited usage and all tools available — no restrictions.

In return, we count on you to help us make TiaCommander better. If you encounter a bug, have an idea for a new feature, or just want to share how you use the tool in your workflow — we want to hear from you:

Every report, every suggestion, every comment helps us build a better tool for the Siemens automation community.

See LICENSE.txt for full terms. Visit tiacommander.com for more information.


Trademarks

TiaCommander™ is a trademark of SIA A4 Studio. Siemens, TIA Portal, SIMATIC, S7-1200, S7-1500 are trademarks of Siemens AG. TiaCommander is not affiliated with, endorsed by, or sponsored by Siemens AG.