grafeo-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@grafeo-mcp find all Person nodes with name 'Alice'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
grafeo-mcp
MCP server that exposes GrafeoDB - an embedded graph database - to AI agents via the Model Context Protocol.
One install, zero infrastructure. The MCP server is the database.
Features
23 tools - graph CRUD, GQL queries, batch import, full-text search, vector search, MMR, hybrid retrieval, PageRank, Dijkstra, Louvain and more
3 resources -
graph://schema,graph://stats,graph://nodes/{id}4 workflow prompts - guide agents through exploration, knowledge extraction, graph analysis and similarity search
GQL with Cypher-style syntax -
CREATE,MERGEandOPTIONAL MATCHrun as written, with query parameters and write countersSchema-first - agents discover the graph structure before querying
Token-aware - all tools have
limitparams and cut large results down to valid JSONAgent-friendly errors - every failure is one
Error: <tool>: ...message with a hint, flaggedisErrorover MCPEmbedded - no separate database server to manage
Related MCP server: M.I.M.I.R - Multi-agent Intelligent Memory & Insight Repository
Quickstart
# Install
uv tool install grafeo-mcp
# Or run it without installing
uvx grafeo-mcpgrafeo-mcp needs grafeo 0.5.44 or later (below 0.7); see Storage and upgrading.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"grafeo": {
"command": "grafeo-mcp",
"env": {
"GRAFEO_DB_PATH": "/path/to/your/graph.grafeo"
}
}
}
}Claude Code
Add to .mcp.json in your project root:
{
"mcpServers": {
"grafeo": {
"command": "grafeo-mcp",
"env": {
"GRAFEO_DB_PATH": "./graph.grafeo"
}
}
}
}VS Code / Copilot
Add to .vscode/mcp.json:
{
"servers": {
"grafeo": {
"command": "grafeo-mcp",
"env": {
"GRAFEO_DB_PATH": "${workspaceFolder}/graph.grafeo"
}
}
}
}HTTP transport
For remote or multi-client setups:
grafeo-mcp streamable-httpEnvironment Variables
Variable | Description | Default |
| Path to the database. Use a | In-memory |
|
| Off |
Read-only mode
With GRAFEO_READ_ONLY=1 the mutation tools stay visible but return an error, and execute_gql refuses queries with INSERT, CREATE, MERGE, SET, REMOVE, DELETE, DROP or ALTER and runs the rest in a transaction that is always rolled back. When GRAFEO_DB_PATH names an existing .grafeo file, the server also opens it with grafeo's read-only mode: the engine itself rejects writes, several read-only servers can share the file, and grafeo 0.6 reads a 0.5.x file without migrating it.
Storage and upgrading
Use a single-file
.grafeopath. Any other path (such asgraph.db) creates a WAL-directory database. grafeo 0.5.x reopens a directory database without its vector, text and property indexes, sovector_searchandsearch_textfail after a restart until the index is created again; the server logs a warning for such paths. The single file is grafeo's recommended format, and WAL-directory storage is deprecated as of grafeo 0.6.One writer at a time. A database file can be open for writing by one process. Run one grafeo-mcp server per file, or use read-only mode for extra readers.
Upgrading to grafeo 0.6. grafeo 0.6.0 writes a new file format. The first read-write open of a 0.5.x
.grafeofile migrates it in place and keeps the old file next to it asgraph.grafeo.pre-0.6(and its WAL asgraph.grafeo.pre-0.6.wal). Before the first start on 0.6, stop every 0.5.x process that uses the file and make sure there is free disk space for a copy of the database. After the migration grafeo 0.5.x can no longer open the file; to go back, see Upgrading from 0.5. A read-only server does not migrate the file. grafeo 0.7 will not read 0.5.x files, so open each database read-write with 0.6 once before moving on.Pinning. Until grafeo 1.0 a minor release may change the file format or the API, so grafeo-mcp pins the grafeo minor versions it is tested with (currently
grafeo>=0.5.44,<0.7). A weekly CI job runs the test suite against the newest grafeo in that range, pre-releases included.
Tools
Query
Tool | Description |
| Run one GQL query, with parameters and write counters |
Graph CRUD & Traversal
Tool | Description |
| Create a node with labels and properties |
| Create a directed edge between two nodes |
| Retrieve a node by ID |
| Update properties on an existing node |
| Delete a node (with optional detach) |
| Update properties on an existing edge |
| Delete an edge by ID |
| Explore a node's neighborhood (1-hop) |
| Find nodes by label with pagination |
| Schema, stats, indexes and engine features |
Batch Import
Tool | Description |
| Bulk-create nodes and edges from JSON arrays |
Full-Text Search
Tool | Description |
| Create a full-text search index on a property |
| Keyword search over indexed string properties |
Vector Search
Tool | Description |
| k-NN similarity search (HNSW) |
| Diversity-aware search (Maximal Marginal Relevance) |
| Create HNSW index on a label + property |
| Hybrid: vector search + graph neighborhood expansion |
Graph Algorithms
Tool | Description |
| Rank nodes by importance |
| Shortest weighted path between two nodes |
| Community detection (Louvain modularity) |
| Find bridge/bottleneck nodes |
| Find disconnected subgraphs |
Resources
URI | Description |
| Rich schema: labels, properties, edge types |
| Counts, memory, disk, config info |
| Node details + connection summary |
Prompts
Prompt | Description |
| Guided exploration of the graph structure |
| Extract entities and relationships from text |
| Structural analysis: communities, PageRank, hubs |
| Vector-powered semantic search with graph context |
Which tool when?
I want to... | Use this tool | Not this |
Add a single node |
|
|
Add a single edge |
|
|
Load many nodes and edges at once |
|
|
Look up a node by ID |
|
|
Create or update a node by a key |
|
|
Update a node's properties |
|
|
Delete a node |
|
|
Update an edge's properties |
|
|
Delete an edge |
|
|
Browse nodes of a type |
|
|
Explore one hop from a node |
|
|
Run a complex or multi-hop query |
| multiple |
Search by keyword in text |
|
|
Find similar nodes by embedding |
|
|
Find similar nodes + graph context |
|
|
Find the most important nodes |
|
|
Find shortest path between two nodes |
|
|
Detect communities |
|
|
Understand the graph before querying |
|
|
Batch reference syntax
The batch_import tool lets edges reference nodes created in the same batch using @N notation, where N is the zero-based index into the nodes array:
batch_import(
nodes=[
{"labels": ["Person"], "properties": {"name": "Alice"}}, # @0
{"labels": ["Person"], "properties": {"name": "Bob"}}, # @1
],
edges=[
{"source_ref": "@0", "target_ref": "@1", "edge_type": "KNOWS"},
],
)You can also mix batch references with existing node IDs: {"source_ref": "@0", "target_ref": 42, ...}.
A batch is all or nothing: it is checked completely before anything is written (labels, edge types, @N references, and that referenced node IDs exist), and if the engine rejects a node or edge partway (for example a UNIQUE constraint), everything the call created is removed again.
Queries
execute_gql passes the query text to grafeo's GQL engine unchanged. The engine also accepts common Cypher syntax such as CREATE, MERGE, OPTIONAL MATCH and DETACH DELETE, so agents trained on Cypher work out of the box.
One statement per call. Text with several statements separated by
;is refused before it runs (a trailing;is fine). Chain clauses instead (INSERT ... INSERT ...,MATCH ... INSERT ...) or send separate calls.Parameters. Pass values in
paramsand reference them as$name, e.g. queryMERGE (p:Person {name: $name}) SET p += $props RETURN id(p)withparams={"name": "Ada", "props": {"born": 1815}}. A parameter the query uses butparamslacks is reported by name.Write counters. Results of writing queries include
counters(nodes, edges, properties and labels created, deleted, set or removed).Embeddings. Store vectors through a parameter (
INSERT (:Doc {emb: $emb})) orvector([...]): grafeo 0.5.44 stores a plain list literal as a list, which vector indexes skip.create_node,batch_importandupdate_nodestore lists of floats as vectors.
Errors
Every tool returns a string. A failure is a single message of the form Error: <tool>: <what went wrong>. Hint: <what to try next>, with the engine's own message included unchanged; over MCP it is returned with isError: true. Successful results are JSON, except the confirmation sentences of delete_node, delete_edge, create_vector_index and create_text_index.
Output size
Results that would exceed about 8,000 characters are cut down to valid JSON: entries are dropped from the end of the largest lists, long strings end with ... [N chars], and the result gets truncated: true, an omitted map (path to number of entries dropped) and a note. A tool that normally returns a JSON array (vector_search, mmr_search, search_text) then returns {"results": [...], "truncated": true, ...}. Embedding properties longer than 32 values are left out of node summaries. execute_gql, search_nodes_by_label and get_neighbors are bounded by their limit instead.
Development
git clone https://github.com/GrafeoDB/grafeo-mcp
cd grafeo-mcp
uv sync
uv run pytest # Run tests
uv run ruff check . # Lint
uv run ruff format . # Format
uv run ty check # Type checktests/test_grafeo_contract.py pins every grafeo behavior the tools rely on, so a grafeo release that changes one fails with a message naming it. To try the newest grafeo release (pre-releases included):
uv sync --upgrade-package grafeo --prerelease allow
uv run --no-sync pytestSee Also
grafeo-memory includes a built-in MCP server (
grafeo-memory-mcp) that wraps the high-level memory API: extract, reconcile, search, summarize. If you need AI memory management rather than raw graph access, useuv add grafeo-memory[mcp].
License
Apache-2.0
Available Tools
23 toolsbatch_importA
Bulk-create nodes and edges from JSON arrays in a single call.
Use this tool when: you need to import many nodes and edges at once, e.g. loading a dataset, building a graph from structured data, or ingesting extracted entities in bulk. Do NOT use for: creating a single node or edge (use create_node / create_edge), or updating existing data (use update_node / update_edge).
Nodes are created first, then edges. Edges can reference nodes created in this batch using "@index" notation (e.g. "@0" refers to the first node in the nodes array).
Note: this operation is not atomic. If an error occurs partway through, already-created nodes/edges remain in the graph.
Args: nodes: List of node objects, each with: - labels: list of strings (required) - properties: dict of key-value pairs (optional) edges: List of edge objects, each with: - source_ref: int (existing node ID) or str ("@0", "@1", ...) referencing a node by its index in the nodes array - target_ref: int (existing node ID) or str ("@0", "@1", ...) - edge_type: str (required) - properties: dict of key-value pairs (optional)
Returns: JSON with created_nodes count, created_edges count, and a node_id_map from batch index to actual node ID.
Examples: batch_import( nodes=[ {"labels": ["Person"], "properties": {"name": "Alice"}}, {"labels": ["Person"], "properties": {"name": "Bob"}}, ], edges=[ {"source_ref": "@0", "target_ref": "@1", "edge_type": "KNOWS"}, ], )
Inputs: nodes (required), edges. Returns: result
betweenness_centralityA
Compute betweenness centrality for all nodes (Brandes' algorithm).
Betweenness centrality measures how often a node lies on the shortest path between other node pairs. High-betweenness nodes are "bridges" that connect different parts of the graph.
Use this tool when: you want to find bridge or bottleneck nodes. Do NOT use this for: finding the most linked-to nodes (use pagerank) or finding communities (use louvain).
Args: normalized: If True, normalize scores by 2/((n-1)(n-2)) so they fall in [0, 1] (default True). top_k: Number of top-ranked nodes to return (default 20).
Returns: JSON array of {node_id, score, labels, properties} sorted by score descending.
Error recovery: If all scores are 0 the graph may be too small or disconnected.
Inputs: normalized, top_k. Returns: result
connected_componentsA
Find connected components (treating the graph as undirected).
A connected component is a maximal set of nodes such that every pair is reachable from every other by following edges in either direction.
Use this tool when: you want to know how many disconnected subgraphs exist, or which nodes belong to the same component. Do NOT use this for: finding dense sub-communities (use louvain).
Returns: JSON object with {num_components, components} where components maps component_id -> list of node IDs.
Error recovery: If every node is its own component, the graph has no edges.
Inputs: no named parameters. Returns: result
create_edgeA
Create a directed edge (relationship) between two existing nodes.
Use this tool when: you need to connect two nodes with a typed relationship. Do NOT use this for: creating nodes (use create_node) or querying relationships (use execute_gql).
Args: source_id: The source node ID (integer). target_id: The target node ID (integer). edge_type: Relationship type string (e.g. "KNOWS", "WORKS_AT"). properties: Optional edge properties (e.g. {"since": 2020, "weight": 1.5}).
Returns: JSON with the created edge's id, source_id, target_id, edge_type, and properties.
Examples: create_edge(1, 2, "KNOWS") create_edge(1, 3, "WORKS_AT", {"since": 2020})
Inputs: source_id (required), target_id (required), edge_type (required), properties. Returns: result
create_nodeA
Create a new node in the graph with the given labels and properties.
Use this tool when: you need to add a single new entity to the graph. Do NOT use this for: bulk inserts (use execute_gql with INSERT/CREATE statements) or creating relationships (use create_edge).
Args: labels: One or more node labels (e.g. ["Person"] or ["Person", "Employee"]). properties: Optional key-value properties (e.g. {"name": "Alice", "age": 30}). Omit or pass null for a node with no properties.
Returns: JSON with the created node's id, labels, and properties.
Examples: create_node(["Person"], {"name": "Alice", "age": 30}) create_node(["Company"], {"name": "Acme", "founded": 2010}) create_node(["Tag"]) # no properties
Inputs: labels (required), properties. Returns: result
create_text_indexA
Create a full-text search index on a string property.
Call this once before using search_text on the same label + property pair. Existing nodes with the given label and property are indexed immediately; future nodes are indexed on insertion.
Use this tool when: you want to enable keyword search on a text property. Do NOT use for: vector/embedding search (use create_vector_index).
Args: label: Node label to index (e.g. "Article"). property: String property to index (e.g. "title", "content").
Returns: Confirmation string on success, or an error message.
Examples: create_text_index("Article", "title") create_text_index("Document", "content")
Inputs: label (required), property (required). Returns: result
create_vector_indexA
Create an HNSW vector index for fast similarity search.
Call this once before using vector_search on a label + property pair. If nodes with the given label already have vector values in the property, they are indexed immediately; future nodes are indexed on insertion.
Args: label: Node label to index (e.g. "Document"). property: Property containing embedding vectors (e.g. "embedding"). dimensions: Vector dimensionality (e.g. 1536 for OpenAI, 384 for MiniLM). If None the engine infers it from existing data. metric: Distance metric — "cosine" (default), "euclidean", "dot_product", or "manhattan". m: HNSW links per node (default 16 inside the engine). Higher values give better recall but use more memory. ef_construction: HNSW construction beam width (default 128 inside the engine). Higher values build a higher-quality index but take longer.
Returns: Confirmation string on success, or an error message.
Example call: create_vector_index("Document", "embedding", 1536, "cosine", m=32, ef_construction=200)
Inputs: label (required), property (required), dimensions, metric, +2 more. Returns: result
delete_edgeA
Delete an edge from the graph.
Use this tool when: you need to remove a relationship between two nodes. Do NOT use for: deleting nodes (use delete_node) or updating edge properties (use update_edge).
Args: edge_id: The ID of the edge to delete.
Returns: Confirmation message on success, or an error message.
Examples: delete_edge(5)
Inputs: edge_id (required). Returns: result
delete_nodeA
Delete a node from the graph.
Use this tool when: you need to remove a node permanently. Do NOT use for: updating properties (use update_node) or deleting edges only (use delete_edge).
Args: node_id: The ID of the node to delete. detach: If True (default), also delete all edges connected to this node (like DETACH DELETE in Cypher). If False, fail if the node has any connected edges.
Returns: Confirmation message on success, or an error message.
Examples: delete_node(42) # detach delete (remove edges too) delete_node(42, detach=False) # fail if edges exist
Inputs: node_id (required), detach. Returns: result
dijkstraA
Find the shortest weighted path between two nodes (Dijkstra's algorithm).
Returns the total distance and the sequence of nodes along the path.
Use this tool when: you need the shortest or cheapest path between two known nodes. Do NOT use this for: discovering important nodes (use pagerank) or finding similar content (use vector_search).
Args: source_id: Starting node ID. target_id: Destination node ID. weight_property: Edge property to use as weight (e.g. "distance", "cost"). If None every edge has weight 1.0.
Returns: JSON object with {distance, path: [{node_id, labels, properties}, ...]}. Returns an error message if the nodes are unreachable.
Error recovery: If the result is null/unreachable, check that both node IDs exist (use get_node) and that there is a connecting path in the graph.
Inputs: source_id (required), target_id (required), weight_property. Returns: result
execute_gqlA
Execute a GQL query against the graph database.
GQL (Graph Query Language) is the ISO/IEC standard query language. Use MATCH patterns to find nodes and relationships, INSERT to add data, and RETURN to project results.
Cypher syntax (e.g. CREATE) is automatically normalized to GQL (INSERT), so queries written in Cypher style will generally work as-is.
Use this tool when: you need to run a custom query — complex filters, multi-hop traversals, aggregations, or mutations beyond what the CRUD tools (create_node, create_edge) provide. Do NOT use this for: simple node lookups (use get_node), label browsing (use search_nodes_by_label), or one-hop exploration (use get_neighbors).
Args: query: A GQL query string (Cypher syntax is auto-normalized). limit: Maximum rows to return (default 100). Use to prevent overwhelming context windows. The query itself can also contain a LIMIT clause for server-side limiting.
Examples: MATCH (p:Person) RETURN p.name, p.age MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name INSERT (:Person {name: 'Alice', age: 30}) MATCH (p:Person) WHERE p.age > 25 RETURN p.name LIMIT 10
Inputs: query (required), limit. Returns: result
get_neighborsA
Get neighboring nodes connected to a given node.
This is the primary tool for graph traversal. Use it to explore the neighborhood of a known node. Returns connected nodes with the edges that link them.
Use this tool when: you have a node ID and want to see what it connects to. Do NOT use this for: finding nodes by property (use search_nodes_by_label) or running complex multi-hop queries (use execute_gql).
Args: node_id: The ID of the node to get neighbors for. direction: "outgoing" (node-->neighbor), "incoming" (neighbor-->node), or "both" (default). Controls which direction of edges to follow. edge_type: Filter by relationship type (e.g. "KNOWS"). None returns all edge types. limit: Maximum neighbors to return (default 50).
Returns: JSON with the center node, a list of neighbors (with connecting edge info), and counts.
Examples: get_neighbors(0) get_neighbors(42, direction="outgoing") get_neighbors(1, edge_type="KNOWS", limit=10) get_neighbors(5, direction="incoming", edge_type="WORKS_AT")
Inputs: node_id (required), direction, edge_type, limit. Returns: result
get_nodeA
Get a single node by its ID.
Returns the node's labels and all properties, or a not-found message.
Use this tool when: you have a specific node ID and need its details. Do NOT use this for: searching nodes by label or property (use search_nodes_by_label or execute_gql).
Args: node_id: The numeric node ID (e.g. 0, 1, 42).
Returns: JSON with id, labels, and properties -- or an error/not-found message.
Examples: get_node(0) get_node(42)
Inputs: node_id (required). Returns: result
graph_infoA
Get an overview of the graph database: counts, labels, edge types, and schema.
Use this tool when: you need to understand what data is in the graph before writing queries, or to verify the database state after mutations. Do NOT use this for: retrieving specific node/edge data (use get_node, search_nodes_by_label, or execute_gql).
Returns: JSON with database info (mode, node_count, edge_count, persistence), schema (labels with counts, edge_types with counts, property_keys), and detailed statistics.
Inputs: no named parameters. Returns: result
louvainA
Detect communities using the Louvain modularity-optimization algorithm.
Groups densely-connected nodes into communities. Higher resolution values produce more (smaller) communities; lower values produce fewer (larger) communities.
Use this tool when: you want to discover clusters or groups in the graph. Do NOT use this for: finding paths (use dijkstra) or ranking nodes (use pagerank).
Args: resolution: Resolution parameter (default 1.0). Values > 1 favor smaller communities, values < 1 favor larger ones.
Returns: JSON object with {modularity, num_communities, communities} where communities maps community_id -> list of node summaries. Output is truncated if it exceeds the token budget.
Error recovery: If this returns 0 communities, the graph may have no edges. Check with graph_info.
Inputs: resolution. Returns: result
mmr_searchA
Find diverse nearest neighbors using Maximal Marginal Relevance (MMR).
MMR balances relevance to the query with diversity among results, avoiding redundant near-duplicate results. This is ideal for RAG pipelines where you want broad coverage rather than 10 variations of the same paragraph.
Use this tool when: you need diverse vector search results for RAG or when vector_search returns too many near-duplicates. Use vector_search when: you want the absolute closest matches regardless of diversity.
Args: label: Node label to search within (e.g. "Document"). property: Property that holds the embedding vector (e.g. "embedding"). query_vector: The query embedding as a list of floats. k: Number of diverse results to return (default 10). fetch_k: Initial candidates from HNSW before MMR re-ranking (default: 4*k). Higher values give MMR more to choose from. lambda_mult: Balance between relevance and diversity. 0.0 = maximize diversity, 1.0 = maximize relevance. Default: 0.5 (balanced). For RAG, try 0.3-0.7. ef: HNSW search beam width. Leave as None for index default.
Returns: JSON array of {node_id, distance, labels, properties} ordered by MMR selection (not pure distance).
Example call: mmr_search("Document", "embedding", [0.12, -0.34, ...], k=5, lambda_mult=0.3)
Inputs: label (required), property (required), query_vector (required), k, +3 more. Returns: result
pagerankA
Run PageRank and return the top-k most important nodes.
PageRank assigns every node a score proportional to how many (and how important) other nodes link to it. Higher scores mean more connected / influential nodes.
Use this tool when: you want to find the most important or central nodes in the graph based on link structure. Do NOT use this for: finding similar nodes by content (use vector_search) or for finding shortest paths (use dijkstra).
Args: damping: Probability of following a link vs. teleporting (default 0.85). max_iterations: Upper bound on convergence iterations (default 100). tolerance: Convergence threshold (default 1e-6). top_k: How many top-ranked nodes to return (default 20). The algorithm always scores every node, but only the top-k are returned to keep the output manageable.
Returns: JSON array of {node_id, score, labels, properties} sorted by score descending. Output is truncated if it exceeds the token budget.
Error recovery: If this returns an error, verify the graph is non-empty with graph_info. PageRank requires at least one edge.
Inputs: damping, max_iterations, tolerance, top_k. Returns: result
search_nodes_by_labelA
Find nodes that have a specific label.
Returns node IDs and their properties, paginated by limit/offset.
Use this tool when: you want to list or browse nodes of a certain type (e.g. all Person nodes, all Company nodes). Do NOT use this for: getting a single node by ID (use get_node), or complex filtered queries (use execute_gql).
Args: label: The label to filter by (e.g. "Person", "Company"). limit: Maximum number of results to return (default 100). offset: Number of results to skip for pagination (default 0).
Returns: JSON with a list of {node_id, properties} objects, total count, and a truncation note if applicable.
Examples: search_nodes_by_label("Person") search_nodes_by_label("Company", limit=10) search_nodes_by_label("Person", limit=50, offset=50) # page 2
Inputs: label (required), limit, offset. Returns: result
search_textA
Full-text keyword search over string properties.
Finds nodes whose text property matches the search query. Requires a text index created via create_text_index on the same label + property.
Use this tool when: you want to search for nodes by keyword or phrase. Do NOT use for: semantic/vector similarity (use vector_search), exact property matching (use execute_gql with WHERE), or browsing by label (use search_nodes_by_label).
Args: label: Node label to search within (e.g. "Article"). property: String property to search (e.g. "title"). query: Search query string (keywords or phrase). limit: Maximum number of results to return (default 20).
Returns: JSON array of {node_id, score, labels, properties} sorted by relevance score descending.
Examples: search_text("Article", "title", "graph database") search_text("Document", "content", "machine learning", limit=10)
Inputs: label (required), property (required), query (required), limit. Returns: result
update_edgeA
Update properties on an existing edge.
Use this tool when: you need to modify an edge's properties after creation. Do NOT use for: changing the edge type (delete and recreate), creating new edges (use create_edge), or deleting edges (use delete_edge).
Args: edge_id: The ID of the edge to update. properties: Key-value properties to set. merge: If True (default), merge with existing properties. If False, replace all properties.
Returns: JSON with the updated edge's id, source_id, target_id, edge_type, and properties.
Examples: update_edge(0, {"weight": 2.5}) update_edge(0, {"since": 2024}, merge=False)
Inputs: edge_id (required), properties (required), merge. Returns: result
update_nodeA
Update properties on an existing node.
Use this tool when: you need to modify a node's properties after creation. Do NOT use for: changing labels (use execute_gql), creating new nodes (use create_node), or deleting nodes (use delete_node).
Args: node_id: The ID of the node to update. properties: Key-value properties to set. Values can be strings, numbers, booleans, or lists. merge: If True (default), merge with existing properties (new keys are added, existing keys are overwritten, unlisted keys are kept). If False, replace all properties (unlisted keys are removed).
Returns: JSON with the updated node's id, labels, and properties.
Examples: update_node(0, {"age": 31}) # merge: keep other props update_node(0, {"name": "Alice"}, merge=False) # replace all props
Inputs: node_id (required), properties (required), merge. Returns: result
vector_graph_searchA
Hybrid search: find similar nodes by vector, then expand their graph neighborhood.
This is the most powerful search tool — it combines semantic similarity (vector search) with graph structure (neighbor expansion). Use it when you want to find relevant nodes AND understand their context.
Step 1: Vector search finds the top-k most similar nodes. Step 2: For each result, expands outward by expand_depth hops.
Use this tool when: you need both semantic relevance AND graph context. Use vector_search when: you only need the similar nodes themselves. Use get_neighbors when: you already have a node and want to explore around it.
Args: label: Node label to search (must have a vector index). property: Property holding the embedding vector. query_vector: The query embedding as a list of floats. k: Number of nearest seed nodes to return (default 5). expand_depth: How many hops to expand from each seed (default 1). Use 0 to skip expansion (equivalent to plain vector_search). expand_edge_type: Optional edge type filter. If provided, only edges of this type are followed during expansion.
Returns: JSON object with "seeds" (vector results) and "neighbors" (expanded context), truncated if the output is large.
Example call: vector_graph_search("Article", "embedding", [0.1, ...], k=3, expand_depth=2, expand_edge_type="CITES")
Inputs: label (required), property (required), query_vector (required), k, +2 more. Returns: result
vector_searchA
Find the k nearest nodes by vector similarity (HNSW index).
Use this tool when you have an embedding vector and want to find semantically similar nodes. Requires a vector index created via create_vector_index on the same label + property.
Do NOT use this for keyword or property search — use search_nodes_by_label or execute_gql for that.
Args: label: Node label to search within (e.g. "Document"). property: Property that holds the embedding vector (e.g. "embedding"). query_vector: The query embedding as a list of floats. k: Number of nearest neighbors to return (default 10). ef: HNSW search beam width. Higher values improve recall at the cost of speed. Leave as None to use the index default.
Returns: JSON array of {node_id, distance, labels, properties} sorted by distance ascending (most similar first).
Example call: vector_search("Document", "embedding", [0.12, -0.34, ...], k=5)
Inputs: label (required), property (required), query_vector (required), k, +1 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 23 tools
Each tool has a clearly distinct purpose, from CRUD operations to various search methods and graph algorithms. Descriptions explicitly state when to use each and when not to, eliminating ambiguity.
Tool names consistently follow a verb_noun pattern (e.g., create_node, delete_edge, search_text). No mixing of case styles or inconsistent conventions.
23 tools is comprehensive for a graph database server, covering CRUD, indexing, search, analytics, and import. Slightly on the higher side but well-scoped for the domain.
The tool set covers the full lifecycle: CRUD for nodes and edges, multiple index types, diverse search methods, graph algorithms, batch import, and custom GQL queries. No obvious gaps.
Maintenance
Related MCP Connectors
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Persistent knowledge graph for AI agents. Remember, recall, and forget facts.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Shared long-term memory for AI agents: save and recall context as a searchable knowledge graph.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceAllows AI models to query and interact with FalkorDB graph databases through the Model Context Protocol (MCP) specification.159 npm42MIT- AlicenseNot gradedqualityDmaintenanceProvides AI assistants with persistent graph database memory using Neo4j, enabling task management, relationship understanding, semantic search with embeddings, file indexing, and multi-agent coordination through the Model Context Protocol.21 npm288MIT
- AlicenseAqualityDmaintenanceA self-contained, in-memory graph database for AI Agents. Provides semantic code understanding through the Model Context Protocol (MCP).62MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with TigerGraph databases through the Model Context Protocol, supporting graph operations, schema queries, and GSQL execution via natural language.Apache 2.0