Live-runtime MCP surface for FrameworX. Read tags, alarms, historian, and UNS state from a running TServer.
AI Integration → Runtime MCP Reference
New in 10.1.5. RuntimeMCP gains an HTTP transport on port 10120, a Windows Service wrapper, target rebinding via runtime_connect(solution, profile) for automated testing workflows that switch between Execution Profiles without restarting the MCP process, and a pre-auth runtime_describe_binding tool that returns the bound TServer's /health payload without requiring authentication.
Tool catalog refresh (10.1.5). Several earlier standalone tools were merged into broader tools: runtime_set_target is now the with-args branch of runtime_connect; runtime_find_by_iri is now runtime_describe_object(iri=…); runtime_get_info is the no-args branch of runtime_connect; runtime_get_object_context folded into runtime_describe_object; runtime_browse_uns became runtime_browse_object_model; runtime_list_by_type became runtime_list_instances; runtime_search_tags became runtime_search_uns; runtime_list_derived_types was removed (folded into runtime_describe_object.derivedTypes). See the full deprecation table on AI Runtime Connector.
RuntimeMCP is the MCP server that speaks to a running FrameworX runtime. Unlike DesignerMCP (design-time, live .dbsln in an IDE) and ConsoleMCP (design-time, file-based JSON workspace), RuntimeMCP targets runtime state — live tag values, active alarms, historical queries, and the UNS namespace as the runtime sees it. Use RuntimeMCP when AI-driven workflows need to observe or test a running solution, not author one.
Setup steps are covered in Claude Code MCP Setup and MCP and Claude Setup. Server-surface overview lives in MCP SDK Reference. Execution Profile details are in Runtime Execution Profiles Reference.
Vocabulary vs. DesignerMCP and ConsoleMCP
RuntimeMCP tools carry a runtime_ prefix so the mode is always obvious in a transcript. The design-time tools in DesignerMCP and ConsoleMCP work on configuration (the solution); the runtime tools work on state (the running process).
Design-time (Designer / Console) | Runtime (this server) | Object of action |
|---|---|---|
|
| Configured UserTypes / AssetTree vs. live UNS instances. |
|
| Configuration row vs. live object with inheritance and cross-references. |
|
| Namespace schema vs. live namespace walk. |
(no equivalent — values are runtime-only) |
| Live and historical tag values. |
(no equivalent — alarms are runtime-only) |
| Live alarm state and history. |
The runtime_ prefix is load-bearing — do not unify names with DesignerMCP. A tool name is the agent's strongest cue about which world it is talking to.
Server Variants
RuntimeMCP ships as three executables, each tailored to a deployment shape.
Server | Transport | Target framework | Use case |
|---|---|---|---|
RuntimeMCP | stdio | .NET 10 | Per-session subprocess, spawned by Claude Desktop or Claude Code. One runtime per client session. |
RuntimeMCPHttp | HTTP (SSE) on port | .NET 10 | Long-running daemon. Supports target rebinding and multi-runtime setups. Required for any workflow that switches targets without restarting the MCP process. |
RuntimeMCPHttpService | N/A (launches subprocess) | .NET Framework 4.8 | Windows Service Control Manager wrapper. Installs, starts, and stops |
All three share the same tool surface. The HTTP variants add bearer-token authentication through the configured API key in RuntimeMCPHttp.json. Use a reverse proxy if you expose the HTTP surface beyond a trusted subnet.
Connection Identity — (solution, profile)
A FrameworX runtime is identified by which solution it is running and which Execution Profile it is running under. The same .dbsln can run concurrently under multiple profiles (Production, Development, Validation, Custom), each bound to its own TCP port via the solution's RuntimeExecutionProfiles configuration. Port is a consequence of the active profile, not an identity; editing profile port offsets in the solution changes the port without changing what solution or profile is running.
RuntimeMCP therefore accepts solution and profile as the connection coordinates. Port is looked up at bind time from InfoServer's registry of running TServers and returned to the client in the bind response for observability.
Profile values:
Integer | Name | Aliases accepted |
|---|---|---|
| Production |
|
| Development |
|
| Validation |
|
| Custom |
|
Aliases are case-insensitive. Responses always echo both the canonical integer and the full profile name.
Startup Modes (HTTP only)
RuntimeMCPHttp supports two startup modes. The stdio RuntimeMCP binary is always process-per-session and retargeting it means restarting the subprocess — modes do not apply there.
Retargetable (default)
Accepts runtime_connect(solution, profile) at runtime to switch the bound TServer without restarting the process. Designed for automated tests that drive many targets from a single long-running MCP instance. The initial target can be supplied via /solution + /profile startup args or deferred until the first runtime_connect(solution, profile) call — tool calls before an initial target return ERR_NO_TARGET.
One Claude Code session per retargetable instance. Retarget state is held in the server process and shared across all connected clients — if two sessions hit the same retargetable instance, the second session's runtime_connect(solution, profile) silently retargets the first session's tools. For multi-session setups, run multiple RuntimeMCPHttp instances on distinct ports in pinned mode.
Pinned
Bound at startup via required /solution + /profile args, immutable for the process lifetime. The with-args branch of runtime_connect is rejected with ERR_PINNED in this mode — agents cannot retarget. The no-args branch (session-info query) remains available. Designed for A/B-style test setups: launch N RuntimeMCPHttp instances on N distinct listen ports, each pinned to its own (solution, profile), and register each as a separate MCP client entry.
Startup argv
RuntimeMCPHttp.exe [/mode:retargetable|pinned]
[/solution:"<name>"] [/profile:0-3]
[/listen:<port>] # default 10120
/mode defaults to retargetable if omitted. In pinned mode both /solution and /profile are required; missing either is a startup error.
Tool Catalog
Category | Tools |
|---|---|
Tag read & browse |
|
Semantic search |
|
Alarms |
|
Historian |
|
Runtime write |
|
Session / target control |
|
Pre-auth introspection |
|
Diagnostics |
|
Note. RuntimeMCP does NOT expose any write to solution configuration — no write_objects, no delete_objects, no rename_objects. Configuration writes belong to DesignerMCP or ConsoleMCP. RuntimeMCP writes are limited to live Object Model row values via set_object_value, gated by the AI Runtime-Write Gate on the active Execution Profile.
10.1.5 additions. runtime_get_aggregated_history (TDEV-1340) sits alongside runtime_get_tag_history and returns time-bucketed aggregates (min, max, avg, count) computed server-side over a query range — the same shape exposed by the Runtime API /aggregates endpoint and the TK.GetTagHistorianAggregated script API. set_object_value writes a single row in the live Object Model (tag value, attribute, or other runtime-writable object) and is the runtime counterpart to DesignerMCP write_objects (which targets configuration tables, not live state); the write is rejected unless the AI Runtime-Write Gate is enabled on the active profile.
Diagnostic Tools
The runtime_debug_* family exposes internal runtime state for troubleshooting workflows. These tools are read-only diagnostics — they do not mutate runtime state, do not require the AI Runtime-Write Gate, and do not open DataAccess connections beyond what the bound TServer already serves. Use them when a tag, alarm, display, or module is behaving unexpectedly and the configuration looks correct.
All diagnostic tools require the MCP to be bound to a target (same as any other authenticated runtime_* tool) and inherit the bound TServer's bearer-token authentication. They return ERR_NO_TARGET on a retargetable instance that has not yet been bound.
Tool | What it returns | Typical use case |
|---|---|---|
| Live Display binding state — which Display elements are bound to which tags or expressions, last evaluation result, and binding errors surfaced by the renderer. | Triage a Display that renders blank, shows |
| TModule lifecycle state for all loaded modules (Alarm, Device, Historian, Dataset, Script, Report, Security, Display, TagProviderService, Info, etc.) with one of | Confirm which modules came up cleanly after a runtime start. A |
| Process-level diagnostics: PID, listen port, working-set memory, uptime, .NET runtime version, and the bound solution / profile. | Confirm which TServer process the MCP is actually talking to when several runtimes are up side by side, or capture a memory / uptime snapshot for a stability investigation. |
| Recent alarm fire events from the runtime's in-memory ring buffer (last N entries, newest first). Each entry carries the alarm name, fire timestamp, severity, and the tag value that crossed the threshold. | Investigate "did this alarm actually fire?" without scanning the persistent alarm history. Faster than |
| Recent system events from the runtime's in-memory ring buffer (last N entries, newest first) — module start/stop, configuration reload, client connect/disconnect, security events, and other lifecycle signals. | Reconstruct what the runtime was doing in the seconds before a symptom appeared. Pairs with |
Privilege gating. None of the runtime_debug_* tools require the AI Runtime-Write Gate — they are read-only. They do inherit the bound TServer's authentication: an HTTP variant rejects unauthenticated calls with 401, same as any other authenticated runtime_* tool. The diagnostic surface intentionally exposes internal runtime state, so do not expose the HTTP endpoint beyond a trusted subnet without a reverse proxy.
Ring-buffer scope. The two runtime_debug_recent_* tools read from in-memory ring buffers sized at runtime start and bounded by available memory; older entries are evicted silently. For audited or long-window queries, use runtime_query_alarm_history (alarms) or the Historian / Events module surfaces — the debug tools are for live triage, not the system of record.
runtime_describe_binding
Pre-auth introspection tool. Returns the runtime's /health payload without performing authentication, so an automated verifier can confirm which sandbox a TServer is actually bound to before issuing authenticated runtime_get_value / runtime_browse_object_model calls.
Why pre-auth matters: authenticating against the wrong sandbox produces confusing downstream failures (tag-not-found, namespace-empty, asset-tree mismatch) that look like runtime bugs but are bench-misalignment. Catching the mismatch pre-auth is one MCP call vs. minutes of false-positive triage.
# No args: resolve the target via this MCP's bound (host, port).
runtime_describe_binding()
# Or probe an arbitrary runtime by URL (cross-bench check; this MCP's
# binding is NOT changed).
runtime_describe_binding(tserver_url="host:3201")
runtime_describe_binding(tserver_url="http://host:3201")
runtime_describe_binding(tserver_url="http://host:3201/health")
Response shape:
Error rendering macro 'code': Invalid value specified for parameter 'com.atlassian.confluence.ext.code.render.InvalidValueException'
{
"success": true,
"url": "http://localhost:3201/health",
"resolved_from": "current_binding", // or "argument" | "tserver_cmdline_scan"
"http_status": 200,
"status": "healthy", // /health "status" field
"version": "10.1.5.2034",
"solution": "ai-test-mcp-context-menu",
"started_at": "2026-05-15T18:02:11Z",
"uptime_seconds": 4231
}
Resolution order when tserver_url is omitted: (1) this MCP's bound CurrentHost / CurrentPort, (2) the MCP's startup args (/Host+/Port or legacy /ip1+/port1), (3) command-line scan of running TServer processes on the host. resolved_from tags which path produced the answer so the caller can see whether the response reflects the MCP's binding or a fallback.
The tool is pure — no DataAccess connection is opened, no search cache is touched, no log is written, the MCP's binding is not changed. The cross-bench form (with tserver_url) leaves the MCP pointed at its existing target.
Error code | When |
|---|---|
|
|
| The |
| Connection refused, TLS handshake failed, or the host is otherwise unreachable. The inner exception message is surfaced in |
| The endpoint returned non-JSON or a shape the tool could not parse. First 512 bytes of the body are surfaced in |
| Any other unexpected failure. |
503 unhealthy. A runtime that is up but mid-startup or shutting down returns http_status: 503 with status: "unhealthy" and a reason field; success is then false but the tool returns normally so the caller can branch on the precise status.
runtime_connect
Single entry point for session and target control. Two branches based on argument presence; both are exposed under the same tool name to keep agent transcripts uncluttered.
No-args branch — session info
Returns the current binding (solution, profile, host, port), the server variant (stdio / HTTP retargetable / HTTP pinned), and version metadata. Always available, regardless of mode. Useful as a first call to confirm what the MCP is talking to.
runtime_connect()
With-args branch — bind or retarget
Binds (or rebinds) a retargetable RuntimeMCPHttp instance to a running TServer identified by (solution, profile). Disconnects from the current target, resolves the new target through InfoServer, reconnects, and invalidates the in-process search cache. Atomic from the caller's perspective — on failure the previous target is left intact.
In pinned mode the with-args branch is rejected with ERR_PINNED; run a separate RuntimeMCPHttp instance for each pinned target.
runtime_connect(
solution="SolarPanels MCP Demo",
profile=1 # or "dev"
)
Parameter | Required | Notes |
|---|---|---|
solution | With-args branch only | Solution name (case-sensitive) as reported by InfoServer for a running TServer. |
profile | With-args branch only | Integer 0–3 or case-insensitive alias (see Connection Identity above). |
With-args response includes the new bound target and, if the server was previously bound, the target it was on before:
Error rendering macro 'code': Invalid value specified for parameter 'com.atlassian.confluence.ext.code.render.InvalidValueException'
{
"solution": "SolarPanels MCP Demo",
"profile": 1,
"profileName": "Development",
"host": "localhost",
"port": 3201,
"connected": true,
"previousTarget": {
"solution": "Industrial Ontology Demo",
"profile": 0,
"profileName": "Production",
"host": "localhost",
"port": 3101
}
}
In 10.1.5, all resolved targets use host = "localhost"; remote TServer binding is not supported. The field is returned for forward compatibility.
Replaces. The earlier standalone runtime_set_target tool is now the with-args branch of runtime_connect; the earlier runtime_get_info tool is now the no-args branch. Existing automation that called either should switch to runtime_connect with the same payload (with-args) or no arguments (no-args). See the deprecation table on AI Runtime Connector.
runtime_describe_object
Returns a single live object as the runtime sees it — inheritance chain, derived types, cross-references, and effective values. Two argument shapes select the object: by name (UNS-pathed or short name resolved against the runtime's namespace) or by iri (the runtime's canonical Internationalized Resource Identifier for an object). Exactly one of the two must be supplied.
# By name (UNS-pathed or short)
runtime_describe_object(name="Tag.Plant.Line1.Temperature")
# By canonical IRI
runtime_describe_object(iri="urn:tatsoft:fx:tag:Plant/Line1/Temperature")
The response shape is identical across both branches — a single resolved object with its derived types in derivedTypes, its inheritance chain in inheritsFrom, and the values the runtime is currently serving. The branch is a convenience over how the caller knows the object, not a difference in what is returned.
Replaces. The earlier standalone runtime_find_by_iri tool is now the iri=… branch of runtime_describe_object; the earlier runtime_get_object_context tool merged into this tool as well; the earlier runtime_list_derived_types tool was removed entirely — its data is now in the derivedTypes field of this response. See the deprecation table on AI Runtime Connector.
MCP Client Registration
For MCP client configuration (Claude Desktop, Claude Code, VS Code Copilot), register each RuntimeMCPHttp instance as its own HTTP MCP entry. Name the entries semantically — runtime_{solution}_{profile} for pinned instances; runtime or runtime_retargetable for a retargetable instance. Never encode the port in the entry name: ports can change when profile offsets are edited in the solution, and a port-named entry becomes a lie the moment that happens.
Example: side-by-side Dev vs. Production (pinned)
# Launch two RuntimeMCPHttp instances pinned to different profiles
RuntimeMCPHttp.exe /mode:pinned /solution:"SolarPanels" /profile:0 /listen:10120
RuntimeMCPHttp.exe /mode:pinned /solution:"SolarPanels" /profile:1 /listen:10121
# Register in the MCP client as two separate entries:
# runtime_solarpanels_prod -> http://localhost:10120
# runtime_solarpanels_dev -> http://localhost:10121
Tools from each entry carry that entry's name as a prefix in the agent's transcript, so runtime_solarpanels_dev.runtime_search_uns is unambiguously the Development runtime, and side-by-side comparisons are legible.
Example: single retargetable instance for automated tests
# Launch one RuntimeMCPHttp in retargetable mode, no initial target
RuntimeMCPHttp.exe /mode:retargetable /listen:10120
# Register as a single entry: runtime_retargetable -> http://localhost:10120
# Scripted tests call runtime_connect(solution, profile) before each scenario.
Ad-hoc HTTP Client Handshake
RuntimeMCPHttp uses stateful Streamable HTTP. Any ad-hoc client — bare-shell curl, Postman, or a custom HTTP wrapper — must perform a three-step handshake before issuing tool calls:
- POST
initializeand capture theMcp-Session-Idresponse header. - POST
notifications/initializedwith thatMcp-Session-Idheader. - POST
tools/listortools/callwith the sameMcp-Session-Idheader.
Skipping the initialize step returns:
-32000 Bad Request: A new session can only be created by an initialize request
Claude Code, Claude Desktop, and any other MCP-aware client perform this handshake transparently — the rule applies only when a script or operator drives the HTTP endpoint directly. The same Mcp-Session-Id must be reused for the lifetime of the session; new POSTs without it are treated as fresh sessions and rejected on subsequent tool calls.
Error Codes
Code | Where | Meaning |
|---|---|---|
| Any runtime_* tool | Retargetable instance has not been bound yet. Call |
|
| Instance is in pinned mode and does not accept retargeting. The pinned target is reported in the error message. Run a separate instance for the desired target. |
|
| InfoServer has no record of |
|
| Solution is running but not under the requested profile. |
|
| Connection to the resolved |
Version History
FrameworX | Notes |
|---|---|
10.1.4 | Initial ship of RuntimeMCP (stdio) with the runtime tool surface. |
10.1.5 | HTTP variant ( |
In this section...