MCP PLC Core
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP PLC Core read the current temperature and pressure from the PLC"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP PLC Core š
Universal MCP Server for industrial PLC communication ā works with ANY PLC.
Connect any industrial controller to AI agents (Claude, GPT, OpenClaw) via MCP protocol. Siemens, Schneider, ABB, Mitsubishi, Omron, Allen-Bradley, WAGO, CODESYS, Arduino, ESP32, or any custom PLC ā write an adapter and it just works.
Don't see your PLC? Write an adapter ā takes 15 minutes. Just implement 6 methods in the
PLCAdapterinterface.
AI Agent (Claude, GPT, OpenClaw)
ā MCP protocol (stdio)
MCP PLC Core
ā your adapter (Modbus, S7, OPC UA, EtherNet/IP...)
PLC ā Sensors, Alarms, Motors, ActuatorsQuick Start
# Install
npm install mcp-plc-core
# Schneider / ABB / WAGO / CODESYS / Arduino
PLC_HOST=192.168.1.100 npx mcp-plc --adapter modbus
# Siemens S7-1200/1500/300/400
npm install nodes7
PLC_HOST=192.168.1.100 npx mcp-plc --adapter s7
# Mitsubishi / Omron / Allen-Bradley / anything else
npx mcp-plc --adapter ./my-custom-adapter.jsRelated MCP server: OpenTIA-MCP
Built-in Adapters
Adapter | Protocol | Port | PLC Types |
| Modbus TCP | 502 | Schneider, ABB, WAGO, CODESYS, Arduino |
| S7 (RFC1006) | 102 | Siemens S7-1200/1500/300/400 |
Custom Adapter ā Works with ANY PLC
Implement the PLCAdapter interface for your PLC. Regardless of manufacturer, protocol, or model ā if it has TCP/IP or serial connectivity, you can write an adapter.
PLCs you can write adapters for:
Siemens S7-200/300/400/1200/1500/1700
Schneider M340/M580/Modicon
ABB AC500/AC580
Mitsubishi MELSEC iQ-R/F/L
Omron NJ/NX/NP
Allen-Bradley ControlLogix/CompactLogix
WAGO PFC200/750
CODESYS-based controllers
Bosch Rexroth IndraMotion
Beckhoff TwinCAT
Fanuc CNC (FOCAS)
Haas / DMG Mori / Mazak
Arduino + EthernetShield
ESP32 + Modbus/S7 gateway
Any custom TCP/UDP protocol
import { PLCAdapter, SensorData, AlarmData, StatusData, SetpointData, OutputData } from "mcp-plc-core";
export class MyPLCAdapter implements PLCAdapter {
readonly name = "My PLC";
readonly protocol = "my-protocol";
async connect() { /* ... */ }
async disconnect() { /* ... */ }
isConnected(): boolean { /* ... */ }
async readSensors(): Promise<SensorData> {
return {
temperature: 25.3,
pressure: 6.2,
motorSpeed: 1500,
production: 1234,
};
}
async readAlarms(): Promise<AlarmData> {
return { active: [], count: 0 };
}
async readStatus(): Promise<StatusData> {
return { status: "running" };
}
async readSetpoints(): Promise<SetpointData> {
return { temperature: 25, pressure: 6, speed: 1500 };
}
async readOutputs(): Promise<OutputData> {
return { green: true, yellow: false, red: false };
}
async writeSetpoint(parameter: string, value: number): Promise<boolean> {
// Write to your PLC...
return true;
}
}Then use it:
import { startServer, MyPLCAdapter } from "mcp-plc-core";
const adapter = new MyPLCAdapter();
await startServer({
adapter,
limits: {
temperature: { min: 0, max: 50 },
pressure: { min: 0, max: 10 },
},
});MCP AI Integration
Claude Desktop / OpenClaw
{
"mcpServers": {
"plc": {
"command": "npx",
"args": ["mcp-plc", "--adapter", "modbus"],
"env": {
"PLC_HOST": "192.168.1.100",
"PLC_PORT": "502"
}
}
}
}Siemens S7
{
"mcpServers": {
"plc": {
"command": "npx",
"args": ["mcp-plc", "--adapter", "s7"],
"env": {
"PLC_HOST": "192.168.1.100",
"PLC_SLOT": "1"
}
}
}
}Tools
Tool | Description | Example |
| Read sensor value | "What's the temperature?" |
| Get active alarms | "Any alarms active?" |
| Full system status | "How's the line running?" |
| Current setpoints | "What are the setpoints?" |
| Write setpoint (safe!) | "Set temperature to 35°C" |
| Everything at once | "Give me all data" |
Resources
Resource | Description |
| Available sensors/tags |
| Alarm definitions |
| Current status |
| PLC and adapter info |
Safety
ā Read-only by default ā no writes without explicit tool call
ā Safety limits ā configurable min/max for setpoints
ā Audit logging ā all tool calls logged
ā Adapter isolation ā protocol-specific errors don't leak
ā ļø Write protection ā only setpoint registers, never I/O directly
Architecture
src/
āāā adapter.ts ā PLCAdapter interface (implement this)
āāā server.ts ā MCP server (generic, adapter-agnostic)
āāā cli.ts ā CLI entry point
āāā index.ts ā Package exports
āāā adapters/
āāā modbus.ts ā Modbus TCP adapter (built-in)
āāā s7.ts ā Siemens S7 adapter (built-in)Writing a New Adapter
6 methods. 15 minutes. Works with any PLC.
Create
src/adapters/myplc.tsImplement
PLCAdapterinterface (6 methods)Register in
cli.ts:
if (adapterName === "myplc") {
const { MyPLCAdapter } = await import("./adapters/myplc.js");
return new MyPLCAdapter({ host, port });
}Submit PR! š
Supported Protocols (via adapters)
Protocol | Status | Adapter |
Modbus TCP | ā Built-in |
|
S7 (RFC1006) | ā Built-in |
|
OPC UA | ā Via community | |
EtherNet/IP | ā Via community | |
BACnet | ā Via community | |
MQTT + Sparkplug B | ā Via community | |
Mitsubishi MC Protocol | šØ Community needed | ā |
Omron FINS | šØ Community needed | ā |
Allen-Bradley CIP | šØ Community needed | ā |
Bosch Rexroth | šØ Community needed | ā |
Fanuc FOCAS | šØ Community needed | ā |
Haas NGC | šØ Community needed | ā |
Any custom TCP/UDP | ā Adapter interface |
|
Don't see your protocol? Implement PLCAdapter ā 6 methods, 15 minutes of work. Submit a PR and it'll be in the next release.
Environment Variables
Variable | Default | Description |
|
| PLC IP address |
| varies | PLC port (502 for Modbus, 102 for S7) |
|
| Adapter to use |
|
| Rack number (S7 only) |
|
| Slot number (S7: 1, S7-300/400: 2) |
License
MIT ā use it, fork it, build adapters for your PLC.
HD WebDesign ā MCP for industrial automation
Available Tools
6 toolsget_alarmsC
Get all active alarms from the PLC.
Inputs: no named parameters.
get_allA
Get all PLC data at once: sensors, alarms, status, setpoints, outputs.
Inputs: no named parameters.
get_setpointsC
Get current setpoint values.
Inputs: no named parameters.
get_statusC
Get overall PLC system status.
Inputs: no named parameters.
read_sensorB
Read a sensor value from the PLC.
Inputs: sensor (required).
write_setpointA
Write a setpoint value to the PLC. Validates against safety limits.
Inputs: value (required), parameter (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 6 tools
Tools are mostly distinct: read_sensor, get_alarms, get_status, get_setpoints, and write_setpoint each target a specific domain area. The main overlap is get_all, which subsumes the individual getters, potentially confusing an agent about whether to call it or individual tools, though descriptions make the distinction reasonably clear.
Naming follows a consistent verb_noun pattern: read_sensor, get_alarms, get_status, get_setpoints, write_setpoint, get_all. Minor inconsistency exists with 'read' vs 'get' for data retrieval (read_sensor uses read while others use get), but this is a small deviation and the pattern is otherwise uniform.
Six tools is a well-scoped set for a PLC control server, covering the essential read and write operations without bloat. Each tool serves a clear purpose, and the count is appropriate for the domain.
The surface covers reading sensors, alarms, status, and setpoints, plus writing setpoints with safety validation. Notably missing are operations for controlling outputs (writing discrete/analog output values) and acknowledging alarms, which are common PLC tasks. However, get_all consolidates reads, and setpoint writing is the safety-relevant write path.
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
One MCP server for the services your AI needs: memory, files, Microsoft 365, kanban and more.
MCP server enabling AI agents to manage Bitrix24 features via standardized protocol
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceMCP server that connects WAGO PLCs to LLM agents via the WDx/WDA REST API, enabling AI assistants to read sensor values, change configuration, trigger firmware updates, or monitor entire PLC fleets without custom code.233 PyPI4-
- FlicenseNot gradedqualityBmaintenanceAn MCP server that lets AI agents interact with Siemens TIA Portal via its Openness API.-
- AlicenseAqualityDmaintenanceMCP server for industrial PLC integration, enabling AI to read tags, monitor alarms, and interact with Allen-Bradley ControlLogix PLCs via natural language.9MIT
- AlicenseNot gradedqualityDmaintenanceThe first and only MCP server for PLC (Programmable Logic Controller) intelligence. Give any AI agent direct access to industrial automation data ā ladder logic, tag databases, cross-references, fault root cause analysis, and sequence blockersMIT