How-to guide · for Developers, Administrators
MCP server
Connect an AI assistant to the hub with the Model Context Protocol. It signs in as a Proxus user and reads plant model, device status, logs and telemetry.
At the end of this guide, an AI assistant that speaks the Model Context Protocol (MCP), such as Claude, Cursor or VS Code, is connected to your hub. It can answer questions about devices, pipelines, rules and alerts from the live system, with the rights of the Proxus user it signs in as.
Before you start
You need:
- The hub's address. The MCP server is at
/mcpon the hub's port, for examplehttp://localhost:8080/mcp. - A Proxus user for the assistant. Its role limits what the assistant may read and change. See Users and roles.
- An MCP client that supports the Streamable HTTP transport.
[MCP] Enabled = truein the hub's configuration (the default).
Step 1: Add the server to your client
claude mcp add --transport http proxus http://localhost:8080/mcp {
"servers": {
"proxus": { "type": "http", "url": "http://localhost:8080/mcp" }
}
} Most clients take a JSON entry with the server's URL:
{
"mcpServers": {
"proxus": { "url": "http://localhost:8080/mcp" }
}
} No header or key is configured in the client. Signing in happens inside the conversation, in the next step.
Step 2: Sign in
Before it signs in, the assistant can only list the tools and call schema_overview, which explains the server and the sign-in step. Ask it to sign in and give it the Proxus user name and password when it asks. It calls auth_login with them.
With single sign-on, the host can sign in with an access token of your identity provider instead: auth_login with accessToken. No Proxus password passes through the conversation, and the connection gets the roles mapped from the person's or service account's groups.
When two-step verification is on for the user, the assistant also asks for the current code from the authenticator app and passes it as code.
The sign-in is tied to this MCP connection and lasts SessionTtlMinutes (25 minutes by default). After that, or after auth_logout, the assistant asks again. auth_whoami shows which user the connection is signed in as.
What the assistant can do
| Tool | What it does | Who may use it |
|---|---|---|
schema_overview | Explains the server, the sign-in state and which tool fits which task. | anyone |
auth_login, auth_whoami, auth_logout | Sign in, show the signed-in user, sign out. | anyone |
schema_entities | Lists the object types (devices, profiles, rules, pipelines and others) and their readable fields. | signed in |
schema_templates | Example bodies for creating objects. | signed in |
schema_protocols | The connection settings and tag address formats of a protocol. | signed in |
schema_telemetry | Describes the stored values table and how to query it. | signed in |
schema_odata_metadata | A summary of the full data model. | administrators |
odata_request | Reads objects (GET only, at most 100 per call). An agent reads the fields the AI Assistant reads, rule conditions, function code and device addresses included; passwords, keys, tokens, connection settings and SQL text stay hidden. | signed in |
odata_mutate | Creates or changes an object when you asked for that exact change. Off until an administrator allows changes (AllowedMethods). | signed in, with the role's rights and AI Assistant Access of at least Ask and propose changes |
operations_summary, open_alarms, alarm_counts, alarm_history, list_devices, get_device, diagnose_device, list_gateways, health_findings, plant_structure, tag_keys, tag_history, dependencies, recurring_problems, shift_summary, audit_trail, system_logs, list_record_types, find_records, read_record, search_docs, read_doc, setup_guide, test_rule_condition | The AI Assistant's own read tools: the same answers, in the same scope, as the user gets in the chat. Read-only. | signed in |
describe_record_type, propose_create, propose_update, propose_delete, propose_bulk_update, propose_plan, propose_alarm_change | The AI Assistant's change tools. Nothing changes: each proposal becomes an approval card in the user's AI Assistant, in the conversation External agent (MCP), and is made only when the user approves it there, as in the chat (risky changes are confirmed twice; an unanswered proposal expires after 24 hours). At most 20 proposals wait for a user at a time. | signed in, with AI Assistant Access of at least Ask and propose changes |
proposal_status | Whether the user approved or rejected a proposal, and what applying it did. | signed in |
device_status | Live online or offline state of the devices the user may see. | signed in |
form_list, form_records | The published forms the user may open, and the records filled in on one of them (state, device, who and when, a summary of the answers), newest first, at most 100 per call. Read-only. | signed in |
form_summary | A form's records summed up as on the Apps page's Analysis tab: a count, or the sum, average, minimum or maximum of a number field, by a choice, device, person, state or time, with each group's share and cumulative share. Read-only. | signed in |
log_query | Recent system log entries, filtered by level, source or text. | signed in |
telemetry_query | One read-only SQL query on the stored values, with row, time and memory limits. | administrators |
graph_schema, graph_neighbors, graph_impact, graph_lineage, graph_paths, graph_context_pack | What a device, rule, pipeline or dashboard depends on and what depends on it (the operational graph). | signed in |
The server also offers three prompts, proxus_read_entity, proxus_write_change and proxus_analyze_telemetry, and resources under proxus://schema/ (overview, entities, telemetry, templates, protocols).
Every call runs with the signed-in user's permissions. A change the role does not allow is refused, as it would be in the hub's screens. The role's AI Assistant Access also applies to MCP: with No access every tool except signing in is refused, with Ask questions the agent only reads, and changes need at least Ask and propose changes. Deleting is blocked by default even for users who may delete (BlockDelete = true).
Secure it for production
Set these in the [MCP] section of the hub's configuration (environment form MCP__<Key>):
| Key | Default | Meaning |
|---|---|---|
Enabled | true | Turns the MCP server on or off. |
ServerBaseUrl | "" | The hub's public address, for example https://proxus.example.com. Required when clients connect from other machines; empty works only through localhost. |
AllowedBaseUrls | [] | Other exact Proxus addresses auth_login may send credentials to. |
AllowedOrigins | [] | Browser origins allowed to call /mcp. Clients that are not browsers send none. |
IPWhitelist | [] | Addresses or ranges allowed to connect, for example ["10.0.0.0/8"]. Empty allows all. |
AdminOnly | false | Only users with an administrative role may use the protected tools. |
AllowedMethods | "GET" | Methods odata_mutate may use. The default "GET" keeps agents read-only; "GET,POST,PATCH,PUT" lets them create and change objects. |
BlockDelete | true | Refuse deletes even if the role allows them. |
BlockBulkOperations | false | Refuse changes to several objects in one call. |
RateLimitEnabled | true | Limit calls per user and minute. |
RateLimitRequestsPerMinute | 60 | All calls. |
ODataRateLimitRequestsPerMinute | 30 | odata_request and odata_mutate. |
TelemetryRateLimitRequestsPerMinute | 120 | telemetry_query. |
GraphRateLimitRequestsPerMinute | 60 | The graph tools. |
MaxConcurrentSessionsPerUser | 0 | Open MCP sessions per user, 0 for no limit. |
SessionTtlMinutes | 25 | How long a sign-in lasts. |
AuditLogging | true | Logs every call with user, address, tool and result. |
AnonymousDiscoveryMode | "ToolsAndOverview" | What clients see before signing in: ToolsAndOverview, ToolsOnly or Disabled. |
DebugLogging | false | Detailed request logging for connection problems. |
[MCP.ClickHouse] limits telemetry_query: MaxResultRows (1000), MaxRowsToRead (10000000), MaxBytesToRead and MaxMemoryUsage (512 MiB), MaxExecutionTimeSeconds (10), MaxThreads (4) and MaxResultBytes (16 MiB). Set Username and Password to a database user that may only read the DeviceRawData and Logs tables.
When several hub instances run behind a load balancer, sign-ins are shared through Redis when Cluster:RedisConnection (or MCP:RedisConnection) is set.
Refusals reach the client as errors: 403 when the address is not allowed, an authorization_denied error when an administrative tool is called by a user without an administrative role, 401 when a protected tool is called before signing in, 429 when a rate limit is reached.
What's next
- REST API: the same data for your own programs.
- Operational graph: what the graph tools read.
- Security hardening.
Was this page helpful?
Evaluating Proxus? See it on your own machines in a 30-minute technical session.