{
  "markdown": "# Elefante\n\nThe open, Git-native memory protocol for MCP agents: portable, inspectable, versioned, and human-editable.\n\n```\nYour agent's memory is a Git repo you own.\nEvery memory is a Markdown file you can read.\nEvery change is a commit you can audit.\nAny MCP agent can connect to it.\n```\n\n---\n\n## Why\n\nEvery AI agent has its own memory system. Claude's works only with Claude. ChatGPT's works only with ChatGPT. They're all opaque, vendor-locked, and non-portable.\n\nElefante takes a different approach. Instead of optimizing for retrieval quality, it optimizes for **ownership**, **auditability**, and **portability** — the things that matter when memory is a first-class asset, not a hidden implementation detail.\n\n| Question | Answer |\n|---|---|\n| Who owns my agent's memory? | You do. It's a Git repo. |\n| What does my agent know about me? | `cat memories/user/*.md` |\n| What changed since last week? | `git log --since=\"1 week ago\"` |\n| How do I use it across Claude, Codex, and Cursor? | Point them at the same MCP server. |\n| How do I back it up? | Every clone is a full backup. |\n| How do I undo a bad memory? | `git revert` |\n\n## Quick Start\n\n```bash\n# Install\nnpm install -g elefante-mcp\n\n# Initialize vault (uses a private GitHub repo as storage)\nelefante init git@github.com:yourname/my-memory.git\n\n# Add your first memory\nelefante add \\\n  --name \"TypeScript strict mode\" \\\n  --type user \\\n  --body \"Always enable strict: true in tsconfig.json\"\n\n# Search\nelefante search \"typescript\"\n\n# Check status\nelefante status\n```\n\n## Connect to Your Agent\n\n**From the terminal** (before starting Claude Code):\n\n```bash\nclaude mcp add --scope user elefante -- npx -y elefante-mcp mcp\n```\n\n**From inside Claude Code** (during a session):\n\n```\n/mcp add --scope user elefante -- npx -y elefante-mcp mcp\n```\n\n**Or manually** — add to your MCP config (`~/.claude.json`, `.cursor/mcp.json`, etc.):\n\n```json\n{\n  \"mcpServers\": {\n    \"elefante\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"elefante-mcp\", \"mcp\"]\n    }\n  }\n}\n```\n\n**Cursor / VS Code / Codex** — same config. Any agent that speaks MCP can read and write to the same vault.\n\nOnce connected, your agent gets 7 tools: `memory_write`, `memory_read`, `memory_search`, `memory_list`, `memory_update`, `memory_delete`, `memory_sync`.\n\n### Auto-Discovery\n\nElefante injects your top memories directly into the agent's system prompt at startup via MCP `instructions`. The agent sees your preferences, feedback, and project context **without needing to search first**.\n\nNo `CLAUDE.md` hacks. No \"search my elefante memory\" prompts. It just works.\n\n## Project-Aware Memory\n\nElefante auto-detects which project you're in and scopes memories accordingly. No configuration needed.\n\n### How It Works\n\nWhen the MCP server starts, it reads the git remote from your working directory:\n\n```\n~/Projects/acme-api/   →  git remote = github.com:you/acme-api.git\n                       →  profile = \"you/acme-api\"\n                       →  memories scoped to this project\n\n~/Projects/my-cli/     →  git remote = github.com:you/my-cli.git\n                       →  profile = \"you/my-cli\"\n                       →  different project, different memories\n```\n\n### What Gets Scoped\n\n| You say | What happens |\n|---|---|\n| \"Remember this project uses Postgres 16\" | Stored with `profile: you/acme-api` (project-scoped) |\n| \"Remember I prefer Bun over npm\" | Agent stores with `profile: global` → `null` (applies everywhere) |\n| \"Remember the staging URL is staging.acme.io\" | Stored with `profile: you/acme-api` (project-scoped) |\n\nThe agent decides based on context. User preferences and behavioral feedback are typically global. Project details and references are typically scoped.\n\n### What You See When You Search\n\n```\nWorking in acme-api:\n  ✓ \"Uses Postgres 16\"              (profile: you/acme-api)\n  ✓ \"Prefers Bun over npm\"          (profile: null — global)\n  ✗ \"Uses SQLite\"                   (profile: you/my-cli — different project)\n\nWorking in my-cli:\n  ✓ \"Uses SQLite\"                   (profile: you/my-cli)\n  ✓ \"Prefers Bun over npm\"          (profile: null — global)\n  ✗ \"Uses Postgres 16\"             (profile: you/acme-api — different project)\n```\n\nGlobal memories always show up. Project memories only show up in their project.\n\n### Escape Hatches\n\n| Profile value | Meaning |\n|---|---|\n| *(omitted)* | Auto-scope to detected project |\n| `\"global\"` | Explicitly global — no project scope |\n| `\"all\"` | Search/list across every project |\n| `\"owner/other-repo\"` | Explicitly target a different project |\n\n## What a Memory Looks Like\n\nEvery memory is a Markdown file with YAML frontmatter. You can open it in any editor.\n\n```markdown\n---\nid: mem_a1b2c3d4e5f6\ntype: feedback\nname: No database mocking in tests\ndescription: Integration tests must use real database connections\nprofile: you/acme-api\nimportance: 3\ntags: [testing, database]\ncreated_at: \"2026-04-14T10:30:00Z\"\nupdated_at: \"2026-04-14T14:22:00Z\"\n---\n\nDo not mock the database in integration tests — use a real connection\nto a test database.\n\n**Why:** Mocked tests passed but the production migration failed because\nthe mock didn't reflect actual schema constraints.\n\n**How to apply:** Use the test database helper (`createTestDb()`)\ninstead of jest mocks.\n```\n\n## What a Git Log Looks Like\n\n```\n$ git log --oneline\nf4a2c1e remember: No database mocking in tests\nb3d8e7a remember: TypeScript strict mode preference\na1c9f2b update: REST to GraphQL migration deadline\n9e7d4c3 forget: Outdated staging URL\n2f8a6b1 Initialize elefante vault\n```\n\nEvery write is `remember:`. Every update is `update:`. Every delete is `forget:`. Your memory has a clean, auditable history.\n\n## Vault Structure\n\n```\n~/.elefante/vault/\n├── .elefante/\n│   └── config.yaml              # Vault settings\n├── memories/\n│   ├── user/                    # Who the user is\n│   │   └── mem_*.md\n│   ├── feedback/                # How the agent should behave\n│   │   └── mem_*.md\n│   ├── project/                 # Active work context\n│   │   └── mem_*.md\n│   └── reference/               # External resource pointers\n│       └── mem_*.md\n├── profiles/\n│   └── *.yaml                   # Named scopes for partitioning\n└── index/\n    ├── manifest.json            # All memory metadata (generated)\n    └── search.json              # Search index (generated)\n```\n\n## Memory Types\n\nFour types. Intentionally constrained — a small taxonomy forces good classification.\n\n| Type | What to store | Typically scoped to |\n|---|---|---|\n| `user` | Facts about you — role, preferences, expertise | Global |\n| `feedback` | Agent behavior guidance — corrections, confirmations | Global |\n| `project` | Active work context — goals, deadlines, decisions | Project |\n| `reference` | External pointers — URLs, dashboards, tools | Project |\n\n## Authentication\n\nElefante doesn't reinvent auth. It uses whatever Git credentials you already have.\n\n**Resolution order:**\n1. Local git credentials (SSH keys, macOS Keychain, credential helpers)\n2. `gh auth token` (if GitHub CLI is installed)\n3. `ELEFANTE_GITHUB_TOKEN` environment variable\n4. `~/.elefante/config.json` token field\n\nIf `git` or `gh` is authenticated, Elefante works with zero config.\n\n## CLI Reference\n\n```\nelefante init <repo-url>       Clone vault repo to ~/.elefante/vault/\nelefante status                Vault status, sync state, memory count\nelefante list [--type TYPE]    List memories with filters\nelefante search <query>        Search by keyword\nelefante read <id>             Read a specific memory\nelefante add                   Create a memory\nelefante delete <id>           Delete a memory\nelefante sync                  Pull and push changes\nelefante reindex               Rebuild search index\nelefante mcp                   Start MCP stdio server\n```\n\n## How It Compares\n\nElefante doesn't compete on retrieval quality. It competes on ownership.\n\n| | Elefante | Claude/ChatGPT Memory | Mem0 / Zep |\n|---|---|---|---|\n| **You own the data** | Git repo you control | Vendor-controlled | Self-hosted or SaaS |\n| **Human-readable** | Markdown files | No | No |\n| **Version history** | Git log for free | No | No |\n| **Agent-agnostic** | Any MCP agent | Single vendor | Yes |\n| **Zero infrastructure** | Git + local process | N/A (managed) | Server + database |\n| **Offline access** | Local clone | No | No |\n| **Auto project scoping** | Detects git remote | Per-conversation | Manual |\n| **Semantic search** | Not yet (planned) | Yes | Yes |\n\n> **\"Why not Obsidian + MCP plugin?\"** — Obsidian is a tool for humans that agents can access. Elefante is a tool for agents that humans can access. Same data format (Markdown + Git), different design center.\n\n## Protocol\n\nThe full protocol specification — memory model, vault structure, MCP interface, concurrency model, indexing, security considerations — is in [`PROTOCOL.md`](PROTOCOL.md).\n\n## License\n\nMIT\n",
  "bytes": 8876,
  "sha": "15db939d89bbbe69d0e8f598750d2caee6d4d90460623a681881c8bc387c4aaa",
  "repo_slug": "amenophis1er/elefante",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_amenophis1er_elefante_60f347c3/readme"
}