Memory database for LLM agents — persistent semantic + keyword memory, project namespacing, served o
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx openchronicle-mcp
MCP client config
{
"mcpServers": {
"openchronicle-mcp": {
"command": "uvx",
"args": [
"openchronicle-mcp"
]
}
}
} · claude-fable-5 · 2026-08-30 · details
A memory database for LLM agents. Persistent semantic + keyword memory, project namespacing, git-onboard, served over HTTP REST and MCP from a single ASGI process. Runs on your hardware.
/api/v1/*) and the MCP streamable-HTTP transport (/mcp) on the
same port. Single container, single port mapping, single
healthcheck./api/v1/health and the MCP health tool.
Backfill catches up when the provider returns; the static /health
endpoint remains a minimal liveness probe./metrics endpoint, off by
default. Opt in with OC_METRICS_ENABLED=true; enabling it in production
stays subject to the performance gates. See the
metrics configuration and the optional
local monitoring runbook..sql migrations with
savepoint atomicity. Re-runs are idempotent. Future schema changes
drop in as NNN_<slug>.sql files.OC_BACKUP_DIR, and one that fails verification is quarantined.
Backup-before-destructive policy: vacuum runs a backup first as part
of the same job. Integrity-check failures trigger emergency backups.OC_API_KEY
is supported but optional — disabled by default for trusted-LAN
deployments. See docs/configuration/security_posture.md for the
when-to-enable guidance.docs/design/0001-cloud-backup.md).By design.
From source:
pip install -e ".[mcp,openai]"
oc init
oc serve
The default oc serve binds 127.0.0.1:8000. Override with
--host/--port or OC_API_HOST/OC_API_PORT.
Docker (single container, NAS-friendly):
docker run --rm \
-p 8000:8000 \
-e OC_API_HOST=0.0.0.0 \
-v $(pwd)/data:/app/data \
-v $(pwd)/config:/app/config \
ghcr.io/carldog/openchronicle-mcp:latest
OC_API_HOST=0.0.0.0 is required in a container — the app default
binds container-loopback, which the port mapping can't reach. To call
the server by anything other than localhost (a NAS hostname, a LAN
IP), also set OC_MCP_ALLOWED_HOSTS=your-host:* or every request gets
a 421 (see
env_vars.md).
For a Portainer stack on a NAS, use the docker-compose.nas.yml at
the repo root. It needs three things first: OC_TAG set to a release tag
(there is no :latest fallback), the data volume created once
(docker volume create openchronicle-mcp_oc-data; the compose never
creates it, so a missing volume fails the deploy instead of starting
empty), and the host exports directory created and owned by uid 1000. The
file's header comments list every variable.
# Bootstrap the runtime tree
oc init
# Create a project
PROJECT_ID=$(oc init-project "my-project")
# Save your first memory
oc memory add "Decision: SQLite for storage; AGPL for license" \
--project-id $PROJECT_ID --tags decision
# Search it
oc memory search "storage decision" --project-id $PROJECT_ID
Or do the same via MCP — register the server with Claude Code:
claude mcp add --scope user --transport http openchronicle \
http://127.0.0.1:8000/mcp
Then ask Claude to call memory_save and memory_search.
Hexagonal: domain/ (pure types + ports) → application/ (use cases,
services) → infrastructure/ (SQLite, embedding adapters, the
maintenance loop). Driver-side adapters in interfaces/ host the
HTTP, MCP, and CLI surfaces.
See docs/architecture/ARCHITECTURE.md for the full layout.
docs/architecture/ARCHITECTURE.md — layout, schema, ASGI designdocs/architecture/MAINTENANCE.md — maintenance loop + degradation policydocs/cli/commands.md — oc subcommand referencedocs/configuration/env_vars.md — environment variablesdocs/configuration/config_files.md — core.json schemadocs/configuration/security_posture.md — security modeldocs/integrations/mcp_client_setup.md — register the MCP serverdocs/integrations/mcp_server_spec.md — MCP tool surfacedocs/api/STABILITY.md — versioning + deprecation policydocs/design/README.md — proposed designs and comparative repository reviewsuv sync --locked --extra dev --extra mcp --extra openai --extra ollama --extra metrics
pre-commit install
uv run pytest
Dependencies are locked in uv.lock, which CI and the Docker image
install from; run uv lock after changing anything in [project] in
pyproject.toml, including the version.
The architecture is enforced by tests:
tests/test_hexagonal_boundaries.py — domain/application/infrastructure layeringtests/test_architectural_posture.py — core agnostic of MCP SDKtests/test_no_secrets_committed.py, tests/test_no_soft_deprecation.py — repo hygieneCopyright (C) 2025-2026 CarlDog
AGPL-3.0. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. It is distributed WITHOUT ANY WARRANTY; see the license for details.
The copyright line lives here rather than inside LICENSE: that file is
the AGPL text verbatim, and the <year> <name of author> placeholders in
its closing appendix are the license's own instructions for what to put
in your source files — not blanks to fill in. Editing them would modify
the license text itself.