An MCP server for Inductive Automation's Ignition SCADA/MES platform
Caldera MCP
An MCP server for Inductive Automation's Ignition SCADA/MES platform.
Caldera MCP connects AI assistants (Claude Desktop, Claude Code, and any MCP-compatible client) to a live Ignition Gateway. It exposes 65+ tools covering Perspective view management, schema validation, Jython script execution, tag I/O, browser-based visual feedback, and safety/backup operations, plus 45+ API-generated tools derived from Ignition's OpenAPI specification.
- Target platform: Ignition 8.3+ with the Perspective module
- Version: 0.2.0
- License: MIT
Quick Start (Windows)
Caldera MCP runs as an HTTP server. The server runs independently; Claude connects to it over HTTP, not as a subprocess.
1. Install and run
Install Python 3.10+ (check "Add python.exe to PATH") and Git, then open PowerShell:
git clone https://github.com/jaedync/caldera-mcp.git
cd caldera-mcp
python -m venv .venv
.venv\Scripts\activate
pip install .
$env:PYTHONPATH = "src"
python -m caldera_mcp.main
The server starts at http://localhost:8765.
2. Configure your gateway connection
Open http://localhost:8765 in a browser and click Settings. Enter your Ignition Gateway URL and API key (or username/password), then save. The dashboard will show the connection status.
API keys are generated in the Ignition Gateway under Config > Security > Users, Roles > [User] > API Keys. The format is username:key_value.
3. Connect Claude
For Claude Code:
claude mcp add --transport http caldera-mcp http://localhost:8765/mcp
For Claude Desktop, add to %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"caldera-mcp": {
"type": "http",
"url": "http://localhost:8765/mcp"
}
}
}
That's it. The Caldera MCP server must be running before Claude can use it.
Optional: Browser tools (screenshots, console error capture)
pip install ".[browser]"
playwright install chromium
Features
Perspective Filesystem Tools (35 tools)
Direct read/write access to Perspective project resources via the WebDev bridge:
| Area | Tools |
|---|---|
| Views | list_views, read_view, write_view, create_view, delete_view |
| Components | get_component, add_component, update_component, remove_component, move_component |
| Pages | list_pages, read_page, write_page, delete_page |
| Scripts | list_scripts, read_script, write_script, create_script, delete_script |
| Named Queries | list_named_queries, read_named_query, create_named_query, delete_named_query |
| UDTs | list_udts, read_udt, create_udt, delete_udt, create_tags_from_udt |
| Gateway Events | list_gateway_events, read_gateway_event, write_gateway_event, create_gateway_event, delete_gateway_event |
| Analysis | get_project_overview, find_view_usage |
Schema & Validation Tools (7 tools)
Live component schema data fetched from the running gateway, plus static reference data:
search_components- Discover component types by keyword or category (use before assuming type names)get_component_schema- Full property schema, events, and usage examples for anyia.*component typevalidate_view_structure- Validate view JSON against component schemas; catches missing required props, bad event groups, invalid bindings, and known pitfallsget_binding_schema- Schema and examples for binding types (tag,property,expr,query) and transforms (expression,script,format)get_expression_reference- Ignition expression language reference with function lookup and category filteringget_design_guidance- ISA-101 / EEMUA 201 / high-performance HMI design guidance with Ignition-specific examples (14 topics including color standards, layout, alarm display, UDT-driven design)search_icons- Search available Perspective icons by keyword or library (material,symbol_simple,symbol_mimic,symbol_p&id,ignition)
Script Execution & Tag I/O (9 tools)
Execute Jython on the gateway and interact with tags and databases:
execute_script- Run Jython 2.7 code on the gateway with access tosystem.tag,system.db, etc.validate_script- Syntax-check Jython without executing itread_tags- Read current values, quality, and timestamps from one or more tagswrite_tags- Write values to one or more tagsbrowse_tags- Browse the tag tree at a given pathrun_named_query- Execute a named query and return results as a list of dictsscript_session_start/script_session_eval/script_session_end- Persistent REPL session with variable state between calls
Visual Feedback & Browser Automation (5 tools)
Visually verify changes and capture runtime errors. Browser tools require Playwright (see Installation).
screenshot_view- Take a PNG screenshot of a running Perspective view (headless browser)get_view_console_errors- Load a view and capture browser console errors, binding failures, and quality overlay errorsscreenshot_gateway_page- Screenshot any gateway web page (e.g.,/web/status,/web/config)get_gateway_diagnostics- CPU, memory, thread counts, and deadlock detection via REST API (Ignition 8.3+ only, no browser required)list_perspective_sessions- List active Perspective sessions with user and connection info (8.3+ only)
Safety & Backup Tools (6 tools)
snapshot_project- Capture a complete project snapshot as a zip archive before batch operationslist_snapshots/restore_snapshot- Browse and restore project snapshots (pre-restore auto-snapshot included)list_backups/restore_backup- Per-resource backups automatically taken before each write/deletereset_trial- Check trial status or reset an expired Ignition trial (browser automation for the reset step)
Base Tools (4 tools)
get_gateway_health- Connection status, gateway info, license, projects directory, and safety settingsget_connection_status- Inspect current configuration and bridge deployment state (read-only diagnostic)install_webdev_bridge- Deploy the WebDev bridge endpoint (handles module upload, EULA, activation, and verification)list_modules- List all gateway modules with health status (8.3+ only)
API-Generated Tools (45+ tools, Ignition 8.3+ only)
Dynamically generated from Ignition's OpenAPI specification. Cover gateway management operations: projects import/export, module management, backup/restore, log configuration, activation/licensing, tag providers, and system performance metrics. Use get_gateway_health or get_connection_status to confirm they are available, or ask Claude to list available tools.
Installation
Prerequisites
- Python 3.10+
- Ignition Gateway 8.3+ with the Perspective module
- API key or admin credentials for the gateway
Install (Windows)
git clone https://github.com/jaedync/caldera-mcp.git
cd caldera-mcp
python -m venv .venv
.venv\Scripts\activate
pip install .
$env:PYTHONPATH = "src"
python -m caldera_mcp.main
Install (Linux / macOS)
git clone https://github.com/jaedync/caldera-mcp.git
cd caldera-mcp
python -m venv .venv && source .venv/bin/activate
pip install .
PYTHONPATH=src python -m caldera_mcp.main
The server starts at http://localhost:8765. Open it in a browser to configure your gateway connection and verify status.
Browser automation (optional)
The screenshot_view, get_view_console_errors, screenshot_gateway_page, and reset_trial tools require Playwright. Without it, those tools return a clear error instead of silently failing.
pip install ".[browser]"
playwright install chromium
Configuration
All settings use the CALDERA_MCP_ prefix. See .env.example for the full reference.
| Setting | Default | Description |
|---|---|---|
| CALDERA_MCP_IGNITION_GATEWAY_URL | http://localhost:8088 | Gateway URL including port |
| CALDERA_MCP_IGNITION_API_KEY | (empty) | API key (username:key), preferred over basic auth |
| CALDERA_MCP_IGNITION_USERNAME | admin | Username for basic auth fallback |
| CALDERA_MCP_IGNITION_PASSWORD | password | Password for basic auth fallback |
| CALDERA_MCP_IGNITION_BRIDGE_PROJECT | mcp-bridge | Project name for the WebDev bridge |
| CALDERA_MCP_IGNITION_BRIDGE_AUTO_DEPLOY | true | Auto-deploy bridge on first use |
| CALDERA_MCP_IGNITION_READ_ONLY_MODE | false | Block all write/delete operations |
| CALDERA_MCP_IGNITION_PROJECT_ALLOWLIST | (empty) | Comma-separated projects to allow (empty = all) |
| CALDERA_MCP_IGNITION_PROJECT_DENYLIST | (empty) | Comma-separated projects to block |
| CALDERA_MCP_IGNITION_BACKUP_ENABLED | true | Auto-backup before writes/deletes |
| CALDERA_MCP_IGNITION_BACKUP_DIR | (auto) | Backup directory (default: ~/.caldera-mcp/backups/) |
| CALDERA_MCP_IGNITION_BACKUP_MAX_PER_RESOURCE | 10 | Backups kept per resource before pruning |
| CALDERA_MCP_IGNITION_SNAPSHOT_ENABLED | true | Enable project snapshot/restore |
| CALDERA_MCP_IGNITION_SNAPSHOT_MAX_PER_PROJECT | 5 | Snapshots kept per project before pruning |
| CALDERA_MCP_IGNITION_SCREENSHOT_TIMEOUT | 30 | Page load timeout for browser tools (seconds) |
| CALDERA_MCP_IGNITION_PERSPECTIVE_AUTH_MODE | form | Browser auth: form, anonymous, or none |
| CALDERA_MCP_IGNITION_HTTP_PORT | 8765 | HTTP server port for MCP and dashboard |
| CALDERA_MCP_IGNITION_HTTP_HOST | 127.0.0.1 | Bind address (localhost only by default) |
| CALDERA_MCP_IGNITION_DASHBOARD_ENABLED | true | Live dashboard at root URL |
Connecting Claude
Caldera MCP runs as a standalone HTTP server. Claude connects to it over the network, not as a subprocess. The server must be running before Claude can use it.
Claude Code
claude mcp add --transport http caldera-mcp http://localhost:8765/mcp
Claude Desktop
Add to your config file (%APPDATA%\Claude\claude_desktop_config.json on Windows, ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"caldera-mcp": {
"type": "http",
"url": "http://localhost:8765/mcp"
}
}
}
Restart Claude Desktop after adding the configuration.
Gateway credentials are configured through the dashboard at http://localhost:8765, not in the Claude config.
Example Workflows
Review and fix a broken view:
"Load the MainDashboard view in my production project. Take a screenshot and check for console errors. Fix any binding failures you find."
Build a new view from scratch:
"Search for available chart components in Perspective. Create a new view called 'TrendDisplay' with a time-series chart bound to the tag [default]Reactor/Temperature."
Safe bulk update:
"Take a snapshot of the WaterTreatment project, then update all views in the 'screens/' folder to use the new company color standard (replace #FF0000 with #CC0000)."
Inspect and interact with tags:
"Browse the [default] tag tree, then read the current values of the top-level process tags. Write 0 to [default]Pump1/Enable."
Validate before deploying:
"Validate the JSON for the new OverviewScreen view before writing it. Show me any errors or warnings."
Architecture
MCP Client (Claude Desktop / Claude Code)
| HTTP (StreamableHTTP transport)
v
CalderaMCPServer (server.py) ← MCP protocol, routing, audit log, dashboard
|
├── PerspectiveTools ← view/component/page/resource/event CRUD
│ └── ProjectNetworkManager ← WebDev bridge calls
├── SchemaTools ← component schemas, validation, guidance
├── ScriptTools ← execute_script, read/write tags, REPL
├── VisualTools ← screenshots, console errors (Playwright)
├── SafetyTools ← snapshots, backups, reset_trial
│
├── IgnitionTools (api_generator) ← 45+ tools from ignition_openapi.json
└── IgnitionClient ← async HTTP (httpx), API key / basic auth
WebDev bridge: Many tools (script execution, component schemas, tag I/O, resource writes) route through a lightweight Jython endpoint deployed into a dedicated mcp-bridge project. With CALDERA_MCP_IGNITION_BRIDGE_AUTO_DEPLOY=true (the default), the bridge is deployed automatically on first use if an API key is configured.
Transport: The server runs over StreamableHTTP (not stdio). It binds to 127.0.0.1:8765 by default and serves the dashboard at the root URL.
Authentication: API key (X-Ignition-API-Token header) is preferred. Falls back to HTTP Basic Auth. The API key format is username:key_value.
Safety Features
Read-Only Mode
Set CALDERA_MCP_IGNITION_READ_ONLY_MODE=true to block all write and delete operations. Any attempt to modify resources returns a clear read_only_mode error. Useful for production gateways where you want to inspect but not change anything.
Project Allowlist / Denylist
Restrict access to specific projects:
# Only allow these projects
CALDERA_MCP_IGNITION_PROJECT_ALLOWLIST=production,staging
# Block these projects (takes precedence over allowlist)
CALDERA_MCP_IGNITION_PROJECT_DENYLIST=legacy-app,deprecated
Auto-Backup Before Writes
With CALDERA_MCP_IGNITION_BACKUP_ENABLED=true (the default), the server automatically saves the current content of any resource before overwriting or deleting it. Backups are stored locally on the MCP host and can be restored with restore_backup. Up to CALDERA_MCP_IGNITION_BACKUP_MAX_PER_RESOURCE (default: 10) backups are kept per resource; older ones are pruned automatically.
Project Snapshots
snapshot_project downloads an entire project as a zip archive before you make sweeping changes. restore_snapshot automatically creates a pre-restore snapshot before overwriting, so you can always get back. Up to 5 snapshots per project are kept by default.
Audit Log
Every tool call is recorded to a SQLite database at ~/.caldera-mcp/audit.db (configurable). The dashboard shows a real-time event table with tool name, project, status, and duration. Audit records are pruned to CALDERA_MCP_IGNITION_AUDIT_RETENTION_CAP (default: 10,000) rows.
Testing
# Install dev dependencies
pip install -e ".[dev]"
# Run the test suite (PYTHONPATH=src required)
PYTHONPATH=src pytest tests/ -v
# Single file
PYTHONPATH=src pytest tests/test_config.py -v
# Integration tests (requires a running Docker Ignition container)
PYTHONPATH=src pytest tests/ -v -m integration
Development
# Install with dev and browser extras
pip install -e ".[dev,browser]"
# Code quality
black src/ && isort src/ && ruff check src/ && mypy src/
License & Attribution
Caldera MCP is released under the MIT License.
All code in this repository is original work.