{
  "name": "Cartographer",
  "category": "relationship memory",
  "summary": "Maps an operator's working relationships from their own correspondence — consent per source, receipts on every claim — and serves that map to AI agents over the Model Context Protocol as context and constraints for drafting. Nothing sends itself.",
  "status": "in development, pre-launch",
  "notice": "Descriptive metadata, not a live endpoint. This file documents the MCP surface of the real build so agents can discover it. The repository is not yet public and no hosted server exists yet; tools marked 'planned' are not in the shipped server.",
  "interface": {
    "protocol": "Model Context Protocol (MCP)",
    "transport": "stdio",
    "entrypoint": "python -m mcpserver.server",
    "working_directory": "the product repository root",
    "requires": [
      "Python 3.13",
      "FalkorDB graph store (docker compose up -d --wait falkordb)"
    ],
    "live_endpoint": null
  },
  "tools": [
    {
      "name": "ritual_pull",
      "status": "shipped",
      "summary": "Everything an agent needs before drafting to a recipient: resolved contact, current edges, graph neighborhood, composites with receipts, policies, relationship state, constraints, and open asks.",
      "inputs": ["recipient", "archetype?"]
    },
    {
      "name": "draft_context",
      "status": "shipped",
      "summary": "The full ritual packet plus the operator's voice fingerprint, register notes, common-ground ledger, knowledge-mask summary, read budget, success criteria, and a commitments scaffold. send_ready is always false: sending stays a human act.",
      "inputs": ["recipient", "archetype?", "claims?", "operator_brief?", "call_id?"]
    },
    {
      "name": "add_episode",
      "status": "shipped",
      "summary": "Add one episode to the graph. Episodes without participant contact ids are rejected, never stored.",
      "inputs": ["source", "participants", "body", "ts", "thread_id?"]
    },
    {
      "name": "mask_check",
      "status": "shipped",
      "summary": "Split claims against the operator's knowledge mask: in-mask claims name their matching domains; out-of-mask claims return as operator-addressed briefings, never draft content.",
      "inputs": ["claims"]
    },
    {
      "name": "declare",
      "status": "shipped",
      "summary": "Write an explicit fact (provenance: declared). Explicit beats inferred; also accepts common-ground ledger entries.",
      "inputs": ["fact"]
    },
    {
      "name": "forget",
      "status": "shipped",
      "summary": "Deletion propagation: remove a contact's episodes and edges, cascade through everything derived from them, resummarize what remains, and record the deletion so re-ingest can never resurrect them.",
      "inputs": ["contact_id"]
    },
    {
      "name": "confidence_report",
      "status": "shipped",
      "summary": "Weak composites plus suggested questions for one contact. Below the confidence floor the system asks; it never asserts.",
      "inputs": ["contact"]
    },
    {
      "name": "record_correction",
      "status": "planned",
      "summary": "Capture operator corrections to drafts and profile claims as first-class evidence. Not in the shipped server yet.",
      "inputs": []
    },
    {
      "name": "resolve_identities",
      "status": "planned",
      "summary": "Merge and split contact identities with append-only, reversible operations. Not in the shipped server yet.",
      "inputs": []
    }
  ],
  "also_exposed": "The same entrypoint serves the vendored upstream Graphiti memory tools (graph search, episode management, status). Those require live model credentials; the tools above run fully offline against the local graph store.",
  "guarantees": [
    "Every profile claim carries receipts to source evidence, or displays as a flagged unknown.",
    "Consent is granted per source and refusal is terminal; collectors will not run without a grant.",
    "No send path exists: draft packets always carry send_ready=false.",
    "Model-agnostic: the extraction model is the operator's configuration choice.",
    "A binding never-scored list: no discretion or forwarding-risk scores, no protected-attribute inference, no clinical labels."
  ],
  "links": {
    "llms": "./llms.txt",
    "site": "./",
    "research": "./research/",
    "open_source": "./open-source/",
    "repository": null
  }
}
