ArcadeDB ships a Model Context Protocol server inside the database. Point Claude Desktop, Claude Code, Cursor or your own agent at it, and the agent can read your schema, query in five languages, run vector, full-text and graph hybrid search, and write long-term memory without duplicating it. Nothing extra to deploy, and every write is off until you turn it on.
An agent that only has a vector store can find passages that look like the question. It cannot tell that a fact was superseded, that two names are one person, or which project a preference belongs to. Those are relationships, and they are what a graph stores. ArcadeDB keeps the graph, the documents, the vectors and the full-text index in one engine, so one MCP connection gives an agent all of them, against one consistent copy of the data.
That combination is the core of GraphRAG: retrieve by similarity, then follow edges to the context similarity alone would miss. If you are building the graph itself from documents, the knowledge graphs page covers modelling and extraction. This page is the practical part: how to switch the MCP server on, what it exposes, and how to wire it into your client.
The MCP server is the mcp module of the ArcadeDB repository. The standard distribution and the Docker image include it and register it automatically, so there is no plugin to add. It is disabled by default. Once enabled, it answers JSON-RPC 2.0 over HTTP at POST /api/v1/mcp (MCP specification 2025-03-26) and authenticates every request with your ArcadeDB credentials, Basic auth or a Bearer API token.
docker run --rm -p 2480:2480 \
-e JAVA_OPTS="-Darcadedb.server.rootPassword=playwithdata" \
arcadedata/arcadedb:26.10.1
curl -X POST -u root:playwithdata \
-H "Content-Type: application/json" \
-d '{"enabled": true, "allowReads": true, "allowedUsers": ["root"]}' \
http://localhost:2480/api/v1/mcp/config
curl -X POST -u root:playwithdata \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
http://localhost:2480/api/v1/mcp
You can do the same from Studio: open the Server panel, then the MCP tab, where you can enable the server, choose an API token, set permissions and copy a ready-made client configuration. For a file-based setup, edit config/mcp-config.json in the server directory.
Each operation type has its own flag. The server decides which flag applies by parsing the statement, not by matching keywords, so a cleverly worded query cannot slip a write past a read-only setting.
| Setting | Default | Controls |
|---|---|---|
enabled | false | Master switch for the HTTP endpoint |
allowReads | true | SELECT, MATCH and other reads, plus schema resources |
allowInsert / allowUpdate / allowDelete | false | Data writes. The upsert tools need both insert and update. |
allowSchemaChange | false | CREATE TYPE, CREATE PROPERTY, CREATE INDEX and other DDL |
allowAdmin | false | Administrative operations, the profiler, changing server settings |
allowedUsers | ["root"] | Users or API tokens allowed to use MCP ("*" for all) |
profile | "all" | Tool profile: all, rag or admin |
principalProfiles | {} | A narrower profile per user or API token |
databases | {} | Per-database restrictions that can deny, never grant |
For a retrieval agent, the rag profile hides everything except schema, query, search and the two upsert tools. Profiles only filter the tool list; the permission flags still apply on top.
As of ArcadeDB 26.10.1 the server registers the tools below. Call tools/list for the authoritative list and input schemas of the version you run.
| Tool | What it does | Profile |
|---|---|---|
list_databases | Databases the authenticated user can access | all, rag, admin |
get_schema | Types, properties, indexes and inheritance of a database | all, rag, admin |
query | Read-only query in SQL, Cypher, Gremlin, GraphQL or MongoDB syntax; writes are rejected | all, rag, admin |
sample_records | The first few records per type, so the agent sees real property shapes | all, rag |
vector_search | Nearest neighbours on a dense or sparse vector index, with an optional SQL filter | all, rag |
full_text_search | BM25-ranked full-text search with boolean, phrase, prefix and fuzzy syntax | all, rag |
hybrid_search | Fuses vector, full-text and graph-expansion results into one ranking | all, rag |
upsert_entity | Create or update one vertex by match keys, without duplicates | all, rag |
upsert_relationship | Create or update one edge between two matched vertices | all, rag |
execute_command | Writes, schema changes and admin commands, checked against the permission flags | all, admin |
server_status | Version, query languages, databases, and HA status for admins | all, admin |
profiler_start / profiler_stop / profiler_status | Record queries with timings and plans for a bounded window | all, admin |
get_server_settings / set_server_setting | Read and change server settings at runtime; secrets are masked | all, admin |
Resources. Each database publishes its schema as arcadedb://{database}/schema, so a client that reads resources gets the schema at session start without spending a tool call.
Prompts. Two guided templates: graphrag_query answers a question with the retrieval tools and cites the @rid of every record it used, and build_knowledge_graph extracts entities and relationships from text and writes them with the upsert tools. A prompt is only offered when the caller's profile and permissions allow every tool it names.
Every client needs the endpoint URL and an Authorization header. Use a Bearer API token created in Studio (Security panel, Add API Token), or Basic auth, which is Basic followed by the base64 of user:password. The examples use Basic auth for root:playwithdata; replace it with your own value, and prefer a token scoped to the databases the agent needs.
Claude Desktop launches local servers as processes, so it reaches the HTTP endpoint through the mcp-remote bridge (needs Node.js for npx). Add this to claude_desktop_config.json:
{
"mcpServers": {
"arcadedb": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:2480/api/v1/mcp",
"--header",
"Authorization: Basic cm9vdDpwbGF5d2l0aGRhdGE="
]
}
}
}
Claude Code speaks Streamable HTTP directly. Add the server from the command line:
claude mcp add --transport http arcadedb http://localhost:2480/api/v1/mcp \
--header "Authorization: Basic cm9vdDpwbGF5d2l0aGRhdGE="
or commit it to a project's .mcp.json:
{
"mcpServers": {
"arcadedb": {
"type": "http",
"url": "http://localhost:2480/api/v1/mcp",
"headers": {
"Authorization": "Basic cm9vdDpwbGF5d2l0aGRhdGE="
}
}
}
}
Put a remote server entry in .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"arcadedb": {
"url": "http://localhost:2480/api/v1/mcp",
"headers": {
"Authorization": "Basic cm9vdDpwbGF5d2l0aGRhdGE="
}
}
}
}
If you run ArcadeDB from the distribution rather than Docker, bin/mcp-stdio.sh starts a server and speaks MCP over standard input and output. It always authenticates as root, so the root password is required, and it ignores the enabled flag while every other setting in mcp-config.json still applies.
{
"mcpServers": {
"arcadedb": {
"command": "/opt/arcadedb/bin/mcp-stdio.sh",
"env": {
"ARCADEDB_SETTINGS": "-Darcadedb.server.rootPassword=playwithdata"
}
}
}
}
Prefer to run Google's MCP server in front of several databases? ArcadeDB is also a source in MCP Toolbox for Databases.
The graph-rag demo in the arcadedb-usecases repository builds a small GraphRAG dataset (text chunks with embeddings, the people, concepts and organizations they mention, and the edges between them) and runs five retrieval patterns: hybrid vector plus graph, multi-hop entity bridging, latest chunk per document, composite scoring, and an agentic multi-step flow. You need Docker, curl and jq.
git clone https://github.com/ArcadeData/arcadedb-usecases.git && cd arcadedb-usecases/graph-rag && docker compose up -d && ./setup.sh && ./queries/queries.sh
No API keys needed, and no LLM in the loop. The sample data uses 4-dimensional toy embeddings so it runs anywhere, and the optional Java LangChain4j examples run the AllMiniLmL6V2 embedding model in-process. The demo shows retrieval; producing a written answer is the job of the LLM you connect. The Compose file pins its own ArcadeDB version and uses port 2480, so stop any other local ArcadeDB first.
The demo's root password is arcadedb. Enable MCP on it and register it with Claude Code:
curl -X POST -u root:arcadedb -H "Content-Type: application/json" \
-d '{"enabled": true, "allowReads": true}' \
http://localhost:2480/api/v1/mcp/config
claude mcp add --transport http arcadedb-graphrag http://localhost:2480/api/v1/mcp \
--header "Authorization: Basic cm9vdDphcmNhZGVkYg=="
Now ask something like "In the GraphRAG database, which documents are connected to Vector Search through shared entities?". The agent reads the schema, writes the Cypher traversal and cites the records. Because the sample vectors are only 4-dimensional, the agent will lean on query rather than vector_search here; with your own data and a real embedding model, all the retrieval tools apply.
Agents need two kinds of durable memory: episodic (what happened, turn by turn) and semantic (facts learned about people, projects and systems, which change over time). Both are naturally a graph: episodes mention entities, facts are about entities, and a newer fact supersedes an older one instead of overwriting it.
Through MCP, an agent can write that memory itself. upsert_entity matches a vertex by key properties and updates it or creates it; upsert_relationship does the same for an edge between two matched vertices. Repeating the same extraction resolves to the same records instead of piling up duplicates. Two things make it reliable:
UNIQUE index on the match-key properties. Without it each match is a type scan, and two concurrent upserts can still create the same vertex twice.allowInsert and allowUpdate, ideally only for the memory database, using the per-database overrides.{"name": "upsert_relationship", "arguments": {
"database": "memory",
"fromType": "Person", "fromMatchKeys": {"email": "[email protected]"},
"toType": "Project", "toMatchKeys": {"code": "ANALYTICAL-ENGINE"},
"relType": "WORKS_ON", "relProperties": {"since": 1843}
}}
The build_knowledge_graph prompt packages this workflow: it reads the existing schema, picks stable match keys, and calls the upsert tools once per entity and relationship.
The upstream hybrid adapter uses ArcadeDB as Cognee's graph store and vector store at once.
A community Claude Code plugin that keeps sessions, decisions with validity windows, and a code graph in ArcadeDB.
Graph stores for agents built on those frameworks, over Bolt and HTTP respectively.
For a single-process agent, the same graph and vector memory can also run in-process with the embedded Python package, with no server at all.
hybrid_search runs up to three retrieval legs and fuses them into one ranked list:
LSM_VECTOR (dense) or LSM_SPARSE_VECTOR index. Required.Fusion defaults to Reciprocal Rank Fusion (RRF); DBSF and LINEAR are available for vector plus full-text. Each result lists the legs that produced it in sources, and expanded results carry their depth and path back to the seed, so the agent can explain why a record is there. ArcadeDB does not compute embeddings: the caller passes queryVector from its own model, with the index's dimensions.
{"name": "hybrid_search", "arguments": {
"database": "research",
"vectorIndexName": "Paper[embedding]",
"queryVector": [0.12, -0.08, 0.31],
"fulltextIndexName": "Paper[abstract]",
"fulltextQuery": "graph retrieval",
"expand": {"edgeTypes": ["CITES"], "direction": "out", "maxDepth": 2},
"fusionStrategy": "RRF",
"k": 10
}}
The same building blocks are available in SQL for application code, through the vector functions and graph traversal described in the vector search docs.
ArcadeDB is Apache 2.0 and free in production. Start it, enable MCP, and connect your client in a few minutes.
Yes. The MCP server is built into ArcadeDB and included in the standard distribution and the Docker image. It is disabled by default; enable it from Studio, through POST /api/v1/mcp/config, or in config/mcp-config.json. Clients connect to http://<host>:2480/api/v1/mcp, or launch bin/mcp-stdio.sh for the stdio transport.
list_databases, get_schema, query, execute_command, sample_records, vector_search, full_text_search, hybrid_search, upsert_entity, upsert_relationship, server_status, profiler_start, profiler_stop, profiler_status, get_server_settings and set_server_setting. It also publishes each database schema as a resource and offers two guided prompts, graphrag_query and build_knowledge_graph. Tool profiles (all, rag, admin) narrow what a client sees.
Only if you allow it. Insert, update, delete, schema change and admin permissions all default to false, and the server classifies each statement by parsing it, not by matching keywords. You can also restrict permissions and users per database and give individual users or API tokens a narrower tool profile.
No. vector_search and hybrid_search take a query vector that the caller computes with its own embedding model. The vector must have the same number of dimensions as the index.
No. The graph-rag demo in the arcadedb-usecases repository runs with Docker, curl and jq only. Its sample data uses small 4-dimensional embeddings, and the optional LangChain4j examples run the AllMiniLmL6V2 embedding model in-process. The demo covers retrieval; generating an answer with an LLM is up to the client you connect, for example Claude through MCP.
Use the upsert_entity and upsert_relationship tools. They match a vertex or edge by key properties and either update it or create it, so repeated extraction resolves to the same records. Create a UNIQUE index on the match-key properties, and enable both allowInsert and allowUpdate, which the tools require.