Create Context Graph
Memory frameworkOfficial neo4j-labs project
Created by neo4j-labs
Published in neo4j-labs/create-context-graph. Publisher page
747 GitHub stars
What it is
AI agents with graph based reasoning memory, scaffolded in seconds
AutoGineer overview, from the brain’s own files
Create Context Graph is an interactive scaffolding tool designed to accelerate the development of AI agents that utilize graph-based memory. By walking developers through a wizard, it generates a complete, domain-specific application stack including a FastAPI backend, a Next.js frontend with interactive graph visualization, and a configured AI agent. The tool supports multiple agent frameworks and offers a choice between a hosted memory backend (NAMS) or a self-hosted Neo4j instance. It includes built-in support for importing data from various SaaS platforms, generating domain-specific ontologies, and creating MCP servers for integration with Claude Desktop.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
The tool operates as a CLI that uses Jinja2 templates to generate project code based on a selected industry domain and agent framework. It creates a FastAPI backend for agent logic and a Next.js frontend for visualization. Memory is managed either via the hosted NAMS service or a self-hosted Neo4j database. The system supports data ingestion from various connectors and can generate domain-specific ontologies, schemas, and agent tools automatically.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 2 |
| docs | docs | 105 |
| scripts | scripts | 2 |
| src | source-code | 168 |
| tests | tests | 48 |
| .serena | folder | 1 |
| npm-wrapper | folder | 3 |
The agent reads
- get_entity_detail_nams evidence: CLAUDE.md
- list_traces evidence: CLAUDE.md
- list_documents_nams evidence: CLAUDE.md
- find_decisions evidence: CLAUDE.md
- search_sessions evidence: CLAUDE.md
- get_collector evidence: CLAUDE.md
The agent writes
- delete_entity evidence: CLAUDE.md
- add_relationship evidence: CLAUDE.md
- add_entity evidence: CLAUDE.md
Requirements
Runtimes: Python >=3.11
Databases: Neo4j
API keys (by name): ANTHROPIC_API_KEY, GOOGLE_API_KEY, LINEAR_API_KEY, MEMORY_API_KEY, OPENAI_API_KEY
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 1 script. Review Makefile before opening the folder in Claude Code. No step below turns a hook on for you.
Makefile:uv venv && uv pip install -e ".[dev]"
- Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (7 declared). https://pypi.org/project/create-context-graph/
Created by neo4j-labs. Published in neo4j-labs/create-context-graph. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Scaffold a new project using the interactive CLI wizard.
- Generate a project with a specific domain and agent framework via CLI flags.
- Connect SaaS data sources like GitHub, Slack, or Notion to populate the graph.
- Configure the memory backend for either hosted NAMS or self-hosted Neo4j.
- Generate an MCP server configuration for Claude Desktop integration.
- Re-import data or seed the graph using generated make commands.
- “uvx create-context-graph my-app --domain healthcare --framework strands --nams-api-key sk-nams-...”
- Generates a healthcare-focused agent application using the Strands framework and hosted NAMS memory.
- “uvx create-context-graph my-app --domain personal-knowledge --framework pydanticai --self-hosted --connector github”
- Generates a personal knowledge application with self-hosted Neo4j, pre-populated with GitHub data.
Documentation by neo4j-labs
Create Context Graph
This is an experimental Neo4j Labs project and not part of Neo4j's supported product lineup. See the Neo4j Labs disclaimer.
Neo4j Labs Project — This project is part of Neo4j Labs. It is maintained by Neo4j staff and the community, but not officially supported. For help, use GitHub Issues or the Neo4j Community Forum.
Interactive CLI scaffolding tool that generates fully-functional, domain-specific context graph applications. Pick your industry domain, pick your agent framework, and get a complete full-stack app in under 5 minutes.
<p align="center"> <img src="docs/static/img/app-three-panel.png" alt="Generated app: chat interface, graph visualization, and document browser" width="800" /> </p>
# Python — NAMS-default (hosted memory)
uvx create-context-graph my-app --domain healthcare --framework strands --nams-api-key sk-nams-...
# Self-hosted Neo4j with full demo fixtures
uvx create-context-graph my-app --domain healthcare --framework pydanticai --self-hosted --demo
# Node.js / interactive wizard
npx create-context-graphWhat It Does
Create Context Graph walks you through an interactive wizard and generates a complete project:
FastAPI backend with an AI agent configured for your domain, powered by neo4j-agent-memory v0.4 for multi-turn conversations with automatic entity extraction. Memory backend is configurable: hosted NAMS (default) or self-hosted bolt Neo4j (
--self-hosted).LiteLLM provider injection for the memory layer — pick any LLM + embedding provider via
MEMORY_LLM/MEMORY_EMBEDDINGenv vars (Anthropic, OpenAI, Bedrock, Vertex AI, Ollama, Groq, Together, …). Native adapters resolve first; everything else routes through LiteLLM.Next.js + Chakra UI v3 frontend with streaming chat (Server-Sent Events), real-time tool call visualization (Timeline with live spinners), interactive graph visualization (schema view, double-click expand, drag/zoom, property panel), entity detail panel, document browser, and decision trace viewer
Neo4j schema with domain-specific constraints, indexes, and GDS projections (self-hosted mode)
Rich demo data — LLM-generated entities, relationships, professional documents (discharge summaries, trade confirmations, lab reports), and multi-step decision traces
SaaS data import — connect GitHub, Slack, Gmail, Jira, Notion, Google Calendar, Salesforce, Linear, Google Workspace, Claude Code, Claude AI, ChatGPT, or local files
Custom domains — describe your domain in plain English and the LLM generates a complete ontology
Domain-specific agent tools with Cypher queries tailored to your industry
MCP server for Claude Desktop — optionally generates an MCP server config so Claude Desktop can query the same knowledge graph (
--with-mcp)
Creating context graph application...
Domain: Wildlife Management
Framework: PydanticAI
Data: Demo (synthetic)
Neo4j: Docker (neo4j://localhost:7687)
[1/6] Generating domain ontology... ✓
[2/6] Creating project scaffold... ✓
[3/6] Configuring agent tools & system prompt... ✓
[4/6] Generating synthetic documents (25 docs)... ✓
[5/6] Writing fixture data... ✓
[6/6] Bundling project... ✓
Done! Your context graph app is ready.
cd my-app
make install && make startQuick Start
There are two flows depending on what you want:
NAMS (default) — hosted memory backend. No Neo4j to install or operate. Graph starts empty; the agent populates it as you chat.
Self-hosted (
--self-hosted) — bolt Neo4j you run yourself (Aura, Docker, neo4j-local). Full demo fixtures available viamake seed.
Prerequisites
Python 3.11+ (with uv recommended)
Node.js 18+ (for the frontend)
NAMS path: a NAMS API key from memory.neo4jlabs.com
Self-hosted path: Neo4j 5+ (Docker, Aura, or local install)
Either path:
ANTHROPIC_API_KEYfor the agent (orOPENAI_API_KEY/GOOGLE_API_KEYdepending on framework)
NAMS path (default, hosted memory)
uvx create-context-graph my-app \
--domain healthcare \
--framework strands \
--nams-api-key sk-nams-...
cd my-app
echo 'ANTHROPIC_API_KEY=sk-ant-...' >> .env # Strands needs Anthropic
make install
make startOpen http://localhost:3000. Graph starts empty — chat with the agent and entities populate via auto-extraction.
Self-hosted path (bolt Neo4j + full demo data)
uvx create-context-graph my-app \
--domain healthcare \
--framework pydanticai \
--self-hosted \
--demo
cd my-app
echo 'ANTHROPIC_API_KEY=sk-ant-...' >> .env
make install
make docker-up # or: make neo4j-start (for neo4j-local)
make seed
make startOpen http://localhost:3000. Pre-populated graph with ~85 entities, 180 relationships, 25 documents, and decision traces.
Other scaffold patterns
# Interactive wizard (asks 6 prompts, autocomplete domain picker)
uvx create-context-graph
# Custom domain from description
uvx create-context-graph my-app \
--custom-domain "veterinary clinic management" \
--framework pydanticai \
--self-hosted --demo \
--anthropic-api-key $ANTHROPIC_API_KEY
# Import real data from SaaS services
uvx create-context-graph my-app \
--domain personal-knowledge --framework pydanticai --self-hosted \
--connector github --connector slack
# With MCP server for Claude Desktop (works on either backend)
uvx create-context-graph my-app \
--domain healthcare --framework strands \
--nams-api-key sk-nams-... --with-mcp
# Pick a specific LiteLLM provider for memory entity extraction
uvx create-context-graph my-app \
--domain healthcare --framework strands --nams-api-key sk-nams-... \
--memory-llm bedrock/anthropic.claude-3-haiku-20240307-v1:0 \
--memory-embedding sentence-transformers/all-MiniLM-L6-v2Explore the running app
Frontend: http://localhost:3000 — Chat with the AI agent, explore the knowledge graph
Backend API: http://localhost:8000/docs — FastAPI auto-generated docs
Health endpoint: http://localhost:8000/health — reports the active memory backend
NAMS dashboard: memory.neo4jlabs.com (NAMS path only)
Neo4j Browser: http://localhost:7474 (self-hosted Docker / neo4j-local only)
NAMS write-path caveats (v0.4)
The NAMS REST API has a narrower write surface than bolt Cypher. The CLI and the generated import_data.py work around it with a hybrid write shape:
Relationships encoded as
ccg-edgesYAML blocks inside each source entity'sdescription. The frontend graph view parses them out and renders edges; a future migration replays them as native edges when NAMS addsadd_relationship.Entity properties collapse into
descriptionas a markdown block (NAMS REST accepts onlyname/type/description).Documents are dual-tracked —
long_term.add_entity(type=OBJECT)(queryable, matches bolt:Document) ANDshort_term.add_message(role="document")(extraction fuel).No preferences or facts via REST.
auto_preferencesforced off on NAMS.GDS endpoints and arbitrary Cypher writes return 501 on NAMS.
For native graph edges + GDS + arbitrary Cypher, use --self-hosted --demo.
Supported Domains
27 industry domains, each with a purpose-built ontology, sample data, agent tools, and demo scenarios:
| Domain | Key Entities | Domain | Key Entities |
|---|---|---|---|
| Financial Services | Account, Transaction, Decision, Policy | Real Estate | Property, Listing, Agent, Inspection |
| Healthcare | Patient, Provider, Diagnosis, Treatment | Vacation & Hospitality | Resort, Booking, Guest, Activity |
| Retail & E-Commerce | Customer, Product, Order, Review | Oil & Gas | Well, Reservoir, Equipment, Permit |
| Manufacturing | Machine, Part, WorkOrder, Supplier | Data Journalism | Source, Story, Claim, Investigation |
| Scientific Research | Researcher, Paper, Dataset, Grant | Trip Planning | Destination, Hotel, Activity, Itinerary |
| GenAI / LLM Ops | Model, Experiment, Prompt, Evaluation | GIS & Cartography | Feature, Layer, Survey, Boundary |
| Agent Memory | Agent, Conversation, Memory, ToolCall | Wildlife Management | Species, Sighting, Habitat, Camera |
| Gaming | Player, Character, Quest, Guild | Conservation | Site, Species, Program, Funding |
| Personal Knowledge | Note, Contact, Project, Topic | Golf & Sports Mgmt | Course, Player, Round, Tournament |
| Digital Twin | Asset, Sensor, Reading, Alert | Software Engineering | Repository, Issue, PR, Deployment |
| Product Management | Feature, Epic, UserPersona, Metric | Hospitality | Hotel, Room, Reservation, Service |
| Options Intelligence | Underlying, OptionsContract, Regime, KeyLevel | Legal | Case, Matter, Contract, Filing |
| Education | Student, Instructor, Course, Assessment | Cybersecurity | Asset, Vulnerability, Alert, Incident |
| Government | Agency, Program, Policy, Regulation |
# List all available domains
create-context-graph --list-domainsCustom domains: Don't see your industry? Select "Custom (describe your domain)" in the wizard or use --custom-domain "your description". The LLM generates a complete ontology with entity types, relationships, agent tools, and more.
SaaS Data Connectors
<p align="center"> <img src="docs/static/img/connector-data-flow.png" alt="SaaS connector data flow into Neo4j knowledge graph" width="700" /> </p>
Import real data from your existing tools instead of (or in addition to) synthetic demo data:
| Service | What's Imported | Auth |
|---|---|---|
| GitHub | Issues, PRs, commits, contributors | Personal access token |
| Notion | Pages, databases, users | Integration token |
| Jira | Issues, sprints, users | API token |
| Slack | Channel messages, threads, users | Bot OAuth token |
| Gmail | Emails (last 30 days) | Google Workspace CLI or OAuth2 |
| Google Calendar | Events, attendees (last 90 days) | Google Workspace CLI or OAuth2 |
| Salesforce | Accounts, contacts, opportunities | Username/password |
| Linear | Issues, projects, cycles, teams, users, labels, comments, milestones, initiatives, attachments + decision traces from history | Personal API key |
| Google Workspace | Drive files, comment threads (as decision traces), revisions, Drive Activity, Calendar events, Gmail metadata | Google OAuth 2.0 |
| Claude Code | Session history, messages, tool calls, files, decisions, preferences, errors | None (local files) |
| Claude AI | Conversations, messages, tool calls, thinking traces from Claude AI web/app export | None (local file) |
| ChatGPT | Conversations, messages, tool results from ChatGPT data export | None (local file) |
The Google Workspace connector extracts resolved comment threads from Google Docs as first-class decision traces — capturing the question, deliberation, resolution, and participants. Combined with Linear, it provides the full decision lifecycle: from meeting discussion to code execution.
The Claude Code connector reads your local session history from ~/.claude/projects/ — no API keys needed. It extracts decision traces from user corrections and error-resolution cycles, identifies developer preferences from explicit statements and behavioral patterns, and automatically redacts secrets before storage.
The Claude AI and ChatGPT connectors import your conversation exports directly from the official data export features. Export your data from Settings, pass the .zip file to the CLI with --import-type claude-ai or --import-type chatgpt, and get a fully populated context graph from your real conversations — no API keys needed.
Connectors run at scaffold time to populate initial data. They're also generated into your project so you can re-import with make import:
cd my-app
make import # Re-import from connected services
make import-and-seed # Import and seed into Neo4jAgent Frameworks
Select your preferred agent framework at project creation time:
| Framework | Description |
|---|---|
| PydanticAI | Structured tool definitions with Pydantic models and RunContext |
| Claude Agent SDK | Anthropic tool-use with agentic loop |
| OpenAI Agents SDK | @function_tool decorators with Runner.run() |
| LangGraph | Stateful graph-based agent workflow with create_react_agent() |
| CrewAI | Multi-agent crew with role-based tools |
| Strands | Tool-use agents with Anthropic model |
| Google ADK | Gemini agents with FunctionTool calling |
| Anthropic Tools | Modular tool registry with Anthropic API agentic loop |
All frameworks share the same FastAPI HTTP layer, Neo4j client, and frontend. Only the agent implementation differs. "Full streaming" means token-by-token text + real-time tool calls. "Tool streaming" means real-time tool calls with text delivered at the end.
Note on memory providers: Conversation memory uses local
sentence-transformers/all-MiniLM-L6-v2embeddings by default — no API key required. Override withMEMORY_EMBEDDING(LiteLLM provider string) for OpenAI, Vertex AI, Bedrock, or others. The entity-extraction LLM defaults toanthropic/claude-haiku-4-5whenANTHROPIC_API_KEYis set, oropenai/gpt-4o-miniif onlyOPENAI_API_KEYis set. Override withMEMORY_LLMfor full control. See Configure Memory Providers.
Generated Project Structure
<p align="center"> <img src="docs/static/img/ontology-pipeline.png" alt="From domain YAML through Jinja2 templates to generated code" width="750" /> </p>
A single domain YAML drives the entire generated application — schema, models, agent tools, and visualization — through the Jinja2 template engine.
my-app/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI application
│ │ ├── agent.py # AI agent (framework-specific)
│ │ ├── config.py # Settings from .env
│ │ ├── routes.py # REST API endpoints
│ │ ├── models.py # Pydantic models (from ontology)
│ │ ├── context_graph_client.py # Neo4j CRUD operations
│ │ ├── memory.py # Memory integration (MemoryIntegration)
│ │ ├── gds_client.py # Graph Data Science algorithms
│ │ ├── vector_client.py # Vector search
│ │ └── connectors/ # SaaS connectors (if selected)
│ ├── scripts/
│ │ ├── generate_data.py # Data seeding script
│ │ └── import_data.py # SaaS import script (if connectors selected)
│ └── pyproject.toml
├── frontend/
│ ├── app/ # Next.js pages
│ ├── components/
│ │ ├── ChatInterface.tsx # Streaming AI chat (SSE) with real-time tool calls + graph data flow
│ │ ├── ContextGraphView.tsx # Interactive NVL graph (schema view, expand, drag/zoom, properties)
│ │ ├── DecisionTracePanel.tsx # Reasoning trace viewer with step details
│ │ ├── DocumentBrowser.tsx # Document browser with template filtering
│ │ └── Provider.tsx # Chakra UI v3 provider
│ ├── lib/config.ts # Domain configuration
│ ├── theme/index.ts # Chakra theme with domain colors
│ └── package.json
├── cypher/
│ ├── schema.cypher # Constraints & indexes
│ └── gds_projections.cypher # GDS algorithm config
├── data/
│ ├── ontology.yaml # Domain ontology definition
│ └── fixtures.json # Pre-generated sample data
├── .env # Neo4j + API key configuration
├── .env.example # Configuration template (tracked in git)
├── .dockerignore # Docker build context exclusions
├── docker-compose.yml # Local Neo4j instance (Docker mode only)
├── Makefile # start, seed, reset, install, test, test-connection, lint
├── mcp/ # MCP server config (only if --with-mcp)
└── README.md # Domain-specific documentation (with framework docs + troubleshooting)CLI Reference
create-context-graph [PROJECT_NAME] [OPTIONS]
Arguments:
PROJECT_NAME Project name (optional — auto-generated from domain+framework if omitted)
Options:
--domain TEXT Domain ID (e.g., healthcare, gaming)
--framework TEXT Agent framework (strands [default], pydanticai, claude-agent-sdk, openai-agents, langgraph, crewai, google-adk, anthropic-tools)
--self-hosted Use self-hosted Neo4j (bolt) instead of NAMS hosted memory
--nams-api-key TEXT NAMS API key [env: MEMORY_API_KEY] — obtain at https://memory.neo4jlabs.com
--nams-endpoint TEXT Override NAMS endpoint URL (default: https://memory.neo4jlabs.com/v1)
--memory-llm TEXT LiteLLM provider string for memory entity extraction (e.g. anthropic/claude-haiku-4-5)
--memory-embedding TEXT LiteLLM provider string for memory embeddings (e.g. sentence-transformers/all-MiniLM-L6-v2)
--demo-data Generate synthetic demo data
--custom-domain TEXT Generate custom domain from description (requires --anthropic-api-key)
--connector TEXT SaaS connector to enable; repeatable (github, slack, jira, notion, gmail, gcal, salesforce, linear, google-workspace, claude-code, claude-ai, chatgpt)
--import-type TEXT Chat history import: claude-ai or chatgpt (requires --import-file)
--import-file PATH Path to chat export file (.zip, .json, .jsonl)
--import-depth TEXT Import extraction depth: fast (default) or deep
--import-filter-after TEXT Only import conversations after this date (ISO 8601)
--import-filter-before TEXT Only import conversations before this date (ISO 8601)
--import-filter-title TEXT Only import conversations matching title pattern (regex)
--import-max-conversations INT Max conversations to import, 0=all (default: 0)
--linear-api-key TEXT Linear API key (required for --connector linear) [env: LINEAR_API_KEY]
--linear-team TEXT Linear team key to filter import (e.g., ENG) [env: LINEAR_TEAM]
--gws-folder-id TEXT Google Drive folder ID to scope import [env: GWS_FOLDER_ID]
--gws-include-comments / --gws-no-comments Import comment threads (default: on)
--gws-include-revisions / --gws-no-revisions Import revision history (default: on)
--gws-include-activity / --gws-no-activity Import Drive Activity (default: on)
--gws-include-calendar Import Calendar events (default: off)
--gws-include-gmail Import Gmail thread metadata (default: off)
--gws-since TEXT Import data since date (ISO format, default: 90 days ago)
--gws-mime-types TEXT MIME types to include (default: docs,sheets,slides)
--gws-max-files INT Maximum files to import (default: 500)
--claude-code-scope TEXT Import current project or all (default: current)
--claude-code-project TEXT Explicit project path to import sessions for
--claude-code-since TEXT Import sessions since date (ISO format)
--claude-code-max-sessions INT Max sessions to import, 0=all (default: 0)
--claude-code-content TEXT Content mode: truncated, full, none (default: truncated)
--with-mcp Generate MCP server configuration for Claude Desktop
--mcp-profile TEXT MCP tool profile: core (6 tools) or extended (16 tools, default)
--session-strategy TEXT Memory session strategy: per_conversation (default), per_day, persistent
--auto-extract/--no-auto-extract Auto-extract entities from messages (default: on)
--auto-preferences/--no-auto-preferences Auto-detect user preferences (default: on)
--ingest Ingest data into Neo4j after generation
--neo4j-uri TEXT Neo4j connection URI [env: NEO4J_URI] (--self-hosted only)
--neo4j-username TEXT Neo4j username [env: NEO4J_USERNAME] (--self-hosted only)
--neo4j-password TEXT Neo4j password [env: NEO4J_PASSWORD] (--self-hosted only)
--neo4j-aura-env PATH Path to Neo4j Aura .env file with credentials (--self-hosted only)
--neo4j-local Use @johnymontana/neo4j-local for local Neo4j (--self-hosted only)
--anthropic-api-key TEXT Anthropic API key for LLM generation [env: ANTHROPIC_API_KEY]
--openai-api-key TEXT OpenAI API key for LLM generation [env: OPENAI_API_KEY]
--google-api-key TEXT Google/Gemini API key (required for google-adk) [env: GOOGLE_API_KEY]
--output-dir PATH Output directory (default: ./<project-name>)
--demo Shortcut for --reset-database --demo-data --ingest
--reset-database Clear all Neo4j data before ingesting
--dry-run Preview what would be generated without creating files
--verbose Enable verbose debug output
--list-domains List available domains and exit
--version Show version and exit
--help Show help and exitContext Graph Architecture
<p align="center"> <img src="docs/static/img/architecture-overview.png" alt="Architecture: generation pipeline and runtime components" width="800" /> </p>
Every generated app demonstrates the three-memory-type architecture from neo4j-agent-memory:
<p align="center"> <img src="docs/static/img/memory-architecture.png" alt="Three memory types: short-term, long-term, and reasoning memory in Neo4j" width="700" /> </p>
Short-term memory — Conversation history and document content stored as messages
Long-term memory — Entity knowledge graph built on the POLE+O model (Person, Organization, Location, Event, Object)
Reasoning memory — Decision traces with full provenance: thought chains, tool calls, causal relationships
This is what makes context graphs different from simple RAG — the agent doesn't just retrieve text, it reasons over a structured knowledge graph with full decision traceability.
With --with-mcp, the generated project also includes an MCP server configuration that connects Claude Desktop to the same knowledge graph. This dual-interface architecture means the web app and Claude Desktop share one context graph — entities, conversations, and reasoning traces are available everywhere.
Development
# Clone and install
git clone https://github.com/neo4j-labs/create-context-graph.git
cd create-context-graph
uv venv && uv pip install -e ".[dev]"
# Run tests (no Neo4j or API keys required)
source .venv/bin/activate
pytest tests/ -v # Fast: 1,177 tests
pytest tests/ -v --slow # Full: 1,398 tests (includes domain x framework matrix + perf + generated project tests)
pytest tests/ --integration # Integration tests (requires running Neo4j)
# Test a specific scaffold
create-context-graph /tmp/test-app --domain software-engineering --framework pydanticai --demo-dataMakefile Targets
| Target | Description | Requirements |
|---|---|---|
make test | Run fast unit tests (1,177 tests) | None |
make test-slow | Full suite including matrix + perf + generated project tests (1,398 tests) | None |
make test-matrix | Domain × framework matrix only (176 combos) | None |
make test-coverage | Tests with HTML coverage report | None |
make smoke-test | E2E smoke tests for 3 key frameworks | Neo4j + LLM API keys |
make lint | Run ruff linter | ruff |
make scaffold | Scaffold a test project to /tmp/test-scaffold | None |
make build | Build Python package (sdist + wheel) | None |
make docs | Start Docusaurus dev server | Node.js |
E2E Smoke Tests
The smoke tests scaffold a real project, install dependencies, start the backend, and send chat prompts to verify the full pipeline works end-to-end. Pass --backend nams to test the hosted-memory path (requires MEMORY_API_KEY env); the default bolt exercises self-hosted Neo4j with full demo fixtures:
# Run all 3 smoke tests (requires Neo4j + at least one LLM API key)
make smoke-test
# Or run individual framework tests directly (default: --backend bolt)
python scripts/e2e_smoke_test.py --domain financial-services --framework pydanticai --quick
python scripts/e2e_smoke_test.py --domain real-estate --framework google-adk --quick
python scripts/e2e_smoke_test.py --domain trip-planning --framework strands --quick
# Test against NAMS hosted backend (requires MEMORY_API_KEY env)
python scripts/e2e_smoke_test.py --domain healthcare --framework strands --backend nams --quick
# Test all 27 domains with one framework
python scripts/e2e_smoke_test.py --all-domains --framework pydanticai --quick
# Full mode (all prompts per scenario, not just first)
python scripts/e2e_smoke_test.py --domain healthcare --framework claude-agent-sdkRequired environment variables:
NEO4J_URI,NEO4J_USERNAME,NEO4J_PASSWORD— Neo4j connection (Aura, Docker, or local) for--backend boltMEMORY_API_KEY— NAMS API key for--backend namsANTHROPIC_API_KEY— for Claude-based frameworks (PydanticAI, Claude Agent SDK, Anthropic Tools, Strands, CrewAI)OPENAI_API_KEY— for OpenAI-based frameworks (OpenAI Agents, LangGraph)GOOGLE_API_KEY— for Google ADK (Gemini)
CI Pipeline
GitHub Actions (.github/workflows/ci.yml) runs automatically:
| Job | Trigger | Description |
|---|---|---|
| test | All pushes + PRs | Unit tests on Python 3.11 and 3.12 (1,177 tests including security, doc snippets, frontend logic, NAMS adapter, wizard, route integration) |
| lint | All pushes + PRs | Ruff linter on src/ and tests/ |
| matrix | Push to main only | Full suite + 176 domain × framework matrix + perf + generated project tests (1,398 tests) |
| smoke-test | Push to main only | Neo4j integration tests + E2E for all 8 frameworks (scaffold → install → start → chat) |
The smoke-test CI job is gated behind a SMOKE_TESTS_ENABLED repository variable. To enable it:
Go to Settings → Variables → Repository variables and add
SMOKE_TESTS_ENABLED=trueGo to Settings → Secrets → Repository secrets and add:
NEO4J_URI— e.g.,neo4j+s://xxxxx.databases.neo4j.ioNEO4J_USERNAMENEO4J_PASSWORDANTHROPIC_API_KEYOPENAI_API_KEYGOOGLE_API_KEY
The smoke-test job uses fail-fast: false so one framework failure doesn't block the others, and it only runs after the unit test job passes.
The npm package is a thin wrapper that delegates to the Python CLI via uvx, pipx, or python3 -m. It requires Python 3.11+ to be installed.
Automated Publishing (GitHub Actions)
Both packages are published automatically when you push a version tag:
# 1. Update version in pyproject.toml and npm-wrapper/package.json
# 2. Commit the version bump (and any CHANGELOG.md update)
# 3. Tag and push
git tag v0.13.0
git push origin v0.13.0This triggers a GitHub Actions workflow, release.yml with jobs:
publish-pypi — Builds and publishes to PyPI
publish-npm — Publishes the npm wrapper to npmjs.com Both use trusted publishing/OIDC.
Version Bumping
Both packages must use the same version. Update in two places:
pyproject.toml→version = "X.Y.Z"npm-wrapper/package.json→"version": "X.Y.Z"
Note: a job called validate-version-consistency in release.yml ensures that the correct versions exist in both places.
License
Apache-2.0
document-parsing-libraries.md
Document parsing libraries and
This document breaks down some candidate Python libraries and APIs for doing unstructured document parsing, which is the first step of the KG builder pipe line (after fetching the docs of course).
For context, the MVP scope we decided on for this is pdf only, and not worry about images and tables in the pdfs.
Python libraries for local parsing
docling
Covers all kinds of document types including pdf, docx, pptx, images, etc, including determining what the format of the doc is. It uses OCR to detect text. It also has the capability to output the parsed doc in a different format, such as markdown. Uses ML models, so would probably run faster with decent HW acceleration. Seems to be the best in terms of quality out of all “intelligent” doc parsing libs/APIs. The API also has functionality for deriving metadata and high level document structure. Well maintained (IBM).
License: MIT
unstructured.io (OSS Python lib)
It basically has the same functionality as docling. However people online claim that docling is significantly better these days in terms of accuracy. Seems well maintained.
License: Apache 2.0
pypdf
What we use now. Works only on PDF. It’s pretty fast. It does extract text from tables and adds some special characters to it. When I give this extracted table as text to an LLM, it is able to understand it completely. It can extract images from pdfs, but not interpret them as text. It also has great functionality for extracting metadata, without parsing the entire document. And can also extract a document’s structure (nested tree of titles and page numbers). Well maintained.
License: BSD
pymupdf
Supports several doc types, including docx, xlsx, epub, and more. It’s very fast (containing non-Python code). Like docling, it can also output parsed text as markdown, and even help with chunking. Like pypdf, it handles metadata, doc structure well in that it can derive them without parsing the entire doc. It also extracts tables as text with special characters in a way that can be parsed by an LLM. Images are also handled the same way as in pypdf, i.e. it can extract them from a pdf, but there’s no OCR or anything to interpret it. Well maintained.
License: AGPL
pdfminer.six
Similar to the aforementioned pypdf. The main difference is that it’s able to derive additional, more precise information like font types, and precise character positions and size. This could be useful if we want to capture the exact layout and geometry of the pdf. It cannot be used for editing pdfs. Seems well maintained.
License: MIT
pdfplumber
Built on top of pdfminer.six, and has some additional convenience functionality that makes it a bit easier to use. Seems to be good at extracting tables (not sure that we need more than py(mu)pdf for that though…). Does not have a major release yet, but seems fairly well maintained.
License: MIT
python-docx
Works only on docx. Seems pretty fast, and can parse tables. Has fantastic support for navigating the structure of the document, once it’s parsed. Seems to be well maintained.
License: MIT
Cloud solutions
These are all basically docling, but as hosted cloud services with HTTP APIs.
LlamaParse
This seems to be fairly popular. Folks online say it’s both faster and has better accuracy than unstructured.io (but worse than docling). It has some functionality for deriving metadata and doc layout as well.
Cost is $0.003 per page.
unstructured.io (Cloud solution)
Used to be popular, but has fallen out of favor recently due to being slower and having worse accuracy than LlamaParse, and for this reason I did not benchmark it as a cloud solution.
Start package price is $500/month for 15k pages, and $0.03/page after that.
Performance benchmark
The benchmark is performed on three different documents, with the relevant libs/APIs. The time is measured in seconds, and approximate over several runs. The benchmark was run on a basic MacBook Pro (by default using the mps device as an accelerator for docling).
The documents
Simple 2 page pdf: The ‘Harry Potter and the Chamber of Secrets Summary’ document, only containing text.
Complex 72 page pdf: The paper ‘Challenges and Applications of Large Language Models’. Contains formulas, tables, images.
Small docx file: 1-2 pages of straightforward docx, but containing things like tables and dotted lists.
Results
| Simple 2 page pdf | Complex 72 page pdf | Small docx file | |
|---|---|---|---|
| docling w/o OCR | 1.5 - 2 | 13 - 14 | 0.39 - 0.45 |
| docling w/ OCR | 4.5 - 5 | 49 - 52 | 0.39 - 0.45 |
| unstructured.io (lib) w/o OCR | 0.07 | 4.18 - 4.22 | 0.07 |
| unstructured.io (lib) w/ OCR | 5.2 - 5.4 | 235 | 0.07 |
| pypdf | 0.009 | 1.8 - 1.9 | n/a |
| pymupdf | 0.005 | 0.33 | 0.002 |
| pdfminer.six | 0.033 | 3.2 - 3.3 | n/a |
| pdfplumber | 0.165 | 6.6 - 6.7 | n/a |
| python-docx | n/a | n/a | 0.003 |
| LlamaParse w/o OCR | 30 (first run), 5 - 7 (subsequent runs) | 100 (first run), 25 - 26 (subsequent runs) | 5 - 7 |
| LlamaParse w/ OCR | 30 (first run), 5 - 7 (subsequent runs) | 138 (first run), 28 - 30 (subsequent runs) | 18 - 19 (first run), 5 - 7 (subsequent runs) |
Some observations
pymupdf is the fastest in all categories
Using an “intelligent” parser with OCR (optical character recognition of tables, images, etc) is several magnitudes slower than standard doc parsing, as expected
docling and unstructured.io is always slower on PDF when using OCR, even if the document only contains text
unstructured.io is significantly faster than docling when not using OCR, but significantly slower when using OCR
LlamaParse seems to be using caching (sometimes?), so the second time a document is dispatched it is parsed much faster. But that wouldn’t be of great help to us
Conclusion
Considering our limited MVP scope, just using pymupdf for now seems like the way to go. It’s the most performant, can handle most document formats, and handles metadata, doc structure and tables well. The main thing we would miss out on is using OCR to parse very visual data, like powerpoint docs and images, as well as very precise PDF information like font types. For the former we might consider docling (better accuracy and perf than unstructured.io when using OCR) running on proper HW, or a remote API like LlamaParse in the future.
344 files · 334 not served here
- .github/workflows/ci.yml (not served here)
- .github/workflows/release.yml (not served here)
- .gitignore (not served here)
- .serena/.gitignore (not served here)
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- CONTRIBUTING.md
- LABS_DISCLAIMER.txt (not served here)
- LICENSE
- Makefile (not served here)
- README.md
- ROADMAP.md
- docs/.gitignore (not served here)
- docs/README.md
- docs/docs/explanation/ccg-edges.md (not served here)
- docs/docs/explanation/how-decision-traces-work.md (not served here)
- docs/docs/explanation/how-domain-ontologies-work.md (not served here)
- docs/docs/explanation/memory-backends.md (not served here)
- docs/docs/explanation/three-memory-types.md (not served here)
- docs/docs/explanation/why-context-graphs.md (not served here)
- docs/docs/how-to/add-custom-domain.md (not served here)
- docs/docs/how-to/configure-memory-providers.md (not served here)
- docs/docs/how-to/connect-claude-desktop.md (not served here)
- docs/docs/how-to/import-local-files.md (not served here)
- docs/docs/how-to/import-saas-data.md (not served here)
- docs/docs/how-to/switch-agent-frameworks.md (not served here)
- docs/docs/how-to/use-docker.md (not served here)
- docs/docs/how-to/use-nams.md (not served here)
- docs/docs/how-to/use-neo4j-aura.md (not served here)
- docs/docs/how-to/use-neo4j-local.md (not served here)
- docs/docs/intro.md (not served here)
- docs/docs/quick-start.md (not served here)
- docs/docs/reference/chat-import-schema.md (not served here)
- docs/docs/reference/claude-code-schema.md (not served here)
- docs/docs/reference/cli-options.md (not served here)
- docs/docs/reference/domain-catalog.md (not served here)
- docs/docs/reference/framework-comparison.md (not served here)
- docs/docs/reference/generated-project-structure.md (not served here)
- docs/docs/reference/google-workspace-schema.md (not served here)
- docs/docs/reference/ontology-yaml-schema.md (not served here)
- docs/docs/tutorials/claude-code-sessions.md (not served here)
- docs/docs/tutorials/customizing-domain-ontology.md (not served here)
- docs/docs/tutorials/first-context-graph-app.md (not served here)
- docs/docs/tutorials/google-workspace-decisions.md (not served here)
- docs/docs/tutorials/import-chat-history.md (not served here)
- docs/docs/tutorials/linear-context-graph.md (not served here)
- docs/docs/whats-new.md (not served here)
- docs/docusaurus.config.ts (not served here)
- docs/package-lock.json (not served here)
- docs/package.json (not served here)
- docs/sidebars.ts (not served here)
- docs/src/components/animations/AppPreview.module.css (not served here)
- docs/src/components/animations/AppPreview.tsx (not served here)
- docs/src/components/animations/ContextGraphExplainer.module.css (not served here)
- docs/src/components/animations/ContextGraphExplainer.tsx (not served here)
- docs/src/components/animations/DomainCarousel.module.css (not served here)
- docs/src/components/animations/DomainCarousel.tsx (not served here)
- docs/src/components/animations/FrameworkGrid.module.css (not served here)
- docs/src/components/animations/FrameworkGrid.tsx (not served here)
- docs/src/components/animations/HowItWorks.module.css (not served here)
- docs/src/components/animations/HowItWorks.tsx (not served here)
- docs/src/components/animations/TerminalAnimation.module.css (not served here)
- docs/src/components/animations/TerminalAnimation.tsx (not served here)
- docs/src/components/animations/TrustBar.module.css (not served here)
- docs/src/components/animations/TrustBar.tsx (not served here)
- docs/src/components/ui/BrowserFrame.module.css (not served here)
- docs/src/components/ui/BrowserFrame.tsx (not served here)
- docs/src/components/ui/Terminal.module.css (not served here)
- docs/src/components/ui/Terminal.tsx (not served here)
- docs/src/css/custom.css (not served here)
- docs/src/data/animation-config.ts (not served here)
- docs/src/pages/404.tsx (not served here)
- docs/src/pages/index.module.css (not served here)
- docs/src/pages/index.tsx (not served here)
- docs/src/theme/Root.tsx (not served here)
- docs/static/.nojekyll (not served here)
- docs/static/img/app-three-panel.excalidraw (not served here)
- docs/static/img/app-three-panel.png (not served here)
- docs/static/img/architecture-overview.excalidraw (not served here)
- docs/static/img/architecture-overview.png (not served here)
- docs/static/img/claude-code-data-flow.excalidraw (not served here)
- docs/static/img/claude-code-data-flow.png (not served here)
- docs/static/img/claude-code-data-pipeline.excalidraw (not served here)
- docs/static/img/claude-code-data-pipeline.png (not served here)
- docs/static/img/claude-code-decision-extraction.excalidraw (not served here)
- docs/static/img/claude-code-decision-extraction.png (not served here)
- docs/static/img/claude-code-graph-schema.excalidraw (not served here)
- docs/static/img/claude-code-graph-schema.png (not served here)
- docs/static/img/connector-data-flow.excalidraw (not served here)
- docs/static/img/connector-data-flow.png (not served here)
- docs/static/img/decision-trace-structure.excalidraw (not served here)
- docs/static/img/decision-trace-structure.png (not served here)
- docs/static/img/docusaurus-social-card.jpg (not served here)
- docs/static/img/docusaurus.png (not served here)
- docs/static/img/favicon.ico (not served here)
- docs/static/img/graph-vs-flat.excalidraw (not served here)
- docs/static/img/graph-vs-flat.png (not served here)
- docs/static/img/gws-decision-flow.excalidraw (not served here)
- docs/static/img/gws-decision-flow.png (not served here)
- docs/static/img/gws-graph-schema.excalidraw (not served here)
- docs/static/img/gws-graph-schema.png (not served here)
- docs/static/img/gws-linear-combined.excalidraw (not served here)
- docs/static/img/gws-linear-combined.png (not served here)
- docs/static/img/linear-data-flow.excalidraw (not served here)
- docs/static/img/linear-data-flow.png (not served here)
- docs/static/img/linear-graph-schema.excalidraw (not served here)
- docs/static/img/linear-graph-schema.png (not served here)
- docs/static/img/logo.svg (not served here)
- docs/static/img/memory-architecture.excalidraw (not served here)
- docs/static/img/memory-architecture.png (not served here)
- docs/static/img/ontology-pipeline.excalidraw (not served here)
- docs/static/img/ontology-pipeline.png (not served here)
- docs/static/img/screenshot-frontend.png (not served here)
- docs/static/img/undraw_docusaurus_mountain.svg (not served here)
- docs/static/img/undraw_docusaurus_react.svg (not served here)
- docs/static/img/undraw_docusaurus_tree.svg (not served here)
- docs/tsconfig.json (not served here)
- document-parsing-libraries.md
- npm-wrapper/README.md (not served here)
- npm-wrapper/bin/create-context-graph (not served here)
- npm-wrapper/package.json (not served here)
- pyproject.toml (not served here)
- scripts/e2e_smoke_test.py (not served here)
- scripts/regenerate_fixtures.py (not served here)
- src/create_context_graph/__init__.py (not served here)
- src/create_context_graph/__main__.py (not served here)
- src/create_context_graph/cli.py (not served here)
- src/create_context_graph/config.py (not served here)
- src/create_context_graph/connectors/__init__.py (not served here)
- src/create_context_graph/connectors/_chat_import/__init__.py (not served here)
- src/create_context_graph/connectors/_chat_import/models.py (not served here)
- src/create_context_graph/connectors/_chat_import/zip_reader.py (not served here)
- src/create_context_graph/connectors/_chatgpt/__init__.py (not served here)
- src/create_context_graph/connectors/_chatgpt/parser.py (not served here)
- src/create_context_graph/connectors/_claude_ai/__init__.py (not served here)
- src/create_context_graph/connectors/_claude_ai/parser.py (not served here)
- src/create_context_graph/connectors/_claude_code/__init__.py (not served here)
- src/create_context_graph/connectors/_claude_code/decision_extractor.py (not served here)
- src/create_context_graph/connectors/_claude_code/parser.py (not served here)
- src/create_context_graph/connectors/_claude_code/preference_extractor.py (not served here)
- src/create_context_graph/connectors/_claude_code/redactor.py (not served here)
- src/create_context_graph/connectors/_local_file/__init__.py (not served here)
- src/create_context_graph/connectors/_local_file/mapper.py (not served here)
- src/create_context_graph/connectors/_local_file/parser.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/__init__.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/asciidoc.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/docx.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/html.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/markdown.py (not served here)
- src/create_context_graph/connectors/_local_file/parsers/pdf.py (not served here)
- src/create_context_graph/connectors/chatgpt_connector.py (not served here)
- src/create_context_graph/connectors/claude_ai_connector.py (not served here)
- src/create_context_graph/connectors/claude_code_connector.py (not served here)
- src/create_context_graph/connectors/gcal_connector.py (not served here)
- src/create_context_graph/connectors/github_connector.py (not served here)
- src/create_context_graph/connectors/gmail_connector.py (not served here)
- src/create_context_graph/connectors/google_workspace_connector.py (not served here)
- src/create_context_graph/connectors/jira_connector.py (not served here)
- src/create_context_graph/connectors/linear_connector.py (not served here)
- src/create_context_graph/connectors/local_file_connector.py (not served here)
- src/create_context_graph/connectors/notion_connector.py (not served here)
- src/create_context_graph/connectors/oauth.py (not served here)
- src/create_context_graph/connectors/salesforce_connector.py (not served here)
- src/create_context_graph/connectors/slack_connector.py (not served here)
- src/create_context_graph/custom_domain.py (not served here)
- src/create_context_graph/domains/_base.yaml (not served here)
- src/create_context_graph/domains/agent-memory.yaml (not served here)
- src/create_context_graph/domains/conservation.yaml (not served here)
- src/create_context_graph/domains/cybersecurity.yaml (not served here)
- src/create_context_graph/domains/data-journalism.yaml (not served here)
- src/create_context_graph/domains/digital-twin.yaml (not served here)
- src/create_context_graph/domains/education.yaml (not served here)
- src/create_context_graph/domains/financial-services.yaml (not served here)
- src/create_context_graph/domains/gaming.yaml (not served here)
- src/create_context_graph/domains/genai-llm-ops.yaml (not served here)
- src/create_context_graph/domains/gis-cartography.yaml (not served here)
- src/create_context_graph/domains/golf-sports.yaml (not served here)
- src/create_context_graph/domains/government.yaml (not served here)
- src/create_context_graph/domains/healthcare.yaml (not served here)
- src/create_context_graph/domains/hospitality.yaml (not served here)
- src/create_context_graph/domains/legal.yaml (not served here)
- src/create_context_graph/domains/manufacturing.yaml (not served here)
- src/create_context_graph/domains/oil-gas.yaml (not served here)
- src/create_context_graph/domains/options-intelligence.yaml (not served here)
- src/create_context_graph/domains/personal-knowledge.yaml (not served here)
- src/create_context_graph/domains/product-management.yaml (not served here)
- src/create_context_graph/domains/real-estate.yaml (not served here)
- src/create_context_graph/domains/retail-ecommerce.yaml (not served here)
- src/create_context_graph/domains/scientific-research.yaml (not served here)
- src/create_context_graph/domains/software-engineering.yaml (not served here)
- src/create_context_graph/domains/trip-planning.yaml (not served here)
- src/create_context_graph/domains/vacation-industry.yaml (not served here)
- src/create_context_graph/domains/wildlife-management.yaml (not served here)
- src/create_context_graph/fixtures/agent-memory.json (not served here)
- src/create_context_graph/fixtures/conservation.json (not served here)
- src/create_context_graph/fixtures/cybersecurity.json (not served here)
- src/create_context_graph/fixtures/data-journalism.json (not served here)
- src/create_context_graph/fixtures/digital-twin.json (not served here)
- src/create_context_graph/fixtures/education.json (not served here)
- src/create_context_graph/fixtures/financial-services.json (not served here)
- src/create_context_graph/fixtures/gaming.json (not served here)
- src/create_context_graph/fixtures/genai-llm-ops.json (not served here)
- src/create_context_graph/fixtures/gis-cartography.json (not served here)
- src/create_context_graph/fixtures/golf-sports.json (not served here)
- src/create_context_graph/fixtures/government.json (not served here)
- src/create_context_graph/fixtures/healthcare.json (not served here)
- src/create_context_graph/fixtures/hospitality.json (not served here)
- src/create_context_graph/fixtures/legal.json (not served here)
- src/create_context_graph/fixtures/manufacturing.json (not served here)
- src/create_context_graph/fixtures/oil-gas.json (not served here)
- src/create_context_graph/fixtures/options-intelligence.json (not served here)
- src/create_context_graph/fixtures/personal-knowledge.json (not served here)
- src/create_context_graph/fixtures/product-management.json (not served here)
- src/create_context_graph/fixtures/real-estate.json (not served here)
- src/create_context_graph/fixtures/retail-ecommerce.json (not served here)
- src/create_context_graph/fixtures/scientific-research.json (not served here)
- src/create_context_graph/fixtures/software-engineering.json (not served here)
- src/create_context_graph/fixtures/trip-planning.json (not served here)
- src/create_context_graph/fixtures/vacation-industry.json (not served here)
- src/create_context_graph/fixtures/wildlife-management.json (not served here)
- src/create_context_graph/generator.py (not served here)
- src/create_context_graph/ingest.py (not served here)
- src/create_context_graph/name_pools.py (not served here)
- src/create_context_graph/neo4j_validator.py (not served here)
- src/create_context_graph/ontology.py (not served here)
- src/create_context_graph/renderer.py (not served here)
- src/create_context_graph/templates/backend/agents/anthropic_tools/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/claude_agent_sdk/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/crewai/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/google_adk/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/langgraph/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/openai_agents/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/pydanticai/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/agents/strands/agent.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/__init__.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/claude_code_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/gcal_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/github_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/gmail_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/google_workspace_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/import_data.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/jira_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/linear_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/local_file_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/notion_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/salesforce_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/connectors/slack_connector.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/agent_stub.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/config.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/constants.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/context_graph_client.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/gds_client.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/generate_data.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/main.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/memory.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/memory_adapter.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/models.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/pyproject.toml.j2 (not served here)
- src/create_context_graph/templates/backend/shared/routes.py.j2 (not served here)
- src/create_context_graph/templates/backend/shared/vector_client.py.j2 (not served here)
- src/create_context_graph/templates/backend/tests/test_routes.py.j2 (not served here)
- src/create_context_graph/templates/base/Dockerfile.backend.j2 (not served here)
- src/create_context_graph/templates/base/Dockerfile.frontend.j2 (not served here)
- src/create_context_graph/templates/base/Makefile.j2 (not served here)
- src/create_context_graph/templates/base/README.md.j2 (not served here)
- src/create_context_graph/templates/base/docker-compose.prod.yml.j2 (not served here)
- src/create_context_graph/templates/base/docker-compose.yml.j2 (not served here)
- src/create_context_graph/templates/base/dockerignore.j2 (not served here)
- src/create_context_graph/templates/base/dot_env.j2 (not served here)
- src/create_context_graph/templates/base/dot_env_example.j2 (not served here)
- src/create_context_graph/templates/base/gitignore.j2 (not served here)
- src/create_context_graph/templates/base/mcp/README.md.j2 (not served here)
- src/create_context_graph/templates/base/mcp/claude_desktop_config.json.j2 (not served here)
- src/create_context_graph/templates/cypher/gds_projections.cypher.j2 (not served here)
- src/create_context_graph/templates/cypher/schema.cypher.j2 (not served here)
- src/create_context_graph/templates/frontend/app/globals.css.j2 (not served here)
- src/create_context_graph/templates/frontend/app/layout.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/app/page.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/ChatInterface.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/ContextGraphView.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/DecisionTracePanel.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/DocumentBrowser.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/ErrorBoundary.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/components/Provider.tsx.j2 (not served here)
- src/create_context_graph/templates/frontend/e2e/app.spec.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/lib/config.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/next.config.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/package.json.j2 (not served here)
- src/create_context_graph/templates/frontend/playwright.config.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/theme/index.ts.j2 (not served here)
- src/create_context_graph/templates/frontend/tsconfig.json.j2 (not served here)
- src/create_context_graph/wizard.py (not served here)
- tests/__init__.py (not served here)
- tests/conftest.py (not served here)
- tests/fixtures/local_file_vault/README.md (not served here)
- tests/fixtures/local_file_vault/companies/acme-corp.md (not served here)
- tests/fixtures/local_file_vault/companies/betawidgets-inc.md (not served here)
- tests/fixtures/local_file_vault/daily-notes/2026-05-08.md (not served here)
- tests/fixtures/local_file_vault/daily-notes/2026-05-09.md (not served here)
- tests/fixtures/local_file_vault/decisions/2026-q2-thesis-call.md (not served here)
- tests/fixtures/local_file_vault/external/acme-10q-2026q1.pdf (not served here)
- tests/fixtures/local_file_vault/external/sector-report-q1-2026.html (not served here)
- tests/fixtures/local_file_vault/meetings/2026-05-07-portfolio-review.md (not served here)
- tests/fixtures/local_file_vault/memos/acme-investment-memo.docx (not served here)
- tests/fixtures/local_file_vault/methodology/dcf-framework.md (not served here)
- tests/fixtures/local_file_vault/methodology/dcf-spec.adoc (not served here)
- tests/fixtures/local_file_vault/people/dana-liu.md (not served here)
- tests/fixtures/local_file_vault/people/marcus-reyes.md (not served here)
- tests/fixtures/local_file_vault/people/sarah-chen.md (not served here)
- tests/fixtures/local_file_vault/people/tariq-osei.md (not served here)
- tests/fixtures/local_file_vault/people/yuki-tanaka.md (not served here)
- tests/fixtures/local_file_vault_TESTING.md (not served here)
- tests/test_bolt_ingest_parity.py (not served here)
- tests/test_chat_import.py (not served here)
- tests/test_cli.py (not served here)
- tests/test_config.py (not served here)
- tests/test_connectors.py (not served here)
- tests/test_custom_domain.py (not served here)
- tests/test_doc_snippets.py (not served here)
- tests/test_fixtures.py (not served here)
- tests/test_frontend_logic.py (not served here)
- tests/test_generated_client_runtime.py (not served here)
- tests/test_generated_project.py (not served here)
- tests/test_generated_tests.py (not served here)
- tests/test_generator.py (not served here)
- tests/test_ingest_nams.py (not served here)
- tests/test_integration.py (not served here)
- tests/test_local_file_connector.py (not served here)
- tests/test_local_file_vault.py (not served here)
- tests/test_matrix.py (not served here)
- tests/test_memory_adapter.py (not served here)
- tests/test_nams_adapter.py (not served here)
- tests/test_nams_ingest_parity.py (not served here)
- tests/test_neo4j_validator.py (not served here)
- tests/test_ontology.py (not served here)
- tests/test_performance.py (not served here)
- tests/test_renderer.py (not served here)
- tests/test_routes_integration.py (not served here)
- tests/test_security.py (not served here)
- tests/test_wizard.py (not served here)
- uv.lock (not served here)
- vercel.json (not served here)
Advantages
- Rapidly scaffolds full-stack applications with domain-specific ontologies and agent tools in under 5 minutes. evidence: README.md
- Provides flexible memory backend options, supporting both hosted NAMS and self-hosted Neo4j. evidence: README.md
Limitations
- The NAMS hosted memory backend has a narrower write surface compared to self-hosted Neo4j, limiting some Cypher-based operations. evidence: README.md
- Requires specific API keys and environment variables depending on the chosen agent framework and memory provider. evidence: README.md
Security
Risk level: Low risk
This brain runs
Agent instructions that run or fetch something (28)
CLAUDE.md:Invoked via `uvx create-context-graph` or `npx create-context-graph`.CLAUDE.md:(2) every document/body ingest write failed (`role="document"` rejected — only user/assistant/system allowed — plus the conversation-404), fixed across all three NAMS ingest implementations (`run_nams_ingest`, scaffolded `import_data.py`, `make seed`'s `ingest_fixtures_nams`) with `role …[+63 chars]CLAUDE.md:the old loop swallowed the AttributeError and printed "0 removed") — `--reset-database` and `make reset` now honestly report that no delete API exists and point at the NAMS dashboard.CLAUDE.md:**NAMS domain ontology activation (new)**: NAMS pre-registers a server-side ontology for every bundled domain but auto-binds workspaces to `nams-default` until one is activated — generated apps now bind on `connect_memory()` (activate catalog match by domain id, or create-from-`backend …[+359 chars]CLAUDE.md:**Carry-forward from v0.13.1 (feedback-report triage):** `create-context-graph --dry-run` no longer demands a NAMS API key (the credential gate is now scoped to non-dry-run flows in `cli.py:392`).CLAUDE.md:**Carry-forward from v0.13.0 (v0.12.0 feedback-report fixes):** Fixed the bolt async/sync mismatch in the scaffolded `import_data.py` (`_ingest_via_bolt()` is `async def` and both call sites wrap with `asyncio.run`);CLAUDE.md:uv venv && uv pip install -e ".[dev]"CLAUDE.md:# Run testsCLAUDE.md:**Data seeding** (`make seed`): Loads all four data types into Neo4j — entities, relationships, documents (as `:Document` nodes with `:MENTIONS` links to entities), and decision traces (as `:DecisionTrace` → `:HAS_STEP` → `:TraceStep` chains).CLAUDE.md:As tools execute, the collector emits `tool_start` and `tool_end` events (with graph data).CLAUDE.md:CrewAI and Strands are synchronous frameworks that run in worker threads via `asyncio.to_thread()`.CLAUDE.md:When `--with-mcp` is passed (or selected in the wizard), the scaffold generates `mcp/claude_desktop_config.json` (pre-configured for the project's Neo4j instance), `mcp/README.md` (setup instructions), and a `make mcp-server` Makefile target.CLAUDE.md:python-docx (Word).CLAUDE.md:Connectors run at scaffold time AND are generated into the project with `make import` / `make import-and-seed` targets.CLAUDE.md:pytest tests/test_generated_tests.py # Scaffold + install + run generated project test suite for 4 frameworks (slow, 5)CLAUDE.md:Full-stack integration tests that scaffold a project, install dependencies, start the backend, and send chat prompts.CLAUDE.md:make smoke-test # Run 3 key framework tests (pydanticai, google-adk, strands)CLAUDE.md:# Or run directly with more control:CLAUDE.md:python scripts/e2e_smoke_test.py --domain healthcare --framework pydanticai --quickCLAUDE.md:python scripts/e2e_smoke_test.py --all-domains --framework claude-agent-sdk --quickCLAUDE.md:python scripts/e2e_smoke_test.py --domain gaming --framework openai-agents # full mode (all prompts)CLAUDE.md:| Target | Description | |--------|-------------| | `make test` | Fast unit tests (1,454 passing, no external deps) | | `make test-slow` | Full suite including matrix + perf + generated project + connector/functional tests (1,866 passing with connectors extra) | | `make test-matrix` | …[+533 chars]CLAUDE.md:Generate fixture data: run the CLI with `--demo-data` or use `generator.py` directlyCLAUDE.md:| Framework | Directory | Pattern | Streaming | |-----------|-----------|---------|-----------| | PydanticAI | `pydanticai/` | `@agent.tool` decorator + `RunContext[AgentDeps]` | Full (`agent.run_stream()`) | | Claude Agent SDK | `claude_agent_sdk/` | Dict-based TOOLS list + bounded ag …[+787 chars]CLAUDE.md:| Job | Trigger | Description | |-----|---------|-------------| | **test** | All pushes + PRs | Fast unit tests on Python 3.11 and 3.12 (`fail-fast: false` so one version's failure doesn't cancel the other) | | **lint** | All pushes + PRs | Ruff on `src/` and `tests/` (rule set pinned …[+444 chars]CLAUDE.md:**Every job installs from `uv.lock` via `uv sync --locked --extra ...` and runs commands with `uv run --no-sync`.** Never mix `uv pip install` with a bare `uv run` in CI: `uv run` does an implicit lockfile sync that downgrades locked base deps underneath freshly-installed latest extras …[+94 chars]CLAUDE.md:If `--locked` fails, run `uv lock` locally and commit the refreshed lockfile — dependency changes in `pyproject.toml` must ship with a matching `uv.lock`.CLAUDE.md:The Makefile test/lint targets use `uv run --extra dev ...` so local runs resolve from the lock the same way.
Install scripts (1)
Makefile(make install):uv venv && uv pip install -e ".[dev]"
- Low risk: network-instructions (CLAUDE.md:15)
- Low risk: network-instructions (Makefile:10)
- Low risk: scripts-present (scripts/e2e_smoke_test.py)
- Low risk: scripts-present (scripts/regenerate_fixtures.py)
Attribution and licence
- Created by
- neo4j-labs
- Declared authors
- William Lyon (declared in pyproject.toml)
- Publisher
- neo4j-labs (Official neo4j-labs project)
- Source
- neo4j-labs/create-context-graph · commit 926e3b3
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by neo4j-labs.
Install from source
334 of its files are not served here, so there is no ZIP. neo4j-labs/create-context-graph at 926e3b3