Skip to main content

Datacron

Local MCP server to query and maintain a Markdown vault from Claude, Codex, Gemini, or another stdio MCP client, without sending the whole vault into the context.

License: Apache 2.0 Python: 3.11+ MCP: local stdio CI

Français | English

Datacron indexes a folder of Markdown notes, exposes a local MCP server, then returns the relevant notes or chunks to the client instead of a full dump. The vault stays an ordinary Markdown folder: Datacron only adds a .datacron/ sidecar for the index, logs, internal ULIDs, history, and the operation journal.

What is in place

Surface Current state
Vault reading list_notes, get_note, resources datacron://vault/map, vault/info, policy/active
Search SQLite FTS5/BM25, FR↔EN query expansion, temporal re-rank, ripgrep via search_regex
Local graph Wikilinks and backlinks via get_backlinks
Writing 8 confined, reversible tools, disabled by default without DATACRON_WRITE_PATHS
MCP transport Python MCP SDK v2 through MCPServer, local stdio only; modern 2026-07-28 protocol and legacy 2025-11-25 compatibility, with no HTTP listener
Index datacron index incremental, datacron reindex full, automatic repair on read
Evaluation datacron eval over the real MCP pipeline: recall@k, MRR, nDCG, freshness, latency, and payload tokens
Guided setup datacron setup: init + index + MCP registration in one command
Clients Auto-detect and register via datacron setup --client all: Claude Desktop, Claude Code, Cursor, Gemini CLI, Antigravity, LM Studio, Codex CLI, Windsurf, VS Code
Memory protocol Universal MCP instructions plus native global rules installed for supported clients
Distribution Windows installer (Datacron-Setup.exe), standalone executable (PyInstaller) with no Python required, or installation from source

Local measurement of the tool/impl pipeline actually received by the agent, 19 questions, 8k-token / 20-result configuration, July 17, 2026:

recall@5       0.89
recall@10      0.95
recall@20      0.95
MRR            0.73
nDCG@10        0.79
latency p50    57 ms
latency p95    276 ms
payload tokens 90567

The tool now matches the raw store at recall@5 (0.89): the previous gap came from globally comparing scores produced by separate AND and OR queries, not from the response budget or a BM25 limitation. Repair-on-read throttling brings its own p50 down to 0.009 ms; the first full sweep of the session remains visible in p95. The golden set does not yet contain a forbidden_paths case and the vault has no indexed supersedes relationship.

Installation

Windows: one double-click installer

The easiest way on Windows: download Datacron-Setup.exe from the latest Release, double-click it, and pick your vault. No Python, no terminal, no administrator rights; Datacron registers itself with your AI clients automatically. Full guide: Windows installation.

From source

From a clone of the repository:

python -m pip install -e ".[dev]"

Or, to install only the application:

python -m pip install -e .

Runtime prerequisites:

  • Python 3.11+
  • ripgrep available on the PATH for search_regex
  • a folder of Markdown notes
  • a supported stdio MCP client, such as Claude Desktop, Codex CLI, or Gemini CLI

Quick start

The easy path - one command detects your AI clients, initializes the vault, indexes it, and registers Datacron everywhere:

datacron setup            # interactive; add --yes for all defaults

See the installation guide for options (--client, --scope, writing, durability). Or step by step:

datacron init /path/to/vault
datacron index --vault /path/to/vault
datacron status --vault /path/to/vault
datacron mcp install --client claude-desktop --vault /path/to/vault

The mcp install subcommand above is dedicated to Claude Desktop. For Codex CLI, Gemini CLI, Antigravity, LM Studio, Cursor, and the other clients, use multi-client setup with datacron setup --client <identifier> or auto-detection with --client all.

Add to LM Studio

LM Studio 0.3.17+ has one user configuration and no project scope. The preferred command is:

datacron setup --yes --vault "VAULT_PATH" --client lmstudio --scope user

For a Python installation where datacron-mcp is on PATH, the equivalent read-only configuration can also be imported with this official deeplink:

Add to LM Studio

The link imports this example. Open LM Studio's MCP editor and replace both <YOUR_VAULT> placeholders before starting the server:

{
  "mcpServers": {
    "datacron": {
      "command": "datacron-mcp",
      "args": [],
      "env": {
        "DATACRON_VAULT_ROOT": "<YOUR_VAULT>",
        "DATACRON_READ_PATHS": "<YOUR_VAULT>",
        "DATACRON_DURABILITY": "best-effort"
      }
    }
  }
}

The example does not enable write tools. CLI setup is safer for packaged installations because it writes the actual executable path automatically.

Restart the configured client or clients after installation.

To run the server manually:

datacron mcp serve --vault /path/to/vault

The direct script entry used by the installer is also available:

datacron-mcp

datacron-mcp reads the vault from DATACRON_VAULT_ROOT.

Configuration

datacron init creates .datacron/VAULT.yaml. That file can carry vault-local configuration, notably query expansion:

query_expansion:
  supervision: [monitoring]
  sauvegarde: [backup]
  restauration: [restore]
  chiffrement: [encryption]
  sécurité: [security]
  validité: [validity]
  certificat: [certificate]

Useful environment variables:

Variable Default Role
DATACRON_VAULT_ROOT unset fallback after --vault; the current directory is accepted only when it contains .datacron/VAULT.yaml
DATACRON_READ_PATHS empty read allowlist; client setup sets it to the vault
DATACRON_WRITE_PATHS empty write allowlist; empty = write tools disabled
DATACRON_MAX_RESULT_COUNT 20 maximum number of results returned
DATACRON_MAX_RESULT_TOKENS 8000 token budget for search results
DATACRON_REPAIR_MIN_INTERVAL_SECONDS 30 minimum interval between repair-on-read sweeps; 0 = every read
DATACRON_GET_NOTE_MAX_TOKENS 25000 budget for get_note(format="full")
DATACRON_CHUNK_MAX_TOKENS 1024 target maximum chunk size
DATACRON_RIPGREP_PATH rg ripgrep binary

Path lists use the OS separator (: on Unix, ; on Windows).

Writing

Writes are deliberately OFF by default. Without DATACRON_WRITE_PATHS, write tools return a clear error and create no file.

To enable writing to a specific subfolder:

$env:DATACRON_VAULT_ROOT = "G:\_DATA"
$env:DATACRON_READ_PATHS = "G:\_DATA"
$env:DATACRON_WRITE_PATHS = "G:\_DATA\_memory"
datacron mcp serve --vault G:\_DATA

datacron setup can also apply the allowlist machine-wide (user environment variable, opt-in) so every MCP client inherits it; default: _memory, _drafts, _journal. See the setup guide.

Available write tools:

  • create_note_ai: creates a typed Markdown note, without overwrite.
  • append_journal: adds an entry under a heading of an existing note.
  • set_frontmatter: updates lifecycle fields and the rejected options list without modifying the Markdown body.
  • patch_note_preamble: replaces or removes the Markdown preamble before the first ATX heading, with mandatory CAS control.
  • patch_note_section: replaces the content under an existing heading with CAS control.
  • delete_note_section: explicitly deletes an ATX H2-H6 section and its subtree.
  • rename_note_section: renames only the title of an ATX H2-H6 section.
  • revert_note: restores the exact bytes of a version kept in history.

Guarantees:

  • strict confinement within DATACRON_WRITE_PATHS
  • atomic overwrite via temporary file + os.replace
  • content-addressed history before modifying an existing note
  • reconcile() after write to make the note immediately searchable
  • local audit log

Concurrent multi-machine mode is not supported for writes: keep a single-writer rule on the vault.

MCP Tools

Reading

Tool Description
list_notes returns a paginated list, filterable by folder, tags, and frontmatter key/value pairs, with ULID, title, tags, aliases, and dates
get_note reads a note by ULID, chunk id, or relative path, as paginated content, chunk, or heading outline
search_text runs a BM25 search on the FTS5 index with ranked snippets and stale notes demoted by default
search_regex runs a regex search via ripgrep and resolves the found lines to indexed chunks
get_backlinks returns chunks whose wikilinks target a ULID or a resolved alias

Writing

Tool Description
create_note_ai creates a new typed _memory note, confined to allowed paths, without overwrite and with a durable journal
append_journal adds a Markdown entry under a heading, with confinement, exact history, and atomic write
set_frontmatter updates only the lifecycle fields, the rejected list, and the updated date, preserving the Markdown body
patch_note_preamble replaces or removes the preamble before the first ATX heading, with mandatory CAS and suffix preservation
patch_note_section replaces the content of an existing heading with CAS, exact history, and preservation of other sections
delete_note_section explicitly deletes an ATX H2-H6 section and its subtree, with optional CAS and exact history
rename_note_section renames an ATX H2-H6 section title without modifying its content or subtree
revert_note restores a note from its content-addressed history; the operation stays durable, reversible, and audited

Operational

Tool Description
get_health returns the real state of index freshness, integrity, checksum, durability, and invariants
get_note_history lists the committed operation metadata of a note without reading historical content or modifying the journal
audit_query queries operation metadata by period, tool, or note without modifying the journal or the vault

Advisory (experimental)

Tool Description
contradiction_scan live, deterministic, bounded scan of contradictions/refinements between sections; proposes and confirms an explicit CAS call read-only, without ever writing automatically

MCP resources:

  • datacron://vault/map
  • datacron://vault/info
  • datacron://policy/active

Search

search_text combines several signals:

  • FTS5/BM25 for the base lexical score
  • FR↔EN query expansion configured in VAULT.yaml
  • conservative temporal re-rank:
    • a note referenced in another note's supersedes is strongly demoted
    • confidence: low and confidence: needs_verification apply a light penalty
    • include_superseded=true brings historical notes back up

search_regex stays literal: it applies neither query expansion nor temporal re-rank.

Privacy and security

  • Datacron does no telemetry.
  • Datacron calls no cloud LLM.
  • The MCP client, for example Claude, Codex, or Gemini, may send the chunks that Datacron returns to its provider. Datacron does not send it the full vault.
  • Content returned to clients is wrapped in <vault_content>...</vault_content>.
  • Results are bounded by count and by token budget.
  • Filesystem access is confined by DATACRON_READ_PATHS and DATACRON_WRITE_PATHS.
  • MCP operations are audited in the local logs.

CLI commands

datacron setup                      # guided path: init + index + client config
datacron setup --yes                # all defaults, no prompts
datacron setup --client all --scope both --vault /path/to/vault
datacron setup --protocol           # also install client memory rules
datacron protocol install --client all
datacron init /path/to/vault
datacron status --vault /path/to/vault
datacron index --vault /path/to/vault
datacron reindex --vault /path/to/vault
datacron scrub-init --vault /path/to/vault
datacron scrub --vault /path/to/vault
datacron eval --questions examples/eval-questions.example.yaml --vault /path/to/vault
datacron eval --questions local/golden.yaml --vault /path/to/vault --save-baseline
datacron eval --questions local/golden.yaml --vault /path/to/vault --compare --json
datacron mcp serve --vault /path/to/vault
datacron mcp install --client claude-desktop --vault /path/to/vault  # Claude Desktop only
datacron unregister --client all --scope both --vault /path/to/vault
datacron protocol uninstall --client all

Current limitations

  • No vector search / embeddings: the spike is ruled out on the current golden because tool-level recall@5 at 0.89 matches the BM25 store. Re-evaluate if an expanded golden falls below 0.85 with the same evaluation.
  • No autonomous agent: the MCP client orchestrates.
  • No GUI.
  • No concurrent multi-machine writes.
  • Client detection in datacron setup is best-effort (a config directory or a binary on the PATH); an install in a non-standard location may be missed and can then be configured by hand.

Documentation

Full index: docs/en/index.md | Index français.

To get started:

Technical references:

Development

python -m pip install -e ".[dev]"
ruff check .
ruff format --check .
mypy
pytest

License

Copyright 2026 Julien Bombled.

Licensed under the Apache License, Version 2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

datacron-2026.829.0.tar.gz (212.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

datacron-2026.829.0-py3-none-any.whl (251.9 kB view details)

Uploaded Python 3

File details

Details for the file datacron-2026.829.0.tar.gz.

File metadata

  • Download URL: datacron-2026.829.0.tar.gz
  • Upload date:
  • Size: 212.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for datacron-2026.829.0.tar.gz
Algorithm Hash digest
SHA256 68f080210ad5097e892c7bc48f12cd7a0050c78616be4cda044078da8c549200
MD5 2306eb6ef3963204acbf32f1cdb81bca
BLAKE2b-256 d7378b55448d360c0365cd4f100ea5b86b1109dab5073c507171b3da797042bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for datacron-2026.829.0.tar.gz:

Publisher: publish-pypi.yml on VBlackJack/Datacron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file datacron-2026.829.0-py3-none-any.whl.

File metadata

  • Download URL: datacron-2026.829.0-py3-none-any.whl
  • Upload date:
  • Size: 251.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for datacron-2026.829.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e078822ae0f3175f796e8b76255c2bd5f47e9bf9809765dc782ad9572ad05ad
MD5 5043a80226696e4de561e0cdbd8b524c
BLAKE2b-256 c3c84cabf1e5f9c2489adb7910c4c906d1142c46c2f1099258d1279b9a551a2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for datacron-2026.829.0-py3-none-any.whl:

Publisher: publish-pypi.yml on VBlackJack/Datacron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2026.831.0

2 files

2026.830.0

2 files

2026.829.1

2 files

This release

2026.829.0 This release

2 files

2026.828.1

2 files

2026.828.0

2 files

2026.827.1

2 files

2026.721.1

2 files

2026.721.0

2 files

2026.720.0

2 files

2026.719.1

2 files

2026.719.0

2 files

2026.718.4

2 files

2026.718.3

2 files

2026.718.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page