MCP PLC Core
Click on "Install 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 Coreread 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: kc_modbus_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
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceAn MCP server that interfaces with SIEMENS WinCC Unified SCADA systems via GraphQL to manage real-time and historical tag data. It enables AI assistants to browse SCADA objects, read or write tag values, and perform alarm management tasks such as fetching, acknowledging, and resetting alarms.Last updated6
- Alicense-qualityDmaintenanceMCP server for Modbus TCP devices that enables AI agents to read/write PLC registers by name using YAML device profiles, with a built-in simulator.Last updated2MIT
- Flicense-qualityBmaintenanceMCP 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.Last updated2
- Alicense-qualityDmaintenanceAn open-source MCP server that bridges AI models with industrial equipment, supporting multiple protocols like Modbus, OPC UA, and MQTT for reading data and controlling machines.Last updated2Apache 2.0
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for AI dialogue using various LLM models via AceDataCloud
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Maxkrempl/mcp-plc-core'
If you have feedback or need assistance with the MCP directory API, please join our Discord server