Git-versioned markdown memory for AI agents: save, search, compact, lint, and audit.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Audit-grade memory for AI agents. Every stored claim can carry an explicit epistemic status (fact / inference / open_question / unverified), typed links to the evidence that backs or contradicts it, and a verifiable quote-level citation to its source. MCP-first, so one memory works in every editor.
Agent memory is becoming a commodity. Auditable agent memory is not: Palinode is the memory layer where a remembered fact says how strongly it is believed and what evidence backs it β and where every fact is a line in a git-versioned markdown file, readable, diffable, attributable to the commit that recorded it, and revertible when it's wrong. An unmarked memory is unmarked, never silently promoted to fact. No black-box vector store you have to trust.
Your agent's memory is a folder of markdown files. Palinode indexes them with hybrid search, compacts them with an LLM, and serves them through MCP β so the same memory works in Claude Code, Cursor, Windsurf, Zed, VS Code (Continue/Cline), and any other MCP-compatible editor. Bring your own Obsidian vault, or use Palinode as one: palinode init --obsidian /path/to/vault scaffolds a full vault with graph defaults, daily-notes wiring, and an LLM-maintained wiki contract. Enterprises can govern AI memory the same way they govern code. If every service crashes, cat still works.
A palinode is a poem that retracts what was said before and says it better. That's what memory compaction does.
Built by Paul Kyle at phasespace-labs. See AUTHORS.
| Platform | Session Skill Path | MCP Config |
|---|---|---|
| Claude Code CLI | ~/.claude/skills/ | ~/.claude.json |
| Claude Desktop | ~/.claude/skills/ | claude_desktop_config.json |
| Cursor | .cursor/skills/ | .cursor/mcp.json |
| VS Code + Claude (Continue / Cline) | ~/.claude/skills/ | see MCP-INSTALL-RECIPES.md |
| JetBrains + Claude | ~/.claude/skills/ | ~/.claude.json |
| Antigravity IDE | .agent/skills/ | native 3-dot MCP menu |
| Codex CLI | N/A (no skills) | ~/.codex/config.toml |
| Pi | N/A (native extension) | plugins/pi/ β per-turn recall via lifecycle hooks |
| Cline CLI / SDK | N/A (native plugin) | plugins/cline/ β per-turn recall via AgentPlugin hooks |
All platforms share the same MCP server β install once on your server, connect from any IDE. docs/HARNESSES.md is the cross-harness map: what each harness gets (native hooks vs. plugin vs. MCP), how the tiers stack, and where to start. Per-client config snippets: docs/MCP-SETUP.md and docs/MCP-INSTALL-RECIPES.md.
Most agent memory is a black box. You can't read it, you can't diff it, you can't grep it when the vector DB is down. Palinode bets on plain files as the source of truth and builds everything else as a derived index.
That's the whole architecture. One directory of .md files, one SQLite database, one API server. No Postgres, no Redis, no cloud dependency.
Palinode doesn't care how you talk to it. The full toolkit β save, search, doctor, dedup-suggest, orphan-repair, diff, blame, rollback, and more β works through every interface:
| Interface | Transport | Best For |
|---|---|---|
| MCP Server | Streamable HTTP or stdio | Claude Code, Claude Desktop, Cursor, Windsurf, Zed, VS Code (Continue/Cline) |
| REST API | HTTP on :6340 | Scripts, webhooks, custom integrations |
| CLI | Wraps REST API | Cron jobs, SSH, shell scripts (8x fewer tokens than MCP) |
| Plugin | OpenClaw lifecycle hooks | Agent frameworks with inject/extract patterns |
Set up once on a server. Connect from any machine, any IDE, any agent framework. The MCP server is a pure HTTP client β it holds no state, no database connection, no embedder. Point it at the API and go.
That's the entire client config. Works with Claude Code, Claude Desktop, Cursor, Windsurf, Zed, and VS Code (Continue/Cline). palinode-mcp-http serves streamable-HTTP at /mcp/ β use "type": "http", not "type": "sse". Always include the trailing slash in the URL. See docs/MCP-SETUP.md for editor-specific install recipes.
Store β Typed markdown files (people, projects, decisions, insights) with YAML frontmatter. Git-versioned. Human-readable. Editable in Obsidian, VS Code, vim, or anything.
Index β A file watcher embeds with BGE-M3 and indexes with FTS5 as you save. Content-hash dedup skips re-embedding unchanged files (~90% savings). Single SQLite file, zero external services.
Search β Hybrid BM25 + vector search merged with Reciprocal Rank Fusion. The two arms have different jobs: on full-sentence questions the vector arm does nearly all the retrieval (FTS5 requires every query token to co-occur, which questions rarely satisfy), while BM25 catches the exact terms and identifiers embeddings blur. Measured together: 0.981 evidence recall@10 on LongMemEval_S (benchmarks). Optional associative entity graph and prospective triggers.
Compact β Weekly consolidation where an LLM returns structured operations and Palinode validates and applies them. Every compaction is a git commit you can review, blame, or revert.
Dream β If you've met "dreaming" as the name for this, palinode dream is an alias for palinode consolidate. Use --dry-run to inspect the proposed operations; each completed pass lands as a git commit, so a bad consolidation is a diff to review and a commit to revert.
Audit β git blame any fact. git diff any change. rollback any mistake. These aren't just git-compatible files β palinode_diff, palinode_blame, and palinode_rollback are first-class tools your agent can call.
bge-m3 (ollama pull bge-m3, β1.2 GB) β for semantic search.
Optional: without an embedder Palinode runs in keyword-only mode (BM25/FTS5) β save,
search, and audit all still work; you just don't get vector recall until you add one.Optional extras: a chat model for weekly consolidation (any 7B+ that outputs JSON), OpenClaw for agent plugin hooks.
Homebrew (macOS/Linux) β quickest path to the CLI:
That taps and installs in one command. It puts the palinode CLI on your PATH; the
service binaries (palinode-api, palinode-watcher, palinode-mcp) currently live in
the tap's private prefix, so for running services use the source install below or Docker.
From source β the full-stack path. Clone, install, point at a memory directory, check it worked:
palinode doctor is the single "did it install correctly?" command β run it after every install, upgrade, or server move. On a fresh venv, use the venv's absolute path for the MCP command (~/palinode-src/venv/bin/palinode-mcp) so it resolves its own dependencies β see llms-install.md for the wrong-Python trap.
Your memory directory is private β it holds personal data. Never make it public; the code repo contains zero memory files. For a pre-populated demo, copy
examples/sample-memory/into~/.palinode/.
Three long-running processes (API, watcher, embedder) shouldn't live in terminal tabs. Pick one:
| Platform | How | Details |
|---|---|---|
| Anywhere with Docker | docker compose up -d from the repo root β API + watcher + Ollama, with the bge-m3 pull handled for you (β1.2 GB on first run) | docker-compose.yml header comments |
| Linux | systemd units via deploy/systemd/install.sh --enable | deploy/systemd/README.md |
| macOS | launchd LaunchAgents from templates | deploy/launchd/README.md |
| Windows | use Docker Compose (set PALINODE_DATA_DIR to a Windows path) | docker-compose.yml header comments |
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/palinode)<a href="https://allmcps.com/mcp/palinode"><img src="https://allmcps.com/api/badge/palinode?style=directory" alt="Palinode on AllMCPs" /></a>