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: wago-plc-mcp-server
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
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
- 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.2MIT
- Flicense-qualityAmaintenanceMCP 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.2
- Flicense-qualityBmaintenanceAn MCP server that lets AI agents interact with Siemens TIA Portal via its Openness API.
- AlicenseAqualityFmaintenanceMCP server for industrial PLC integration, enabling AI to read tags, monitor alarms, and interact with Allen-Bradley ControlLogix PLCs via natural language.9MIT
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