Skip to main content

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

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

# 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.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.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


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

maggraph-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl (853.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

File details

Details for the file maggraph-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for maggraph-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b566f54940459b71fd4dd1dc5c8e72a647f211a6b08eda9b3dd6aeca87d58041
MD5 d43d300d82043d896ead3f18984ad465
BLAKE2b-256 db5b18fbada05d779d5a5b05598cfec0e84a92aa9a0cf6705a89d504c1938853

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