Skip to main content
Glama
grafeo-mcp

grafeo-mcp

Official
by GrafeoDB

CI codecov PyPI License

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, MERGE and OPTIONAL MATCH run as written, with query parameters and write counters

  • Schema-first - agents discover the graph structure before querying

  • Token-aware - all tools have limit params and cut large results down to valid JSON

  • Agent-friendly errors - every failure is one Error: <tool>: ... message with a hint, flagged isError over MCP

  • Embedded - 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-mcp

grafeo-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-http

Environment Variables

Variable

Description

Default

GRAFEO_DB_PATH

Path to the database. Use a .grafeo file; it is created if it doesn't exist

In-memory

GRAFEO_READ_ONLY

1, true, yes or on disables every write (mutation tools and writing execute_gql)

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 .grafeo path. Any other path (such as graph.db) creates a WAL-directory database. grafeo 0.5.x reopens a directory database without its vector, text and property indexes, so vector_search and search_text fail 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 .grafeo file migrates it in place and keeps the old file next to it as graph.grafeo.pre-0.6 (and its WAL as graph.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

execute_gql

Run one GQL query, with parameters and write counters

Graph CRUD & Traversal

Tool

Description

create_node

Create a node with labels and properties

create_edge

Create a directed edge between two nodes

get_node

Retrieve a node by ID

update_node

Update properties on an existing node

delete_node

Delete a node (with optional detach)

update_edge

Update properties on an existing edge

delete_edge

Delete an edge by ID

get_neighbors

Explore a node's neighborhood (1-hop)

search_nodes_by_label

Find nodes by label with pagination

graph_info

Schema, stats, indexes and engine features

Batch Import

Tool

Description

batch_import

Bulk-create nodes and edges from JSON arrays

Tool

Description

create_text_index

Create a full-text search index on a property

search_text

Keyword search over indexed string properties

Tool

Description

vector_search

k-NN similarity search (HNSW)

mmr_search

Diversity-aware search (Maximal Marginal Relevance)

create_vector_index

Create HNSW index on a label + property

vector_graph_search

Hybrid: vector search + graph neighborhood expansion

Graph Algorithms

Tool

Description

pagerank

Rank nodes by importance

dijkstra

Shortest weighted path between two nodes

louvain

Community detection (Louvain modularity)

betweenness_centrality

Find bridge/bottleneck nodes

connected_components

Find disconnected subgraphs

Resources

URI

Description

graph://schema

Rich schema: labels, properties, edge types

graph://stats

Counts, memory, disk, config info

graph://nodes/{node_id}

Node details + connection summary

Prompts

Prompt

Description

explore_graph

Guided exploration of the graph structure

knowledge_extraction

Extract entities and relationships from text

graph_analysis

Structural analysis: communities, PageRank, hubs

similarity_search

Vector-powered semantic search with graph context

Which tool when?

I want to...

Use this tool

Not this

Add a single node

create_node

execute_gql, batch_import

Add a single edge

create_edge

execute_gql

Load many nodes and edges at once

batch_import

create_node in a loop

Look up a node by ID

get_node

execute_gql

Create or update a node by a key

execute_gql with MERGE and params

create_node

Update a node's properties

update_node

execute_gql

Delete a node

delete_node

execute_gql

Update an edge's properties

update_edge

execute_gql

Delete an edge

delete_edge

execute_gql

Browse nodes of a type

search_nodes_by_label

execute_gql

Explore one hop from a node

get_neighbors

execute_gql

Run a complex or multi-hop query

execute_gql

multiple get_neighbors

Search by keyword in text

search_text

execute_gql

Find similar nodes by embedding

vector_search

execute_gql

Find similar nodes + graph context

vector_graph_search

vector_search + get_neighbors

Find the most important nodes

pagerank

execute_gql

Find shortest path between two nodes

dijkstra

execute_gql

Detect communities

louvain

execute_gql

Understand the graph before querying

graph_info

search_nodes_by_label

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 params and reference them as $name, e.g. query MERGE (p:Person {name: $name}) SET p += $props RETURN id(p) with params={"name": "Ada", "props": {"born": 1815}}. A parameter the query uses but params lacks 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})) or vector([...]): grafeo 0.5.44 stores a plain list literal as a list, which vector indexes skip. create_node, batch_import and update_node store 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 check

tests/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 pytest

See 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, use uv add grafeo-memory[mcp].

License

Apache-2.0

Available Tools

23 tools
batch_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

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.6/5.0

    Scored across 23 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    Tool names consistently follow a verb_noun pattern (e.g., create_node, delete_edge, search_text). No mixing of case styles or inconsistent conventions.

    Tool Count4/5

    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.

    Completeness5/5

    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

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides 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 npm
      288
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables 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