Skip to main content

MdBind — Structured memory in plain Markdown

Project description

MdBind

Structured memory in plain Markdown.

Transform your Markdown files into a navigable knowledge graph —
without databases, embeddings, or proprietary formats.

Python Tests Version License PyPI


# Install
pip install mdbind

# Validate your docs folder
mdb validate --root docs/

# Get a section by URI
mdb get docs/intro.md#intro --json

What is MdBind?

MdBind turns Markdown files into a directed knowledge graph where every section is an addressable node with stable identity, metadata, and explicit relationships.

Your files stay plain text, Git-friendly, and human-readable — but gain:

  • Graph traversal and dependency resolution
  • Stable URIs that survive reorganization
  • Structured metadata queries
  • AI-oriented context retrieval with bounded token consumption

Why not embeddings?

Approach Inspectable Versionable Deterministic Human-readable
Vector databases
Proprietary stores partial partial
MdBind

Every node, every edge, every relationship is visible in the source file. What an agent reads, a human can audit.


Quick start

# 1. Clone and install
git clone <repo-url> && cd mdbind
python3 -m venv .venv && source .venv/bin/activate
pip install -e .

# 2. Point it at your docs
mdb validate --root docs/

# 3. Query the graph
mdb get docs/auth.md#auth --json

See it in action

# Navigate the dependency tree
$ mdb tree docs/auth.md#auth --root docs/

auth  [docs/auth.md]
├── jwt          [include]  docs/security.md#jwt
└── permissions  [ref]      docs/users.md#permissions

# Compose a unified document by expanding all @include directives
$ mdb compose docs/auth.md#auth --root docs/ --depth 2

# Find everything that depends on a node (reverse BFS)
$ mdb impact docs/auth.md#auth --root docs/ --json

# Boolean metadata query
$ mdb query "tag:api AND NOT status=obsolete" --root docs/ --json

# Bounded context for LLM consumption
$ mdb context-compose docs/auth.md#auth --root docs/ --depth 2 --token-limit 2000 --json

Syntax

Declaring a section

A section is a Markdown heading followed immediately by a YAML block with a section: field:

## Authentication

```yaml
section: auth
title: Authentication
type: domain
owner: security-team
tags: [auth, core]
```

Authentication is responsible for user identity.

[@include: JWT handling](security.md#jwt)

See also: [@ref: permissions model](users.md#permissions)
  • The YAML block must be the first element after the heading
  • section: is mandatory and must be unique per repository
  • Any additional fields are preserved as queryable metadata

Directives (graph edges)

[@include: label](path/to/file.md#section-id)   <!-- expands inline during compose -->
[@ref: label](path/to/file.md#section-id)        <!-- records dependency, no expansion -->

Directives are standard Markdown links — they render correctly in any Markdown viewer.

auth
├── jwt          [include]
└── permissions  [ref]

Commands

Quick reference

Command Description
mdb get <URI> Extract a section with full documentary fidelity
mdb tree <URI> Visual dependency hierarchy
mdb compose <URI> Materialize a unified document (expands @include)
mdb validate Check integrity: broken refs, cycles, duplicate IDs
mdb context <URI> Metadata + immediate 1-hop neighborhood
mdb metadata get/update/unset <URI> Read or edit structured YAML metadata
mdb backlinks <URI> All sections that reference this URI
mdb search <predicate> Search sections by metadata
mdb impact <URI> All nodes that depend on this URI (reverse BFS)
mdb neighbors <URI> All nodes reachable within N hops
mdb explain <URI_A> <URI_B> All directed paths between two nodes
mdb diff Structural graph diff against a git reference
mdb query <expression> Boolean metadata/structure query (AND, OR, NOT)
mdb context-compose <URI> Bounded materialization for LLM consumption

All commands accept --json for machine-readable output.
All outputs are deterministic and JSON-serializable. All URIs are stable across sessions.

Selected examples

# Validate an entire repository
mdb validate --root docs/ --json

# 1-hop neighborhood of a node
mdb context docs/auth.md#auth --root docs/ --json

# Read and edit structured YAML metadata without touching the Markdown body
mdb metadata get docs/auth.md#auth owner.name --json
mdb metadata update docs/auth.md#auth status '"review"' --json
mdb metadata update docs/auth.md#auth owner '{"name":"Alice","team":"security"}' --json
mdb metadata unset docs/auth.md#auth draft_notes --json

# Find all sections tagged api that are not obsolete
mdb query "tag:api AND NOT status=obsolete" --root docs/ --json

# Find backlog-like section IDs with a regex predicate
mdb query "section~=/^backlog\\.item\\.B-\\d{3}$/ AND NOT status=done" --root docs/ --json

# Bounded context for LLM — depth 2, max 2000 tokens
mdb context-compose docs/auth.md#auth --root docs/ --depth 2 --token-limit 2000 --json

# What changed structurally since the last commit?
mdb diff --root docs/ --since HEAD~1 --json

Philosophy

Five principles behind every design decision:

  1. Markdown is the source of truth — no proprietary formats, no hidden state
  2. Knowledge should be inspectable — every node, every edge, every relationship is visible in the source
  3. Relationships should be explicit@include and @ref are first-class graph primitives
  4. Stable identifiers are better than headingsfile.md#id survives reorganization
  5. AI memory should remain human-readable — what an agent reads, a human can audit

Examples

See the examples/ directory for a complete working knowledge base demonstrating sections, directives, composition, and graph traversal.


Development

# Install in editable mode
pip install -e .

# Run the full test suite
python -m pytest

# Run a specific module
python -m pytest tests/test_cli_validate.py -v

209 tests, 0 failures.


License

Apache License, Version 2.0

Project details


Download files

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

Source Distribution

mdbind-0.1.9.tar.gz (42.6 kB view details)

Uploaded Source

Built Distribution

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

mdbind-0.1.9-py3-none-any.whl (25.5 kB view details)

Uploaded Python 3

File details

Details for the file mdbind-0.1.9.tar.gz.

File metadata

  • Download URL: mdbind-0.1.9.tar.gz
  • Upload date:
  • Size: 42.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for mdbind-0.1.9.tar.gz
Algorithm Hash digest
SHA256 1df869c3f455be0944fab6678d67da473b4cacbd8c2e625ca2c4b96c78fe392a
MD5 9a4c192d221adf22eaf109cb6ca2fbbd
BLAKE2b-256 61934476e27f9f954db6705dc9774f118603a9e3a5ae978d35b28e9c96d43218

See more details on using hashes here.

File details

Details for the file mdbind-0.1.9-py3-none-any.whl.

File metadata

  • Download URL: mdbind-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 25.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for mdbind-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 e2d95869d3e3aca00f8b9e88839b55d3800fb577e7fde4e698448d3275b6168c
MD5 43281471fdb08d27cf817a075e5249c0
BLAKE2b-256 adcd21b959ba69186b97ced94778dd979a9f05d571cd3ae4f1892883b2268daf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page