Any MCP client,
one memory.
Point every agent at the same Borg. No per-client SDKs, no per-client memories — the graph is shared by the database, not by passing bytes around.
One Postgres.
Every client.
The OSS release runs as a single borg-engine listening on :8080/mcp. Every MCP client — Claude Code, Codex CLI, Copilot, Kiro — points at the same endpoint and reads from the same graph.
No SDKs, no lock-in
The entire client surface is three MCP tools: borg_think, borg_learn, borg_recall. If your agent speaks MCP over streamable HTTP, it can use Borg unchanged.
Share memory across tools
Claude Code writes. Codex reads. Copilot queries. One Postgres. No synchronization daemon, no cross-SDK pipeline — just a shared namespace on a shared engine.
Two commands.
Everything wired.
install.sh detects Docker, starts the stack, writes your OpenAI key, and installs the borg CLI. borg init detects which tools you use and writes the right project config.
# one command — brings up Postgres + borg-engine + CLI curl -fsSL https://raw.githubusercontent.com/villanub/borgmemory/main/install.sh | sh # in any project — detects Claude / Copilot / Codex / Kiro cd your-project borg init
Four verified clients,
one config pattern.
Every client below is wired through mcp-remote for local MCP over HTTP. borg init generates these snippets for you; they're shown here for reference.
// .mcp.json at project root
{
"mcpServers": {
"borg": {
"command": "bash",
"args": ["-lc", "exec npx -y mcp-remote http://localhost:8080/mcp 35535"]
}
}
}# ~/.codex/config.toml
[mcp_servers.borg]
command = "bash"
startup_timeout_sec = 30
args = [
"-lc",
"exec npx -y mcp-remote http://localhost:8080/mcp 35534 --resource http://localhost:8080/mcp",
]// ~/.kiro/settings/mcp.json
{
"mcpServers": {
"borg": {
"command": "bash",
"args": ["-lc", "exec npx -y mcp-remote http://localhost:8080/mcp 35536"],
"autoApprove": ["borg_think", "borg_learn", "borg_recall"]
}
}
}// .vscode/mcp.json
{
"servers": {
"borg": {
"command": "bash",
"args": ["-lc", "exec npx -y mcp-remote http://localhost:8080/mcp 35537"]
}
}
}Tell each client
when to consult memory.
Memory is only useful if the agent calls for it. The hook + instruction matrix below keeps behavior consistent across tools.
| Tool | Global instructions | Project instructions | Hooks |
|---|---|---|---|
| Claude Code | ~/.claude/CLAUDE.md | CLAUDE.md | PostSession |
| Codex CLI | ~/.codex/AGENTS.md | AGENTS.md | none native |
| Kiro CLI | ~/.kiro/steering/AGENTS.md | AGENTS.md · .kiro/steering/*.md | stop · postToolUse · agentSpawn |
| GitHub Copilot | n/a | copilot-instructions.md | none native |
Not an MCP client?
Same tools over REST.
Every MCP tool has a REST mirror. Ingest episodes from webhooks, CI, or legacy apps with plain HTTP.
Ingest an episode
POST /api/learn
content-type: application/json
{
"namespace": "product-engineering",
"content": "We moved Customer Portal off Semantic Kernel to Azure AI Foundry on Mar 10.",
"source": "slack:#eng-arch",
"occurred_at": "2026-03-10T15:04:00Z"
}Compile context
POST /api/think
content-type: application/json
{
"namespace": "product-engineering",
"query": "why did we move off Semantic Kernel?",
"model": "claude-sonnet-4.5",
"task_hint": "architecture"
}