Manages Neo4j Aura Agents via the v2beta1 REST API — create, list, get, update, delete, and invoke Aura agents backed by an AuraDB instance. Use when configuring Aura Agent tools (CypherTemplate, SimilaritySearch, Text2Cypher), setting system prompts, deploying agents to REST or MCP endpoints, invoking agents with natural language queries, or generating evaluation datasets (max 50 questions) for the Aura Agent evaluation feature. Covers OAuth2 auth, organization/project scoping, tool parameter schemas, and InvokeAgentResponse format. Does NOT cover AuraDB instance provisioning — use neo4j-aura-provisioning-skill. Does NOT cover vector index creation — use neo4j-vector-index-skill.
Building Aura Graph Analytics sessions → neo4j-aura-graph-analytics-skill
What are Aura Agents
GraphRAG agents on top of AuraDB — answer natural language questions via three tool types:
CypherTemplate — parameterized queries for predictable lookups
SimilaritySearch — vector similarity search over a VECTOR index
Text2Cypher — natural language → Cypher for aggregations and discovery
Expose your graph via natural language to users or apps without application code. Accessible as REST or MCP endpoint; single- and multi-turn. For full Cypher control, low-latency lookups, or direct writes — use neo4j-cypher-skill instead.
Prerequisites
Running AuraDB instance with knowledge graph loaded
"Generative AI assistance" enabled in Organization settings
"Aura Agent" toggled on in the project
"Tool authentication" enabled at project/Security level
Project admin access
AURA_CLIENT_ID and AURA_CLIENT_SECRET from console.neo4j.io → Account Settings → API Credentials
AURA_ORG_ID, AURA_PROJECT_ID — see Step 2; AURA_INSTANCE_ID — resolved interactively in Step 2 if not already set
If the list is empty: no AuraDB instances exist in this project — an Aura Agent cannot be created without one. Stop and report.
If 401: re-run Step 1. If 404: verify AURA_PROJECT_ID. Stop and report.
Step 3 — List Existing Agents
uv run python3 scripts/manage_agent.py list # Linux/macOS
uv run python scripts\manage_agent.py list # Windows
Data gate — script exits with error and does NOT write schema.json if:
fewer than 2 nodes, OR
zero relationship types
If gate fails: load data into the database before proceeding. Stop and report.
If ServiceUnavailable: check NEO4J_URI uses neo4j+s://; instance must be running. Stop and report.
If neo4j-graphrag not found: uv add neo4j-graphrag. Stop and report.
Take answers from request and schema; ask about gaps. Do NOT guess tool types or parameters.
"What questions should this agent answer?"
"Which nodes or relationships matter most?" — match against schema.json → node_props
"Do users search by a specific property value?" → CypherTemplate
"Any counting, grouping, or date-range questions?" → Text2Cypher
"Search for semantically similar text?" → check schema.json → metadata → vector_index
No VECTOR index found: inform user; skip SimilaritySearch; delegate to neo4j-vector-index-skill first
VECTOR index found: provider/model from request, else ask ("Which embedding provider and model?"); supported models → references/REFERENCE.md → Embedding Provider Options. Dimension from index (vector.dimensions). Do NOT guess provider/model.
Tool selection:
Use Case
Tool
Lookup by specific property value
cypherTemplate
Semantic text search
similaritySearch
Aggregation, counting, open-ended
text2cypher
CypherTemplate parameters: for each parameter, read aura_data_type from schema.json → node_props or rel_props and use it as data_type. If the property has low_cardinality: true, the parameter description should list the valid values — copy them from the values array in schema.json. Example: "description": "Agreement type to filter by. Valid values: \"Distributor Agreement\", \"License Agreement\", \"NDA\"". Properties with has_fulltext_index: true are especially likely to be filter targets and should include valid values when low cardinality.
SimilaritySearch configuration — values from request; dimension from index; ask about gaps; then draft tool config:
Field
What to ask
Source
provider
"openai" or "vertexai"?
Request, else user confirms
model
Which model?
Request, else user picks from references/REFERENCE.md → Embedding Provider Options
dimension
What output dimension?
Required if model is configurable (see table); fixed models use the table value
index: use name from schema.json → metadata → vector_index where state = ONLINE. dimension must match vector.dimensions in the same index entry.
Signals inventory: for each label or relationship that appears in a tool or the user's stated questions, write a signal block in the system prompt. See references/authoring-guide.md → Signals inventory for the template and rules.
Draft config JSON → show to user for review → confirm → proceed to Step 6. Skip review if user said go ahead or request gives full config; state config, proceed.
Step 6 — Create Agent
Minimum required config:
{
"name": "My Agent",
"description": "Answers questions about the graph",
"dbid": "<AURA_INSTANCE_ID>",
"is_private": false,
"tools": [
{
"type": "text2cypher",
"name": "Query Graph",
"description": "Translates natural language questions into Cypher queries"
}
]
}
Show config to user and confirm before running (skip if user already asked to create with these details):
uv run python3 scripts/manage_agent.py create --config agent-config.json
Response includes id (save as AURA_AGENT_ID), endpoint_link. No MCP URL in response; if is_mcp_enabled: https://mcp.neo4j.io/agent?project_id=<project_id>&agent_id=<agent_id> — see references/REFERENCE.md → External Access.
Step 7 — Invoke Agent (Test)
uv run python3 scripts/invoke_agent.py --agent-id "$AURA_AGENT_ID" "What can you help me with?"
--raw prints full JSON including reasoning chain and token usage.
Direct curl (uses token from Step 1):
curl -s -X POST \
"https://api.neo4j.io/v2beta1/organizations/${AURA_ORG_ID}/projects/${AURA_PROJECT_ID}/agents/${AURA_AGENT_ID}/invoke" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"input": "What can you help me with?"}'
uv run python3 scripts/manage_agent.py update --agent-id "$AURA_AGENT_ID" --config patch.json
Step 9 — Delete Agent
IRREVERSIBLE. Configuration permanently removed.
Show to user and wait for explicit confirmation before running:
uv run python3 scripts/manage_agent.py delete --agent-id "$AURA_AGENT_ID"
Returns 202 Accepted.
Step 10 — Generate Evaluation Dataset
Creates an importable evaluation dataset (max 50 questions) for Aura's Agent Evaluation feature. Read references/evaluation-dataset-guide.md first — it defines format, tool_type mapping, question budget and category rules.
Export the real agent definition (never draft from a description alone — LLMs invent plausible tool calls):
uv run python3 scripts/manage_agent.py get --agent-id "$AURA_AGENT_ID" > agent.json
Ensure schema.json exists (Step 4).
List tools (name, type, parameters, descriptions) and propose the per-category plan (≤ 50 total). Categories:
Per-tool probing — per non-Text2Cypher tool: one it should nail, one edge case on a hypothesised limit, one exploiting a structural gap confirmed in its config
Semantic search — exact-match + paraphrased/conceptual (only if a similaritySearch tool exists)
Derive every expected answer by running Cypher against the database (driver with .env creds). No guessed answers. Keep Cypher + gap rationale in eval_dataset.provenance.json.
Write eval_dataset.json and validate:
uv run python3 scripts/validate_eval_dataset.py eval_dataset.json --agent agent.json
Show the user category counts and samples. Warn: questions are read-only after saving in the console and datasets have no version history, so confirm before they import (Agent → Evaluation).
Tool Configuration
CypherTemplate
Pre-defined parameterized queries for repeated, predictable lookups.
{
"type": "cypherTemplate",
"name": "<descriptive name>",
"description": "<what it looks up and when to use it>",
"enabled": true,
"config": {
"template": "MATCH (n:Label {prop: $param}) RETURN n",
"parameters": [
{
"name": "param",
"data_type": "<string|integer|number|boolean — from schema.json aura_data_type>",
"description": "<what the parameter represents. If low_cardinality=true in schema.json, append: Valid values: \"val1\", \"val2\", ...>"
}
]
}
}
Low-cardinality rule: if schema.json → node_props[Label][prop].low_cardinality is true, the description field must end with the exact values from schema.json → node_props[Label][prop].values. This applies to relationship properties in rel_props too.
SimilaritySearch
Requires a VECTOR index (state = ONLINE). Get index name from schema.json → metadata → vector_index.
{
"type": "similaritySearch",
"name": "<descriptive name>",
"description": "<what text it searches and when to use it>",
"enabled": true,
"config": {
"provider": "openai",
"model": "text-embedding-3-small",
"index": "<name from schema.json metadata.vector_index[state=ONLINE].name>",
"top_k": 5,
"dimension": "<vector.dimensions from schema.json metadata.vector_index options.indexConfig>",
"post_processing_cypher": "<optional: Cypher to enrich similarity results with related nodes>"
}
}
Natural language → Cypher. Use as fallback for aggregation and discovery.
{
"type": "text2cypher",
"name": "<descriptive name>",
"description": "<what questions it handles — and explicitly what it should NOT handle>",
"enabled": true
}
Common Errors
Error
Cause
Fix
401 Unauthorized
Token expired
Re-run Step 1
403 Forbidden on create
Not a project admin
Request admin access
400 Bad Request
Invalid tool config or missing required field
Check type spelling: cypherTemplate, similaritySearch, text2cypher
404 Not Found
Wrong org/project/agent ID
Re-run list to verify IDs
400 on create with SimilaritySearch
Vector index missing
Create index first — use neo4j-vector-index-skill
Agent returns no results
top_k too low or index empty
Increase top_k; verify index is populated
Scripts
All scripts load credentials from .env automatically. Run with uv run python3 <script>.
Script
Purpose
scripts/fetch_schema.py
Fetch graph schema from AuraDB; save to schema.json
scripts/manage_agent.py
CRUD: list, create, get, update, delete agents
scripts/invoke_agent.py
Send a natural language query to an agent
scripts/validate_eval_dataset.py
Validate an evaluation dataset JSON (optionally against agent.json)
fetch_schema.py parameters:
Parameter
Type
Required
Default
NEO4J_URI
env
Yes
—
NEO4J_USERNAME
env
No
neo4j
NEO4J_PASSWORD
env
Yes
—
NEO4J_DATABASE
env
No
neo4j
manage_agent.py parameters:
Parameter
Type
Required
Env fallback
AURA_CLIENT_ID
env
Yes
—
AURA_CLIENT_SECRET
env
Yes
—
--org-id
arg
No
AURA_ORG_ID
--project-id
arg
No
AURA_PROJECT_ID
--agent-id
arg
get/update/delete
AURA_AGENT_ID
--config
arg
create/update
—
invoke_agent.py parameters:
Parameter
Type
Required
Env fallback
AURA_CLIENT_ID
env
Yes
—
AURA_CLIENT_SECRET
env
Yes
—
--org-id
arg
No
AURA_ORG_ID
--project-id
arg
No
AURA_PROJECT_ID
--agent-id
arg
Yes
AURA_AGENT_ID
query
positional
Yes
—
--raw
flag
No
—
Checklist
AuraDB instance running, knowledge graph loaded
"Generative AI assistance" + "Aura Agent" enabled in org/project settings
Authoritative reference for the neo4j-agent-memory Python package — a graph-native memory system for AI agents built on Neo4j — and for the hosted service (NAMS) at memory.neo4jlabs.com. Use this skill whenever the user mentions neo4j-agent-memory, agent memory with Neo4j, context graphs, the POLE+O model, MemoryClient/MemorySettings, the memory MCP server, or any of the framework integrations (LangChain, PydanticAI, CrewAI, AWS Strands, Google ADK, Microsoft Agent Framework, OpenAI Agents, LlamaIndex). Also use when the user mentions the hosted service at memory.neo4jlabs.com, NAMS, the Neo4j Agent Memory Service, the `nams_` API key prefix, or the hosted MCP endpoint. Also use when writing documentation, blog posts, tutorials, PRDs, or code samples for the project, when comparing agent memory approaches, or when positioning graph-native memory against vector-only approaches — even if the user doesn't explicitly name the package.
Serverless Aura Graph Analytics (AGA) GDS Sessions — covers GdsSessions, AuraGraphDataScience, AuraAPICredentials, DbmsConnectionInfo, SessionMemory, get_or_create, remote graph projection with gds.graph.project.cypher and gds.graph.project.remote, gds.graph.project.native, gds.graph.construct, graphdatascience client 2.0 session endpoints, async compute and gds.jobs, AuraDB Cypher API memory/sessionId projection, algorithms, write-back, and session lifecycle. Use for AuraDB-connected, self-managed Neo4j, or standalone DataFrame/Spark session workloads. Does NOT cover the embedded GDS plugin on Aura Pro or self-managed Neo4j — use neo4j-gds-skill. Does NOT handle Cypher authoring — use neo4j-cypher-skill. Does NOT cover Snowflake Graph Analytics — use neo4j-snowflake-graph-analytics-skill.
Provisions and manages Neo4j Aura instances via CLI (aura-cli v1.7+) or REST API. Use when creating, pausing, resuming, resizing, or deleting AuraDB Free/Professional/Business Critical/VDC instances; downloading credentials; scripting CI/CD pipelines; polling async status; or using the Terraform neo4j-labs/neo4jaura provider. Covers auth setup (client credentials OAuth2), credential lifecycle (download once — never recoverable), instance type selection, region codes, and Python provisioning scripts. Does NOT handle Cypher queries — use neo4j-cypher-skill. Does NOT cover Graph Data Science algorithms — use neo4j-gds-skill or neo4j-aura-graph-analytics-skill. Does NOT cover neo4j-admin/cypher-shell — use neo4j-cli-tools-skill.
Use when working with Neo4j command-line tools — neo4j-cli (modern unified CLI — Cypher via Bolt, schema inspection, Aura management, Docker containers, credential management, agent skill catalog install; install with curl -sSfL https://neo4j.sh/install.sh | bash), neo4j-admin (backup, restore, import, memory sizing), cypher-shell (ad-hoc queries, scripting, CI/CD), or neo4j-mcp (quick MCP server install). Does NOT cover Cypher query authoring — use neo4j-cypher-skill. Does NOT cover driver upgrades — use neo4j-migration-skill. Does NOT cover full MCP editor configuration — use neo4j-mcp-skill.
Generates, optimizes, and validates Cypher 25 queries for Neo4j 2025.x and 2026.x. Use when writing new Cypher queries, optimizing slow queries, graph pattern matching, vector or fulltext search, subqueries, or batch writes. Covers MATCH, MERGE, CREATE, WITH, RETURN, CALL, UNWIND, FOREACH, LOAD CSV, SEARCH, expressions, functions, indexes, and subqueries. Does NOT handle driver migration or API changes — use neo4j-migration-skill. Does NOT cover DB administration or server ops — use neo4j-cli-tools-skill.
Ingests unstructured and semi-structured documents into Neo4j as a knowledge graph. Use when chunking PDFs, HTML, plain text, or Markdown; extracting entities and relationships from text with an LLM (SimpleKGPipeline, neo4j-graphrag); loading JSON via apoc.load.json; building Document→Chunk→Entity graph structures; or connecting LangChain/LlamaIndex document loaders to Neo4j. Covers neo4j-graphrag SimpleKGPipeline, LLM Graph Builder web UI, entity resolution, chunking strategies, and graph schema design for RAG pipelines. Does NOT handle structured CSV/relational import — use neo4j-import-skill. Does NOT handle GraphRAG retrieval after ingestion — use neo4j-graphrag-skill. Does NOT handle vector index creation — use neo4j-vector-search-skill.