In-process graph engine for AI semantic layers — powered by Rust
Project description
MagGraph
In-process Git-backed graph engine for AI semantic layers — powered by Rust
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
# BFS traversal
result = index.traverse("welcome", depth=2, order="bfs")
print(result.to_markdown(index)) # formatted traversal report
# CRUD
index.create_node("new_note", node_type="note", body="# Hi\n", links=["welcome"])
index.update_node("new_note", "# Updated\n")
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.toml → ResolvedConfig |
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.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.update_node(id, body) |
Update body on disk |
GraphIndex.delete_node(id) |
Delete node from disk + index |
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file maggraph-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: maggraph-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 853.6 kB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b566f54940459b71fd4dd1dc5c8e72a647f211a6b08eda9b3dd6aeca87d58041
|
|
| MD5 |
d43d300d82043d896ead3f18984ad465
|
|
| BLAKE2b-256 |
db5b18fbada05d779d5a5b05598cfec0e84a92aa9a0cf6705a89d504c1938853
|