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, or invoking agents with natural language queries. 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.
74
92%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
neo4j-aura-provisioning-skillneo4j-vector-index-skillneo4j-cypher-skillneo4j-aura-graph-analytics-skillGraphRAG agents on top of AuraDB — answer natural language questions via three tool types:
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.
AURA_CLIENT_ID and AURA_CLIENT_SECRET from console.neo4j.io → Account Settings → API CredentialsAURA_ORG_ID, AURA_PROJECT_ID — see Step 2; AURA_INSTANCE_ID — resolved interactively in Step 2 if not already setuv sync in skill directory (or pip install neo4j neo4j-graphrag requests python-dotenv).env and schema.json in .gitignoreManual credential verification only — scripts call get_token() internally.
TOKEN=$(curl -s --request POST 'https://api.neo4j.io/oauth/token' \
--user "${AURA_CLIENT_ID}:${AURA_CLIENT_SECRET}" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
| jq -r '.access_token')
echo "Token: ${TOKEN:0:20}..."If blank token: verify AURA_CLIENT_ID/AURA_CLIENT_SECRET in .env. Stop and report.
Token TTL: 3600 s. Re-run on 401/403.
From console URL (fastest): open console.neo4j.io → navigate to a project. URL pattern:
/organizations/{AURA_ORG_ID}/projects/{AURA_PROJECT_ID}
Programmatic fallback:
curl -s https://api.neo4j.io/v1/tenants \
-H "Authorization: Bearer $TOKEN" | jq '.data[] | {id, name}'
# tenant id maps to AURA_PROJECT_IDSet in .env:
AURA_ORG_ID=<organization-id>
AURA_PROJECT_ID=<project-id>Check AURA_INSTANCE_ID — if it is already set in .env, skip the rest of this step.
If not set, list available instances and ask the user to choose:
curl -s "https://api.neo4j.io/v1/instances?tenantId=${AURA_PROJECT_ID}" \
-H "Authorization: Bearer $TOKEN" \
| jq '.data[] | {id, name, status, region, type}'Show output to user. Ask: "Which instance should the agent connect to?" Then write to .env:
AURA_INSTANCE_ID=<chosen-instance-id>
NEO4J_URI=neo4j+s://<chosen-instance-id>.databases.neo4j.ioIf 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.
uv run python3 scripts/manage_agent.py list # Linux/macOS
uv run python scripts\manage_agent.py list # WindowsOutput: agent IDs, names, enabled status, endpoint URLs.
If 401: re-run Step 1. If 404: verify AURA_ORG_ID/AURA_PROJECT_ID. Stop and report.
Requires NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD in .env.
uv run python3 scripts/fetch_schema.py # Linux/macOS
uv run python scripts\fetch_schema.py # WindowsSaves schema.json. Output: node/rel-type counts, node labels + typed properties (with Aura data_type), relationship patterns, VECTOR indexes.
Data gate — script exits with error and does NOT write schema.json if:
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.
Read schema.json before Step 5.
Before designing tools, read references/authoring-guide.md.
Ask the user these questions. Do NOT guess tool types or parameters.
schema.json → node_propsschema.json → metadata → vector_index
neo4j-vector-index-skill firstreferences/REFERENCE.md → Embedding Provider Options. Do NOT guess or default.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 MUST 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 must include valid values when low cardinality.
SimilaritySearch configuration — ask the user for all three before drafting the tool config:
| Field | What to ask | Source |
|---|---|---|
provider | "openai" or "vertexai"? | User confirms |
model | Which model? | 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.
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:
uv run python3 scripts/manage_agent.py create --config agent-config.jsonResponse includes id (save as AURA_AGENT_ID), endpoint_link, mcp_endpoint_link.
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?"}'Create patch JSON with only the fields to change:
{ "system_prompt": "Updated instructions.", "is_mcp_enabled": true }Show to user and confirm before running:
uv run python3 scripts/manage_agent.py update --agent-id "$AURA_AGENT_ID" --config patch.jsonIRREVERSIBLE. 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.
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.
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>"
}
}provider/model combinations: see references/REFERENCE.md.
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
}| 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 |
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 |
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 | — |
running, knowledge graph loaded.env populated: AURA_CLIENT_ID, AURA_CLIENT_SECRET, AURA_ORG_ID, AURA_PROJECT_ID, AURA_INSTANCE_ID, NEO4J_URI, NEO4J_PASSWORD.env and schema.json in .gitignorelist (Step 3)schema.json fetched and reviewed (Step 4) — data gate passed (≥2 nodes, ≥1 rel type)data_type taken from schema.json aura_data_typeindex from schema.json metadata.vector_index (state=ONLINE)name, description, dbid, is_private, tools (min 1)AURA_AGENT_ID saved from create response66ed0e1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.