Skip to main content

0.3.0 package and tool migration: Install industriagents-ethernetip-mcp from npm (requires uv) or PyPI; the command remains ethernetip-mcp. The advertised catalog now contains 8 tools. Older tool names in the examples below remain compatibility calls. See the architecture and canonical tool guide and release guide.

ethernetip-python

Python MCP server for Rockwell/Allen-Bradley EtherNet/IP controllers. Built with pycomm3, mcp[cli] (1.x) and uv, it exposes the ethernetip-mcp entry point for AI agents and MCP-compatible clients.

Prerequisites

  • Python 3.11+
  • uv
  • Network access to a controller or the included mock server

Quick Start

Run these from this directory (ethernetip-python/).

Against a controller (read-only, the default):

uv sync
ENIP_HOST=192.168.1.10 ENIP_SLOT=0 uv run ethernetip-mcp

Against the mock PLC (start it first, see its README):

uv sync
ENIP_HOST=127.0.0.1 ENIP_PORT=5025 ENIP_JSON_BRIDGE=true uv run ethernetip-mcp

The server speaks MCP over stdio, so it waits for a client on stdin; its logs go to stderr. Configure it with environment variables; the full list is in the Configuration section of the top-level README, and .env.example shows them all.

A .env file in this directory (ethernetip-python/.env) is read automatically, but only for this server's own connection settings (ENIP_*, TAG_MAP_FILE). No other .env is read implicitly: not one in the working directory, not one in a parent directory, and none at all when the package is installed rather than run from this checkout. ENIP_WRITES_ENABLED, ENIP_SYSTEM_CMDS_ENABLED and any other variable in the automatic .env are ignored, with a warning on stderr. Set the switches in the MCP client's env, or pass a file explicitly with uv run ethernetip-mcp --env-file /path/to/eip.env, which honours every setting in it. Write tools are refused unless ENIP_WRITES_ENABLED=true.

Layout

ethernetip-python/
├── README.md
├── pyproject.toml
├── uv.lock
├── .python-version
├── .env.example        # every setting; copy for --env-file
├── src/ethernetip_mcp
│   ├── __init__.py
│   ├── cli.py          # entry point: load .env, build the server, run stdio
│   ├── server.py       # FastMCP wiring, argument errors as envelopes
│   ├── tools.py        # compatibility exports
│   ├── protocol/       # 8 advertised tools and legacy dispatch
│   ├── application/    # protocol operations
│   ├── domain/         # ports, errors and policy
│   ├── infrastructure/ # tag maps and audit
│   ├── adapters/       # native CIP and JSON-bridge implementations
│   └── eip_client.py   # compatibility import for the native adapter
└── tests
    ├── fake_pycomm3.py         # LogixDriver stand-in that enforces pycomm3's real signatures
    ├── blackhole_server.py     # the CLI against a fake controller the tests can black-hole
    ├── test_cancellation.py    # cancelled or abandoned writes are never sent later
    ├── test_cancel_race.py     # a cancel in the same step a wait completes still stops the send
    ├── test_config.py
    ├── test_docs.py            # README covers every setting, breaking change and response shape
    ├── test_env.py             # an automatic .env cannot enable writes; --env-file can
    ├── test_pycomm3_path.py    # pycomm3 call shapes, retries, writes sent once, port/timeout/Micro800
    ├── test_tools.py           # tools over an in-memory MCP session
    ├── test_json_bridge.py     # client against the mock PLC (subprocess)
    └── test_integration.py     # ethernetip-mcp over stdio against the mock PLC

Tests

uv sync --extra dev
(cd ../ethernetip-mock-server && uv sync)   # the integration tests start the mock with `uv run`
uv run --extra dev pytest
uv run --extra dev ruff check src tests
uv run --extra dev ruff format --check src tests

The integration tests pick a free local port for the mock and stop it afterwards. Without uv on PATH they are skipped, unless ENIP_REQUIRE_INTEGRATION=1 is set (as in CI), which makes that a failure.

Status

server.py, eip_client.py and tools.py implement connection management with bounded retries, input validation, the shared response envelope and the initial tool surface (read_tag, write_tag, array/string helpers, batch read/write, tag list, tag map, PLC identity and time, and health checks). The pycomm3 path is tested against pycomm3's real signatures but not yet against a physical controller; see Known limitations. Remaining planned features, such as UDT operations, module info and session control, are listed under Planned Capabilities.

Metadata

Release files for industriagents-ethernetip-mcp 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for industriagents-ethernetip-mcp 0.3.0
File Size Uploaded
industriagents_ethernetip_mcp-0.3.0.tar.gz 125.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for industriagents-ethernetip-mcp 0.3.0
File Interpreter ABI Platform
industriagents_ethernetip_mcp-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 176.6 kB

Release files / industriagents_ethernetip_mcp-0.3.0.tar.gz

Download URL industriagents_ethernetip_mcp-0.3.0.tar.gz
Size 125.4 kB
Tags Source
SHA-256 checksum
How to use checksums
2aa7012b6899cb05c9ddfbda7d97d87bd19b4cf123c76732f5efba9c997597d3
BLAKE2b-256 checksum
How to use checksums
9c1cb65bfd003f9a901049dc0768e78e168727d39eac1e1fe438b4381af2440f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / industriagents_ethernetip_mcp-0.3.0-py3-none-any.whl

Download URL industriagents_ethernetip_mcp-0.3.0-py3-none-any.whl
Size 51.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f677507432cf21ef7ce0ee0e21fc5526b63afc11ef4774d12b359ef0b96191ed
BLAKE2b-256 checksum
How to use checksums
2b4d7eb93ca92a5fb8d401ccd94744d9a66da7c96ff7c7bf6fc9d1639db8fef3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page