Skip to main content
Glama

cognee‑mcp - Run cognee’s memory engine as a Model Context Protocol server

GitHub forks GitHub stars GitHub commits Github tag Downloads License Contributors

Build memory for Agents and query from any client that speaks MCP – in your terminal or IDE.

✨ Features

  • Multiple transports – choose Streamable HTTP --transport http (recommended for web deployments), SSE --transport sse (real‑time streaming), or stdio (classic pipe, default)

  • Cloud Mode – connect to Cognee Cloud via --serve-url or COGNEE_SERVICE_URL env var (see Connection Modes)

  • API Mode – connect to an already running Cognee FastAPI server (see Connection Modes)

  • Minimal Memory API – exposes only remember, recall, and forget for agent memory workflows

  • Integrated logging – all actions written to a rotating file (see get_log_file_location()) and mirrored to console in dev

  • Session-aware memory – store fast session cache entries or permanent graph memory through one remember tool

  • Focused recall – query memory through one recall tool with optional session and search controls

  • Simple deletion – remove a dataset or all owned memory through one forget tool

Please refer to our documentation here for further information.

Related MCP server: remembrallmcp

🚀 Quick Start

  1. Clone cognee repo

    git clone https://github.com/topoteretes/cognee.git
  2. Navigate to cognee-mcp subdirectory

    cd cognee/cognee-mcp
  3. Install uv if you don't have one

    pip install uv
  4. Install all the dependencies you need for cognee mcp server with uv

    uv sync --dev --all-extras --reinstall
  5. Activate the virtual environment in cognee mcp directory

    source .venv/bin/activate
  6. Set up your OpenAI API key in .env for a quick setup with the default cognee configurations

    LLM_API_KEY="YOUR_OPENAI_API_KEY"
  7. Run cognee mcp server with stdio (default)

    python src/server.py

    or stream responses over SSE

    python src/server.py --transport sse

    or run with Streamable HTTP transport (recommended for web deployments)

    python src/server.py --transport http --host 127.0.0.1 --port 8000 --path /mcp

You can do more advanced configurations by creating .env file using our template. To use different LLM providers / database configurations, and for more info check out our documentation.

No API key? If your MCP host grants the sampling capability, LLM_PROVIDER="mcp-sampling" delegates completions to the host's own model, so no LLM_API_KEY is needed (embeddings still need a provider). Host support varies — as of early 2026 Claude Code does not yet grant sampling (anthropics/claude-code#1785). See the "MCP sampling" section of the .env template.

🐳 Docker Usage

If you'd rather run cognee-mcp in a container, you have two options:

  1. Build locally

    1. Make sure you are in /cognee root directory and have a fresh .env containing only your LLM_API_KEY (and your chosen settings).

    2. Remove any old image and rebuild:

      docker rmi cognee/cognee-mcp:main || true
      docker build --no-cache -f cognee-mcp/Dockerfile -t cognee/cognee-mcp:main .
    3. Run it:

      # For HTTP transport (recommended for web deployments)
      docker run -e TRANSPORT_MODE=http --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main
      # For SSE transport
      docker run -e TRANSPORT_MODE=sse --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main
      # For stdio transport (default)
      docker run -e TRANSPORT_MODE=stdio --env-file ./.env --rm -it cognee/cognee-mcp:main

      Installing optional dependencies at runtime:

      You can install optional dependencies when running the container by setting the EXTRAS environment variable:

      # Install a single optional dependency group at runtime
      docker run \
        -e TRANSPORT_MODE=http \
        -e EXTRAS=aws \
        --env-file ./.env \
        -p 8000:8000 \
        --rm -it cognee/cognee-mcp:main
      
      # Install multiple optional dependency groups at runtime (comma-separated)
      docker run \
        -e TRANSPORT_MODE=sse \
        -e EXTRAS=aws,postgres,neo4j \
        --env-file ./.env \
        -p 8000:8000 \
        --rm -it cognee/cognee-mcp:main

      Available optional dependency groups:

      • aws - S3 storage support

      • postgres / postgres-binary - PostgreSQL database support

      • neo4j - Neo4j graph database support

      • neptune - AWS Neptune support

      • turso - Turso vector/graph store support

      • scraping - Web scraping capabilities

      • langchain - LangChain integration

      • llama-index - LlamaIndex integration

      • anthropic - Anthropic models

      • groq - Groq models

      • mistral - Mistral models

      • ollama / huggingface - Local model support

      • docs - Document processing

      • tracing - OpenTelemetry tracing

      • redis - Redis support

      • And more (see pyproject.toml for full list)

  2. Pull from Docker Hub (no build required):

    The image is published to Docker Hub on every push to main. If you have not cloned the repo, create the .env file the run commands expect first — it needs at least your LLM key:

    # Pull the prebuilt image
    docker pull cognee/cognee-mcp:main
    
    # Create a minimal .env in the current directory (no repo checkout required)
    echo 'LLM_API_KEY="YOUR_OPENAI_API_KEY"' > .env
    # With HTTP transport (recommended for web deployments)
    docker run -e TRANSPORT_MODE=http --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main
    # With SSE transport
    docker run -e TRANSPORT_MODE=sse --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main
    # With stdio transport (default)
    docker run -e TRANSPORT_MODE=stdio --env-file ./.env --rm -it cognee/cognee-mcp:main

    With runtime installation of optional dependencies:

    # Install optional dependencies from Docker Hub image
    docker run \
      -e TRANSPORT_MODE=http \
      -e EXTRAS=aws,postgres \
      --env-file ./.env \
      -p 8000:8000 \
      --rm -it cognee/cognee-mcp:main

Important: Docker vs Direct Usage

Docker uses environment variables, not command line arguments:

  • ✅ Docker: -e TRANSPORT_MODE=http

  • ❌ Docker: --transport http (won't work)

Direct Python usage uses command line arguments:

  • ✅ Direct: python src/server.py --transport http

  • ❌ Direct: -e TRANSPORT_MODE=http (won't work)

Docker API Mode

To connect the MCP Docker container to a Cognee API server running on your host machine:

Simple Usage (Automatic localhost handling):

# Start your Cognee API server on the host
python -m cognee.api.client

# Run MCP container in API mode - localhost is automatically converted!
docker run \
  -e TRANSPORT_MODE=sse \
  -e API_URL=http://localhost:8000 \
  -e API_TOKEN=your_auth_token \
  -p 8001:8000 \
  --rm -it cognee/cognee-mcp:main

Note: The container will automatically convert localhost to host.docker.internal on Mac/Windows/Docker Desktop. You'll see a message in the logs showing the conversion.

Explicit host.docker.internal (Mac/Windows):

# Or explicitly use host.docker.internal
docker run \
  -e TRANSPORT_MODE=sse \
  -e API_URL=http://host.docker.internal:8000 \
  -e API_TOKEN=your_auth_token \
  -p 8001:8000 \
  --rm -it cognee/cognee-mcp:main

On Linux (use host network or container IP):

# Option 1: Use host network (simplest)
docker run \
  --network host \
  -e TRANSPORT_MODE=sse \
  -e API_URL=http://localhost:8000 \
  -e API_TOKEN=your_auth_token \
  --rm -it cognee/cognee-mcp:main

# Option 2: Use host IP address
# First, get your host IP: ip addr show docker0
docker run \
  -e TRANSPORT_MODE=sse \
  -e API_URL=http://172.17.0.1:8000 \
  -e API_TOKEN=your_auth_token \
  -p 8001:8000 \
  --rm -it cognee/cognee-mcp:main

Environment variables for API mode:

  • API_URL: URL of the running Cognee API server

  • API_TOKEN: Authentication token (optional, required if API has authentication enabled)

Note: When running in API mode:

  • Database migrations are automatically skipped (API server handles its own DB)

  • Some features are limited (see API Mode Limitations)

🔗 MCP Client Configuration

After starting your Cognee MCP server with Docker, you need to configure your MCP client to connect to it.

⚠️ Host/Origin protection (why you might get HTTP 421 or 403)

Both the http and sse transports validate the Host and Origin headers to block DNS-rebinding attacks, on every bind address including loopback — rebinding targets loopback services specifically, so 127.0.0.1 is not a mitigation.

  • A Host the server does not recognise returns 421 Misdirected Request

  • An Origin it does not recognise returns 403 Forbidden

When you bind a non-loopback address (--host 0.0.0.0, which is what the Docker entrypoint does), only localhost / 127.0.0.1 / [::1] are accepted by default, so reaching the server by LAN IP or a custom hostname returns 421 — the guard working, not a bug.

Allow specific hosts (the :* port glob is required):

-e MCP_ALLOWED_HOSTS="192.168.1.50:*,myserver.local:*"

Or turn the guard off entirely (only on a trusted network):

-e MCP_DISABLE_DNS_REBINDING_PROTECTION=true

Implementation note. FastMCP installs this guard on its streamable-http app only — create_sse_app() accepts no such option, so the allow-lists were silently dropped for SSE. cognee-mcp mounts the same middleware on the SSE app itself, with the same allow-lists, so both transports behave identically.

SSE Transport Configuration (Legacy — prefer HTTP below; both are guarded)

Start the server with SSE transport:

docker run -e TRANSPORT_MODE=sse --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main

Configure your MCP client:

Claude CLI (Easiest)

claude mcp add cognee-sse -t sse http://localhost:8000/sse

Verify the connection:

claude mcp list

You should see your server connected:

Checking MCP server health...

cognee-sse: http://localhost:8000/sse (SSE) - ✓ Connected

Manual Configuration

Claude (~/.claude.json)

{
  "mcpServers": {
    "cognee": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "cognee-sse": {
      "url": "http://localhost:8000/sse"
    }
  }
}

HTTP Transport Configuration (Recommended)

Start the server with HTTP transport:

docker run -e TRANSPORT_MODE=http --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main

Configure your MCP client:

Claude CLI (Easiest)

claude mcp add cognee-http -t http http://localhost:8000/mcp

Verify the connection:

claude mcp list

You should see your server connected:

Checking MCP server health...

cognee-http: http://localhost:8000/mcp (HTTP) - ✓ Connected

Manual Configuration

Claude (~/.claude.json)

{
  "mcpServers": {
    "cognee": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "cognee-http": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

Dual Configuration Example

You can configure both transports simultaneously for testing:

{
  "mcpServers": {
    "cognee-sse": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    },
    "cognee-http": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Note: Only enable the server you're actually running to avoid connection errors.

🌐 Connection Modes

The MCP server supports three connection modes:

Direct Mode (Default)

The MCP server directly imports and uses the cognee library with local databases (SQLite, LanceDB, Ladybug). This is the default mode with full feature support.

Cloud Mode

Connect to Cognee Cloud or a remote Cognee instance. The server calls cognee.serve() at startup, and all SDK operations transparently route to the cloud. No local databases needed.

Via CLI flags:

python src/server.py --serve-url https://your-instance.cognee.ai --serve-api-key ck_...

Via environment variables (zero-config):

export COGNEE_SERVICE_URL="https://your-instance.cognee.ai"
export COGNEE_API_KEY="ck_..."
python src/server.py

Cloud Mode with Docker:

docker run \
  -e TRANSPORT_MODE=sse \
  -e COGNEE_SERVICE_URL=https://your-instance.cognee.ai \
  -e COGNEE_API_KEY=ck_... \
  -p 8000:8000 \
  --rm -it cognee/cognee-mcp:main

Cloud Mode arguments / environment variables:

  • --serve-url / COGNEE_SERVICE_URL: Cognee Cloud or remote instance URL

  • --serve-api-key / COGNEE_API_KEY: API key for the instance

Database migrations are automatically skipped in Cloud mode.

API Mode

The MCP server connects to an already running Cognee FastAPI server via HTTP requests. This is useful when:

  • You have a centralized Cognee API server running

  • You want to separate the MCP server from the knowledge graph backend

  • You need multiple MCP servers to share the same knowledge graph

Starting the MCP server in API mode:

# Start your Cognee FastAPI server first (default port 8000)
cd /path/to/cognee
python -m cognee.api.client

# Then start the MCP server in API mode
cd cognee-mcp
python src/server.py --api-url http://localhost:8000 --api-token YOUR_AUTH_TOKEN

API Mode with different transports:

# With SSE transport
python src/server.py --transport sse --api-url http://localhost:8000 --api-token YOUR_TOKEN

# With HTTP transport
python src/server.py --transport http --api-url http://localhost:8000 --api-token YOUR_TOKEN

API Mode with Docker:

# On Mac/Windows (use host.docker.internal to access host)
docker run \
  -e TRANSPORT_MODE=sse \
  -e API_URL=http://host.docker.internal:8000 \
  -e API_TOKEN=YOUR_TOKEN \
  -p 8001:8000 \
  --rm -it cognee/cognee-mcp:main

# On Linux (use host network)
docker run \
  --network host \
  -e TRANSPORT_MODE=sse \
  -e API_URL=http://localhost:8000 \
  -e API_TOKEN=YOUR_TOKEN \
  --rm -it cognee/cognee-mcp:main

Command-line arguments for API mode:

  • --api-url: Base URL of the running Cognee FastAPI server (e.g., http://localhost:8000)

  • --api-token: Authentication token for the API (optional, required if API has authentication enabled)

Docker environment variables for API mode:

  • API_URL: Base URL of the running Cognee FastAPI server

  • API_TOKEN: Authentication token (optional, required if API has authentication enabled)

API Mode behavior: The MCP server intentionally exposes only the memory API: remember, recall, and forget (plus the cognify_status progress check). In API mode these tools call the Cognee API server endpoints directly. Operational helpers such as cognify, search, list_data, delete, prune, improve, and document retrieval helpers are kept internal and are not exposed as MCP tools.

💻 Basic Usage

The MCP server exposes its functionality through tools. Call them from any MCP client (Cursor, Claude Desktop, Cline, Roo and more).

Available Tools

The MCP server exposes four tools (three memory tools pinned in tools/list, plus cognify_status):

  • remember: Store data in memory. Pass data for text, or filename + content_base64 to ingest an uploaded file (up to 10 MB). With session_id: fast session cache (text only). Without session_id: permanent graph memory

  • recall: Search memory with auto-routing. Searches session cache first when session_id is provided, then falls through to the permanent graph

  • forget: Delete memory by dataset name or id, a single data item by data_id, or delete all owned memory with everything=True

  • cognify_status: Check the progress of background ingestion started by remember(background=True). Unadvertised by default; discoverable via search_tools and callable by name

Recall result summaries

recall (the MCP memory-search tool) starts every successful response with a summary, followed by the same result body as before:

3 memories found (2 from sessions, 1 from project docs)
[session] ...

The count is the number of returned memory entries, not top_k, underlying chunks used to synthesize an answer, or system status messages. Source and dataset hints use metadata already present in the returned entries; no recency lookup or extra LLM call is made.

Empty results distinguish an empty memory graph, indexing in progress, indexing failure, and no match. When available, progress is displayed as, for example, still indexing — 12/40 items processed, retry shortly. These are data items, not an inferred chunk count. A graph with no recorded indexing run is reported as not yet indexed. If the status check fails or exceeds its two-second budget, the summary explicitly says memory status is unavailable. Successful hits do not trigger status checks.

The MCP content remains a single TextContent block. Text consumers can separate line one from the unchanged body with text.partition("\n"). Machine consumers can read content[0]._meta["cognee/memory"], containing count and state.

state is one of four values, one per action a caller can take:

state

meaning

found

memory contributed; count is how many entries

indexing

ingestion is still running — retry shortly

build_failed

ingestion failed — check cognify_status

none

nothing to return

indexing additionally carries completed/total when the pipeline reports them. Tool errors retain their existing Error: response.

Tool surface (COGNEE_MCP_TOOL_MODE)

Advertising every tool up front costs agent context and hurts tool-selection accuracy, so by default the server pins a small set in tools/list and makes the rest discoverable through FastMCP's built-in search_tools. Unadvertised tools stay callable by name.

COGNEE_MCP_TOOL_MODE=default   # pinned: remember, recall, forget
COGNEE_MCP_TOOL_MODE=minimal   # pinned: remember, recall, forget
COGNEE_MCP_TOOL_MODE=all       # no search transform; advertise every tool

Also settable per-process with --tool-mode. In default/minimal an agent calls search_tools(query=...) to find a tool and either calls it by name or goes through the call_tool proxy. Tiers are declared per tool via @registry.tool(tags={...}) in src/server.py, so the pinned set is derived from the decorators rather than a separate list.

search_tools returns up to TOOL_SEARCH_MAX_RESULTS (10) tools, sized for a catalog that will grow. The window only costs context on turns that actually call search; tools/list stays constant either way. See tests/test_tool_search_benchmark.py for the recall sweep behind the number.

Writing a tool so search can find it

Search works well on natural-language queries. Every phrasing below returns its target ranked first (covered by tests/test_tool_search.py):

query

returns

"is my background ingestion finished?"

cognify_status

"check the progress of a pipeline job"

cognify_status

The one thing to know when adding a tool: matching is purely lexical. FastMCP's BM25 tokenizer does no stemming and drops tools that score zero, so a query shares no credit with a word it doesn't literally contain. Multi-word queries paper over this (they usually contain some matching token), which is why the table above passes, but terse queries won't.

So: write descriptions in the words an agent would use, including both singular and plural. Recall is bounded by vocabulary, not by TOOL_SEARCH_MAX_RESULTS. If lexical matching ever stops being enough, BaseSearchTransform leaves _search() abstract — a semantic ranker over cognee's own embeddings can be dropped in without touching the rest of the plumbing.

Agent Scoping (per-client default datasets)

By default, each MCP client gets its own auto-named dataset (e.g. Cursor → cursor_vscode_memory, Claude Code → claude_code_memory) so different agents don't share memory unintentionally. The dataset is created on demand the first time a client writes to it.

remember and cognify_status route to the agent-scoped dataset when dataset_name is omitted (the internal cognify/improve helpers, which are not exposed as tools, do the same). Pass dataset_name explicitly to override (e.g. dataset_name="main_dataset" still works).

To disable agent scoping and have all clients share main_dataset as the default, set in .env:

COGNEE_MCP_AGENT_SCOPED=false

When disabled, no per-client datasets are autocreated.

Per-dataset isolation (ENABLE_BACKEND_ACCESS_CONTROL)

Agent scoping decides which dataset name a tool defaults to. Whether two datasets are actually isolated at the storage layer is governed by cognee's ENABLE_BACKEND_ACCESS_CONTROL flag:

  • true (default) — each (user, dataset) pair gets its own per-dataset Kuzu + LanceDB under .cognee_system/databases/<dataset_uuid>/, and search is strictly per-dataset.

  • false — all datasets share one Kuzu graph DB and one LanceDB. The dataset filter is honored for top-level data points, but GRAPH_COMPLETION traversal can pull connected nodes from any dataset. Use for single-user local dev; also disables the API auth requirement unless REQUIRE_AUTHENTICATION=true is set explicitly.

Switching modes wipes nothing automatically — but data does not migrate. Data ingested in one mode lives at a different on-disk path than the other and won't be visible after the flip. Clean-slate when changing the flag:

# Stop server, then:
DATA_ROOT="/absolute/path/to/data-root"
rm -rf "$DATA_ROOT/.cognee_system" "$DATA_ROOT/.data_storage"
# Edit .env to flip ENABLE_BACKEND_ACCESS_CONTROL, restart, re-cognify.

(Set DATA_ROOT to whatever you used for DATA_ROOT_DIRECTORY / SYSTEM_ROOT_DIRECTORY, or your cognee install dir if you didn't set those.)

Examples:

# Store permanent memory
remember(data="Cognee MCP now exposes a focused memory API.", dataset_name="main_dataset")

# Store session memory
remember(data="Temporary working note", session_id="agent-session-1")

# Recall from memory
recall(query="What changed in the MCP server?", session_id="agent-session-1")

# Delete one dataset
forget(dataset="main_dataset")

Select an uploaded ontology for a write

Pass ontology_key to remember to ground permanent-memory extraction with one or more previously uploaded OWL ontologies:

remember(data="Alice works at Acme.", dataset_name="workspace_a", ontology_key="workspace_a_v2")
remember(
    data="Acme develops software.",
    ontology_key=["organizations", "software"],
    background=True,
)

In API mode, upload the ontologies first through POST /api/v1/ontologies using the same authenticated user as the MCP server. Keys are sent as repeated ontology_key form fields. In local mode, keys resolve through OntologyService in the default user's local ontology store; remote uploads are not copied locally. Unknown or inaccessible keys fail the write. Background failures are reported by cognify_status.

Omitting ontology_key (or passing an empty list) preserves the configured server ontology, including ONTOLOGY_FILE_PATH. Ontology selection is only for permanent writes: combining a nonempty key with session_id returns an error because session-cache writes do not perform extraction.

Development and Debugging

Debugging

Use the fastmcp CLI, not mcp. Since the FastMCP 3 migration this server is a standalone fastmcp.FastMCP instance, which the mcp CLI does not recognise — mcp dev src/server.py fails with "Ignoring object 'src/server.py:mcp' as it's not a valid server object".

Inspect the server without launching anything (fast sanity check — name, version, tool count):

uv run fastmcp inspect src/server.py:mcp

Run it against the MCP Inspector UI:

uv run fastmcp dev src/server.py:mcp

Open the inspector with a longer timeout — cognee's first call can be slow while the databases initialise:

http://localhost:5173?timeout=120000

To apply new changes while developing cognee:

  1. Update dependencies in the cognee folder if needed

  2. uv sync --group dev --reinstall

  3. uv run fastmcp dev src/server.py:mcp

The :mcp suffix names the server object in the file. Without it the CLI has to guess, and the guess is not reliable across FastMCP versions.

Development

In order to use local cognee:

  1. Uncomment the following line in the cognee-mcp pyproject.toml file and set the cognee root path.

    #"cognee[postgres-binary,docs,neo4j] @ file:/path/to/your/cognee"

    Replace /path/to/your/cognee with the absolute path to your cognee checkout, and comment out the released "cognee[...]>=1.5.0,<2.0.0" line directly below it — otherwise both requirements apply and uv resolves the published package instead.

  2. Install dependencies with uv in the mcp folder

    uv sync --reinstall

    Re-run this after every change to the local cognee checkout.

Note: editing that line modifies the tracked pyproject.toml and rewrites uv.lock with a machine-local absolute path. Revert both before committing — git checkout -- pyproject.toml uv.lock — or the path leaks into the repo.

Code of Conduct

We are committed to making open source an enjoyable and respectful experience for our community. See CODE_OF_CONDUCT for more information.

💫 Contributors

Star History

Star History Chart

Available Tools

5 tools
call_toolA

Call a tool by name with the given arguments.

Use this to execute tools discovered via search_tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the tool to call
argumentsNo

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not mention potential side effects, required permissions, or the fact that this tool may execute arbitrary actions. This lack of transparency is risky for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant information. The description is efficient and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the basic purpose and links to search_tools, but it lacks details on error handling, return values, or behavioral constraints. Given the tool's generic nature, this is acceptable but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only the 'name' parameter has a description in the schema; 'arguments' is not described. The description adds minimal value by implying arguments are passed, but does not clarify structure or constraints, leaving significant ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (call a tool) and the target (by name with arguments), and it is distinct from the sibling tools which perform specific operations like remember or recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this for executing tools discovered via search_tools, giving a clear use case. It does not elaborate on when not to use it, but the guidance is sufficient for typical scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forgetA

Delete data from memory.

Can target a single data item, a specific dataset (by name or id), or everything the user owns. Removes data from the relational DB, graph DB, and vector DB.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_idNoUUID of a single data item to delete. Must be paired with `dataset` or `dataset_id` so the owning dataset is unambiguous.
datasetNoDataset name to delete entirely.
dataset_idNoUUID of the dataset to delete entirely, or to scope `data_id`.
everythingNoIf true, delete ALL data across all datasets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that records are removed from three types of databases, which is useful. However, it does not mention irreversibility, permission requirements, or potential cascading effects. This is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct, leading with the primary action, then the targeting options, and finally the storage impact. No unnecessary words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a delete operation, it covers the key aspects: what can be deleted, how scope is specified, and which storage layers are affected. It does not explain error scenarios or side effects beyond deletion, but that is not essential given the presence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents each parameter at 100% coverage. The description adds overarching semantics: it clarifies that data_id must be paired with a dataset identifier, and distinguishes three targeting modes. This guidance helps the agent correctly combine parameters beyond what individual descriptions provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with 'Delete data from memory', a precise verb+resource pair, and enumerates the three deletion scopes (single item, dataset by name/id, everything). It also specifies that deletion spans relational, graph, and vector databases, clearly distinguishing it from siblings like remember and recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for deletion but does not explicitly name alternatives or conditions. It could have said 'Use this instead of remember/recall for removing data' to guide the agent, but the intent is clear from context and sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recallA

Search memory with auto-routing and session awareness.

When session_id is provided without datasets or search_type, searches session cache first by keyword matching. Falls through to the permanent knowledge graph if no session results match.

Auto-routing picks the best search strategy when search_type is not specified.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural language query to search for.
top_kNoMaximum results to return (default: 15).
datasetsNoComma-separated dataset names to search within.
session_idNoSession ID for session-first search.
search_typeNoOverride auto-routing with one SearchType name. Completion types (answer written by an LLM): HYBRID_COMPLETION (the default when routing is off), GRAPH_COMPLETION, GRAPH_COMPLETION_COT, GRAPH_COMPLETION_CONTEXT_EXTENSION, GRAPH_COMPLETION_DECOMPOSITION, GRAPH_SUMMARY_COMPLETION, RAG_COMPLETION, TRIPLET_COMPLETION, TEMPORAL, AGENTIC_COMPLETION. Retrieval-only types (no LLM): CHUNKS, CHUNKS_LEXICAL, SUMMARIES, SKILLS, CODE. Other: CYPHER, NATURAL_LANGUAGE, CODING_RULES, GRAPH_REPORT, FEELING_LUCKY. An unknown name is rejected with a validation error.
system_promptNoOverride the synthesis prompt for completion searches. When omitted, falls back to COGNEE_MCP_RECALL_SYSTEM_PROMPT / _FILE if configured on the server.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the behavioral disclosure burden and does it reasonably well by explaining session-first fallback and automatic strategy selection. It does not describe result formatting or failure modes, but those are partly covered by the output schema and the search_type validation note in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and each sentence adds behavior detail without repetition or filler. The paragraph breaks make the routing rules scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-style search tool with a rich input schema and an output schema, the description plus schema covers invocation, routing, fallback, and override behavior. Nothing essential is missing for an agent to select and call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already documented; the description adds value by explaining the conditional interaction between session_id, datasets, and search_type beyond the schema's field-level text. It clarifies that search_type is an override of routing and that session behavior changes when session_id is supplied alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Search memory') and identifies the key behaviors ('auto-routing and session awareness'), so an agent can tell it is a retrieval tool. It does not explicitly distinguish recall from the sibling search_tools, keeping it one step below a fully differentiated purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete routing conditions: when session_id is present without datasets or search_type, search the session cache first, then fall through to the knowledge graph; and auto-routing applies when search_type is omitted. It gives clear context for invoking the tool correctly, though it does not mention when to prefer it over sibling tools such as search_tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rememberA

Store data in memory.

Two modes depending on whether session_id is provided:

Without session_id (permanent memory): Runs the full add + cognify pipeline to ingest data and build the knowledge graph, then the self-improvement loop (improve) unless self_improvement=False.

With session_id (session memory): Stores the data in the session cache only. Fast, no entity extraction. Omit session_id when the content should be stored as permanent graph memory.

Pass either data (text) or filename + content_base64 (a file upload, up to 10 MB), not both. File uploads are permanent-memory only and don't support session_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoThe text content to store. Mutually exclusive with filename/content_base64.
filenameNoOriginal filename for a file upload. Used to derive the stored document's name. Requires content_base64.
backgroundNoQueue permanent ingestion as a background task and return immediately instead of waiting for the pipeline. Use when the caller has a request deadline shorter than ingestion takes. Ignored with session_id, which is already fast. Errors surface via cognify_status, not the return value.
session_idNoSession ID. When set, stores in session cache only.
dataset_nameNoTarget dataset name. Defaults to the current MCP client's agent-scoped dataset (e.g. "cursor_vscode_memory"), or "main_dataset" if no client identity is detected.
ontology_keyNoOne or more uploaded ontology keys for extraction (permanent mode only). API mode uses ontologies uploaded by the authenticated API user. Local mode uses the default user's ontology store. Omit to keep the configured server ontology.
custom_promptNoCustom prompt for entity extraction (permanent mode only).
content_base64NoBase64-encoded file content to ingest. Requires filename.
self_improvementNoRun the improve loop (triplet enrichment and, with sessions, the session bridge) after cognify. Permanent mode only; default True. Pass False for a plain add + cognify ingestion.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses the permanent pipeline (add + cognify + optional improve loop), the session-cache fast path with no entity extraction, file upload constraints, and the mutual exclusivity of data vs file upload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized and front-loaded, with the core purpose stated first and mode-specific details cleanly separated. Every sentence adds operational value, and the file-upload constraint is included without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two modes, 9 optional parameters, and an output schema, the description covers the key decision points and constraints necessary to call it correctly. The output schema covers return values, and the input schema covers remaining parameter details, so no critical operational context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaningful parameter semantics: it explains how session_id switches modes, that data is mutually exclusive with filename/content_base64, and that file uploads are limited to 10 MB and permanent-memory only. This goes beyond the schema's per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Store data in memory') and then distinguishes the tool by splitting it into permanent and session memory modes. This clearly separates it from siblings like recall and forget, which handle retrieval and deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use permanent vs session memory, including the rule to omit session_id for permanent storage. It does not explicitly contrast with sibling tools like recall or search_tools, but the mode-selection context is strong enough to guide correct use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_toolsA

Search for tools using natural language.

Returns matching tool definitions ranked by relevance, in the same format as list_tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural language query to search for tools

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It states that it returns matching tool definitions ranked by relevance, which is a behavioral trait. It also mentions the format is same as list_tools, which is useful. However, it doesn't disclose any side effects, rate limits, or other behavioral details. Given the tool is a search operation, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, two sentences, and front-loaded with the purpose. Every sentence adds value: the first states what it does, the second clarifies the return format. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter and an output schema. The description explains the return format (same as list_tools) and ranking by relevance. Given the simplicity and the presence of an output schema, the description is complete enough. It could mention that it's a read-only operation, but that's not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the single parameter 'query' as a natural language query. The description adds no additional meaning beyond that. Baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: searching for tools using natural language. It specifies the action (search) and the resource (tools), and distinguishes it from siblings like list_tools by mentioning the return format. However, it doesn't explicitly differentiate from other sibling tools like call_tool, but the purpose is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: when you need to find tools by natural language query. It mentions the return format is same as list_tools, which gives some context. However, it doesn't explicitly state when to use this vs alternatives, nor does it provide exclusions or alternative tool references. The guidance is minimal but not misleading.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 3 tool updatesv1.6.0
    • Changedforget6 fields changed
      • addedInput schema / properties / data_id / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / data_id / type
        Removed value: -"string"
      • addedInput schema / properties / dataset / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / dataset / type
        Removed value: -"string"
      • addedInput schema / properties / dataset_id / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / dataset_id / type
        Removed value: -"string"
    • Changedrecall10 fields changed
      • addedInput schema / properties / datasets / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / datasets / type
        Removed value: -"string"
      • addedInput schema / properties / search_type / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / search_type / description
        Previous value: -"Override auto-routing. Options: GRAPH_COMPLETION,\nGRAPH_COMPLETION_COT, RAG_COMPLETION, CHUNKS, SUMMARIES,\nTEMPORAL, FEELING_LUCKY, etc."New value: +"Override auto-routing with one SearchType name. Completion types\n(answer written by an LLM): HYBRID_COMPLETION (the default when\nrouting is off), GRAPH_COMPLETION, GRAPH_COMPLETION_COT,\nGRAPH_COMPLETION_CONTEXT_EXTENSION, GRAPH_COMPLETION_DECOMPOSITION,\nGRAPH_SUMMARY_COMPLETION, RAG_COMPLETION, TRIPLET_COMPLETION,\nTEMPORAL, AGENTIC_COMPLETION. Retrieval-only types (no LLM):\nCHUNKS, CHUNKS_LEXICAL, SUMMARIES, SKILLS, CODE. Other: CYPHER,\nNATURAL_LANGUAGE, CODING_RULES, GRAPH_REPORT, FEELING_LUCKY.\nAn unknown name is rejected with a validation error."
      • removedInput schema / properties / search_type / type
        Removed value: -"string"
      • addedInput schema / properties / session_id / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / session_id / type
        Removed value: -"string"
      • addedInput schema / properties / system_prompt / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / system_prompt / type
        Removed value: -"string"
      • changedInput schema / properties / top_k / description
        Previous value: -"Maximum results to return (default: 10)."New value: +"Maximum results to return (default: 15)."
    • Changedremember14 fields changed
      • addedInput schema / properties / content_base64 / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / content_base64 / type
        Removed value: -"string"
      • addedInput schema / properties / custom_prompt / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / custom_prompt / type
        Removed value: -"string"
      • addedInput schema / properties / data / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / data / type
        Removed value: -"string"
      • addedInput schema / properties / dataset_name / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / dataset_name / type
        Removed value: -"string"
      • addedInput schema / properties / filename / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / filename / type
        Removed value: -"string"
      • addedInput schema / properties / ontology_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "One or more uploaded ontology keys for extraction (permanent mode only).\nAPI mode uses ontologies uploaded by the authenticated API user. Local\nmode uses the default user's ontology store. Omit to keep the configured\nserver ontology."
        +}
      • addedInput schema / properties / self_improvement
        Added value: +{
        +  "default": true,
        +  "description": "Run the improve loop (triplet enrichment and, with sessions, the\nsession bridge) after cognify. Permanent mode only; default True.\nPass False for a plain add + cognify ingestion.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / session_id / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / session_id / type
        Removed value: -"string"
  2. 5 tool updatesv1.5.1
    • Changedforget2 fields changed
      • addedInput schema / properties / data_id
        Added value: +{
        +  "default": null,
        +  "description": "UUID of a single data item to delete. Must be paired with `dataset`\nor `dataset_id` so the owning dataset is unambiguous.",
        +  "type": "string"
        +}
      • addedInput schema / properties / dataset_id
        Added value: +{
        +  "default": null,
        +  "description": "UUID of the dataset to delete entirely, or to scope `data_id`.",
        +  "type": "string"
        +}
    • Removedopen_cognee_workspace
    • Changedremember1 field changed
      • addedInput schema / properties / background
        Added value: +{
        +  "default": false,
        +  "description": "Queue permanent ingestion as a background task and return immediately\ninstead of waiting for the pipeline. Use when the caller has a request\ndeadline shorter than ingestion takes. Ignored with session_id, which\nis already fast. Errors surface via cognify_status, not the return\nvalue.",
        +  "type": "boolean"
        +}
    • Removedupload_file_ui
    • Removedvisualize_graph_ui
  3. 13 tool updatesv1.5.0
    • Addedcall_tool
    • Removedcognify_file
    • Removedcreate_dataset_json
    • Changedforget7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dataset / description
        Added value: +"Dataset name to delete entirely."
      • removedInput schema / properties / dataset / title
        Removed value: -"Dataset"
      • addedInput schema / properties / everything / description
        Added value: +"If true, delete ALL data across all datasets."
      • removedInput schema / properties / everything / title
        Removed value: -"Everything"
      • removedInput schema / title
        Removed value: -"forgetArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Removedget_client_info_json
    • Removedlist_dataset_data_json
    • Removedlist_datasets_json
    • Changedopen_cognee_workspace2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"open_cognee_workspaceArguments"
    • Changedrecall15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / datasets / description
        Added value: +"Comma-separated dataset names to search within."
      • removedInput schema / properties / datasets / title
        Removed value: -"Datasets"
      • addedInput schema / properties / query / description
        Added value: +"Natural language query to search for."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • addedInput schema / properties / search_type / description
        Added value: +"Override auto-routing. Options: GRAPH_COMPLETION,\nGRAPH_COMPLETION_COT, RAG_COMPLETION, CHUNKS, SUMMARIES,\nTEMPORAL, FEELING_LUCKY, etc."
      • removedInput schema / properties / search_type / title
        Removed value: -"Search Type"
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID for session-first search."
      • removedInput schema / properties / session_id / title
        Removed value: -"Session Id"
      • addedInput schema / properties / system_prompt / description
        Added value: +"Override the synthesis prompt for completion searches. When omitted,\nfalls back to COGNEE_MCP_RECALL_SYSTEM_PROMPT / _FILE if configured\non the server."
      • removedInput schema / properties / system_prompt / title
        Removed value: -"System Prompt"
      • addedInput schema / properties / top_k / description
        Added value: +"Maximum results to return (default: 10)."
      • removedInput schema / properties / top_k / title
        Removed value: -"Top K"
      • removedInput schema / title
        Removed value: -"recallArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedremember15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / content_base64
        Added value: +{
        +  "default": null,
        +  "description": "Base64-encoded file content to ingest. Requires filename.",
        +  "type": "string"
        +}
      • addedInput schema / properties / custom_prompt / description
        Added value: +"Custom prompt for entity extraction (permanent mode only)."
      • removedInput schema / properties / custom_prompt / title
        Removed value: -"Custom Prompt"
      • addedInput schema / properties / data / default
        Added value: +null
      • addedInput schema / properties / data / description
        Added value: +"The text content to store. Mutually exclusive with\nfilename/content_base64."
      • removedInput schema / properties / data / title
        Removed value: -"Data"
      • addedInput schema / properties / dataset_name / description
        Added value: +"Target dataset name. Defaults to the current MCP client's\nagent-scoped dataset (e.g. \"cursor_vscode_memory\"), or\n\"main_dataset\" if no client identity is detected."
      • removedInput schema / properties / dataset_name / title
        Removed value: -"Dataset Name"
      • addedInput schema / properties / filename
        Added value: +{
        +  "default": null,
        +  "description": "Original filename for a file upload. Used to derive the stored\ndocument's name. Requires content_base64.",
        +  "type": "string"
        +}
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID. When set, stores in session cache only."
      • removedInput schema / properties / session_id / title
        Removed value: -"Session Id"
      • removedInput schema / required
        Removed value: -[
        -  "data"
        -]
      • removedInput schema / title
        Removed value: -"rememberArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedsearch_tools
    • Changedupload_file_ui2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"upload_file_uiArguments"
    • Changedvisualize_graph_ui3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / dataset_name / title
        Removed value: -"Dataset Name"
      • removedInput schema / title
        Removed value: -"visualize_graph_uiArguments"
  4. 4 tool updatesv1.4.1
    • Addedcreate_dataset_json
    • Addedget_client_info_json
    • Addedrecall
    • Addedremember
  5. 4 tool updatesv1.4.0
    • Removedcreate_dataset_json
    • Removedget_client_info_json
    • Removedrecall
    • Removedremember
  6. 1 tool updatev1.0.2
    • Changedrecall1 field changed
      • changedInput schema / properties / top_k / default
        Previous value: -10New value: +15
  7. 11 tool updatesv1.0.1
    • First observedcognify_file
    • First observedcreate_dataset_json
    • First observedforget
    • First observedget_client_info_json
    • First observedlist_dataset_data_json
    • First observedlist_datasets_json
    • First observedopen_cognee_workspace
    • First observedrecall
    • First observedremember
    • First observedupload_file_ui
    • First observedvisualize_graph_ui

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation3/5

The memory operations remember/recall/forget are clearly distinct, but call_tool and search_tools introduce a meta-layer that overlaps with direct tool invocation and with recall (searching tools vs searching memory). An agent could easily reach for search_tools when it means to search memory, or call_tool instead of a specific memory tool.

Naming Consistency3/5

The memory trio uses single-word verbs (remember/recall/forget), while the other two use snake_case verb_noun patterns (call_tool/search_tools). All names are lowercase and readable, but the convention is not consistent across the full set.

Tool Count4/5

Five tools is a reasonable size for a memory-focused server, and the three domain tools cover the core workflow. The count is slightly inflated by two generic meta-tools that are not memory-specific, but it is still well within a sensible range.

Completeness4/5

The set covers the main memory lifecycle: store (remember), search/retrieve (recall), and delete (forget), with session and permanent modes. Missing explicit update or list operations creates minor gaps, but agents can work around them in a memory system.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Persistent knowledge memory layer for AI agents. Hybrid semantic + full-text search with pgvector, code dependency graph with blast-radius impact analysis, and incremental indexing for 7 languages. In-process ONNX embeddings, no external API required.
    24 npm
    35
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides persistent knowledge graph memory for AI agents, enabling them to store, recall, and query facts about people, projects, and relationships across sessions.
    MIT
  • F
    license
    Not graded
    quality
    F
    maintenance
    Enables LLMs to store, search, and manage memories with hybrid semantic and keyword search using ChromaDB and Neo4j for persistent memory and knowledge graph capabilities.
    -