{"name":"Cascadian MCP tools","description":"The agent-native causal decision substrate: one MCP server, one Postgres. This manifest documents the designed tool surface; the alpha is MCP-only and REST mirror paths are planned.","connect":{"mcp":"claude mcp add cascadian https://mcp.cascadian.ai/alpha","docs":"https://cascadian.ai/mcp-api","llms":"https://cascadian.ai/llms.txt"},"invariants_note":"Enforced structurally — by schema constraints, append-only storage, and mandatory service paths — never by prompt.","invariants":[{"id":"I1","statement":"History is never silently overwritten","enforcement":"Append-only triggers on ledger tables; corrections insert a new row and close the old one in one transaction."},{"id":"I2","statement":"No future information in past decisions","enforcement":"A single as-of read path; every read takes as_of, and open decisions auto-inject their pinned as_of."},{"id":"I3","statement":"No causal estimate without identification","enforcement":"effect_estimates.identification_review_id is a NOT NULL FK; estimate() refuses to run without a review, and exploratory output is watermarked."},{"id":"I4","statement":"No hidden arbitrary scores","enforcement":"No scalar score column anywhere; recommendations store rationale, explicit comparison, and assumptions."},{"id":"I5","statement":"Agents never define truth","enforcement":"Every MCP write tool can only create status='proposed' rows; promotion requires an approval token that never crosses the MCP boundary."},{"id":"I6","statement":"No high-risk action without approval","enforcement":"record_decision requires a granted approval for risk ≥ medium, computed server-side from the decision row — not from tool arguments."}],"groups":[{"id":"memory","label":"Memory","blurb":"What is known — facts, sources, the four memory networks."},{"id":"causal","label":"Causal","blurb":"Why — the governed graph, identification, estimates, knock-ons."},{"id":"decisions","label":"Decisions","blurb":"Decide and learn — the ledger that makes judgment compound."},{"id":"governance","label":"Governance","blurb":"Trust — approvals, audit, leakage detection, honesty."}],"tool_count":32,"tools":[{"name":"bootstrap","group":"Memory","tier":"Key","tagline":"The ~200-token session card your agent reads first.","returns":"SESSION CARD","params":[],"docs":"https://cascadian.ai/mcp-api/tools/bootstrap","rest_mirror_planned":"POST /v1/bootstrap"},{"name":"ingest_source","group":"Memory","tier":"Key","tagline":"Store a raw source — chunked, embedded, indexed.","returns":"SOURCE_ID + SUMMARIES","params":[{"name":"content","type":"string","required":true,"description":"The raw source text to store."},{"name":"title","type":"string","required":false,"description":"Human-readable source title."},{"name":"source_type","type":"string","required":false,"description":"e.g. \"note\", \"document\", \"transcript\"."}],"docs":"https://cascadian.ai/mcp-api/tools/ingest_source","rest_mirror_planned":"POST /v1/sources"},{"name":"assert_fact","group":"Memory","tier":"Key","tagline":"Write a temporal fact with an honest available_at.","returns":"FACT","params":[{"name":"entity","type":"string","required":true,"description":"The entity the fact is about."},{"name":"attribute","type":"string","required":true,"description":"The attribute being asserted."},{"name":"value","type":"string","required":true,"description":"The value of the attribute."},{"name":"valid_from","type":"timestamp","required":false,"description":"When the fact became true in the world."},{"name":"backdate_reason","type":"string","required":false,"description":"Audited reason to set available_at in the past."}],"docs":"https://cascadian.ai/mcp-api/tools/assert_fact","rest_mirror_planned":"POST /v1/facts"},{"name":"propose_memory","group":"Memory","tier":"Key","tagline":"Propose a memory item — contradiction-checked on write.","returns":"PROPOSED + CONFLICTS","params":[{"name":"content","type":"string","required":true,"description":"The belief, assumption, hypothesis, or lesson."},{"name":"type","type":"enum","required":true,"description":"belief · assumption · hypothesis · lesson."},{"name":"entities","type":"string[]","required":false,"description":"Entities to link. The server also links automatically."},{"name":"evidence_ids","type":"string[]","required":false,"description":"Sources or facts supporting the item."}],"docs":"https://cascadian.ai/mcp-api/tools/propose_memory","rest_mirror_planned":"POST /v1/memories"},{"name":"link_memories","group":"Memory","tier":"Key","tagline":"A typed relationship edge, with rationale.","returns":"EDGE","params":[{"name":"from_id","type":"string","required":true,"description":"Source memory id."},{"name":"to_id","type":"string","required":true,"description":"Target memory id."},{"name":"relation","type":"string","required":true,"description":"The typed relation, e.g. \"contradicts\"."},{"name":"rationale","type":"string","required":true,"description":"Why this edge exists."}],"docs":"https://cascadian.ai/mcp-api/tools/link_memories","rest_mirror_planned":"POST /v1/memories/link"},{"name":"supersede_memory","group":"Memory","tier":"Key","tagline":"Revise without erasing — new row, old row closed.","returns":"REVISION","params":[{"name":"memory_id","type":"string","required":true,"description":"The memory item being superseded."},{"name":"content","type":"string","required":true,"description":"The revised content."},{"name":"reason","type":"string","required":true,"description":"Why the old item no longer holds."}],"docs":"https://cascadian.ai/mcp-api/tools/supersede_memory","rest_mirror_planned":"POST /v1/memories/supersede"},{"name":"search_memory","group":"Memory","tier":"Key","tagline":"Hybrid retrieval with an honest empty result.","returns":"RANKED SUMMARIES + IDS","params":[{"name":"query","type":"string","required":true,"description":"Natural-language or keyword query."},{"name":"types","type":"string[]","required":false,"description":"Filter by memory type — fact, belief, lesson, …"},{"name":"entity","type":"string","required":false,"description":"Restrict to one entity."},{"name":"as_of","type":"timestamp","required":false,"description":"Search only what was knowable at this moment."},{"name":"limit","type":"int","required":false,"description":"Max results. Default 10."}],"docs":"https://cascadian.ai/mcp-api/tools/search_memory","rest_mirror_planned":"POST /v1/search"},{"name":"get_facts","group":"Memory","tier":"Key","tagline":"What was true, as of any moment.","returns":"FACTS","params":[{"name":"entity","type":"string","required":true,"description":"The entity to query."},{"name":"as_of","type":"timestamp","required":false,"description":"The moment to reconstruct. Default now."}],"docs":"https://cascadian.ai/mcp-api/tools/get_facts","rest_mirror_planned":"GET /v1/facts"},{"name":"get_entity","group":"Memory","tier":"Key","tagline":"The versioned dossier for one entity.","returns":"DOSSIER","params":[{"name":"entity_id","type":"string","required":true,"description":"The entity to load."},{"name":"as_of","type":"timestamp","required":false,"description":"Dossier as of this moment. Default now."}],"docs":"https://cascadian.ai/mcp-api/tools/get_entity","rest_mirror_planned":"GET /v1/entities"},{"name":"get_memory","group":"Memory","tier":"Key","tagline":"The full evidence card, by id.","returns":"EVIDENCE CARD","params":[{"name":"memory_id","type":"string","required":true,"description":"The memory item to load in full."}],"docs":"https://cascadian.ai/mcp-api/tools/get_memory","rest_mirror_planned":"GET /v1/memories"},{"name":"get_context_pack","group":"Memory","tier":"Key","tagline":"Everything knowable for a decision, stamped and typed.","returns":"CONTEXT PACK","params":[{"name":"question","type":"string","required":true,"description":"The decision question to assemble context for."},{"name":"as_of","type":"timestamp","required":false,"description":"Assemble only what was knowable then. Default now — pinned automatically inside an open decision."},{"name":"detail","type":"enum","required":false,"description":"\"summary\" (default, ≤2k tokens) or \"full\"."}],"docs":"https://cascadian.ai/mcp-api/tools/get_context_pack","rest_mirror_planned":"POST /v1/context-pack"},{"name":"list_contradictions","group":"Memory","tier":"Key","tagline":"Open conflicts waiting on a human.","returns":"CONFLICTS[]","params":[{"name":"status","type":"enum","required":false,"description":"\"open\" (default) or \"resolved\"."}],"docs":"https://cascadian.ai/mcp-api/tools/list_contradictions","rest_mirror_planned":"GET /v1/contradictions"},{"name":"propose_nodes","group":"Causal","tier":"Key","tagline":"Propose variables for the graph — status proposed.","returns":"PROPOSED NODES","params":[{"name":"nodes","type":"object[]","required":true,"description":"Proposed variables — name + description each."},{"name":"rationale","type":"string","required":true,"description":"Why these variables belong in the graph."},{"name":"evidence_ids","type":"string[]","required":false,"description":"Memory or sources supporting the proposal."}],"docs":"https://cascadian.ai/mcp-api/tools/propose_nodes","rest_mirror_planned":"POST /v1/graph/nodes"},{"name":"propose_edge","group":"Causal","tier":"Key","tagline":"Propose a cause→effect edge, with evidence.","returns":"PROPOSED EDGE","params":[{"name":"cause","type":"string","required":true,"description":"The cause variable."},{"name":"effect","type":"string","required":true,"description":"The effect variable."},{"name":"rationale","type":"string","required":true,"description":"The claimed mechanism."},{"name":"evidence_ids","type":"string[]","required":false,"description":"Memory or sources supporting the edge."}],"docs":"https://cascadian.ai/mcp-api/tools/propose_edge","rest_mirror_planned":"POST /v1/graph/edges"},{"name":"get_graph","group":"Causal","tier":"Key","tagline":"The governed graph, by version or as-of.","returns":"GRAPH","params":[{"name":"version","type":"string","required":false,"description":"A specific graph version. Default latest."},{"name":"as_of","type":"timestamp","required":false,"description":"The graph as it stood at this moment."},{"name":"format","type":"enum","required":false,"description":"\"json\" (default) or \"mermaid\"."}],"docs":"https://cascadian.ai/mcp-api/tools/get_graph","rest_mirror_planned":"GET /v1/graph"},{"name":"validate_graph","group":"Causal","tier":"Key","tagline":"Structural checks before anyone trusts an edge.","returns":"VALIDATION REPORT","params":[{"name":"treatment","type":"string","required":false,"description":"Optional treatment to check connectivity for."},{"name":"outcome","type":"string","required":false,"description":"Optional outcome to check connectivity for."},{"name":"version","type":"string","required":false,"description":"Graph version to validate. Default latest."}],"docs":"https://cascadian.ai/mcp-api/tools/validate_graph","rest_mirror_planned":"POST /v1/graph/validate"},{"name":"identify","group":"Causal","tier":"Key","tagline":"Can this effect be estimated at all? The gate.","returns":"IDENTIFICATION REVIEW","params":[{"name":"treatment","type":"string","required":true,"description":"The cause variable, e.g. \"discount\"."},{"name":"outcome","type":"string","required":true,"description":"The effect variable, e.g. \"win_rate\"."},{"name":"as_of","type":"timestamp","required":false,"description":"Identify on the graph as it stood then. Default now."}],"docs":"https://cascadian.ai/mcp-api/tools/identify","rest_mirror_planned":"POST /v1/identify"},{"name":"estimate","group":"Causal","tier":"Key","tagline":"A causal estimate that survives the skeptic checks.","returns":"ESTIMATE + SKEPTIC REPORT","params":[{"name":"identification_review_id","type":"string","required":true,"description":"The review from identify(). No review, no estimate."},{"name":"estimator","type":"enum","required":false,"description":"diff_means · ols_adjusted · logistic · ipw. Default chosen by the review."},{"name":"as_of","type":"timestamp","required":false,"description":"Build the dataset as of this moment. Default the review's as_of."}],"docs":"https://cascadian.ai/mcp-api/tools/estimate","rest_mirror_planned":"POST /v1/estimate"},{"name":"simulate_intervention","group":"Causal","tier":"Key","tagline":"do(X=x) on the approved graph — the knock-on report.","returns":"KNOCK-ON REPORT","params":[{"name":"intervention","type":"object","required":true,"description":"The do() — variable and value, e.g. {\"discount_tier\": \"removed\"}."},{"name":"targets","type":"string[]","required":false,"description":"Downstream variables to report. Default: all descendants."},{"name":"as_of","type":"timestamp","required":false,"description":"Fit mechanisms from data as of this moment. Default now."}],"docs":"https://cascadian.ai/mcp-api/tools/simulate_intervention","rest_mirror_planned":"POST /v1/simulate"},{"name":"attribute_change","group":"Causal","tier":"Key","tagline":"What caused this metric to move?","returns":"ATTRIBUTION","params":[{"name":"metric","type":"string","required":true,"description":"The variable that moved."},{"name":"window_a","type":"string","required":true,"description":"Baseline as-of window, e.g. \"2026-03-01/2026-04-15\"."},{"name":"window_b","type":"string","required":true,"description":"Comparison as-of window."}],"docs":"https://cascadian.ai/mcp-api/tools/attribute_change","rest_mirror_planned":"POST /v1/attribute"},{"name":"open_decision","group":"Decisions","tier":"Key","tagline":"Open a decision and pin what is knowable now.","returns":"DECISION + PINNED PACK","params":[{"name":"question","type":"string","required":true,"description":"The decision question, plainly stated."},{"name":"risk_level","type":"enum","required":false,"description":"low · medium · high. Server may raise it by policy."},{"name":"as_of","type":"timestamp","required":false,"description":"Pin knowledge to this moment. Default now."}],"docs":"https://cascadian.ai/mcp-api/tools/open_decision","rest_mirror_planned":"POST /v1/decisions"},{"name":"record_recommendation","group":"Decisions","tier":"Key","tagline":"The full recommendation — expectation frozen.","returns":"RECOMMENDATION","params":[{"name":"decision_id","type":"string","required":true,"description":"The open decision this recommends on."},{"name":"action","type":"enum","required":true,"description":"act · wait · test · research · add · hold · trim · exit · hedge · escalate."},{"name":"rationale","type":"string","required":true,"description":"Why this action, in plain language."},{"name":"expected_outcome","type":"object","required":true,"description":"The measurable expectation. Frozen on write."},{"name":"invalidation_criteria","type":"string[]","required":true,"description":"Observable conditions that void the thesis."}],"docs":"https://cascadian.ai/mcp-api/tools/record_recommendation","rest_mirror_planned":"POST /v1/recommendations"},{"name":"record_decision","group":"Decisions","tier":"Scoped","tagline":"The immutable commit. Approval enforced server-side.","returns":"IMMUTABLE DECISION","params":[{"name":"decision_id","type":"string","required":true,"description":"The decision to commit."},{"name":"approval_id","type":"string","required":false,"description":"Required for risk ≥ medium. Verified server-side."}],"docs":"https://cascadian.ai/mcp-api/tools/record_decision","rest_mirror_planned":"POST /v1/decisions/commit"},{"name":"record_outcome","group":"Decisions","tier":"Key","tagline":"Measured actuals against the frozen expectation.","returns":"EXPECTED VS ACTUAL","params":[{"name":"decision_id","type":"string","required":true,"description":"The decided decision to score."},{"name":"actuals","type":"object","required":true,"description":"The measured outcome values."},{"name":"measured_at","type":"timestamp","required":false,"description":"When the actuals were measured."}],"docs":"https://cascadian.ai/mcp-api/tools/record_outcome","rest_mirror_planned":"POST /v1/outcomes"},{"name":"propose_learning","group":"Decisions","tier":"Key","tagline":"Queue what the variance taught — humans approve.","returns":"PROPOSED LEARNING","params":[{"name":"decision_id","type":"string","required":false,"description":"The decision whose variance prompted this."},{"name":"type","type":"enum","required":true,"description":"edge_confidence · belief_supersession · lesson · policy."},{"name":"content","type":"string","required":true,"description":"The proposed update, plainly stated."},{"name":"evidence_ids","type":"string[]","required":false,"description":"Outcomes or memory supporting it."}],"docs":"https://cascadian.ai/mcp-api/tools/propose_learning","rest_mirror_planned":"POST /v1/learnings"},{"name":"review_calibration","group":"Decisions","tier":"Key","tagline":"How good are the calls, over time and by type.","returns":"CALIBRATION REPORT","params":[{"name":"window","type":"string","required":false,"description":"Lookback window, e.g. \"365d\". Default all time."},{"name":"decision_type","type":"string","required":false,"description":"Restrict to one decision type or action."}],"docs":"https://cascadian.ai/mcp-api/tools/review_calibration","rest_mirror_planned":"GET /v1/calibration"},{"name":"get_decision","group":"Decisions","tier":"Key","tagline":"The full decision card, by id.","returns":"DECISION CARD","params":[{"name":"decision_id","type":"string","required":true,"description":"The decision to load in full."}],"docs":"https://cascadian.ai/mcp-api/tools/get_decision","rest_mirror_planned":"GET /v1/decisions"},{"name":"request_approval","group":"Governance","tier":"Scoped","tagline":"Ask the human. The token never crosses this boundary.","returns":"PENDING + INSTRUCTIONS","params":[{"name":"decision_id","type":"string","required":true,"description":"The decision awaiting sign-off."},{"name":"reason","type":"string","required":false,"description":"Context for the human reviewing it."}],"docs":"https://cascadian.ai/mcp-api/tools/request_approval","rest_mirror_planned":"POST /v1/approvals"},{"name":"get_pending_approvals","group":"Governance","tier":"Key","tagline":"What is waiting on a human.","returns":"PENDING[]","params":[],"docs":"https://cascadian.ai/mcp-api/tools/get_pending_approvals","rest_mirror_planned":"GET /v1/approvals"},{"name":"reconstruct_decision","group":"Governance","tier":"Key","tagline":"Re-run the pinned reads. The diff is the audit.","returns":"AS-OF DIFF","params":[{"name":"decision_id","type":"string","required":true,"description":"The decision to reconstruct."}],"docs":"https://cascadian.ai/mcp-api/tools/reconstruct_decision","rest_mirror_planned":"POST /v1/reconstruct"},{"name":"detect_leakage","group":"Governance","tier":"Key","tagline":"Catch any future fact that leaked into the past.","returns":"VIOLATION REPORT","params":[{"name":"decision_id","type":"string","required":true,"description":"The decision to audit for leakage."}],"docs":"https://cascadian.ai/mcp-api/tools/detect_leakage","rest_mirror_planned":"POST /v1/leakage"},{"name":"capabilities","group":"Governance","tier":"Public","tagline":"The honesty endpoint — what is real vs planned.","returns":"CAPABILITY MATRIX","params":[],"docs":"https://cascadian.ai/mcp-api/tools/capabilities","rest_mirror_planned":"GET /v1/capabilities"}]}