Atlas / MCP servers / carldog / openchronicle-mcp

openchronicle-mcpCAUTION

mcp/carldog/openchronicle-mcp

Memory database for LLM agents — persistent keyword + optional semantic memory, project namespacing, served over HTTP REST and MCP from a single ASGI process. SQLite-backed, packaged as a Docker container. Runs on your hardware.

Verdict
CAUTION
Grade
B
Trust score
86 /100
Exposed tools
23 15r · 5w · 3d
Transport
sse · stdio · streamable-http
License
AGPL-3.0
Stars
16
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

· claude-fable-5 · 2026-08-30 · details

[](LICENSE) [](https://ghcr.io/carldog/openchronicle-mcp) [](https://python.org)

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.

What it does

  • Persistent memory across sessions. Save decisions, milestones,

and rejected approaches that survive context compression and new conversations. Retrieve them with hybrid full-text and semantic search via Reciprocal Rank Fusion.

  • Project namespacing. Memory is scoped to projects, so context

for one workstream doesn't leak into another.

  • Git onboarding. Clone a repo, cluster commits by relatedness,

return summaries ready for memory ingestion. Seeds long-term memory with the WHY behind existing code.

  • One process, two transports. FastAPI hosts both the REST surface

(/api/v1/*) and the MCP streamable-HTTP transport (/mcp) on the same port. Single container, single port mapping, single healthcheck.

  • Embedding-failure degradation. When the embedding provider goes

down, search degrades cleanly to FTS5-only and surfaces the degraded state via /api/v1/health and the MCP health tool. Backfill catches up when the provider returns; the static /health endpoint remains a minimal liveness probe.

  • Optional operational metrics. Released images (since v3.4.0) include

the bounded Promet

Read from source at commit e3177964eaf7OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add openchronicle-mcp-tools --env OC_API_KEY=${OC_API_KEY} --env OC_GIT_TOKEN=${OC_GIT_TOKEN} --env OPENAI_API_KEY=${OPENAI_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "openchronicle-mcp-tools": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "OC_API_KEY": "${OC_API_KEY}",
        "OC_GIT_TOKEN": "${OC_GIT_TOKEN}",
        "OPENAI_API_KEY": "${OPENAI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (23)

15 read · 5 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
context_recentreadCatch up on prior context for a project: returns recent memory items.
db_backup_createwriteCreate one consistent SQLite snapshot in the exposed manual backup directory.
db_backup_listreadList completed local SQLite snapshots, newest first.
db_backup_verifyreadCheck one snapshot
db_restore_planreadCompare a verified snapshot with the running database before restore.
db_restore_stagereadCopy and reverify one candidate on the database volume for offline recovery.
healthreadProbe the OC server: DB reachability, config status, embedding subsystem.
memory_deletedestructivePreview or hard-delete a memory item.
memory_embedreadGenerate embeddings for memories that lack them (or regenerate all).
memory_getreadFetch a single memory by ID.
memory_listreadBrowse memory items — enumeration, distinct from relevance search.
memory_pinreadMark a memory as pinned (or unpin it).
memory_savewritePersist a memory item that should outlive the current session.
memory_searchreadFind memory items relevant to a query (hybrid semantic + keyword).
memory_statsreadSummarize memory contents: total/pinned counts, breakdowns by tag and source.
memory_updatewriteEdit an existing memory
onboard_gitreadBootstrap project memory from a remote git repo
project_createwriteCreate a new project namespace for memories.
project_deletedestructivePreview or hard-delete a project and all its memories.
project_delete_bulkdestructivePreview or hard-delete several projects and all their memories.
project_getreadFetch a single project by id.
project_listreadList projects, newest first, with id, name, and creation timestamp.
project_updatewriteRename a project or update its metadata.
04

Trust audit

CAUTIONgrade B · trust 86/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (8 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (21)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Dockerfile:111
CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8000/health',timeout=3).status==200 else 1)"
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
memory_delete, project_delete, project_delete_bulk
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitleaks.toml
.gitleaks.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.markdownlint-cli2.jsonc
.markdownlint-cli2.jsonc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.markdownlint.json
.markdownlint.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_backup_catalog.py:195
@pytest.mark.parametrize("artifact_id", ["../secret", "manual:../../secret", "auto:bad", "/tmp/x.db"])
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_git_onboard.py:565
"https://169.254.169.254/latest/meta-data",  # metadata endpoint
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
AGENTS.md:510
claude mcp add --scope user --transport http openchronicle http://127.0.0.1:8000/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
CLAUDE.md:510
claude mcp add --scope user --transport http openchronicle http://127.0.0.1:8000/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:131
http://127.0.0.1:8000/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/integrations/mcp_client_setup.md:161
http://127.0.0.1:8000/mcp
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
scripts/probe_artifact.py:88
chunk = base64.b64decode(match[5], validate=True)
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
markdownlint-cli2
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/CODEBASE_ASSESSMENT.md:119
| 315 | 2026-10-03 | **QUAL-22 and QUAL-26: metric labels, and the MCP endpoint served at exactly `/mcp`** (post-merge finding from #100, widened by the pre-deploy review of #109; affects `main` and v
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/CODEBASE_ASSESSMENT.md:265
| 169 | 2026-08-29 | **ADR 0009 implementation merged to `main` (fast-forward to `0ad0e50d`, 844 tests) + the ADR's implementation note recorded.** The mandated live OpenAI capture FALSIFIED the ADR's
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/V3_PLAN.md:1777
- **Offline / write-behind sync for LAN-unreachable clients.** OC's single-user home-LAN posture (no auth, NAS-only, per `docs/configuration/security_posture.md`) means any client MCP call fails outri
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/archive/v2/CODEBASE_ASSESSMENT.md:254
| **File-based configuration** (single `core.json`, three-layer precedence) | Working | All subsystems wired: routing, budget, retry, privacy, telemetry, conversation, Discord. Secrets (API keys, bot
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/design/0001-cloud-backup.md:170
**Dropbox.** No app review for a single-user app (production approval only past 50 linked users), refresh tokens with no documented expiry, `Retry-After` always present on 429, and App Folder is the n
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/design/0001-cloud-backup.md:395
**Why encrypt — corrected justification. Considered and rejected: the scope critique's claim that recommending Dropbox App Folder makes encryption redundant.** That argument conflates *token scope* wi
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/design/0010-performance-measurement.md:166
do not export the live corpus or load the credential vault.
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha e3177964eaf7full audit observations/trust-audit/mcp-server/carldog__openchronicle-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10e3177964eaf7CAUTIONB86first audit
06

Questions

What is the openchronicle-mcp MCP server?

Memory database for LLM agents — persistent keyword + optional semantic memory, project namespacing, served over HTTP REST and MCP from a single ASGI process. SQLite-backed, packaged as a Docker container. Runs on your hardware.

What tools does openchronicle-mcp expose?

23 in total: 15 read-only, 5 that write, and 3 that can delete or overwrite (memory_delete, project_delete, project_delete_bulk). Every one is listed on this page with its risk.

Is openchronicle-mcp safe to connect to an agent?

With care. The audit graded it B (86/100) and found 21 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does openchronicle-mcp need?

It reads OC_API_KEY, OC_GIT_TOKEN and OPENAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does openchronicle-mcp run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as openchronicle-mcp-tools at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (e3177964eaf7), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement