Skip to main content
Glama
alfianyusufabdullah

jalipata-mcp-memory

jalipata-mcp-memory

npm version

Persistent long-term memory for AI tools, over MCP. Give Claude Code, OpenCode, Cursor, Antigravity, Codex — or any MCP-capable client — a shared knowledge graph it can read and write across sessions. Like Claude's memory, but tool-agnostic.

Features

  • Knowledge graph memory — entities, atomic observations, and directed relations (compatible with @modelcontextprotocol/server-memory).

  • Model-driven — the model recalls and saves via MCP tools, guided by an injected prompt. No host-specific integration required.

  • Multi-tenant — memory is scoped by namespace (user:alice, user:alice:project:frontend), so users, projects, and agents never mix.

  • SQLite storage — transactional, WAL mode, zero-setup, single portable file.

  • Keyword search — SQLite FTS5 with a substring fallback; no external services.

  • Live updates — mutation tools notify subscribed clients via MCP resources.

  • Two transports — stdio (default, local) and Streamable HTTP (remote).

Related MCP server: Mnemosyne

Quick start

Wire memory into Claude Code, OpenCode, Cursor, Antigravity, or Codex with one interactive command:

npx -y @jalipata/mcp-memory init

The wizard asks which tools, where to set it up, the database path, and a memory namespace — then writes the MCP config, injects usage guidance, and optionally installs an auto-inject hook/plugin. Restart your AI tool and start chatting.

Run it outside a project (e.g. from $HOME)? It detects that and defaults to a user/global setup instead of cluttering your home directory. Re-running is safe — existing files are merged, never overwritten.

Generated configs pin a specific version (@jalipata/mcp-memory@<version>). After publishing a new release, bump the pinned version in all existing configs with one command:

npx -y @jalipata/mcp-memory update

It scans every configured tool (project + user scope) and rewrites only the pinned version — no interactive prompts.

What the wizard writes

Config and guidance cells show the project path / user-global path. The auto-inject column shows the project path — user scope mirrors it under your home directory.

Tool

Config file

Guidance file

Auto-inject

Claude Code

.mcp.json / ~/.claude.json

CLAUDE.md / ~/.claude/CLAUDE.md

.claude/settings.jsonSessionStart hook, disables auto memory

OpenCode

opencode.json / ~/.config/opencode/opencode.json

AGENTS.md / ~/.config/opencode/AGENTS.md

.opencode/plugins/memory-guidance.tssystem.transform plugin

Cursor

.cursor/mcp.json / ~/.cursor/mcp.json

.cursor/rules/memory.mdc / ~/.cursor/rules/memory.mdc

none — rules auto-applied (alwaysApply)

Antigravity

.agents/mcp_config.json / ~/.gemini/config/mcp_config.json

AGENTS.md / ~/.gemini/GEMINI.md

.agents/hooks.jsonPreInvocation hook

Codex

.codex/config.toml / ~/.codex/config.toml

AGENTS.md / ~/.codex/AGENTS.md

.codex/hooks.jsonSessionStart hook

For Claude Code, the injected guidance makes the model treat the memory MCP server as its primary long-term memory, instead of Claude's built-in memory.

Auto-inject memory guidance (hooks / plugin)

File guidance (CLAUDE.md / AGENTS.md / GEMINI.md) is advisory — the model reads it but is free to ignore it. The wizard can go one step further and make the memory guidance automatically injected on every session, so you never have to tell the model to use mcp-memory again:

  • Claude CodeSessionStart hook returning additionalContext (system reminder before the first prompt); disables Claude's built-in auto memory.

  • OpenCode — plugin tapping experimental.chat.system.transform (guidance appended to the system prompt before every LLM request).

  • AntigravityPreInvocation hook emitting injectSteps[].ephemeralMessage before every model call.

  • CodexSessionStart hook returning additionalContext (same contract as Claude) with matcher: startup|resume.

Pick project, user/global, or both when prompted; existing settings and hooks are merged, never overwritten.

Adding a new AI tool

Integrations are adapters, not scattered patches. The wizard (init.ts) is a single generic loop that only talks to the ToolAdapter contract (src/cli/adapters/types.ts); it contains zero per-tool logic. Adding a tool means two steps:

  1. Create src/cli/adapters/<tool>.ts — a ToolAdapter implementing:

    • hasExistingConfig — pre-select the tool when its config already declares the memory server

    • targets(scope, ctx) — resolve config + guidance file paths for project/user/both

    • autoInject? — an AutoInjectMechanism, or undefined for rules-only tools

  2. Register it — one line in src/cli/adapters/registry.ts (TOOL_ADAPTERS).

Reusable building blocks:

  • Config formatsCONFIG_FORMATS (mcpServers / servers / mcp / mcpServersToml) in src/cli/config.ts. Most tools reuse mcpServers; Codex's TOML [mcp_servers.*] shape uses mcpServersToml (serialized by the built-in src/cli/toml.ts parser). A genuinely new shape needs only a new format entry.

  • Plugin mechanismscreateFilePluginMechanism (adapters/pluginMechanism.ts) covers any tool that auto-injects guidance by writing a plugin file (OpenCode uses it; a future Cursor extension would too). Supply file paths + a content renderer, get install/uninstall/isInstalled for free.

  • Hook mechanismsadapters/hookMechanism.ts provides createSessionStartHookMechanism for any client whose session-start hook returns additionalContext (Claude Code, Codex — matcher/handler-fields/extra-settings per spec) and createPreInvocationHookMechanism for Antigravity's injectSteps.

  • Guidance variantsbuildGuidanceBlock(scope, variant) wording is per-target (claude vs generic); rule-file formats get YAML frontmatter (e.g. Cursor .mdc alwaysApply: true).

Cursor ships as a reference adapter: it reuses the mcpServers format and .cursor/rules/memory.mdc with alwaysApply: true, so it needs no auto-inject mechanism at all.

Running the server

The server is a normal MCP process. stdio is the default transport — most clients spawn it themselves from your MCP config, so you rarely run it directly. HTTP is for remote setups.

stdio (default):

npx -y @jalipata/mcp-memory

HTTP (remote):

MEMORY_TRANSPORT=http MEMORY_HTTP_PORT=3000 npx -y @jalipata/mcp-memory

Web dashboard

Visualize and inspect your memories in the browser — a read-only graph view with entity details, observations, relations, and search:

npx -y @jalipata/mcp-memory serve

Then open http://127.0.0.1:4824 (default). Pick a namespace from the dropdown, click nodes to inspect them, and search across names/types/observations.

Environment

Env var

Description

Default

MEMORY_DB_PATH

SQLite database file

~/.jalipata/memory.db

MEMORY_TRANSPORT

stdio or http

stdio

MEMORY_HTTP_PORT

Port when transport is http

3000

MEMORY_WEB_HOST

Host the web dashboard binds to

127.0.0.1

MEMORY_WEB_PORT

Port the web dashboard listens on

4824

Memory is centralized in one database (~/.jalipata/memory.db by default). Projects stay isolated through namespaces, not separate files. Set an absolute MEMORY_DB_PATH in client configs if you move it — the default is resolved from your home directory.

Manual MCP client setup

Skipped the wizard? Add the server to your client's MCP config. On Windows, prefix npx with cmd /c.

Most clients (Claude Code .mcp.json, Claude Desktop claude_desktop_config.json, Cursor .cursor/mcp.json, Antigravity .agents/mcp_config.json) — mcpServers format:

{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": ["-y", "@jalipata/mcp-memory"],
      "env": { "MEMORY_DB_PATH": "/absolute/path/to/memory.db" }
    }
  }
}

OpenCode (opencode.json):

{
  "mcp": {
    "memory": {
      "type": "local",
      "command": ["npx", "-y", "@jalipata/mcp-memory"],
      "enabled": true,
      "environment": { "MEMORY_DB_PATH": "/absolute/path/to/memory.db" }
    }
  }
}

Codex (.codex/config.toml or ~/.codex/config.toml) — TOML:

[mcp_servers.memory]
command = "npx"
args = ["-y", "@jalipata/mcp-memory"]
env = { MEMORY_DB_PATH = "/absolute/path/to/memory.db" }

VS Code / Copilot (.vscode/mcp.json) — uses the servers key:

{
  "servers": {
    "memory": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@jalipata/mcp-memory"],
      "env": { "MEMORY_DB_PATH": "/absolute/path/to/memory.db" }
    }
  }
}

Remote HTTP:

{
  "mcpServers": {
    "memory": { "url": "http://localhost:3000/mcp" }
  }
}

How memory works

Memories form a knowledge graph of entities, atomic observations, and directed relations:

{ "name": "Alfian", "entityType": "person", "observations": ["Prefers TypeScript"] }
{ "from": "Alfian", "to": "jalipata", "relationType": "works_on" }

The guidance injected into CLAUDE.md / AGENTS.md / GEMINI.md (or the bundled memory-guidance prompt) tells the model to:

  1. Recall relevant context at the start of a conversation with search_nodes / open_nodes.

  2. Save durable facts with create_entities, create_relations, and add_observations.

  3. Stay clean — atomic observations, reuse existing entities, delete stale memory — always under a consistent namespace.

MCP tools

All tools accept an optional namespace argument (defaults to default).

Tool

Description

create_entities

Create entities; duplicates by name are ignored

create_relations

Create directed relations; missing endpoints are auto-created

add_observations

Append atomic facts to entities (fails if entity is missing)

delete_entities

Delete entities — cascades to relations & observations

delete_observations

Delete specific observations

delete_relations

Delete specific relations

read_graph

Read the full knowledge graph for a namespace

search_nodes

Keyword search over names, types, and observations (FTS5 + LIKE)

open_nodes

Retrieve specific nodes plus their connected relations

list_namespaces

List all memory namespaces

MCP resources

  • memory://namespaces — all known namespaces (JSON)

  • memory://graph/{namespace} — full graph of a namespace (JSON), subscribable

Development

npm run typecheck   # tsc --noEmit
npm test            # vitest run (unit tests)
npm run dev         # tsx watch

Stack: Node.js ≥ 22 · TypeScript · @modelcontextprotocol/sdk · better-sqlite3 · SQLite FTS5 · zod · @clack/prompts

Project layout

src/
├── index.ts               # entry point: stdio + HTTP transports + `init`/`serve` dispatch
├── config.ts              # env configuration
├── prompts.ts             # LLM memory-guidance prompt
├── resources.ts           # MCP resources + subscribe notifications
├── db/
│   ├── schema.ts          # SQLite DDL + FTS5 triggers
│   ├── connection.ts      # better-sqlite3 bootstrap
│   └── knowledgeGraph.ts  # namespace-aware CRUD + search
├── cli/
│   ├── config.ts          # format registry (mcpServers/servers/mcp/mcpServersToml), merge/write engine, guidance
│   ├── toml.ts            # minimal TOML parser/serializer (Codex config.toml)
│   ├── init.ts            # interactive `init` wizard — one generic loop, no per-tool logic
│   ├── plan.ts            # pure planner: selection + scope → targets & mechanism installs
│   ├── hooks.ts           # Claude Code hook file layout + script renderer
│   └── adapters/          # pluggable AI-tool integrations
│       ├── types.ts           # ToolAdapter / AutoInjectMechanism / WizardContext contracts
│       ├── registry.ts        # static registry (TOOL_ADAPTERS) — the only wiring point
│       ├── pluginMechanism.ts # generic "write a plugin file" mechanism factory
│       ├── hookMechanism.ts   # generic SessionStart (additionalContext) + PreInvocation (injectSteps) hooks
│       ├── claudeCode.ts      # Claude Code adapter (SessionStart hook + auto memory disable)
│       ├── opencode.ts        # OpenCode adapter (system-transform plugin mechanism)
│       ├── cursor.ts          # Cursor adapter (rules-only, reuses mcpServers format)
│       ├── antigravity.ts     # Antigravity adapter (PreInvocation hook, mcp_config.json)
│       └── codex.ts           # Codex adapter (SessionStart hook, TOML config)
├── web/
│   ├── server.ts          # web dashboard HTTP server + read-only JSON API
│   └── static/            # frontend (index.html, styles.css, app.js)
└── tools/
    └── index.ts           # MCP tool registration (zod schemas)

License

MIT

Available Tools

10 tools
add_observationsAdd ObservationsA

Add new observations (atomic facts) to existing entities in the knowledge graph. Fails if an entity does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".
observationsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
namespaceYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate it's a write operation and non-idempotent; the description adds the crucial failure behavior when the entity does not exist and clarifies that observations are atomic facts. This goes beyond what the annotations convey about side effects.

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 entire description is a single 19-word sentence that front-loads the primary action and includes a key constraint. No redundant phrases or filler; every word earns its place.

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 simple write operation with annotations and a schema, the description provides the essential context: purpose, target, and a crucial error condition. It doesn't discuss return values, but the presence of an output schema covers that, and behavioral annotations handle idempotency and safety.

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 documents the namespace, entityName, and contents parameters with descriptions, but the top-level observations property lacks a description. The tool description compensates by explaining observations as atomic facts and emphasizing that entityName must refer to an existing entity, adding semantic meaning to the parameters.

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 identifies the action (add), the resource (observations as atomic facts), and the target (existing entities in the knowledge graph). It distinguishes itself from sibling tools like create_entities and create_relations by specifying the verb-noun combination and the constraint that entities must exist.

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 context, such as the need for entities to already exist, but does not explicitly state when to use this tool versus alternatives like create_entities or delete_observations. The failure condition suggests a prerequisite but no direct comparison to siblings.

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

create_entitiesCreate EntitiesA

Create multiple new entities in the knowledge graph. Entities with an existing name are ignored.

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYes
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
namespaceYes

TDQS

A3.5/5.0
Behavior1/5

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

The description states that entities with an existing name are ignored, which implies idempotent behavior (repeated calls with the same entities have no additional effect). However, the annotations set idempotentHint to false, directly contradicting this implication. Per the rubric, this is an annotation contradiction requiring a score of 1.

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 extremely concise, consisting of two short sentences. It front-loads the purpose and adds the key behavioral trait (ignoring existing names) without extraneous information. Every word earns its place.

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 simple batch creation tool, the description covers the core purpose and the most critical edge case (duplicate names). The schema provides details on parameters and the output schema exists (though not shown), so return values need not be described. However, the idempotency contradiction weakens overall completeness, and there is no mention of partial failures or namespace defaults, though those are partly addressed by schema.

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?

The input schema has 50% description coverage: the 'namespace' parameter is well-described, but the 'entities' array property lacks a top-level description. The tool description adds no further parameter semantics—it merely repeats the word 'entities' without explaining the structure or namespace behavior, leaving the agent to rely entirely on the incomplete schema.

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 tool creates multiple new entities in the knowledge graph, using a specific verb ('Create') and resource ('entities'). It is distinct from sibling tools like create_relations, which handle relations, and add_observations, which add observations to existing entities.

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 clearly implies this tool is for adding new entities, and the behavior of ignoring existing names is a useful context cue. It does not explicitly state alternatives or when-not-to-use, but the sibling tool names provide enough situational awareness for an agent to differentiate.

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

create_relationsCreate RelationsA

Create multiple new relations between entities. Relations should be in active voice. Missing endpoint entities are created automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".
relationsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
namespaceYes
relationsYes

TDQS

A3.8/5.0
Behavior1/5

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

The description contradicts the annotation openWorldHint=false by stating 'Missing endpoint entities are created automatically.' This is an open-world behavior, directly conflicting with the closed-world annotation. Therefore, score is 1 per contradiction rule.

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 three concise sentences, each adding distinct value: main purpose, formatting rule, and auto-creation behavior. No redundant information; it's front-loaded with the primary action.

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 description covers the main usage and key behavior (auto-creation). An output schema exists, so return values are presumably defined. However, the contradiction with openWorldHint could confuse an agent; also, edge cases like partial failures are not addressed. But given the moderate complexity, it's mostly complete.

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 description adds meaning beyond the schema: 'Relations should be in active voice' specifies the format for relationType, and 'Missing endpoint entities are created automatically' clarifies that from and to can reference non-existent entities, which will be created. This complements the 50% schema coverage.

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 tool's function: 'Create multiple new relations between entities.' This distinguishes it from sibling tools like create_entities (creates entities) and delete_relations (deletes relations). The additional details about active voice and automatic endpoint creation further clarify behavior.

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 clear context: it is for creating multiple relations, with guidance that relations should be in active voice. It does not explicitly mention alternatives or when-not-to-use, but the naming and sibling set make the purpose clear. The lack of explicit exclusion is acceptable given the straightforward domain.

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

delete_entitiesDelete EntitiesA
DestructiveIdempotent

Delete entities and their associated relations and observations from the knowledge graph (cascading). Silent if an entity does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".
entityNamesYesThe names of the entities to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

A4.5/5.0
Behavior5/5

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

The description adds behavioral context beyond annotations: it discloses the cascading deletion of relations and observations, and the silent behavior when an entity doesn't exist. These details are not present in the annotations (destructiveHint, idempotentHint) and are valuable for an agent. No contradiction with annotations.

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 two short sentences, front-loaded with the core action ('Delete entities...') and no filler. The cascade and silent behavior are concise additions that earn their place.

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?

Given the presence of an output schema and clear annotations, the description adequately covers the tool's behavior (cascading deletion, silent idempotency). It doesn't need to explain return values because an output schema exists, and the description is complete for an agent to understand when and how to use this tool.

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 parameters are fully described in the schema. The description adds no additional parameter-level detail beyond what the schema already provides (e.g., format, defaults). Baseline 3 is appropriate as the schema does the heavy lifting.

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 tool deletes entities with a cascading effect on associated relations and observations, using specific verbs ('Delete') and the resource ('entities'). It also distinguishes itself from sibling tools like delete_relations and delete_observations by explicitly mentioning the cascading scope.

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 makes the use case clear: use this when you want to delete an entity and all its associated data. It implicitly contrasts with sibling tools (e.g., delete_relations for relations only), though it doesn't explicitly say 'use delete_relations instead when you only want to delete relations.' This is a minor gap.

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

delete_observationsDelete ObservationsA
DestructiveIdempotent

Delete specific observations from entities in the knowledge graph. Silent if an observation does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
deletionsYes
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

A4.2/5.0
Behavior4/5

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

The description adds concrete behavioral detail beyond the annotations: 'Silent if an observation does not exist' expands on the idempotentHint and clarifies the tool's no-op behavior. It does not contradict any annotations and adds useful context for a destructive operation.

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 two short sentences, front-loaded with the action and resource, with no redundant filler. Every sentence adds value, including the behavioral note about silence.

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?

Given the destructive annotation, the presence of an output schema, and sibling tools, the description is mostly complete. It explains the core operation and the key edge case of missing observations, though it does not address behavior when the entity itself is missing, which would be useful but is not critical given the tool's focused purpose.

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?

The schema covers the namespace parameter in detail and the deletions array structure via nested property descriptions. The tool description adds some meaning with 'specific observations' but does not meaningfully compensate for the 50% schema description coverage at the top level; the deletions parameter lacks an explicit top-level description.

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 uses a specific verb ('Delete') and resource ('specific observations from entities in the knowledge graph'), clearly distinguishing it from sibling tools like delete_entities, delete_relations, and add_observations.

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 clearly states the tool's scope (deleting observations from entities), which implies when it should be used versus sibling tools. It does not explicitly mention alternatives or exclusions, but the focused wording provides enough context for selection.

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

delete_relationsDelete RelationsA
DestructiveIdempotent

Delete specific relations from the knowledge graph. Silent if a relation does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".
relationsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate destructive and idempotent hints, but the description adds the valuable behavioral detail that the operation is 'Silent if a relation does not exist', which clarifies the idempotent nature and avoids unexpected errors. It also clarifies the scope (knowledge graph) and specificity of deletion. No contradiction with annotations, and it enriches the annotation data with contextual behavior.

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 only two sentences, immediately stating the purpose in the first sentence and adding a key behavioral nuance in the second. Every word earns its place, with no redundant content. It is front-loaded with the verb and object, making it highly scannable.

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?

Given the presence of an output schema and annotations, the description covers essential aspects: what it deletes, the silent behavior for missing relations, and the knowledge graph context. It doesn't mention namespace defaulting, but that's in the schema. It lacks an explicit note on when to use this vs. sibling delete tools, but the description is otherwise complete for a delete operation with good schema/annotation support.

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?

The schema provides rich descriptions for the namespace and the subfields of relations, but the top-level relations parameter lacks a direct description. The tool description adds minimal parameter insight beyond naming 'specific relations'. Overall, the schema carries most weight, and the description doesn't significantly compensate for the 50% coverage gap, though the subfields are well-documented.

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 verb 'Delete' and the resource 'specific relations from the knowledge graph', which precisely identifies the tool's purpose. It also distinguishes it from sibling tools like delete_entities and delete_observations by explicitly targeting relations. The mention of 'specific' relations adds clarity that it deletes user-selected edges, not all relations.

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 for deleting particular relations by saying 'specific relations', and the tool name reinforces this. However, it does not explicitly state when to use this tool over alternatives (e.g., delete_entities, delete_observations) or provide exclusions. The guidance is inferred rather than explicit, so it falls short of a clear context for selection.

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

list_namespacesList NamespacesA
Read-onlyIdempotent

List all memory namespaces (scopes) stored in this server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
namespacesYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the 'all' and 'scopes' context but does not disclose any further behavior such as pagination, ordering, or result limits. With strong annotations, this is adequate but not exceptional.

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 a single, front-loaded sentence that states the action and target concisely. Every word earns its place, with no filler or 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?

Given the tool's simple nature (no parameters, read-only, safe), the description, combined with strong annotations and an output schema, provides complete context. It clearly defines what the tool does without needing to explain return details that the output schema covers.

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 tool accepts zero parameters, which makes the input schema fully self-explanatory (100% coverage by construction). The description adds no parameter-specific meaning, but the baseline of 4 is appropriate for parameterless tools.

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 uses the specific verb 'List' and names the resource 'all memory namespaces (scopes)', clearly distinguishing it from sibling tools that focus on entities, relations, and observations. The parenthetical clarifies the meaning of namespaces.

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 clearly implies when to use this tool: when you need to enumerate available memory scopes. It does not explicitly name alternatives or exclusions, but no sibling tool serves this purpose, so the context is clear without needing contrast.

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

open_nodesOpen NodesA
Read-onlyIdempotent

Retrieve specific nodes by name, along with relations connected to them. Silently skips non-existent nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesYesThe entity names to retrieve
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
namespaceYes
relationsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the operation read-only and idempotent; the description adds valuable context by disclosing that non-existent nodes are silently skipped, which is not captured in the annotations. This informs the agent about error handling without contradicting the structured metadata.

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 two short sentences: the first states the core action and output scope, the second discloses a key behavioral nuance. Every word adds value with no 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 simple read-only retrieval tool with comprehensive schema annotations and an output schema, the description covers the essential purpose and the one non-obvious behavior (silent skipping). No further context is needed.

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?

Both parameters have thorough descriptions in the input schema (names and namespace with examples), covering 100% of parameters. The tool description adds no additional parameter-level meaning, so it earns the baseline for high schema coverage.

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 uses the specific verb 'Retrieve' with the resource 'specific nodes by name' and adds 'along with relations connected to them,' clearly distinguishing this from sibling tools like search_nodes (search by query) and read_graph (read entire graph).

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 clearly implies the tool is for retrieving nodes when their names are known ('specific nodes by name'), providing a distinct use case. However, it does not explicitly mention alternatives or exclusions, so it stops short of full usage guidance.

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

read_graphRead GraphA
Read-onlyIdempotent

Read the entire knowledge graph for a namespace, including all entities and relations.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
namespaceYes
relationsYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that it reads the 'entire' graph including all entities and relations, which is useful scope context. However, it does not disclose pagination, size limits, or behavior for missing namespaces, though these are partially mitigated by the output 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 a single sentence, front-loaded with the verb 'Read', and contains no filler or redundant information. Every word contributes to understanding the tool's scope.

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 simple read operation with one parameter, full schema coverage, an output schema, and comprehensive safety annotations, the description plus structured fields provide all necessary context. There are no missing prerequisites or side effects to explain.

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?

The input schema provides 100% coverage for the single 'namespace' parameter with a detailed description including examples and default value. The tool description adds no additional parameter semantics, so the baseline of 3 is appropriate.

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 uses the specific verb 'Read' and clearly identifies the resource as 'the entire knowledge graph for a namespace, including all entities and relations.' This distinguishes it from sibling tools like search_nodes (filtered search) and create_entities (write operation), making its purpose unambiguous.

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 clearly implies when to use this tool: when you need the complete knowledge graph for a namespace, not just a subset. However, it does not explicitly mention alternatives or when not to use it, stopping short of a 5.

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

search_nodesSearch NodesA
Read-onlyIdempotent

Keyword search for nodes in the knowledge graph by entity names, entity types, and observation content. Returns matching entities and their connected relations.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query to match against entity names, types, and observations
namespaceNoMemory scope/tenant. Use the same namespace to keep related memories together (e.g. "user:alice" or "user:alice:project:frontend"). Defaults to "default".

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
namespaceYes
relationsYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds valuable behavioral context by specifying what data is searched (entity names, types, observations) and what is returned (entities and connected relations), which goes beyond the structured annotations.

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 two concise sentences, front-loaded with the action ('Keyword search') and resource ('nodes in the knowledge graph'), followed by match criteria and return value. Every word added value, with no redundancy or fluff.

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?

Given the output schema exists (though not shown in the prompt), the description need not detail return format. The tool is a simple read-only search with well-annotated semantics and schema-complete parameters. Minor gaps like pagination or exact matching behavior are acceptable because annotations and schema cover safety and parameter details.

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% for both parameters (query and namespace). The description mirrors some of the query parameter semantics but does not add additional meaning beyond the schema's own descriptions. Baseline score of 3 is appropriate since the schema fully documents the parameters.

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 tool performs a keyword search over nodes in a knowledge graph, matching by entity names, types, and observations, and returns entities with connected relations. This distinguishes it from sibling tools like read_graph (full graph dump) and open_nodes (likely direct access) by emphasizing the search use case.

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 the tool is for searching nodes, but it does not explicitly state when to use it vs. alternatives like read_graph or open_nodes. No exclusion criteria or alternative tool references are provided, so the usage context is clear but not explicit about trade-offs.

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. 10 tool updatesv0.1.5
    • First observedadd_observations
    • First observedcreate_entities
    • First observedcreate_relations
    • First observeddelete_entities
    • First observeddelete_observations
    • First observeddelete_relations
    • First observedlist_namespaces
    • First observedopen_nodes
    • First observedread_graph
    • First observedsearch_nodes

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct operation: creating entities, creating relations, adding observations, and deleting each of those, plus distinct retrieval methods (read graph, search, open by name) and namespace listing. No two tools have overlapping purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (create_entities, delete_relations, open_nodes, etc.). The only slight variation is 'add_observations' versus 'create_*', but 'add' is still a clear active verb in the same style.

Tool Count5/5

With 10 tools, the server is well-scoped for a knowledge graph memory system. Each tool covers a essential operation without redundancy, and the count is within the ideal range for a focused server.

Completeness4/5

The surface covers the full CRUD lifecycle for entities, relations, and observations, plus retrieval and namespace listing. Minor gaps exist such as no update/rename operation for entities or relations, but these are not critical for typical memory graph workflows.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides AI agents with persistent knowledge storage, enabling them to store, search, and retrieve text, documents, and files using semantic and keyword search via MCP tools.
    32
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Provides persistent, graph-based memory for AI agents via MCP, enabling semantic search, wikilink traversal, reminders, and injection protection.
    9
    30
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides persistent, scoped shared memory for collaborating AI agents, with tools for storing observations, semantic recall, and handoff workflows. Backed by PostgreSQL and exposed through MCP.
    1
    Apache 2.0