Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

RCA-MCP

PYPI · RCA-MCP-CONNECTOR · SCANNED SEP 21

Causal root-cause analysis MCP server -- 56 tools across graphs, RCA models, PyRCA.

Available components

0 this week 0 Trust /100

Recent critical change

CVE-2026-32871 affects this package (2 Aug 2026). See the changelog before you install this server.

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security25
Provenance & Transparency45
Schema Quality & AI Usability67
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11685 tokens (~208/item across 56 items; 56 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
  • Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 56 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the RCA-MCP server?

RCA-MCP runs locally as a PyPI package, launched with uvx rca-mcp-connector. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · rca-mcp-connector

# add to Claude Code
claude mcp add dave1362-rca-mcp-connector -- uvx rca-mcp-connector
// .cursor/mcp.json
{
  "mcpServers": {
    "dave1362-rca-mcp-connector": {
      "command": "uvx",
      "args": [
        "rca-mcp-connector"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "dave1362-rca-mcp-connector": {
      "command": "uvx",
      "args": [
        "rca-mcp-connector"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add dave1362-rca-mcp-connector -- uvx rca-mcp-connector
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dave1362-rca-mcp-connector": {
      "type": "local",
      "command": [
        "uvx",
        "rca-mcp-connector"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add dave1362-rca-mcp-connector --command uvx --arg rca-mcp-connector
# ~/.hermes/config.yaml
mcp_servers:
  dave1362-rca-mcp-connector:
    command: "uvx"
    args: ["rca-mcp-connector"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "dave1362-rca-mcp-connector": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "rca-mcp-connector"
      ]
    }
  }
}
# add to Vellum
assistant mcp add dave1362-rca-mcp-connector -t stdio -c uvx -a rca-mcp-connector
// mcp.json
{
  "mcpServers": {
    "dave1362-rca-mcp-connector": {
      "command": "uvx",
      "args": [
        "rca-mcp-connector"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 19 Sept 26 0
    • Stability: pass → 0.80 functional
  • 18 Sept 26 0
    • Stability: 0.97 → pass security
  • 17 Sept 26 0
    • Malware scan: pass → unverified security
  • 16 Sept 26 0
    • Malware scan: unverified → pass security
  • 14 Sept 26 0
    • Malware scan: pass → unverified security
  • 12 Sept 26 0
    • Malware scan: unverified → pass security
    • Stability: pass → 0.80 functional
  • 11 Sept 26 0
    • Stability: 0.97 → pass security
    • Package version: 4.1.18 → 4.1.20 functional
  • 10 Sept 26 0
    • Package version: 4.1.16 → 4.1.18 functional
    • Package version: 4.1.16 → 4.1.17 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed pypi/rca-mcp-connector@4.1.20

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Vulnerabilities 6 findings
ID CVE Severity Vector Fix available
GHSA-m8x7-r2rg-vh5g CVE-2025-64340 medium CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H yes
GHSA-rww4-4w9c-7733 CVE-2026-27124 high yes
GHSA-vv7q-7jx5-f767 CVE-2026-32871 critical CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H yes
PYSEC-2026-2475 CVE-2025-64340 medium CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H yes
PYSEC-2026-2476 CVE-2026-27124 none yes
PYSEC-2026-338 CVE-2026-32871 critical CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H yes

Background: What a vulnerability scan can and cannot prove →

Dependencies 75 packages
Packages resolved 75
Stale 5
No linked repository 3
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 56 exposed · ~11,685 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
rca_admin_health ~162

Return server health status and instance-wide aggregate counts. Any authenticated key can call this (minimum viewer role) -- use this to confirm the server is reachable and to see which model families are supported, not to check your own account's usage. Note: models_in_registry/graphs_on_disk/results_on_disk are counts across ALL users on this server instance, not just yours -- for your own data, use rca_model_list, rca_graph_list_versions, or rca_analysis_list_results instead. Args: params (HealthInput): token, client_id Returns: str: JSON health snapshot (status, timestamp, instance-wide counts, supported model_families_supported list)

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_admin_purge_namespace ~213

Permanently delete ALL of YOUR OWN records in a storage namespace (graphs/models/results) in one call. Requires confirm=true. This action is IRREVERSIBLE. Only affects data you own -- there is no cross-account purge capability exposed via this or any other tool. Enterprise plan only (a deliberate tier feature, not a bug -- Free/Starter/Pro get a security_violation error). On those plans, delete records one at a time instead: rca_graph_delete for graphs, rca_model_delete for models. There's currently no per-item delete tool for results. Args: params (PurgeInput): - namespace: one of "graphs", "models", "results" -- purges only that one namespace, not all three at once - confirm: must be true, or this returns an "aborted" error without deleting anything Returns: str: JSON {namespace, deleted_count}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_admin_read_audit_log ~227

Read YOUR OWN structured audit log entries for a given hour bucket — one entry per tool call you made, showing which tool ran, when, and whether it succeeded or was denied. Requires the audit_log_export feature (Pro plan or above -- Free/Starter get a plan_required-style security_violation error; use rca_admin_show_plan_info to check your own plan first). Never returns another user's activity, regardless of plan. Use this to investigate why a call was denied or confirm a destructive action (e.g. rca_graph_delete) actually ran — it's an hourly snapshot, not a live stream, so it's not suited to real-time monitoring. Args: params (AuditInput): - hour_key: hour bucket as YYYYMMDD_HH, e.g. "20260803_14" (defaults to the current UTC hour if omitted) Returns: str: JSON {hour_key, entry_count, entries: [{tool, timestamp, outcome, ...}, ...]}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_admin_show_plan_info ~183

Show your current plan, every feature limit, and which locked features an upgrade would unlock. Takes no parameters beyond authentication -- there's nothing else to configure here. Call this proactively before something like rca_analysis_batch, rca_model_create, rca_report_compare, rca_guide_generate_report, rca_dtree_start, or the ai_summary flag on rca_analysis_run/ rca_dtree_answer to check your limits up front, rather than discovering a plan_required error mid-workflow -- several of those tools' docstrings point back to this one for exactly that reason. Returns: str: JSON {plan, display_name, limits: {..., ai_summary_monthly_quota}, features: {..., ai_summary}, locked_features: [...], upgrade_url (null on Enterprise)}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_batch ~221

Run the same RCA model over multiple incidents in one call, then rank which root causes recur most often across all of them — use this to spot a systemic cause behind several similar incidents, not just one. Requires Starter+ (Free plan cannot batch at all; Starter allows up to 5 incidents per call, Pro+ up to 20 — call rca_admin_show_plan_info to check your own limit). For a single incident, use rca_analysis_run instead — it's simpler and doesn't need the plan tier. Args: params (BatchAnalysisInput): - model_id: an existing model, applied identically to every incident - incidents: 1-20 payload dicts (capped by your plan), each matching the same shape rca_analysis_run expects for this model family Returns: str: JSON {per_incident: [{incident_index, result_id, top_cause, confidence}, ...], cross_incident_ranking}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_compare ~140

Compare multiple RCA results: surface overlapping root causes, confidence agreement, and model disagreements. Returns raw comparison JSON for programmatic use -- use rca_report_compare instead if you want the same comparison rendered as a shareable markdown/HTML document. Args: params (CompareResultsInput): result_ids -- 2-10 result_ids to compare (from rca_analysis_run or rca_analysis_list_results) Returns: str: JSON comparison with consensus_causes and model_disagreements, or a not_found error if any result_id doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_ensemble ~284

Run 2-5 different RCA models on the SAME payload and combine their root-cause scores via weighted voting. Requires the ensemble feature (Pro+). Use this when you're unsure which single model family fits the data best and want cross-validation across families -- for the SAME model run over multiple different incidents instead, use rca_analysis_batch. Algorithm: 1. Run each model_id via dispatch_rca() 2. Collect all root_cause {node, score} pairs 3. For each unique node: ensemble_score = sum(weight_i * score_i * confidence_i) 4. Normalise to [0,1] 5. Return ranked ensemble result Args: params (EnsembleInput): - model_ids: 2-5 existing models, all run against the same payload - payload: shared input, shape depends on the models' families - weights: optional per-model weights, same length as model_ids (default: equal weighting) - save: persist the ensembled result (default true) Returns: str: JSON with ensemble_root_causes (ranked), model_contributions, agreement_matrix (which models agree on which root causes), or a bad_input/not_found error

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_explain ~194

Turn a stored RCA result into a human-readable explanation with heuristic recommended actions (IMMEDIATE/MONITOR/TRACK, based on each cause's score) -- useful for a chat response or incident writeup, as opposed to rca_analysis_get_result's raw JSON. Args: params (ExplainInput): - result_id: from a prior analysis call - detail_level: "brief" (summary + top 3 causes + recommended actions), "standard" (default -- adds all root causes, contributing factors, warnings), or "verbose" (adds the raw model output, timestamp, duration) Returns: str: JSON narrative explanation, ranked causes, recommended actions (shape varies by detail_level -- see above), or a not_found error if result_id doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_get_result ~154

Retrieve a previously saved RCA result by result_id. Use this after rca_analysis_run (or rca_analysis_run_async + rca_analysis_poll_task) to re-fetch a result you already have the ID for — e.g. to hand it to rca_report_generate or rca_analysis_compare later. If you don't have a result_id yet, use rca_analysis_list_results to find one first. Args: params (GetResultInput): - result_id: from a prior analysis call's response Returns: str: JSON of the full stored RCAResult, or a not_found error if the ID doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_list_results ~125

List all of YOUR stored RCA result IDs, newest first, with pagination. Returns IDs and a count only — not the results themselves; follow up with rca_analysis_get_result for the full content of any one of them. Args: params (ListResultsInput): limit (1-100, default 20), offset (skip this many from the newest, for paging past `limit`) Returns: str: JSON {total, count, offset, result_ids: [...], has_more}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_poll_task ~180

Poll the status of an async RCA task submitted via rca_analysis_run_async. Requires the async_tasks feature (Pro+ -- same gate as submitting the task in the first place). Call this repeatedly (e.g. every few seconds) until status is "completed" or "failed" -- there's no push notification, only polling. status progresses pending → running → completed/failed; `result` is only populated once completed, `error` only once failed. Args: params (PollTaskInput): - task_id: from rca_analysis_run_async's response Returns: str: JSON {task_id, status, progress, result (if completed), error (if failed)}, or a not_found error if the task_id doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_query_results ~232

Query stored RCA results by model family, confidence threshold, time range, or tags — without loading every full result record. Use this instead of rca_analysis_list_results whenever you need to filter (e.g. "only high-confidence Granger results from this week"); use rca_analysis_list_results for a plain unfiltered listing instead. Returns lightweight index entries, not full result bodies -- follow up with rca_analysis_get_result for the complete content of any one. Args: params (QueryResultsInput): - model_family: exact family name, e.g. "granger_causality" (omit for all families) - min_confidence: 0.0-1.0, only results at or above this - after_ts: ISO timestamp, only results executed at or after this - tags: only results matching any of these tags - limit, offset: pagination, 1-100 per page Returns: str: JSON {total, results: [index entries], has_more}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_run ~291

Execute an RCA analysis using a registered model and return ranked root causes. This is the primary, synchronous analysis entry point -- it blocks until the model finishes. For a model that might take a while, use rca_analysis_run_async + rca_analysis_poll_task instead (Pro+); for multiple incidents through the same model in one call, use rca_analysis_batch instead (Starter+). Args: params (RunAnalysisInput): - model_id: an existing model from rca_model_create - payload: family-specific dict -- shape depends on the model's family (see the payload field's own description for the exact keys each family expects) - save: persist the result for later retrieval via rca_analysis_get_result (default true; set false for a throwaway check you don't want cluttering your result list) - tags: optional labels for filtering later with rca_analysis_query_results - ai_summary: also generate a short NL executive summary (Starter+, quota-limited -- see field description) Returns: str: JSON RCAResult with root_causes, confidence_overall, explanation, raw model output, _saved_as (the result_id) if save=true, and ai_summary/ai_summary_error if ai_summary=true was requested

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_analysis_run_async ~213

Submit a long-running RCA analysis (bayesian_network, dowhy_causal_inference, or any model against a large dataset) as a background task instead of blocking. Requires the async_tasks feature (Pro+); for most models on typical data sizes, the synchronous rca_analysis_run is simpler and doesn't need this or the plan tier. Returns a task_id immediately -- use rca_analysis_poll_task repeatedly to check progress and retrieve the result once it completes. Args: params (RunAnalysisAsyncInput): - model_id: an existing model from rca_model_create - payload: same shape as rca_analysis_run expects for that model's family - save: persist the result once the task completes (default true) - tags: optional labels for filtering later with rca_analysis_query_results Returns: str: JSON {task_id} -- pass this to rca_analysis_poll_task

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_auth_generate_token ~193

Generate a new API key for authenticating all other tools. Always issues the Free plan. Call this FIRST before using any other RCA-MCP tool. Store the returned api_key securely — it cannot be recovered later. Pass it as the 'token' field in every subsequent tool call. It does not expire. Paid plans (Starter/Pro/Enterprise) are NOT requested here — they are issued automatically, tied to your payment, the moment a Paystack subscription payment succeeds. Upgrade at https://rca-mcp.com/upgrade. Args: params (AuthSetupInput): - roles: audit-only metadata for this API key (not authorization) - key_id: accepted for backward compatibility, ignored - key_label: optional human-readable label for this key Returns: str: JSON with api_key, plan, roles, instruction

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_auth_list_keys ~145

List your own API keys and their metadata. Never returns raw or hashed key material. Requires the multi-key feature (Pro plan or above -- up to 5 keys on Pro, unlimited on Enterprise); Free/Starter keys get a security_violation error, since those plans only ever have the one key they authenticated with. Use the returned key_id values with rca_auth_rotate_key or rca_auth_revoke_token to act on a specific key. Returns: str: JSON with total and a list of {key_id, label, plan_at_issue, created_at, last_used_at, is_active}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_auth_revoke_token ~207

Deactivate one of your own API keys immediately — useful when a key is compromised or an integration is being retired. Unlike rca_auth_list_keys/rca_auth_rotate_key, this has no plan gate at all — every plan can revoke, including Free/Starter with only one key (revoking your only key means you'll need rca_auth_generate_token again, or your dashboard, to get back in). If you don't already know key_id_to_revoke and you're Free/Starter (so rca_auth_list_keys is unavailable to you), check your account dashboard for the key's ID instead. Args: params (RevokeTokenInput): - token: your API key, to authenticate this call - key_id_to_revoke: UUID of the key to deactivate (may be the same key presented in 'token') Returns: str: JSON confirmation with the revoked key_id

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_auth_rotate_key ~182

Deactivate one of your existing API keys and generate a replacement for the same account in one call. Requires the multi-key feature (Pro plan or above -- up to 5 keys on Pro, unlimited on Enterprise). Use rca_auth_list_keys first to find key_id if you don't already have it. Prefer this over rca_auth_revoke_token when you want a like-for-like replacement key in one step rather than just shutting the old one off. Args: params (RotateKeyInput): - key_id: UUID of the existing key to deactivate (from rca_auth_list_keys), not the raw key string itself Returns: str: JSON with old_key_id, new_key_id, api_key (new raw key -- store it now, it cannot be recovered later)

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_dtree_answer ~193

🌟 Starter+ — Answer the current diagnostic question to advance the decision tree. Call repeatedly until status == "resolved". Once resolved, use rca_guide_generate_report to turn the session into a shareable report. Args: params (DTreeAnswerInput): session_id, answer (yes|no|unknown), measurement - ai_summary: also generate a short NL executive summary if this answer resolves the session (Starter+, quota-limited -- see field description) Returns: str: JSON with status, question OR diagnosis, progress_pct, and ai_summary/ai_summary_error if ai_summary=true was requested and the session resolved. Diagnosis fields (when resolved): diagnosis, confidence, actions, parts_to_check, estimated_repair_time, escalate_to_specialist, fault_codes, references, diagnostic_path

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_dtree_generate_from_fmea ~199

🌟 Starter+ — Auto-generate a diagnostic decision tree from a completed FMEA analysis, converting HIGH-priority failure modes into a sequential yes/no diagnostic tree. Get fmea_result_id first by running rca_analysis_run against a model created with family="fmea". When save_as_guide=True (default), the tree is ingested as a json_dtree guide and the returned guide_id can be passed to rca_dtree_start -- or skip this tool entirely and pass guide_id="auto" directly to rca_dtree_start, which generates the tree on the fly without saving it. Args: params (DTreeGenerateFromFmeaInput): fmea_result_id, equipment_id, equipment_type, save_as_guide Returns: str: JSON with the generated tree, and guide_id if save_as_guide=True

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_dtree_list_sessions ~163

🌟 Starter+ — List your equipment diagnostic sessions (started via rca_dtree_start), each with its status and diagnosis if resolved. Free-plan keys get a plan_required error instead of results. Use this to find a session_id for rca_guide_generate_report, check whether a session is already resolved before continuing it with rca_dtree_answer, or review diagnostic history for one piece of equipment. Args: params (DTreeListInput): equipment_id (optional filter), resolved_only (default false — includes in-progress sessions too) Returns: str: JSON {total, sessions: [{session_id, equipment_id, status, diagnosis, ...}, ...]}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_dtree_start ~321

🌟 Starter+ — Begin an interactive diagnostic session using a decision tree guide. Returns a question — answer with rca_dtree_answer, one call per question, until the session resolves to a diagnosis. Two modes: 1. guide_id = <uuid> → Use a specific json_dtree guide 2. guide_id = "auto" → Auto-generate tree from FMEA results (requires fmea_result_id pointing to a completed FMEA analysis) session_id resume behavior (non-obvious): if you pass a session_id that's yours and not yet resolved, this returns its CURRENT question — guide_id/equipment_id/symptom are ignored entirely in that case. If the session_id is missing, already resolved, or belongs to someone else, it's silently treated as if you'd omitted it: a brand-new session starts fresh under that same session_id (or a fresh UUID if you didn't supply one) — you won't get an error, so a typo'd ID quietly starts over rather than resuming. Args: params (DTreeStartInput): - guide_id: guide UUID or "auto" - equipment_id: equipment being diagnosed - symptom: initial fault description - session_id: optional; see resume behavior above - fmea_result_id: required when guide_id="auto" Returns: str: JSON with session_id, question, options (yes/no/unknown), progress_pct

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_add_edge ~252

Add a directed causal edge (source → target) to a graph. Both nodes must already exist -- add them first with rca_graph_add_node. Automatically rejects edges that would create a cycle (DAG enforcement) rather than silently allowing an invalid graph. Args: params (EdgeOpInput): - graph_id: the graph to add to - source, target: existing node names (cause -> effect) - weight: causal strength, 0.0-1.0 (default 1.0) - confidence: how sure you are of this edge, 0.0-1.0 (default 1.0) -- distinct from weight; a weak-but-certain edge and a strong-but-uncertain one score differently - method: free-text provenance label, e.g. "manual", "granger_causality", "domain_expert" -- display only Returns: str: JSON {added_edge, weight, confidence, total_edges}, or a value/not_found error if either node doesn't exist or the edge would create a cycle

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_add_node ~188

Add a typed node to a causal graph. Node names must be unique within the graph -- adding a node with a name that already exists raises an error rather than overwriting it; remove the existing one first with rca_graph_remove_node if you want to replace it. Args: params (NodeOpInput): - graph_id: the graph to add to - name: unique node name within this graph - node_type: metric | incident | symptom | root_cause | intermediate (default "metric") -- classifies the node for reports and graph views, doesn't affect analysis - description, metadata: optional, for your own reference Returns: str: JSON {added_node, node_type, total_nodes}, or a value error if the name already exists in this graph

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_create ~116

Create a new, empty causal DAG. Populate it with rca_graph_add_node and rca_graph_add_edge afterward, or use rca_graph_discover instead if you have observational data and want the graph inferred rather than hand-built. Args: params (GraphCreateInput): - name: graph display name (for your own reference) - description: optional free-text notes on this graph's purpose Returns: str: JSON {graph_id, name, message}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_delete ~180

Delete a causal graph permanently. Requires confirm=true. This action is IRREVERSIBLE via this tool -- if graph versioning is available on your plan, restoring an old version first won't help since the whole graph record is gone, not just its edges. You only need this to remove a graph entirely; to fix a graph you're still using, edit its nodes/edges instead (rca_graph_add_node/remove_node/add_edge/remove_edge). Args: params (GraphDeleteInput): - graph_id: the graph to delete - confirm: must be true, or this returns an "aborted" error without deleting anything Returns: str: JSON {deleted: graph_id}, or a not_found error if the graph doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_discover ~221

Automatically discover a causal skeleton from observational metric data using partial-correlation + Fisher-Z conditional independence tests (PC-algorithm). Requires the causal_discovery feature (Pro+). Creates and saves a new graph, same as rca_graph_create, but with edges inferred from data instead of asserted by hand -- use rca_graph_create + rca_graph_add_edge instead if you already know the causal structure and just want to encode it directly. Always review the discovered edges (rca_graph_get or rca_graph_score) before trusting them for RCA -- statistical discovery finds correlational structure consistent with the data, not guaranteed ground truth. Args: params (GraphDiscoverInput): - name: name for the resulting graph - data: {variable: [float values]} — min 30 rows, max 50 variables - significance: p-value threshold (default 0.05) Returns: str: JSON with graph_id and discovered edge summary

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_get ~146

Retrieve a causal graph's current state. Use "json" (default) to inspect it programmatically, "dot" to render it visually with Graphviz, or "adjacency" for a plain source->targets mapping. Args: params (GraphGetInput): - graph_id: the graph to retrieve - format: "json" (full node/edge detail, default), "dot" (Graphviz source), or "adjacency" (simple mapping) Returns: str: Graph data in the requested format, or a not_found error if the graph doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_list_versions ~150

List all historical versions of a causal graph. A new version is snapshotted automatically every time the graph is saved (node/edge additions, removals, etc) -- there's no separate "save version" step. Requires the graph_versioning feature (Starter+). Use the returned version_id values with rca_graph_restore_version to roll back to an earlier state. Args: params (GraphListVersionsInput): graph_id -- the graph to list versions for Returns: str: JSON {graph_id, total, versions: [{version_id, created_at, node_count, edge_count}, ...]}, newest first

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_markov_blanket ~197

Return the Markov blanket of a node: parents ∪ children ∪ co-parents -- the minimal set of other nodes needed to fully explain this node's behavior, ignoring the rest of the graph. Use this to scope an investigation to just the metrics that actually matter for one incident node, instead of reasoning about the whole graph -- e.g. before running a targeted analysis, or to decide which upstream metrics are even worth pulling data for. Args: params (MarkovBlanketInput): - graph_id: the graph to search - node: the node to compute the blanket for (must exist in the graph; check with rca_graph_get) Returns: str: JSON {parents, children, co_parents, full_blanket}, or a not_found error if the node or graph doesn't exist

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_merge ~218

Merge two causal graphs into a unified graph for cross-system RCA (e.g. combining a network-layer graph with an application-layer graph). Duplicate edges keep the higher-weight version; edges that would introduce a cycle are dropped and counted, not silently ignored. Requires the causal_discovery feature (Pro+); both source graphs must belong to you. Args: params (GraphMergeInput): - graph_id_a, graph_id_b: the two graphs to merge (both must be yours) - merged_name: name for the new, third graph created by this call (graph_id_a/b are left untouched) - conflict_resolution: "union" (default -- keep all nodes from both graphs) or "intersection" (only nodes present in both) Returns: str: JSON {merged_graph_id, node_count, edge_count, cycles_removed}, or a not_found error if either graph doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_remove_edge ~206

Remove a directed edge (source → target) from a causal graph. Destructive and irreversible via this tool — undo by re-adding the edge with rca_graph_add_edge, or restoring an earlier version with rca_graph_restore_version. Use this when an edge was added in error or a causal hypothesis is disproven. Use rca_graph_remove_node instead if you want the node itself gone — that already removes all its edges, so you don't need to remove them individually first. Args: params (RemoveEdgeInput): - graph_id: the graph to modify - source, target: exact node names (case-sensitive); the edge must currently exist — check with rca_graph_get if unsure Returns: str: JSON {removed_edge: "source → target"}, or a not_found/value error if the edge or either node doesn't exist

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_remove_node ~208

Remove a node and all its incident edges from a causal graph. Destructive and irreversible via this tool — undo only by rebuilding the node/edges with rca_graph_add_node + rca_graph_add_edge, or restoring an earlier version with rca_graph_restore_version if versioning is available on your plan. Use this to correct a mistaken node, not to prune weak paths — for that, adjust edge weights instead, or use rca_graph_score_paths first to see which paths actually matter before deciding what to remove. Args: params (RemoveNodeInput): - graph_id: the graph to modify - name: exact node name (case-sensitive) — use rca_graph_get first if you're not sure of the exact name Returns: str: JSON {removed_node, total_nodes} (post-removal count), or a not_found/value error if the node doesn't exist

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_restore_version ~167

Restore a causal graph to a specific historical version. This creates a new current state from the version snapshot — the version history itself is preserved (the restore operation is snapshotted too, so restoring is itself undoable by restoring forward again). Requires confirm=true and the graph_versioning feature (Starter+). Use rca_graph_list_versions first to find a version_id. Args: params (GraphRestoreVersionInput): - graph_id: the graph to restore - version_id: from rca_graph_list_versions - confirm: must be true, or this returns an "aborted" error Returns: str: JSON with graph_id, restored_from version_id, node/edge counts

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_score ~180

Compute structural quality scores for a causal graph -- a sanity check on the graph's shape itself (is it a valid DAG, how connected is it), not a root-cause analysis. Use this after building or editing a graph by hand, or after rca_graph_discover, to catch structural issues (e.g. disconnected components, a graph that isn't actually a DAG) before running rca_analysis_run on it. Args: params (GraphScoreInput): graph_id -- the graph to score Returns: str: JSON GraphScore {node_count, edge_count, dag_valid, density, avg_in_degree, avg_out_degree, max_path_length, connected_components, root_nodes, leaf_nodes, structural_score, coverage_score} -- both scores in [0,1]

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_graph_score_paths ~262

Find and rank all causal paths from every root (no-incoming-edge) node to a target incident node. Score = geometric-mean(edge weights) × avg_confidence / sqrt(hops) — shorter, higher-weight, higher-confidence paths rank above longer or weaker ones. Use this on a graph you've built by hand (rca_graph_create + rca_graph_add_edge) to see which manually-asserted causal chains are strongest. For a data-driven ranking instead of a hand-built graph, use rca_analysis_run with a model family like granger_causality or dowhy_causal_inference instead. Args: params (PathScoreInput): - graph_id: the graph to search - target_node: the incident/effect node to trace backward from (must exist in the graph; check with rca_graph_get) - top_k: how many top-ranked paths to return, 1-50 (default 10) Returns: str: JSON {target_node, paths_found, top_paths: [ScoredPath, ...]} ranked by score descending; empty list if no path from any root node reaches the target

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_delete ~222

Permanently delete an equipment guide you ingested. Requires confirm=true. This action is IRREVERSIBLE -- re-ingest via rca_guide_ingest or rca_guide_ingest_pdf if you need it back. Scoped to your own guides only -- the 4 built-in sample guides (shared, visible to every account) can never be deleted this way, since delete_guide() requires an exact ownership match; deleting a guide already referenced by an active decision-tree session doesn't affect that session's in-progress state. Args: params (GuideDeleteInput): - guide_id: the guide to delete (from rca_guide_list or rca_guide_search) - confirm: must be true, or this returns an "aborted" error Returns: str: JSON confirmation with the deleted guide_id, or a not_found error if it doesn't exist or belongs to another user (including the 4 shared built-in samples)

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_generate_report ~203

🌟 Starter+ (markdown) / 💎 Pro+ (PDF/HTML) — Generate a maintenance/ troubleshooting report from a completed diagnostic session. The session must already be resolved (finished via rca_dtree_answer) — an in-progress session returns an error telling you to keep answering questions first. Report includes equipment/symptom summary, full diagnostic path, root cause with confidence score, recommended actions and parts list, measurements recorded, guide section references, and escalation flag. Args: params (GuideReportInput): - session_id: must be a session already marked "resolved" (check via rca_dtree_list_sessions) - format: "markdown" (default, Starter+), "pdf" or "html" (Pro+ only — Starter requesting these gets plan_required, not a silent downgrade) - include_guide_refs, custom_title

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_get ~231

✅ All plans — Retrieve a full troubleshooting guide, or one specific section by ID. Includes the 4 built-in shared sample guides (visible and readable by every account, though only rca_guide_ingest/rca_guide_ingest_pdf can add your own, and only your own can be deleted via rca_guide_delete). Args: params (GuideGetInput): - guide_id: from rca_guide_ingest, rca_guide_ingest_pdf, or rca_guide_search/rca_guide_list results - section_id: optional, to retrieve one section instead of the whole guide (section IDs come from rca_guide_search results or a prior full rca_guide_get call) Returns: str: JSON {guide_id, metadata, sections} (whole guide) or {guide_id, metadata, section} (single section), or a not_found error if the guide/section doesn't exist or isn't yours

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_ingest ~205

🌟 Starter+ — Upload and index an equipment troubleshooting guide into the knowledge base, as plain text content. Use rca_guide_ingest_pdf instead if you're starting from an actual PDF file. Supports three formats: markdown — Structured Markdown with ## headings (recommended); fault codes (F-###, ERR-###) are auto-extracted plain — Raw text; split into sections on double newlines json_dtree — JSON decision tree for interactive diagnostics via rca_dtree_start Guide is immediately searchable via rca_guide_search after ingestion. Plan limits: Starter up to 10 guides, Pro up to 100, Enterprise unlimited. Args: params (GuideIngestInput): equipment_id, equipment_type, name, content, format, tags, version Returns: str: JSON with guide_id, section_count, symptom_count, fault_code_count

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_ingest_pdf ~293

🌟 Starter+ — Parse a PDF equipment manual and ingest it into the RCA knowledge base. Rejects non-PDF input (checked via file signature, not just the base64 wrapper) and files over 50MB. A quality gate runs automatically: if the parsed quality score falls below min_quality_threshold (default 0.3), ingestion is refused with suggestions -- set skip_preview_check=true to bypass it, or lower min_quality_threshold, if you've already reviewed the content via rca_guide_pdf_preview and are OK with a rougher parse. Recommended workflow: 1) rca_guide_pdf_preview to check quality, 2) rca_guide_ingest_pdf if quality >= 0.5, 3) rca_guide_search to verify. Plan limits: Starter up to 10 guides total, Pro up to 100, Enterprise unlimited. Max PDF size: 50MB. Args: params (GuidePDFIngestInput): pdf_base64, equipment_id, equipment_type, name, tags, version, strategy, ocr_dpi, ocr_language, max_pages, skip_preview_check, min_quality_threshold Returns: str: JSON with guide_id, section_count, fault_codes, part_numbers, parse_quality, strategy_used, page_count, word_count

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_list ~154

✅ All plans — List your ingested troubleshooting guides (plus the 4 built-in shared samples visible to every account), with optional equipment_type/tag filters. Use the returned guide_id with rca_guide_get, rca_guide_delete, or rca_dtree_start. Args: params (GuideListInput): - equipment_type: only guides for this type (omit for all) - tags: only guides matching any of these tags (omit for all) Returns: str: JSON {total, guides: [{guide_id, equipment_id, equipment_type, name, version, tags, section_count, created_at}, ...]}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_pdf_preview ~148

🌟 Starter+ — Preview a PDF document before full ingestion to verify parsing quality. Always call this BEFORE rca_guide_ingest_pdf. Strategies: text_native (born-digital, fastest), ocr (scanned, needs Tesseract), table (parts lists/spec tables), mixed (combination), auto (recommended default). Args: params (GuidePDFPreviewInput): pdf_base64, n_pages, strategy Returns: str: JSON with detected_strategy, page_count, scanned_page_ratio, estimated_quality, sample_text, fault_codes_preview, part_numbers_preview, tables_found, recommendations, dependencies

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_guide_search ~117

✅ All plans — Search the equipment knowledge base by symptom description using TF-IDF relevance ranking. Free plan capped at 3 results. Searches both your own ingested guides and the 4 built-in shared sample guides (visible to every account). Args: params (GuideSearchInput): symptom, equipment_type, tags, top_k (1-20) Returns: str: JSON list of matching guide sections with relevance_score, excerpt, fault_codes, and page_ref

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_model_create ~296

Register a new RCA model spec in the registry, starting in "draft" status. This just stores the spec — it doesn't run anything. Plan limits on how many models you can hold: Free 5, Starter 20, Pro+ unlimited (call rca_admin_show_plan_info to check your own count/limit). Typical lifecycle: create (here) → rca_analysis_run to use it → rca_model_validate on hold-out data → rca_model_update_status to mark it "deployed" (or "deprecated"/"failed") → rca_model_delete when you're done with it entirely. Model families: bayesian_network | dowhy_causal_inference | granger_causality | fault_tree_analysis | fishbone_ishikawa | fmea | bayesian_structural_time_series | change_point_detection | random_forest_importance | counterfactual_analysis Args: params (ModelCreateInput): - name: for your own reference only - family: which RCA algorithm this model will use - description, tags, version: optional, for your own organization - config: family-specific parameters (e.g. significance threshold), passed through to the model at run time Returns: str: JSON {model_id}, or a plan_required error if you're at your model-count limit

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_model_delete ~203

Permanently delete a model from the registry and storage. Requires confirm=true. This action is IRREVERSIBLE -- any results already produced by this model (via rca_analysis_run etc.) are unaffected and stay retrievable via rca_analysis_get_result, but you can no longer run new analyses with this model_id. Use rca_model_update_status to mark a model "deprecated" instead if you just want to stop new usage while keeping it around for reference -- delete is for when you're certain you won't need the spec again. Args: params (ModelDeleteInput): - model_id: the model to delete - confirm: must be true, or this returns an "aborted" error without deleting anything Returns: str: JSON {deleted_model_id}, or a not_found error if the model doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_model_list ~139

List all of YOUR registered RCA models, with optional family/status filters. Use this to find a model_id for rca_analysis_run, or to check your usage against your plan's model-count limit (see rca_admin_show_plan_info for the limit itself). Args: params (ModelListInput): - family_filter: only this model family (omit for all) - status_filter: only this status (omit for all) Returns: str: JSON {total, models: [{model_id, name, family, status, version, tags, created_at}, ...]}

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_model_update_status ~231

Set a model's lifecycle status directly to any of: draft, trained, validated, deployed, deprecated, failed. This is a direct field update, not a guarded state machine — there is no enforced order (e.g. nothing stops setting "deployed" on a model that was never validated); that discipline is on the caller, not the API. Use "deprecated" to retire a model without deleting it (its past results stay queryable via rca_analysis_get_result); use "failed" to flag one that shouldn't be used, e.g. after rca_model_validate reports poor hold-out performance. Use rca_model_delete instead if you want the model gone entirely, not just marked. Args: params (ModelStatusInput): - model_id: the model to update - new_status: one of draft | trained | validated | deployed | deprecated | failed Returns: str: JSON {model_id, status}, or a not_found error if the model doesn't exist or belongs to another user

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_model_validate ~223

Run a quick correlation-based sanity check of a model against hold-out data you supply (not automatically split from training data -- you provide a separate dataset). This is a lightweight coverage/confidence check, not full cross-validation or backtesting; use it to catch an obviously broken model, not to certify accuracy. Sets the model's status to "validated" on success -- you don't need to also call rca_model_update_status afterward, though you can still use that tool later to move it to "deployed", "deprecated", or "failed". Args: params (ModelValidateInput): - model_id: the model to validate (from rca_model_create) - validation_data: {variable: [values]}, same shape as an rca_analysis_run payload's "data" field - target: which variable in validation_data to validate against Returns: str: JSON validation metrics (coverage, mean_correlation, confidence), or a not_found/bad_input error

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

rca_provider_list_configs ~263

Get MCP client configuration and setup instructions for a specific provider or list all supported providers. Use this when a user asks "how do I connect RCA-MCP to X" -- it's documentation lookup, not something that affects RCA-MCP's own behavior. Supported providers: claude_desktop — Claude Desktop app (macOS/Windows) claude_code — Claude Code VS Code extension cursor — Cursor AI code editor ollama_mcphost — Ollama local models via MCPHost bridge groq_mcphost — Groq cloud via MCPHost bridge openai_agents — OpenAI GPT via openai-agents SDK gemini_mcphost — Google Gemini via MCPHost bridge langchain_langgraph — LangChain/LangGraph via mcp-adapters openrouter — OpenRouter (200+ models) via MCPHost remote_http — Direct Streamable HTTP (advanced, custom clients only) Args: params (ProviderConfigInput): - provider: specific provider key, or omit to list all Returns: str: JSON config dict with setup instructions, run commands, and notes

NameTypeReqDescription
paramsyes
NameTypeReqDescription
resultstringyes

No examples provided.

Common questions

What is the RCA-MCP server?

RCA-MCP is listed in the public MCP registry as io.github.dave1362/rca-mcp-connector. Causal root-cause analysis MCP server -- 56 tools across graphs, RCA models, PyRCA. This page covers its PyPI package (rca-mcp-connector).

What tools does the RCA-MCP server expose?

RCA-MCP exposes 56 tools: rca_auth_generate_token, rca_auth_list_keys, rca_auth_rotate_key, rca_auth_revoke_token, rca_admin_health, and 51 more. Their descriptions and schemas cost roughly 11,685 tokens of context every time the server is loaded.

Is the RCA-MCP server still maintained?

RCA-MCP is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the RCA-MCP server under?

RCA-MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.