
asqi-carter/lgx-mcp
Developer toolsMCP for connecting Logix Studio Designer to LLMs
Overview
Version 1.0.1. Verified on FactoryTalk Logix Echo only; not verified on a physical controller. See docs/verified-on.md. MCP server for Allen-Bradley/Logix PLCs. Static .L5X analysis, live tag access over CIP (EtherNet/IP), and — never typed into a config. Open a project, and lgx-mcp reads your tag names, UDT member descriptions, safety-tag prefixes, and rung neutral-text to build a write-gate policy: every tag is classified as granted or denied, and every decision carries a provenance string naming the exact L5X element that justified it. "Open this project and tell me what an agent would be allowed to write." *"Read MainRoutine and check whether every rung that sets Motor_Run also checks Safety_OK."* With your own licensed Logix Designer and Logix Designer SDK, an agent can propose online rung edits in Logix Designer while you watch. An edit moves through a pending-edit lifecycle: propose, then pending on the controller, then test, then assemble.
README
lgx-mcp
Version 1.0.1. Verified on FactoryTalk Logix Echo only; not verified on a physical controller. See docs/verified-on.md.
MCP server for Allen-Bradley/Logix PLCs. Static .L5X analysis, live tag
access over CIP (EtherNet/IP), and write permissions derived from your own
project file — never typed into a config. Open a project, and lgx-mcp reads
your tag names, UDT member descriptions, safety-tag prefixes, and rung
neutral-text to build a write-gate policy: every tag is classified as granted
or denied, and every decision carries a provenance string naming the exact
L5X element that justified it.
“Open this project and tell me what an agent would be allowed to write.”
“Read MainRoutine and check whether every rung that sets Motor_Run also checks Safety_OK.”
What it is
The SDK lane. With your own licensed Logix Designer and Logix Designer SDK, an agent can propose online rung edits in Logix Designer while you watch. An edit moves through a pending-edit lifecycle: propose, then pending on the controller, then test, then assemble. Before anything reaches the controller, lgx-mcp can run a build check on an offline copy of your project, so undefined tags show up first. The engineer decides when to test and when to assemble: by default the agent only proposes. The lane is optional, Windows-only, and off unless you build and provision it; see Logix Designer SDK lane. It is verified on Echo only.
The rest of lgx-mcp needs no Rockwell software:
- Static analysis — open a
.L5Xfile (or, in the SDK lane, an.ACDproject) and ask about tags, data types, routines, cross-references, and diffs between two project versions, with no controller required. - Derived write-gates — the open project is the single source of truth for
what may be written:
Cmd_*andSim_*tags are writable; logic-written,Safety_-prefixed and undesignated tags are denied. Every decision traces to a specific L5X element. A partial export derives no gate; see the safety model. - Live tags over CIP — read and poll tags against a real controller using libplctag, license-free.
- Static interlock proof — check whether every rung that writes a given output tag also carries a named condition contact, and get back the exact rung(s) that do not.
What’s verified, and on what
The capabilities listed in docs/verified-on.md were
verified against FactoryTalk Logix Echo — Rockwell’s software emulator — and
none of them has been verified against a physical controller. Rockwell’s own documentation is explicit that emulated
controller behavior can differ from physical hardware. Re-verify anything you
rely on against your own physical controller before depending on it.
Requirements
- Static analysis + CIP tag access: Windows, macOS, or Linux; the .NET runtime bundled in the published binary. No Rockwell software installed.
- Project files:
.L5Xfor the core build..ACDneeds the SDK lane; without it, export your project to.L5Xfrom Logix Designer first. - SDK lane (optional): Windows, plus your own licensed Logix Designer and
Logix Designer SDK: v36 or later; verified on v38 (see
docs/verified-on.md). See Logix Designer SDK lane. - An MCP client: Claude Code, Claude Desktop, VS Code (Copilot agent mode), or any other MCP-compatible client.
Testing
make test runs without any Rockwell software: it builds and tests with the SDK
lane switched off, so the SDK-lane code is not exercised by it. Exercising that
lane needs the SDK build described in
Logix Designer SDK lane and your own Logix Designer.
The documentation tests (README, docs/, NOTICE and the safety claims) read
the documents at the repository root and run as part of make test. A few
individual tests inside shipped test files read development-only files; they
are tagged Scope=Internal and make test skips them here.
Quickstart (Windows)
From a regular PowerShell window:
git clone https://github.com/asqi-carter/lgx-mcp.git
cd lgx-mcp
powershell -ExecutionPolicy Bypass -File bootstrap\install.ps1
install.ps1 needs only PowerShell and winget: no make, bash or Python. It
installs the .NET 10 SDK if it is missing, finds your Logix Designer SDK package
(or builds the no-SDK build if there is none), builds, checks that no Rockwell
file is in the output, installs to %LOCALAPPDATA%\Programs\lgx-mcp, runs the
cold-install self-check, and registers lgx-mcp with Claude Desktop. Add
-EnableLiveWrites to allow tag writes and -EnableStudioAutomation to let the
agent click Test and Assemble in your open Studio window; both are off by
default. -Client ClaudeCode or -Client VSCode registers with those instead.
Then fully quit Claude Desktop from its tray icon and start it again. Under
Settings → Developer, lgx-mcp shows running; ask Claude to run
logix_doctor. In Cowork, start a new task: the lgx-mcp tools are already
there (see Claude Desktop setup).
The sections below cover the release zip, the manual steps and every option.
Install (10 minutes)
Prerequisites
- To build from source with
make release-nosdk(not needed to run a published release zip):make,bash,python3,sha256sum(orshasum) and the .NET 10 SDK. On Windows run it from WSL or Git Bash. - Microsoft Visual C++ 2015–2022 Redistributable (x64) — Windows only, for
the CIP backend (
backend="cip"). make,tarandpwsh(PowerShell 7) — to run the tests.
Get lgx-mcp
On Windows, run bootstrap\install.ps1 as in the Quickstart.
Or build from source and run the manual steps below. Release zips
(lgx-mcp--win-x64.zip, lgx-mcp--linux-x64.zip) can be
unpacked in place of the build, when published.
To build the zips from source, run this in bash (Linux, macOS, WSL or Git Bash on Windows), not in PowerShell:
make release-nosdk
This writes dist/lgx-mcp--win-x64.zip,
dist/lgx-mcp--linux-x64.zip and dist/SHA256SUMS. Unpack the zip for
your platform, then on Windows run the installer from the unpacked directory:
powershell -ExecutionPolicy Bypass -File bootstrap\setup.ps1 -AppDir
`` is the unpacked directory that contains LogixMcp.exe.
setup.ps1 runs a cold-install gate that launches the binary and drives
logix_ping → logix_open_project before declaring success. The
logix_connect SDK probe is not part of the no-SDK gate.
The release zip contains no Rockwell software.
Windows execution policy. If the release zip was downloaded, Windows marks it as blocked and PowerShell may refuse to run the scripts. Unblock the zip before unpacking it, then run the installer with the policy bypassed for that one process:
Unblock-File .\lgx-mcp--win-x64.zip
powershell -ExecutionPolicy Bypass -File bootstrap\setup.ps1 -AppDir
To register lgx-mcp with your MCP client, run
bootstrap/setup-mcp-client.ps1 with -Client ClaudeCode, ClaudeDesktop or
VSCode. Without -WriteConfig it only prints the command or JSON block it
would use; with -WriteConfig it applies it. It needs the same execution
policy bypass:
powershell -ExecutionPolicy Bypass -File bootstrap\setup-mcp-client.ps1 -Client ClaudeCode -AppDir -WriteConfig
-EnableLiveWrites applies to every build. -EnableStudioAutomation,
-PublishMode and -LiveFinalize belong to the SDK lane: for a no-SDK build
setup-mcp-client.ps1 refuses the first two, and -LiveFinalize has no effect.
For an SDK build they set LGX_ENABLE_STUDIO_AUTOMATION, LGX_PUBLISH_MODE and
LGX_ENABLE_LIVE_FINALIZE. See Logix Designer SDK lane.
Or point your MCP client at the published binary as a stdio server by hand. See:
| Claude Code | CLI registration |
| Claude Desktop | GUI client config |
| VS Code | Copilot agent mode / native MCP |
Tools
42 tools, each with exactly one row below: 29 in the core build, and 13 more that
exist only in an SDK build (the SDK lane tables). The Parameters column lists every
argument a tool takes: required ones first, then optional ones marked ? with
their defaults where there is one; — means the tool takes none. The
tool reference says what each tool does and returns,
what it can change, and the gates and flags it needs, and describes the main
parameters in each tool’s entry.
Read and analyze
Nothing here writes a tag, a file, or the controller (except session state for open/close).
| Tool | Parameters | Purpose |
|---|---|---|
logix_open_project |
path |
Load a .L5X file (an .ACD in an SDK build). A full controller export derives the write gate when you connect; a routine or program export is reported as partialExport with an exportTarget and derives none. |
logix_close_project |
— | Unload the open project. |
logix_project_summary |
— | Controller info and per-program tag and routine counts. |
logix_find_tags |
namePattern?, dataType? |
Filter tags by glob name pattern and/or data type. |
logix_get_routine |
program, routine |
Rung-by-rung neutral text and comments for a routine. |
logix_get_rung_diagram |
program, routine, rung, format? (default text) |
Draw one rung or a range of up to 10 as ladder text and/or SVG. |
logix_trace_origin |
tag, maxDepth? (default 6), focus?, format? (default text) |
Trace where a tag’s value comes from: its writers, their sources and gating conditions, back to literals and external inputs. |
logix_cross_reference |
tag |
Every rung that reads or writes a tag. |
logix_diff_projects |
pathA, pathB, normalize? (default true) |
Component-level diff between two .L5X files. |
logix_diff_against_controller |
l5xPath |
Diff an .L5X file against the controller image an online SDK session uploaded at connect. Without one (the core build holds none) it returns NoActiveSession or NotOnline. |
logix_list_datatypes |
nameContains?, userOnly? (default true) |
Data types in the open project, with member detail. |
logix_list_modules |
probe? (default false) |
The I/O module tree, optionally probing each module read-only. |
logix_gate_report |
commandPrefixes?, safetyPrefixes? |
What this session may write, and the L5X element behind each decision. |
logix_verify_interlock |
outputTag, conditionTag |
Statically prove whether every rung writing an output carries a condition contact. |
logix_lint |
program?, routine?, namingPattern? |
Static lint of ladder routines (defeated interlocks, bad JSR calls, divide by zero, and more). |
logix_document |
scope? (controller, program, routine), program?, routine?, includeRungText? (default true) |
Deterministic Markdown documentation of the open project. |
logix_list_skills |
— | List the bundled agent-playbook skills. |
logix_get_skill |
name |
Return the full playbook for a named skill. |
logix_list_options |
parameter? |
List the legal values of every fixed-choice parameter, or of one. |
logix_read |
tag |
Read a tag’s current value. |
logix_poll |
tags, count? (default 3), intervalMs? (default 1000) |
Poll a set of tags and report only what changed. |
logix_diagnose |
controllerIp? |
Read-only controller fault diagnosis. |
Live writes
Each of these is off by default or needs an explicit confirmation. See the safety summary.
| Tool | Parameters | Purpose |
|---|---|---|
logix_write |
tag, value |
Write one tag; gate-enforced, live targets need LGX_ENABLE_LIVE_WRITES=1. |
logix_controller_mode |
mode?, confirm? (default false) |
Read the controller mode; mode changes on a live controller are not applied. |
logix_import_datatype |
acdPath, datatypeName, saveAs, l5xPath?, members?, collision?, dryRun? (default true), confirm?, overwrite? |
Offline datatype import into a new copy (a file write, not a live one); dryRun by default. The core build writes an .L5X copy; an .ACD saveAs needs the SDK lane. |
Setup
| Tool | Parameters | Purpose |
|---|---|---|
logix_ping |
— | Server identity, version, and which opt-in switches are on. |
logix_doctor |
commPath?, controllerIp? |
Read-only setup and health check with the next step for every problem. Available in every build. |
logix_connect |
backend? (cip default, virtual, l5x, and sdk in an SDK build), gateway?, path?, useVirtual?; SDK build only: sdkMode? (offline default, online), sdkCommPath?, allowControllerDownload? (default false), confirmedByUser? |
Open a tag session: cip (live), virtual, l5x, or sdk (the Logix Designer SDK lane). On a partial export no gate is derived and writes are refused (WriteGateRequired) unless LGX_WRITE_ALLOWLIST is set. A controller download (allowControllerDownload) is off by default; see LGX_ENABLE_CONTROLLER_DOWNLOAD. |
logix_connect_status |
— | Read-only. Progress of a background SDK connect after logix_connect answered connecting: status (connecting, connected, failed), connectId, phase, elapsedMs, phaseTimings. connected carries the normal connect result, failed the original typed error; with no connect in flight it returns the last outcome or NoConnectInProgress. |
SDK lane: rung edits, build and test
Present only in an SDK build, and they work only in an SDK session
(logix_connect with backend="sdk"). See
Logix Designer SDK lane for what each does to a
running controller.
| Tool | Parameters | Purpose |
|---|---|---|
logix_export_rungs |
xPath |
Export a routine’s rungs as an L5X fragment (read-only). |
logix_propose_rung_edit |
routineXPath, insertPosition, replaceCount, rungs?, tags?, l5xFragment?, offline? (default false), target? (workstation default, controller, live), confirmedByUser? (default false), expectedRungText? |
Stage a rung edit, publish it as a pending edit (target="controller"), or publish and finalize it in one step (target="live"). Gate-enforced on every tag the edit references; controller and live need LGX_ENABLE_LIVE_WRITES=1, and live also LGX_ENABLE_LIVE_FINALIZE=1 and confirmedByUser=true. |
logix_create_routine |
program, name, type? (only RLL), description?, confirmedByUser (default false) |
Create an empty ladder routine in a program, ready for logix_propose_rung_edit. Needs LGX_ENABLE_LIVE_WRITES=1 and confirmedByUser=true. Refused with PendingEditsBlockImport while the program has unassembled edits. The routine stays even if later edits are cancelled; the SDK cannot delete it, so remove it in Studio. |
logix_pending_edits |
program?, routine? |
Read the pending-edit state of a routine, a program or the whole controller. Read-only. |
logix_clear_staged |
routine?, program? |
Discard this session’s staged rungs and tags for one routine, or for all when routine is omitted. Server-side only; the controller is not touched. |
logix_build |
target? (default, physical, echo) |
Structural build check of an offline saved copy of the session’s project; never goes online or downloads. Needs Logix Designer v37 or later. |
logix_run_test |
cases, confirmedByUser? (default false) |
Scripted logic tests that write inputs and check outputs. Emulator only: refused on any other controller. Needs LGX_ENABLE_LIVE_WRITES=1 and confirmedByUser=true. |
logix_finalize_edits |
program, routine, confirm? (default false) |
Never assembles an existing pending zone. It reports the zone and names the way to accept or cancel it. |
SDK lane: Studio automation
Each of these drives the Studio 5000 Logix Designer window on the engineer’s
interactive desktop (the SDK has no call for these steps). All are refused unless
LGX_ENABLE_STUDIO_AUTOMATION=1 and confirm=true, and they refuse when Studio
is not installed or nothing is pending. Accept, test, untest and assemble also need
LGX_ENABLE_LIVE_WRITES=1.
| Tool | Parameters | Purpose |
|---|---|---|
logix_accept_pending_edits |
program, routine, confirm? (default false) |
Accept the pending edits and finish the zone in one step. The new rungs then execute on a running controller. |
logix_test_pending_edits |
program, routine, confirm? (default false) |
Test the accepted edits: the new logic executes and the original is kept. |
logix_untest_pending_edits |
program, routine, confirm? (default false) |
Put the original logic back after a test. |
logix_assemble_pending_edits |
program, routine, confirm? (default false) |
Assemble a tested zone. Irreversible. |
logix_cancel_pending_edits |
program, routine, confirm? (default false) |
Cancel the pending or accepted edits. |
Environment variables
Every variable the server reads. All are optional. Rows marked SDK lane apply
only to an SDK build (see Logix Designer SDK lane); a
no-SDK build ignores them. Set them in the environment of the MCP server process (for example with -e NAME=value on claude mcp add,
or the env block of your client’s config).
| Variable | Default | Effect |
|---|---|---|
LGX_ENABLE_LIVE_WRITES |
off | 1, true or yes allows live tag writes and controller mode requests. Without it, logix_write and logix_controller_mode are refused on live targets. Reported by logix_ping as capabilities.liveWrites. |
LGX_CONNECT_SYNC_BUDGET_S |
20 |
Seconds an SDK-backend logix_connect waits before answering status: "connecting" (with a connectId, the current phase and elapsedMs) while the connect keeps running in the server. A connect that finishes within the budget returns its normal result. Clients that declare the MCP Tasks extension run the connect as a task instead and are not affected. 0 always answers connecting at once. Values above 600 are clamped to 600 s (logged). |
LGX_WRITE_ALLOWLIST |
unset | Path to a text file listing the tags a session may write. With no project open it is the only check on a live session; with a full export it only narrows what the derived gate grants; with a partial export it is the only source of grants and the partial file’s denies and ranges still apply. See the safety model. |
LGX_GATE_COMMAND_PREFIXES |
Cmd_,Sim_ |
Comma-separated tag-name prefixes (case-insensitive) that designate writable command tags, for example Cmd_,Sim_,HMI_. * alone designates every tag name. It relaxes naming only; logic-written, safety, External Access and consumed tags stay denied. An entry with characters outside A-Z a-z 0-9 _ fails logix_connect with GateConfigInvalid. The Safety prefix is not configurable. logix_connect and logix_gate_report report commandPrefixes and commandPrefixesSource. See the safety model. |
LGX_TAG_ROUTE |
auto |
Which channel carries tag reads and writes in an SDK online session: auto uses CIP when a CIP connection to the same controller succeeds and otherwise the SDK; cip uses CIP only and fails with TagRouteUnavailable when CIP cannot connect; sdk always uses the SDK. The SDK session stays the source of types and the write gate; CIP carries only the values. In auto a CIP failure during a call is retried once over the SDK and the result says so (routeNote); in cip it is returned as a typed error. Every read, write and poll result carries route, and logix_doctor (check session) shows the active route and why it was chosen. An unknown value fails logix_connect. SDK lane. |
LGX_AUDIT_MAX_MB |
50 |
Rotate audit.jsonl before an append would take it past this many megabytes. 0 never rotates; unset, unparsable or negative values use the default. |
LGX_AUDIT_KEEP |
5 |
Number of rotated audit files kept (audit.1.jsonl, audit.2.jsonl, …). Minimum 1; the oldest is deleted. |
LGX_AUDIT_FAIL_CLOSED |
off | 1, true or yes checks, before the write, that the audit log can be opened for append, and refuses logix_write with AuditUnavailable if it cannot. Otherwise a failed append is reported on stderr and by logix_doctor, and the write proceeds. |
LGX_ENABLE_STUDIO_AUTOMATION |
off | 1, true or yes allows the five Studio automation tools (logix_accept_pending_edits, logix_test_pending_edits, logix_untest_pending_edits, logix_assemble_pending_edits, logix_cancel_pending_edits), which drive the Studio 5000 window on the interactive desktop. Each call also needs confirm=true; all but cancel also need LGX_ENABLE_LIVE_WRITES=1. SDK lane. |
LGX_ENABLE_LIVE_FINALIZE |
off | 1, true or yes allows logix_propose_rung_edit with target="live", which publishes and finalizes a rung in one call so it executes at once. Each call also needs confirmedByUser=true (even when LGX_PUBLISH_MODE=auto) and LGX_ENABLE_LIVE_WRITES=1. SDK lane. |
LGX_ENABLE_CONTROLLER_DOWNLOAD |
off | 1, true or yes lets logix_connect download the open project to the controller when you pass allowControllerDownload=true (backend="sdk", sdkMode="online", no comm path). A download stops the running controller (PROGRAM mode), permanently overwrites the program stored in it, goes online and returns the controller to RUN; it also disconnects other Logix Designer sessions online with it. Off by default, and it is a last resort for a controller that is empty or holds an unrelated program, where upload cannot correlate the project. Even when set, it needs LGX_ENABLE_LIVE_WRITES=1 and an explicit confirmedByUser=true on that call, which you pass only after the user approves; the server cannot verify the approval. Without the flag or the confirmation the call is refused before anything reaches the controller. SDK lane. |
LGX_PUBLISH_MODE |
confirm |
auto publishes staged rung edits without a confirmation step; anything else means confirm. SDK lane. |
LGX_IMAGE_FINGERPRINT_TTL_S |
5 |
Seconds a controller fingerprint probe stays valid. A session-image read older than this probes the controller (routine names, rung counts, TestEdits, name and serial) to notice changes made outside this session, and refreshes the changed programs; reads within it cost no probe. 0 probes on every read; unset, unparsable or negative values use the default. logix_diff_against_controller always probes. SDK lane. |
LOGIX_SDK_PATH |
unset | Directory searched first for the Logix Designer SDK assemblies. SDK lane. |
XDG_STATE_HOME |
~/.local/state |
Linux and macOS only: the log directory is $XDG_STATE_HOME/logix-mcp/logs/. Ignored on Windows, which uses %LOCALAPPDATA%\logix-mcp\logs\. |
WINDIR |
set by Windows | Read by logix_import_datatype to refuse a saveAs path inside the Windows directory. Not for you to set. |
First session, no Rockwell software
logix_open_projecta.L5Xfile.logix_gate_report— see exactly what this session may write, and why.logix_verify_interlock— statically prove (or disprove) a guard relationship between two tags.logix_connect(CIP, license-free) andlogix_reada live tag.
First online session (SDK lane)
SDK build only, with your own Logix Designer and a controller (FactoryTalk Logix
Echo is the one it is verified on). Writes are off until you set the flags named
in docs/tool-reference.md; each step’s gates are
listed there and in docs/safety-model.md.
logix_connectwithbackend="sdk"andsdkMode="online".logix_get_routine— read the routine you intend to change.logix_propose_rung_edit— stage the rung edit, then publish it as a pending edit (target="controller").- Test it: in Logix Designer, or with
logix_test_pending_edits. - Assemble it: in Logix Designer, or with
logix_assemble_pending_edits. The engineer decides when; assembling is irreversible. logix_run_test— run scripted input and output checks (emulator only).
See docs/tool-reference.md for what every tool does,
returns and can change, and docs/verified-on.md
for the capabilities verified on Echo (none verified on a physical controller). Anything not listed there is not verified.
Safety summary
- Writes are gate-enforced, not merely gate-suggested. A denied tag is rejected before anything reaches the wire; the rejection names the L5X element that caused the denial.
- Live controller writes are off by default.
Set
LGX_ENABLE_LIVE_WRITES=1to enable them. A controller mode change is requested but never applied on a live controller (ModeChangeNotApplied). Without them, the server still opens projects, runs static analysis, and reports what a session would be allowed to do. - SDK lane (SDK builds only): a controller download is off by default and
needs
LGX_ENABLE_CONTROLLER_DOWNLOAD=1,LGX_ENABLE_LIVE_WRITES=1and a per-callconfirmedByUser=true; Studio automation needsLGX_ENABLE_STUDIO_AUTOMATION=1andconfirm=true; a live rung finalize needsLGX_ENABLE_LIVE_FINALIZE=1andconfirmedByUser=true. By default an edit is only proposed, and the engineer accepts or cancels it. - This is not a safety system. Nothing in this repository may be used to satisfy a safety function. See SECURITY.md.
Full detail: docs/safety-model.md.
Logix Designer SDK lane
The SDK lane is an optional, Windows-only part of lgx-mcp that drives Rockwell’s Logix Designer SDK. It is switched off in the core build and in the release zips, which contain no Rockwell software. You build it from source against your own licensed Rockwell install; nothing from Rockwell is redistributed.
Requirements
- Windows (x64). The SDK lane does not run on Linux or macOS.
- Your own licensed Logix Designer, v36 or later, and the Logix Designer SDK
(it provides the
RockwellAutomation.LogixDesigner.CSClient.nupkg).logix_buildneeds Logix Designer v37 or later; on v36 it refuses withSdkCapabilityUnavailable. - FactoryTalk Logix Echo if you have no hardware: it is the bench controller
for trying the lane, and
logix_run_testworks only against an emulator. - For the Studio automation tools only: Studio 5000 Logix Designer running in your interactive desktop session.
- To build: the .NET 10 SDK,
makeandbash(WSL or Git Bash on Windows).
Install
-
Copy
RockwellAutomation.LogixDesigner.CSClient.2.2.1109.nupkg(the required version: Logix Designer SDK 2.2.1109;install.ps1andsetup.ps1refuse any other) from your Logix Designer SDK install (by default%PUBLIC%\Documents\Studio 5000\Logix Designer SDK\dotnet\) into a.localfeed/directory at the repository root. It is not on nuget.org and is never committed or shipped. -
Build the SDK binary, in bash:
make publish-winThe output is in
src/LogixMcp/bin/Release/net10.0/win-x64/publish. The build fails if anyRockwellAutomation*file would end up in it. -
Provision it and run the cold-install gate, in PowerShell, from the repository root:
powershell -ExecutionPolicy Bypass -File bootstrap\setup.ps1 -AppDir src\LogixMcp\bin\Release\net10.0\win-x64\publishsetup.ps1extracts the two Rockwell files it needs from your.nupkgintosdk\vendor\(pass-NupkgPathif the package is not in the default location), then launches the binary and driveslogix_ping,logix_open_projectand alogix_connectprobe withbackend="sdk"before it reports success. If the assemblies live elsewhere, setLOGIX_SDK_PATH. -
Register it with your MCP client using
bootstrap\setup-mcp-client.ps1, adding the opt-in switches you want (-EnableLiveWrites,-EnableStudioAutomation,-LiveFinalize,-PublishMode). See Install.
What the lane adds
- Online rung edits.
logix_propose_rung_editstages rungs (and the tags they use) on the workstation, publishes them to the controller as a pending edit (target="controller"), or publishes and finalizes in one call (target="live", which runs the rung at once).logix_export_rungsgives the current rung text to check against. - Pending-edit lifecycle.
logix_pending_editsreports the zone state. Moving it on (accept, test, untest, assemble, cancel) is Studio automation, off unlessLGX_ENABLE_STUDIO_AUTOMATION=1; otherwise the engineer does it in Logix Designer (Logic, Online Edits).logix_get_rung_diagramlabels pending rungs. - Structural build check.
logix_buildsaves a copy of the session’s project, opens that copy offline, builds it with the SDK and deletes it, so undefined tags show up before you publish. It never builds in the online session, goes online, downloads or changes mode. .ACDprojects.logix_open_projectand offline SDK sessions take.ACDfiles, andlogix_import_datatypecan save to an.ACD.- SDK tag route with a CIP fast path. In an online SDK session the SDK stays the
source of types and of the write gate;
LGX_TAG_ROUTEchooses whether values travel over CIP or the SDK. Withauto(the default) CIP is used when it connects and the SDK otherwise. Every read, write and poll result reports itsroute. - Emulator tests and diffs.
logix_run_testruns scripted cases against an emulator only, andlogix_diff_against_controllerdiffs an.L5Xagainst the image uploaded when the SDK session connected.
Safety and verification
Everything that changes a controller here is off by default and gate-enforced; see
the safety summary. Online edits can change what a running
machine does. Nothing in the SDK lane is a safety function, and the verification
caveat above applies to it in full: anything not listed in
docs/verified-on.md is not claimed as verified, and
nothing is verified on a physical controller.
Documentation
| Safety model | Gate derivation, write path, audit trail |
| Tool reference | Every MCP tool, parameters, returns, opt-in flags |
| Errors | Error kinds and what they mean |
| Troubleshooting | Symptom-indexed fixes |
| What’s verified | Capabilities verified on Echo; anything not listed is not verified; none verified on a physical controller |
| Security | Disclosure, threat model, safety-function disclaimer |
License
MIT · © 2026 ASQI · Not affiliated with or endorsed by Rockwell Automation. Allen-Bradley, Logix, Studio 5000, ControlLogix, and FactoryTalk are trademarks of Rockwell Automation, Inc.; this project interoperates with locally installed, separately licensed Rockwell software without redistributing it. See NOTICE.
Install
This server does not publish a one-line install command.
Open the repository installation guide New to MCP? Start with the mcpskill.org guide →