aiops-mcp
Integrates with Ansible for configuration management and automation of host state, enabling playbook execution and drift convergence.
Integrates with OpenTofu for infrastructure provisioning and state management, supporting drift detection and convergence.
Integrates with Talos Linux API for managing Kubernetes nodes and cluster operations.
Click on "Deploy 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., "@aiops-mcpcheck drift for production webserver fleet"
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.
AIOps-MCP
praxis, the unified AI-operations MCP.
Documentation site (rendered from docs/): https://rmednitzer.github.io/aiops-mcp/
Status: v0, stdio default with an opt-in HTTP transport, single-operator, in iterative security hardening.
make ci-successis green (ruff + mypy strict + pytest + the schema-drift guard + the dispatch eval gate) and each of the nine invariants has a passing test. The deep review (ADR-0015) found that several load-bearing controls were specified but not yet wired into the running server; the ADR-0016 enforcement wave and the waves through ADR-0042 closed those findings. The implemented backlog is resolved; the two open items are both forward-looking: BL-111 (first-class kubectl/helm actuation, gated on the ADR-0043 credential contract; nothing built yet) and BL-113 (re-confirm the EU AI Act high-risk dates against the Official Journal once the Digital Omnibus publishes, ADR-0044). Read "Maturity and honest limitations" below andLIMITATIONS.mdfor the known remaining boundaries before relying on it. The design reference isdocs/architecture.md.
What it is
praxis is a self-contained, security-first, single-operator-operable,
EU-sovereign unified AI-operations MCP server. It fuses three things into one
control plane:
A live bitemporal model of the fleet. Hosts, services, packages, storage, networks, identities, and alerts as typed vertices and edges, with every fact carrying four timestamps and never being deleted (corrections supersede). The source of truth.
A drift engine. Observed host state vs desired state (IaC plan, config baseline, or an operator-blessed known-good snapshot), with structured drift findings and human-gated convergence.
A tiered, audited actuator. A single execution path that classifies every action T0-T3, gates state-changing actions behind human confirmation, and wraps the right tool per host type (ssh/ansible/opentofu/runbooks/talosctl/redfish/ cloud) instead of reinventing it.
It is self-contained: no imports from, or runtime coupling to, any sibling fleet repository. Third-party libraries are kept minimal and license-vetted (pydantic for input validation; psycopg for the optional Postgres backend), and the execution core stays dependency-free (ADR-0001, ADR-0014).
Related MCP server: LUMINO MCP Server
Why
It is the engineered successor to a hand-run fleet gateway: graduated autonomy being made load-bearing in code (not just a design note), drift detection formalized out of manual markdown baselines into a queryable bitemporal store, scattered state unified, and flat skills given a real registry and router. Security-first by design and intended for real production deployments, with the gaps still on the way to that bar tracked openly (see below).
Maturity and honest limitations
v0 is real and tested, but it is a hardening-in-progress security project, not a finished product. The deep review in ADR-0015 (2026-06-08) verified the spine is sound (storage-layer append-only state, parameterised SQL, inert untrusted skill bundles, an option-injection-guarded SSH target, an RFC 6962 Merkle implementation, a robust SSRF filter) and that all nine invariants have a proving test; the ADR-0016 enforcement wave (2026-06-10) closed its P1 and wiring findings. The honest current state:
HTTP transport is implemented and opt-in (ADR-0041): a stdlib
http.serverwith anMcp-Session-Idsession lifecycle, per-session isolation (each session has its own trifecta taint latch, approval nonces, budget, and consent ceiling), constant-time bearer-token auth, a request-body cap, and a per-client consent ceiling. It stays default-closed (token + non-loopback opt-in + SSRF egress, ADR-0006); stdio is still the default. Serving is concurrent (ADR-0042, BL-110): aThreadingHTTPServerover a store that serialises on a per-instance lock, so a slow actuation does not block other clients while the bitemporal/append-only invariants hold.The human-approval gate is human-binding (ADR-0016, BL-072): a gated dry run mints a server-generated, single-use, TTL-bound token surfaced on the operator console, out-of-band from the MCP channel. The token never appears in a tool response, so an automated caller cannot reproduce or replay it. Free-form shell actuation floors at T2 (BL-073).
Every registered tool, including the read tools and
ingest_observation, runs through the single audited path (BL-017, BL-062, BL-085); reads that return observed facts arm the trifecta latch, enforced inside the path (BL-083).Scoped credentials (opt-in via the first grant), per-session budgets, and an audited
emergency_stopactuator with a durable kill-switch sentinel are wired (BL-049, BL-074, BL-075). WithPRAXIS_AUDIT_PATHset, the server also produces runtime Merkle checkpoints over the trail (every N records and at shutdown) and an optional anchored high-water mark (PRAXIS_ANCHOR_PATH) that detects truncation of log plus evidence together (ADR-0019; BL-076, BL-050). The default checkpoint stamper is the keylessLocalStamper; a non-forgeable RFC 3161 TSA stamper is available opt-in (PRAXIS_TSA_URLplusPRAXIS_TSA_CERT, the TSA signing certificate in PEM, plus thetsaextra; BL-095, ADR-0030). With the default stamper, OS-level append-only storage remains the required control against an attacker who can rewrite the files. Audit records can also be forwarded best-effort to syslog for SIEM/journald visibility (PRAXIS_AUDIT_SYSLOG_ADDRESS, opt-in); the append-only file stays the authoritative, tamper-evident sink (BL-100, ADR-0037). Each record carries optionalrequest_id/client_idcorrelation fields, set per request by the transport, so concurrent calls can be tied to their audit entries (BL-101, ADR-0038).
These and the rest are tracked as BL-NNN in docs/backlog.md with severities in
ADR-0015. LIMITATIONS.md is the running list of what is specified but not yet
delivered.
Quickstart
For a complete, task-oriented walkthrough of running the server and using every tool, see the how-to guide (also on the docs site).
praxis is self-contained: the default path is the SQLite store over stdio with no
external services.
uv sync --extra dev # add --extra postgres for the production store backend
make check # ruff + mypy strict + pytest
make ci-success # the above plus the schema-drift guard and eval gate
python -m praxis # serve over stdio (JSON-RPC 2.0); refuses unsafe HTTP bindsConfiguration is PRAXIS_-prefixed and bound once at import (src/praxis/config.py).
For the architecture and layout see docs/architecture.md; the nine non-negotiable
invariants are in CLAUDE.md.
Layout
See docs/architecture.md for the full tree. The spine: src/praxis/execution/
(the single audited executor), src/praxis/store/ (the pluggable bitemporal
store), src/praxis/drift/ (the drift engine), src/praxis/actuation/ (tool
adapters), src/praxis/tools/ (the MCP surface), and docs/{adr,stpa}/ plus
docs/backlog.md (governance-as-code).
Governance
Decisions:
docs/adr/(Architecture Decision Records).Safety and security requirements:
docs/stpa/(System-Theoretic Process Analysis, including STPA-Sec).Work tracking:
docs/backlog.md(stableBL-NNNids).Compliance mapping:
docs/governance/(EU AI Act, NIS2/NISG, CRA, GDPR, ISO 27001).
License
Apache-2.0 (see LICENSE) and NOTICE.
Available Tools
5 toolsdrift_scanBRead-only
Compute drift findings: observed facts versus the known-good baseline.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | No | Restrict the scan to one subject. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds minimal behavioral context beyond the concept of drift. It does not disclose how the baseline is determined, performance implications, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 10 words, front-loading the key action ('Compute drift findings'). No wasted words; every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should explain what a drift finding consists of or how results are presented. It does not. The simple structure (1 optional param, no nested objects) partially mitigates the need, but the lack of output context and no comparison to siblings leaves the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'subject' parameter, which is already described as 'Restrict the scan to one subject.' The tool description does not add any additional meaning or clarification beyond the schema, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'compute', the resource 'drift findings', and explains what drift findings are ('observed facts versus the known-good baseline'). It distinguishes from sibling tools like query_facts and fact_history by focusing on drift analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., query_facts, fact_history). It does not mention prerequisites, exclusions, or context for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fact_historyARead-only
Return the full recorded (bitemporal) history of facts for a subject.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | ||
| predicate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior. The description adds the 'bitemporal' aspect, clarifying it returns full history, which is useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, 10 words, front-loaded with key information. No redundant or unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple retrieval tool with annotations covering safety, but lacks detail on return format, behavior for missing data, and how the predicate parameter affects results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description only explains the 'subject' parameter implicitly ('for a subject') but does not explain the optional 'predicate' parameter, leaving its filtering role unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return', the resource 'full recorded (bitemporal) history of facts', and specifies the subject. It distinguishes from sibling tools like query_facts (current facts) and ingest_observation (adding data).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives such as query_facts for current data. The description implies use for historical data but does not state exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingest_observationA
Parse captured host telemetry into observed facts.
| Name | Required | Description | Default |
|---|---|---|---|
| collector | Yes | ||
| subject | Yes | ||
| predicate | No | ||
| raw | Yes | Raw tool output captured by a T0 read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is not read-only (readOnlyHint=false) and not destructive (destructiveHint=false), so the description adds the context that it parses telemetry into facts. However, it does not disclose whether previous facts are overwritten, any authentication requirements, or error handling. The added value is moderate given the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that starts with the action verb. It contains no filler or redundancy, making it efficient for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, 3 required, and no output schema, the description is too minimal. It does not explain what 'observed facts' are, the format of the raw input, the effect of multiple ingests, or error conditions. This leaves significant gaps for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only the 'raw' parameter has a brief description). The tool description provides no parameter-specific information, leaving 3 of 4 parameters (collector, subject, predicate) without semantic guidance. This is insufficient, especially for a tool with required parameters and an enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Parse') and resource ('captured host telemetry') and clearly states the output ('observed facts'). It distinguishes from sibling tools like query_facts (query existing facts) and run_action (perform actions), making the ingestion purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for ingesting telemetry but does not explicitly state when to use this tool versus alternatives (e.g., when to use drift_scan or query_facts). No exclusions or prerequisites are given, so the agent must infer usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_factsARead-only
List active fleet-state facts; filter by subject and/or fact_type.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | No | Filter to one subject, e.g. host:axiom. | |
| fact_type | No | Filter to observed/desired/drift/known_good. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint. Description adds only 'active' context, which is minimal beyond annotations. No mention of pagination, limits, or other behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with action and resource, no wasted words. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with no output schema; description covers purpose and filter options adequately. Could be improved by explicitly distinguishing from 'fact_history' or noting only active facts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds little beyond schema descriptions. It reinforces the two filter dimensions but no extra semantic depth.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action ('list') and resource ('active fleet-state facts') with filtering options. While it implies a distinction from 'fact_history' via 'active', it does not explicitly differentiate from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies use for listing facts with optional filters, but provides no explicit guidance on when to use this tool versus alternatives like 'fact_history' or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_actionBDestructive
Run a tier-gated actuation via an adapter (DRY_RUN, approve, execute).
| Name | Required | Description | Default |
|---|---|---|---|
| adapter | Yes | ||
| host | Yes | ||
| host_type | Yes | ||
| action | Yes | ||
| ssh_alias | No | ||
| nodes | No | ||
| endpoints | No | ||
| dry_run | No | ||
| approval_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the 'tier-gated' concept and the modes (DRY_RUN, approve, execute), which go beyond the annotations. However, it does not explain the gating mechanism, what each mode entails, or the nature of destructiveness beyond what annotations already indicate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence (17 words) that front-loads the verb and key concept. While very brief, it avoids fluff. However, it could include structured information without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (9 parameters, destructive, no output schema, tier-gating), the description is woefully incomplete. It lacks details about how gating works, when to set dry_run, what approval_token is, and the specific adapters. It needs much more context to be usable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and 9 complex parameters, the description fails to add any meaning to the parameters. It only mentions 'adapter' indirectly and does not explain host, host_type, action, approval_token, etc. This is a critical gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb 'Run' and specifies the resource 'tier-gated actuation via an adapter'. The parenthetical '(DRY_RUN, approve, execute)' further clarifies the modes. This clearly distinguishes it from sibling tools which are about scanning and fact queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool vs alternatives. It does not mention prerequisites, conditions, or warning about destructive impacts, which is needed given the destructiveHint annotation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.0.0- First observed
drift_scan - First observed
fact_history - First observed
ingest_observation - First observed
query_facts - First observed
run_action
TDQS
Scored across 5 tools
Each tool has a distinct purpose: ingest_observation creates facts, query_facts retrieves them, fact_history shows historical data, drift_scan computes differences, and run_action executes actuations. No overlap.
All names use snake_case and are two-word phrases, but they mix verb_noun (e.g., ingest_observation, query_facts) and noun_noun (e.g., drift_scan, fact_history) patterns. Still consistent in style and readable.
With 5 tools, the set covers the essential AIOps operations—observation ingestion, fact querying and history, drift detection, and action execution—without being excessive or sparse.
Covers the main lifecycle: ingest, query, history, drift, and action. Missing update/delete for facts or baseline management, but core workflows are supported.
Maintenance
Related MCP Connectors
AI governance MCP server for EU AI Act compliance and jurisdiction verification
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
Deterministic IT asset registry operated by AI agents over MCP. Agents propose, humans approve.
Autopilot MCP server for GEO analyses, reports, content, audits, memories and agents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server for compliance automation of AI agents, enabling EU AI Act compliance, verifiable credentials, and decentralized identity management with 47 tools across 9 modules.45 PyPI17Apache 2.0
- AlicenseNot gradedqualityCmaintenanceAn open source MCP server empowering SREs with intelligent observability, predictive analytics, and AI-driven automation across Kubernetes, OpenShift, and Tekton environments.25 PyPI11Apache 2.0
- AlicenseBqualityCmaintenanceMCP server for telecom AI with built-in EU AI Act compliance, part of the MEOK AI Labs ecosystem.1MIT
- AlicenseAqualityCmaintenanceAn MCP server for AI economy infrastructure with built-in EU AI Act compliance, supporting risk management, transparency, and bias detection.10MIT