Skip to main content

MagGraph

In-process Git-backed graph engine for AI semantic layers — powered by Rust

CI PyPI Python License

Why "MagGraph"? The name is short for Magpie — a Corvid. Corvids (ravens, crows, jays, and magpies) are renowned in animal cognition research for their remarkable intelligence, long-term memory, and sophisticated tool use. MagGraph is built to be the memory and knowledge layer for AI agents with those same qualities: a graph that thinks, remembers, and uses tools.

MagGraph stores knowledge as versioned Markdown nodes in your Git repository, with BFS/DFS traversal, Git-backed sync, external lakehouse content resolution, and a built-in MCP server scaffold — all from a zero-dependency pip install.


Install

pip install maggraph

Pre-built wheels are available for:

Platform Architectures
Linux (manylinux_2_28) x86_64 · aarch64
macOS Intel (x86_64) · Apple Silicon (arm64)
Windows x86_64

No Rust toolchain required — the Rust core is compiled into the wheel.


Quick start

import maggraph

# Load config + open the graph index
config = maggraph.load_config("maggraph.toml")
index  = config.open_index()

# List nodes
print(index.list_nodes())          # ['getting_started', 'welcome', ...]

# Read a node
node = index.read_node("welcome")
print(node.body)                   # full markdown body

# Search, backlinks, and recall
print(index.search("Welcome")[0]["id"])
print(index.backlinks("welcome"))
bundle = index.recall_bundle("welcome", reason="quick start")
print(bundle["markdown"])

# BFS traversal
result = index.traverse("welcome", depth=2, order="bfs")
print(result.to_markdown(index))   # formatted traversal report

# CRUD and memory helpers
index.create_memory_node("prefers_cli", "preference", "User prefers CLI-first UX.")
index.create_node("new_note", node_type="note", body="# Hi\n", links=["welcome"])
index.update_node("new_note", "# Updated\n")
index.suppress_node("new_note", reason="example")
index.unsuppress_node("new_note")
index.delete_node("new_note")

Async support

import asyncio, maggraph

async def main():
    index = maggraph.open_index("examples/basic/knowledge_graph")
    node  = await index.read_node_async("welcome")
    result = await index.traverse_async("welcome", depth=3, order="dfs")
    print(result.to_markdown(index))

asyncio.run(main())

Blocking Rust work runs on a Tokio thread pool — Python's event loop stays responsive.


Lakehouse content resolution

Resolve external data sources (S3, file://, HTTP) referenced from node frontmatter:

import maggraph

config = maggraph.load_config("maggraph.toml")  # mode = "lakehouse"
index  = config.open_index()
reader = config.open_lakehouse_reader()

# Resolve a node's external source (e.g. s3://bucket/data.parquet)
result = reader.read_node(index, "customer_churn_q2")
print(result.content.kind)          # "external_asset"
print(result.content.uri)           # "s3://corp-data/lake/churn.parquet"
print(result.content.format)        # "parquet"
print(result.content.to_markdown()) # agent-friendly summary

# Cache stats
print(reader.cache_len())    # 1
print(reader.cache_bytes())  # ~128

# Also callable directly on the index
result2 = index.read_node_with_content(reader, "customer_churn_q2")

maggraph.toml for lakehouse mode:

[storage]
mode = "lakehouse"
root_path = "./knowledge_graph"

[lakehouse]
remote_sources = [
  { uri = "s3://corp-data/lake", format = "parquet" }
]

MCP server scaffold

maggraph scaffold --mcp --output ./mcp_server

Generates a ready-to-run FastMCP server at ./mcp_server/server.py wired to your graph index — expose list_nodes, read_node, traverse, create_node, and delete_node as MCP tools with one command.


Git-backed sync

# Leader pushes a snapshot
maggraph sync push --message "Add Q2 analysis nodes"

# Follower (read-only) pulls
maggraph sync pull

API reference

Class / Function Description
load_config(path) Load maggraph.tomlResolvedConfig
open_index(root_path) Open graph index directly → GraphIndex
ResolvedConfig.open_index() Open index from config
ResolvedConfig.open_lakehouse_reader() Create a LakehouseReader
GraphIndex.list_nodes() All node ids (sorted)
GraphIndex.read_node(id) Node with metadata + body
GraphIndex.search(...) Structured search over ids, types, tags, frontmatter, links, body, and recency
GraphIndex.backlinks(id) Node ids that link to id
GraphIndex.changed_since(unix) Files modified after a Unix timestamp
GraphIndex.update_file(path) Refresh one changed markdown file in the index
GraphIndex.recall_bundle(id, ...) Compact agent retrieval dict with Markdown
GraphIndex.read_node_async(id) Async version
GraphIndex.traverse(id, depth, order) BFS/DFS → TraversalResult
GraphIndex.traverse_async(...) Async version
GraphIndex.create_node(...) Write new node to disk + index
GraphIndex.create_memory_node(...) Create typed memory nodes (preference, project_fact, decision, task, session_summary, bookmark, tool_failure)
GraphIndex.update_node(id, body) Update body on disk
GraphIndex.delete_node(id) Delete node from disk + index
GraphIndex.suppress_node(id) / unsuppress_node(id) Mark/unmark stale or duplicate nodes
GraphIndex.merge_nodes(target, source) Merge duplicate source into canonical target
GraphIndex.read_node_with_content(reader, id) Resolve external content
LakehouseReader.read_node(index, id) NodeWithContent
LakehouseReader.read_node_async(index, id) Async version
LakehouseReader.cache_len() Entries in content cache
LakehouseReader.cache_bytes() Bytes in content cache
Node.id / .node_type / .body / .links / .source Node properties
Node.to_markdown() Full node as Markdown string
Node.to_dict() Node as plain Python dict
ResolvedContent.kind "local" / "text" / "external_asset"
ResolvedContent.body / .uri / .format Content details
ResolvedContent.to_markdown() Agent-friendly summary
NodeWithContent.node / .content Node + resolved content

Links


License

MIT OR Apache-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

maggraph-0.3.0.tar.gz (75.5 kB view details)

Uploaded Source

Built Distributions

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

maggraph-0.3.0-cp39-abi3-win_amd64.whl (817.9 kB view details)

Uploaded CPython 3.9+Windows x86-64

maggraph-0.3.0-cp39-abi3-manylinux_2_28_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

maggraph-0.3.0-cp39-abi3-manylinux_2_28_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

maggraph-0.3.0-cp39-abi3-macosx_11_0_arm64.whl (951.3 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

maggraph-0.3.0-cp39-abi3-macosx_10_12_x86_64.whl (958.8 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file maggraph-0.3.0.tar.gz.

File metadata

  • Download URL: maggraph-0.3.0.tar.gz
  • Upload date:
  • Size: 75.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for maggraph-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e8c5460b06251eabfb1fddb520a873fbd117552b1ac8370cb02f7862d18e998f
MD5 549954f6f3c6c7cc9ffeb05eb7460069
BLAKE2b-256 64bc1753694f8758ce09e2ebd1e519d9d61ab90795e00b8d757f75a23d9a5d56

See more details on using hashes here.

File details

Details for the file maggraph-0.3.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: maggraph-0.3.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 817.9 kB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for maggraph-0.3.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 67178e63c5b96f73f5123e8e2e2d012f58245e0ab71629aede919711214cd2b9
MD5 128f75d97bd6c3e0f9e26616bca24bc7
BLAKE2b-256 43f3732e5851ebad629fb33584f852eb2b3031bdd514d8ad68d920099126fa85

See more details on using hashes here.

File details

Details for the file maggraph-0.3.0-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for maggraph-0.3.0-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6286a1d3c1f5f76d75b4095a7d63ef7930a388ab7dc1da6ed3fd225afff388f4
MD5 8a4d0a1722b6138ead5dd76e30d3696c
BLAKE2b-256 e891f30a52808af64f1e39bb6898fa78eff1b4a890310016c2e34f57a651c462

See more details on using hashes here.

File details

Details for the file maggraph-0.3.0-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for maggraph-0.3.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7583ebb386332944a8b7876ebc64ea80c59c7de5055c99abdad4f797c5bfa70b
MD5 c5bdde9af0caa70a46979ae668e7979a
BLAKE2b-256 64ef0f0bb18b09aa73b89fef633693f38e937a42e1e065e66157e301e3d1b48d

See more details on using hashes here.

File details

Details for the file maggraph-0.3.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for maggraph-0.3.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 81a184cc45f4e1868f53b25a30017a48acae14732dbc25e8eda4ae8d3203ee97
MD5 cc48a8ff97596714c523c37760843779
BLAKE2b-256 f741ecbb2d78767c9b97500977e6e4783313508871d3a9f93036d1a46a2bed32

See more details on using hashes here.

File details

Details for the file maggraph-0.3.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for maggraph-0.3.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e72e7a23db813e1083e7c204019b64bd0d25b448964b335ff6cceaea0cdbc1aa
MD5 51c9608965873405d6e68ea7b68feb09
BLAKE2b-256 70ec8cfaa5dfd1162865d61d6f62de0f0720351055b2d91acffd572ec225f01f

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.1

6 files

0.4.0

6 files

This release

0.3.0 This release

6 files

0.2.5

6 files

0.2.0

2 files

0.1.0

1 file

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