Skip to main content
Glama

delx-memory

Local-first persistent memory MCP server. One shared SQLite store any MCP-speaking agent (Claude Desktop, Cursor, Hermes, OpenClaw, Codex) can read and write — so context survives across sessions AND across tools.

npm version GitHub Release npm downloads status: beta license: MIT node: >=20 Verified Release Index

Why

Every chat client has its own ephemeral context. Quit the tab → preferences gone. Switch from Claude Desktop to Cursor → starting from scratch. Pin a side project in Hermes → invisible to the next agent.

delx-memory is a tiny MCP server that exposes a single shared SQLite file as a key/value memory layer. Any client that speaks MCP can read and write the same memory file → real continuity, real cross-tool context.

  • 15 tools — discovery + handoff + batch ops + FTS5 search + mutations gated by intent.

  • SQLite at ~/.delx-memory/db.sqlite (0700 dir, 0600 file).

  • Secret-blocking: refuses to store credential-shaped keys or values.

  • TTL support (lazy expiry on read).

  • Tags + prefix filters + FTS5 full-text search (bm25 ranking, stemming, diacritic folding; LIKE fallback if FTS5 is unavailable).

  • Mutations require explicit_user_intent: true so over-eager agents can't silently rewrite your context.

  • Zero telemetry. Zero phone-home. The file is yours.

Multi-agent namespaces

# Agent A
DELX_MEMORY_NAMESPACE=claude npx -y delx-memory

# Agent B (same machine, isolated keys)
DELX_MEMORY_NAMESPACE=cursor npx -y delx-memory

Keys are stored as namespace::key. Omit the env var for a single global store (default).

Footprint / lightweight mode

  • Default transport is lite: tools-only MCP over stdio without loading the MCP SDK (biggest RSS win for always-on agents).

  • Full SDK surface (prompts + resources): delx-memory --sdk or DELX_MEMORY_TRANSPORT=sdk.

  • Optional HTTP: delx-memory --http (Express + SDK; still loopback by default).

  • DELX_MEMORY_LEAN=1 applies to the SDK path only (skip prompts/resources).

  • doctor --json reports rss_kb. Dominant remaining cost is Node + native better-sqlite3 (no embeddings).

Community measurements (custom transport vs SDK) pointed at the SDK tree as the main overhead — see issue #7.

Related MCP server: agent-shared-memory

Install + run

# Run once (npx will download + boot)
npx -y delx-memory doctor

# Or install globally
npm install -g delx-memory
delx-memory doctor

The doctor command checks Node version, DB writability, and file permissions, then prints next steps.


HTTP (v2 stateless)

Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:

npx -y delx-memory --http
# GET  http://127.0.0.1:3030/health
# POST http://127.0.0.1:3030/mcp   (sessionless)

Env: DELX_MEMORY_HOST, DELX_MEMORY_PORT, DELX_MEMORY_TRANSPORT=http.

Wire it into your MCP client

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "delx-memory": {
      "command": "npx",
      "args": ["-y", "delx-memory"]
    }
  }
}

Then restart Claude Desktop. See examples/claude-desktop.json.

Cursor

Add to ~/.cursor/mcp.json. See examples/cursor.json.

Hermes

See examples/hermes.md.

OpenClaw

See examples/openclaw.md.

Codex CLI

See examples/codex.toml.


What makes it different (honest)

delx-memory

Typical cloud memory

Graph memory MCP

Data leaves your machine

No

Yes

Usually no

Multi-client same store

Yes (one SQLite)

Account-bound

Process-local

Agent mutation safety

explicit_user_intent

Varies

Rare

Secret storage

Hard-refused

Often allowed

Often allowed

Default RSS path

Lite (no MCP SDK)

N/A

Full stack

Multi-agent isolation

DELX_MEMORY_NAMESPACE

Tenants

Manual

Search

FTS5 bm25

Embeddings (cost/leak)

Graph walk

Not a vector DB. Not a second brain SaaS. Local continuity for agents that already have a model.

Tools (15)

Session start

Tool

Purpose

memory_handoff

One-call resume brief: stats + recent keys (optional values). Prefer this at session start.

memory_agent_manifest

Machine install/ops contract for agents.

memory_connection_status / memory_stats

Readiness + store size.

memory_capabilities / memory_data_inventory

Self-description for agents.

Reads

Tool

Purpose

memory_list

Keys only; filters: prefix, tag, since (delta sync).

memory_get / memory_get_many

Exact key or batch (max 50).

memory_search

FTS5 bm25 (+ LIKE fallback). See search quickstart.

Mutations (require explicit_user_intent: true)

Tool

Purpose

memory_set / memory_set_batch

Upsert one key or up to 50 in one transaction.

memory_forget / memory_forget_by_tag

Delete one key or by tag.

memory_export

Dump JSON / JSONL / Markdown.

Every mutation refuses to run unless the caller passes explicit_user_intent: true. The intent: an agent that decides on its own to update memory must show its work. The user can see the flag in the tool call and reject it if they didn't ask.


Privacy contract (read this)

delx-memory is NOT a secrets manager. Use macOS Keychain / gnome-keyring / Windows Credential Manager for those.

What we refuse to store:

  • Keys matching: oauth, token, secret, password, cookie, refresh, api_key, api-key, apikey, bearer, credential, session_id (case-insensitive).

  • Values matching credential shapes:

    • JWT tokens (eyJ…)

    • Bearer <token> headers

    • Stripe sk_live_… / sk_test_…

    • Slack xoxb-… / xoxp-… / etc.

    • GitHub github_pat_… / ghp_… / gho_… / ghs_… / ghr_…

    • OpenAI / Anthropic sk-… (with realistic length)

    • AWS access keys AKIA…

    • Authorization: <scheme> <token> strings

  • Nested objects are walked recursively — a nested field named refresh_token (even with an empty value) is rejected.

What stays local:

  • The DB file lives at ~/.delx-memory/db.sqlite.

  • Directory is created with mode 0700; file with mode 0600. (Best effort on Windows / WSL / non-POSIX filesystems.)

  • Nothing is uploaded. No telemetry. No phone-home.

What we do NOT promise:

  • Other users of the same machine (root, your sudo-using housemate) can read the file. Use full-disk encryption (FileVault, BitLocker, LUKS) if that matters.

  • TTL is best-effort. Expired rows are deleted lazily on next read; SQLite doesn't VACUUM automatically, so freed pages may sit on disk. For sensitive ephemera, treat the DB file like any other unencrypted dotfile.

  • No durability promise. Back up ~/.delx-memory/db.sqlite like any other dotfile if you care about losing it.


Example session

agent> memory_stats({})
→ { total_keys: 0, db_path: "/Users/me/.delx-memory/db.sqlite", … }

user> Remember that I prefer concise responses in pt-BR.

agent> memory_set({
  key: "user_preferences",
  value: { language: "pt-BR", verbosity: "concise" },
  tags: ["profile", "preferences"],
  explicit_user_intent: true
})
→ { action: "created", key: "user_preferences", … }

# … new chat, possibly different tool …

agent> memory_list({ tag: "preferences" })
→ [{ key: "user_preferences", updated_at: … }]

agent> memory_get({ key: "user_preferences" })
→ { found: true, value: { language: "pt-BR", verbosity: "concise" } }

Storage layout

Default path

~/.delx-memory/db.sqlite

Override

DELX_MEMORY_PATH env var

Directory mode

0700

File mode

0600

Schema

memory(key PRIMARY KEY, value, created_at, updated_at, ttl_expires_at, tags, metadata)

Indexes

partial index on ttl_expires_at, plus tags, updated_at

Per-value cap

64 KB (JSON-serialized)

Per-key cap

512 chars


CLI

delx-memory                Start MCP stdio server
delx-memory --http         Start local HTTP MCP server (127.0.0.1:3030)
delx-memory setup          Print MCP client config snippets
delx-memory setup --json   Print as JSON
delx-memory doctor         Health check + next steps
delx-memory doctor --json  Health check as JSON
delx-memory version        Print version

Environment

Var

Default

Purpose

DELX_MEMORY_PATH

~/.delx-memory/db.sqlite

DB file location

DELX_MEMORY_TRANSPORT

stdio

stdio or http

DELX_MEMORY_HOST

127.0.0.1

HTTP host

DELX_MEMORY_PORT

3030

HTTP port

DELX_MEMORY_ALLOWED_ORIGIN

http://HOST:PORT

CORS origin


Development

git clone https://github.com/davidmosiah/delx-memory
cd delx-memory
npm install
npm test         # typecheck + build + smoke + secret-detector + ttl + tag-delete + metadata

See AGENTS.md for repo conventions, SECURITY.md for the security model and reporting policy, and CONTRIBUTING.md for PR rules.


License

MIT © 2026 David Batista. Code of Conduct.

Skill or MCP

Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:

npx -y delx-memory call memory_connection_status --json '{}'

Copy skill/SKILL.md into your agent skills dir.

Available Tools

15 tools
memory_agent_manifestA
Read-onlyIdempotent

Machine-readable install and operating instructions for AI agents. Call first when onboarding. Supports privacy_mode documentation for read tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientYesgeneric

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the tool is known to be safe and idempotent. The description adds behavioral context by specifying it is machine-readable, to be called first, and that it supports privacy_mode documentation—details not in the annotations. There is 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 sentences, front-loading the core purpose ('Machine-readable install and operating instructions for AI agents') before adding usage guidance. Every sentence adds value with no redundancy, making it highly concise and well-structured.

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 tool with one parameter and no output schema, the description provides the essential usage context: when to call it and a special feature (privacy_mode). It lacks details on what the manifest contains or how to interpret it, but given the tool's simplicity and annotations covering safety, it is reasonably complete.

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?

Schema description coverage is 0%, meaning the description provides no explanation of the 'client' parameter. The description does not mention the parameter at all, leaving the agent to rely solely on the schema's enum and default. Since the description should compensate for low schema coverage but does not, the parameter semantics are poorly communicated.

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: it provides machine-readable install and operating instructions for AI agents. It also indicates it should be called first during onboarding, which is a clear directive. While it doesn't explicitly differentiate from siblings, the onboarding context and manifest nature make the purpose distinct enough.

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 explicitly says 'Call first when onboarding,' giving a clear when-to-use signal. It also mentions support for privacy_mode documentation, hinting at a specific use case for read tools. However, it does not state when not to use it or name alternative tools, though the manifest's role as an initial reference is implicit.

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

memory_capabilitiesB
Read-onlyIdempotent

Self-description of this MCP including privacy modes and mutation gating.

ParametersJSON Schema
NameRequiredDescriptionDefault
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, covering safety and idempotency. The description adds that it reports on 'privacy modes and mutation gating', which goes beyond the annotations and provides useful behavioral context. However, it does not elaborate on what these modes mean or how the mutation gating is represented, so it adds limited detail beyond the 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 a single sentence with no filler. It front-loads the core purpose ('self-description') and immediately names the key inclusions. Every word contributes to understanding the tool's role, making it highly efficient.

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 tool with one optional parameter and no output schema, the description is largely complete. It states the tool's purpose and key aspects (privacy modes, mutation gating), and the annotations cover read-only and idempotency. The only minor gap is that it does not indicate whether the output is a structured manifest or a free-text summary, but given the simplicity, this is acceptable.

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 description coverage is 100%, and the single parameter 'privacy_mode' is fully documented in the schema with its enum values and explanations. The tool description does not add any additional meaning beyond what the schema already provides, 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.

Purpose4/5

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

The description clearly identifies the tool as a self-description of the MCP, specifying it includes privacy modes and mutation gating. This distinguishes it from the sibling tools that perform memory operations (get, set, search, etc.), so an agent can tell it apart. It is not a tautology and names concrete aspects, though it could be more explicit about the exact return format.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It does not mention that it is suitable for discovering capabilities or checking mutation restrictions, nor does it exclude any scenario. An agent must infer its purpose from the description alone, which is minimal.

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

memory_connection_statusA
Read-onlyIdempotent

Local SQLite path readiness and size without reading entry values. Safe first call every session.

ParametersJSON Schema
NameRequiredDescriptionDefault
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds behavioral context beyond these: it is a lightweight check that does not read entry values and verifies path readiness and size. This is consistent with the annotations and adds value without contradiction.

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 that front-load the core purpose ('Local SQLite path readiness and size') and include a critical usage note ('Safe first call every session'). There is no wasted wording, making it highly efficient.

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 status-check tool with one optional parameter and no output schema, the description covers the essential behavior and usage guidance. It does not describe the return format, but for a readiness/size check an agent can reasonably infer a JSON status object. The absence of output schema reduces the need for detailed return documentation.

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 parameter privacy_mode is fully documented in the schema. The description does not add any additional meaning about the parameter, so it relies on the schema. 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 function: checking 'Local SQLite path readiness and size' while explicitly noting it does so 'without reading entry values'. This distinguishes it from data-access siblings like memory_get and memory_list. It could be more explicit about being a status/health check, but the purpose is 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 phrase 'Safe first call every session' provides clear usage context, recommending it as an initial lightweight check before other operations. It also implicitly differentiates from siblings by noting it avoids reading entry values, but it does not explicitly name alternatives or state when not to use it. This meets the 'clear context, no exclusions' level.

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

memory_data_inventoryA
Read-onlyIdempotent

Static inventory of memory domains, privacy modes and recommended first calls. No live value reads.

ParametersJSON Schema
NameRequiredDescriptionDefault
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint. The description adds the static nature ('Static inventory') and explicitly states 'No live value reads', which reinforces and extends the read-only behavior with useful context about the tool's non-dynamic character. This adds value beyond the 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?

A single sentence that is fully front-loaded with the core purpose and explicitly disclaims live reads. Every word contributes to understanding, with no filler or repetition.

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 optional parameter and no output schema. The description adequately conveys its purpose as a static inventory and mentions the key elements (domains, privacy modes, recommended first calls). It could specify the exact output structure, but given the simplicity and the fact that it's an inventory, the description is sufficiently complete for an agent to call it correctly.

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 has 100% coverage with a detailed description of the privacy_mode parameter. The tool description adds no additional information about the parameter beyond referencing privacy modes, so it does not go beyond what the schema already provides. 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 clearly states the tool provides a static inventory of memory domains, privacy modes, and recommended first calls, and explicitly differentiates it from live data reads. This distinguishes it from siblings like memory_get and memory_list, which likely perform dynamic reads.

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 getting an overview or starting point ('recommended first calls'), but does not explicitly state when to use it versus alternatives or when not to use it. There is no naming of sibling tools or exclusion conditions, leaving some ambiguity.

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

memory_exportA
Read-onlyIdempotent

Dump the memory store as JSON, JSONL, or Markdown. Optional since/until window on updated_at. Use for backup/inspection. Requires explicit_user_intent: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoUnix ms timestamp — include only entries with updated_at >= since.
untilNoUnix ms timestamp — include only entries with updated_at <= until.
formatYesOutput format: json (single object), jsonl (one entry per line), markdown (human-friendly).
explicit_user_intentYesMust be true. Set ONLY when the current user message explicitly asks the agent to modify memory (set/forget/export). Do not infer intent.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description does not need to restate these. It adds the behavioral detail of an optional since/until window and reinforces the explicit_user_intent requirement, which is already in the schema. Beyond that, it does not disclose additional behaviors like error handling or output structure, so it adds modest value over the 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 sentences with no redundant wording. The primary action and formats are front-loaded, followed by the optional filter and use case. Every sentence contributes essential information without fluff, making it efficient and easy for an agent to parse quickly.

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 read-only export tool with no output schema, the description covers the core purpose, formats, time filtering, and the explicit intent requirement. It does not describe the exact return structure, but the formats imply the output shape, and annotations cover the safety profile. Minor gaps like pagination or size limits are absent, but they are not critical for a dump operation. Overall, it is sufficiently complete for correct invocation.

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 all parameters are already well-documented in the input schema. The description adds a high-level summary of the time window and formats, but these are already captured in the property descriptions. With full schema coverage, the baseline is 3, and the description does not introduce new parameter semantics beyond what the schema provides.

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 dumps the memory store in three specific formats (JSON, JSONL, Markdown) and supports optional time filtering. This distinguishes it from sibling tools like memory_get or memory_list, which are retrieval-focused, by emphasizing export for backup/inspection. The verb 'dump' and resource are explicit and 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 specifies the intended use case ('Use for backup/inspection') which gives clear context for when to invoke it. However, it does not explicitly mention alternatives or exclusion criteria (e.g., when to use memory_list instead), leaving some room for inference. The guidance is sufficient but not exhaustive.

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

memory_forgetA
DestructiveIdempotent

Delete a single key from memory. Idempotent: returns existed=false if the key was not present. Requires explicit_user_intent: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesStable identifier for the memory entry. Free-form text. Treat as case-sensitive.
explicit_user_intentYesMust be true. Set ONLY when the current user message explicitly asks the agent to modify memory (set/forget/export). Do not infer intent.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds valuable context beyond annotations: it specifies idempotent behavior (returns existed=false if key absent) and the explicit_user_intent requirement. 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 a single, well-structured sentence that front-loads the primary action, then states idempotency and the intent requirement. Every word earns its place with no redundancy or fluff.

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 tool with two parameters, annotations covering destructive/idempotent behavior, and no output schema, the description is complete. It explains the return behavior (existed=false) and the prerequisite (explicit intent), which are the key facts an agent needs. Nothing critical is missing.

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 both parameters are already well-documented. The tool description does not add parameter-specific meaning beyond what the schema provides, only reiterates the explicit_user_intent requirement. This meets the baseline for full schema coverage but adds no extra value.

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 ('Delete a single key from memory') with a specific verb and resource. It distinguishes itself from sibling memory_forget_by_tag by explicitly focusing on a single key, and the parameter schema reinforces this.

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 clear context: it deletes a single key and requires explicit user intent. It does not explicitly mention when to use alternative tools like memory_forget_by_tag or memory_set, but the single-key focus makes the usage context clear. No exclusions are stated, but the intent requirement sets a boundary.

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

memory_forget_by_tagA
DestructiveIdempotent

Delete every entry carrying the given tag. Returns deleted_count. Requires explicit_user_intent: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesTag to bulk-delete.
explicit_user_intentYesMust be true. Set ONLY when the current user message explicitly asks the agent to modify memory (set/forget/export). Do not infer intent.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds the return value (deleted_count) and the explicit_user_intent requirement, which is beyond the annotations and provides important operational context. It also clarifies the scope ('every entry') but does not over-explain given the existing safety 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 with no filler. The primary action is front-loaded, and the return value and intent requirement are placed immediately after, making it easy for an agent to parse quickly.

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 destructive tool with no output schema, the description is complete: it specifies what is deleted, what is returned, and the required intent flag. No missing information would prevent an agent from invoking it correctly.

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 coverage is 100%, so the schema already documents both parameters with detailed descriptions. The description only restates the tag as 'every entry carrying the given tag' and repeats the intent requirement, adding no new semantic meaning beyond the 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 states a clear verb ('Delete'), a precise resource ('every entry carrying the given tag'), and the return value. This distinguishes it from sibling tools like memory_forget (single-entry) and memory_set, leaving no ambiguity about what the tool does.

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 bulk deletion by tag and requires explicit_user_intent, but it does not explicitly contrast with alternatives such as memory_forget or memory_set. The usage context is implied rather than stated, so the agent must infer when this tool is the right choice.

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

memory_getA
Read-onlyIdempotent

Exact key lookup. Returns the stored value plus timestamps, ttl, tags, metadata. Returns null if missing or expired. Optional privacy_mode=summary omits full values.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesStable identifier for the memory entry. Free-form text. Treat as case-sensitive.
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description adds useful context: it returns null for missing/expired entries and describes the effect of privacy_mode. This goes beyond the annotations without contradicting them.

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?

Three concise sentences with the core purpose front-loaded. No redundant phrasing, and every sentence adds meaningful information.

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 key-lookup tool with a single required parameter and optional privacy mode, the description covers behavior, return contents, and edge cases (missing/expired). Nothing critical is missing for correct invocation.

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 the baseline is 3. The description adds value by mentioning the return structure (timestamps, ttl, tags, metadata) and reinforces privacy_mode behavior, which is not fully captured in the schema. This merits a 4.

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 'Exact key lookup' which specifies the verb and resource, distinguishing it from sibling tools like memory_list and memory_search. It also details what the tool returns (value plus timestamps, ttl, tags, metadata) and behavior on missing/expired keys.

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 phrase 'Exact key lookup' implies use when you have a specific key, and the mention of privacy_mode provides a conditional usage option. While it doesn't explicitly exclude alternatives like memory_search, the context is clear enough for an agent to decide when to use this tool.

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

memory_get_manyA
Read-onlyIdempotent

Batch exact-key lookup (max 50). Missing keys omitted. Respects DELX_MEMORY_NAMESPACE.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYesExact keys to fetch (max 50). Missing keys omitted.
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnly and idempotent annotations, the description adds meaningful behavior: missing keys are omitted from results, the operation respects DELX_MEMORY_NAMESPACE, and the batch size is capped at 50. These are non-obvious details that materially affect how an agent interprets results.

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?

Three short, information-dense sentences with no filler. The core operation is front-loaded, followed by the most behaviorally relevant details (omission and namespace). Every clause earns its 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?

For a read-only batch lookup with fully documented parameters and safety annotations, the description covers all essential invocation details: operation type, key limit, missing-key behavior, and namespace handling. The schema fills in privacy_mode semantics, so nothing an agent needs to call this correctly is missing.

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 coverage is 100%, so the schema already fully documents both parameters. The description's 'max 50' and 'missing keys omitted' notes reinforce the keys parameter, and it adds the namespace context, but it does not add substantial new semantics beyond what the schema provides.

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 phrase ('Batch exact-key lookup') with an explicit resource and operation mode. It clearly distinguishes itself from siblings like memory_get (single lookup) and memory_search (non-exact search) by emphasizing exact-key batch semantics.

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 usage context clear: use when performing exact-key batch lookups, with a hard limit of 50 keys. It does not explicitly name alternatives or exclusions, but 'exact-key' strongly implies this is not for fuzzy or list-based retrieval.

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

memory_handoffA
Read-onlyIdempotent

Returns store stats + the most recently updated keys (optional values). Designed for session start: one call instead of stats+list+get fan-out. Namespace-aware.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitYesHow many recent keys to include in the handoff brief.
include_valuesYesIf true, include structured values (can be large). Default: keys + tags + timestamps only.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, covering safety and world assumptions. The description adds useful behavioral context: it is namespace-aware and can include optional values. No contradictions 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?

Three short sentences with no filler. It front-loads the return payload, then states the intended use case, then adds the namespace-aware behavior. Every sentence 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 two-parameter, read-only, idempotent tool with fully described schema properties, the description covers what it returns, when to use it, and its namespace behavior. It does not detail the shape of the 'stats', but no output schema exists and the tool is low-complexity.

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 baseline of 3 applies. The description's mention of 'optional values' loosely maps to include_values but adds no meaning beyond the schema's own parameter 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 uses a specific verb ('Returns') and a clear resource ('store stats + the most recently updated keys'), and it differentiates itself from siblings by positioning this as a consolidated session-start call rather than a stats+list+get fan-out.

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 states when to use the tool ('Designed for session start') and why it is preferable ('one call instead of stats+list+get fan-out'). However, it does not explicitly list exclusion cases or name the alternative sibling tools, so it stops short of full routing guidance.

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

memory_listA
Read-onlyIdempotent

List keys with optional prefix, tag, or since (updated_at) filter. Returns keys + timestamps + tags only — call memory_get for values. Scoped by DELX_MEMORY_NAMESPACE when set.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOnly return keys carrying this tag.
limitYesMax keys to return.
sinceNoUnix ms — only keys with updated_at >= since (session resume / delta sync).
prefixNoOnly return keys starting with this string.
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description carries the burden of explaining return behavior. The claim 'Returns keys + timestamps + tags only' contradicts the schema's privacy_mode parameter, which can return full entries in structured/raw modes. This misleading simplification is a significant transparency gap.

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 sentences with no wasted words. The core purpose and routing to memory_get are front-loaded, and the namespace scoping is a useful one-line addition.

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 covers the primary use case and points to the right sibling for values, but it omits any explanation of the privacy_mode parameter, which is central to the tool's output behavior. Combined with the misleading return statement, the description is incomplete for a tool with five parameters.

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?

Schema coverage is 100%, so the description adds little beyond what the schema already explains. The only added context (filters and return payload) is partially misleading because it ignores the privacy_mode parameter and misrepresents the default behavior. The description does not clarify how privacy_mode affects output, leaving agents with incorrect expectations.

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 lists keys with optional filters (prefix, tag, since) and explicitly differentiates itself from memory_get by noting it returns only keys, timestamps, and tags, not values. This is a specific verb+resource with clear scope and sibling distinction.

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 instructs to call memory_get for values, which is a clear alternative for a common use case. However, it does not mention other siblings like memory_search or memory_stats, so guidance on when to use this vs. those is absent.

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

memory_setA
Idempotent

Create or update a key in memory. Rejects credential-shaped keys or values. Requires explicit_user_intent: true. Returns whether the row was created or updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesStable identifier for the memory entry. Free-form text. Treat as case-sensitive.
tagsNoOptional list of tags for grouping/filter/bulk-delete.
valueYesThe value to store. Will be JSON-serialized. Rejected if it looks like a credential.
metadataNoOptional small JSON object with provenance/notes. Subject to same secret-detection rules.
ttl_secondsNoOptional TTL in seconds. After this, the entry is lazy-deleted on next read.
explicit_user_intentYesMust be true. Set ONLY when the current user message explicitly asks the agent to modify memory (set/forget/export). Do not infer intent.

TDQS

A4/5.0
Behavior4/5

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

Annotations already signal a mutating, idempotent write; the description adds useful behavior beyond that: credential-shaped keys/values are rejected, explicit user intent is mandatory, and the return value indicates created vs updated. 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?

Four short sentences, each carrying distinct information: purpose, rejection rule, intent requirement, and return value. There is no filler and the core purpose is front-loaded.

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 tool with six parameters, the schema is rich and the annotations cover safety/idempotency; the description fills the main remaining gap by stating the return behavior since there is no output schema. It could have mentioned TTL/tag/metadata behavior, but those are already fully documented in the schema.

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 baseline is 3; the description does not add parameter meaning beyond the schema. It mentions key, value, and explicit_user_intent only in passing, while tags, ttl_seconds, and metadata are left entirely to the schema.

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 clear verb and resource: 'Create or update a key in memory.' It is specific enough to identify the operation, though it does not explicitly differentiate from the sibling memory_set_batch or other memory tools.

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 a clear precondition: explicit_user_intent must be true, and the schema reinforces that it applies only when the user explicitly asks to modify memory. It does not name alternatives or state when not to use this tool instead of memory_set_batch, but the intent requirement supplies clear usage context.

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

memory_set_batchA
Idempotent

Upsert up to 50 entries in one SQLite transaction. One explicit_user_intent covers the batch. Rejects secret-shaped keys/values. Namespace-aware.

ParametersJSON Schema
NameRequiredDescriptionDefault
entriesYesUpsert up to 50 entries atomically in one transaction.
explicit_user_intentYesMust be true. Set ONLY when the current user message explicitly asks the agent to modify memory (set/forget/export). Do not infer intent.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as idempotent and non-destructive. The description adds genuinely useful behavioral context: secret-shaped keys/values are rejected, namespace awareness, and that a single explicit_user_intent covers the entire batch. This goes beyond the structured fields and enriches the agent's mental model without contradiction.

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 sentences, zero filler. The most important information (upsert, batch size, transaction) is front-loaded, and each clause earns its place by adding a distinct constraint or behavior.

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 batch mechanics, transaction semantics, intent requirement, secret handling, and namespace scope. It doesn't describe the return value or error cases, but given the lack of an output schema and the richness of the input schema and annotations, the description is sufficiently complete for an agent to call it 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 description coverage is 100%, so the schema already documents both parameters. The description adds value by clarifying that 'entries' is a batch upsert in one transaction and that 'explicit_user_intent' is batch-scoped, plus the secret-detection rule affecting values and metadata. These clarifications go beyond the schema's basic 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 ('Upsert up to 50 entries') and adds critical scoping details: the batch limit, atomic transaction, a single intent covering the batch, secret-shape rejection, and namespace awareness. It clearly distinguishes this from the single-entry sibling memory_set and other memory tools.

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 batch use and atomicity, and the sibling list makes the contrast with memory_set obvious, but it never explicitly states when to prefer this over alternatives (e.g., 'use when you need to write multiple entries atomically'). It also doesn't mention any exclusions or prerequisites.

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

memory_statsA
Read-onlyIdempotent

High-level stats about the local memory store. Safe to call first on every session to gauge whether the store is empty, small, or large.

ParametersJSON Schema
NameRequiredDescriptionDefault
privacy_modeNosummary = keys/meta without full values; structured/raw = full entries (local store parity).structured

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description's 'Safe to call' aligns with that without adding new safety info. The description adds context about the outcome (size category) but does not describe return format, granularity, or edge cases. Given the annotations cover the safety profile, a 3 is appropriate.

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, tightly written sentence that leads with the core purpose and then adds the key usage guidance. There is zero wasted wording, and the most important information (what it does and when to use it) is front-loaded.

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 tool with one optional parameter and no output schema, the description covers the essential points: what it provides (high-level stats) and a canonical use case (first call). It does not explicitly differentiate from memory_data_inventory or memory_capabilities, but the size-assessment focus is enough for most agents to select it correctly. A mention of output shape or a contrast with siblings would make it more complete.

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 fully documents the privacy_mode parameter with a detailed description covering all enum values and their behavior. The tool description itself does not mention the parameter, but the schema provides 100% coverage, so the baseline of 3 applies. No additional meaning is added by the description.

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 states the tool provides 'high-level stats about the local memory store' and clarifies its purpose to gauge store size ('empty, small, or large'). This is clear and specific, though it lacks an explicit verb like 'retrieve' or 'get'. It does not explicitly contrast with siblings like memory_data_inventory or memory_capabilities, which could be confused, but the size-gauge focus gives a distinct angle.

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 a clear when-to-use instruction: 'Safe to call first on every session to gauge whether the store is empty, small, or large.' This provides a concrete use case. It does not mention when not to use it or name alternatives, but the guidance is actionable and distinguishes it as an initial assessment tool.

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

TDQS

A3.8/5.0
Disambiguation3/5

Core data operations are distinct, but the six introspection/status tools (agent_manifest, connection_status, data_inventory, capabilities, stats, handoff) overlap in purpose—several report store size or describe privacy modes, and handoff explicitly subsumes stats+list+get. Detailed descriptions mitigate confusion but don't fully eliminate it.

Naming Consistency3/5

All tools share a consistent memory_ snake_case prefix, but the set mixes noun-style names (memory_stats, memory_handoff, memory_capabilities) with verb-style names (memory_get, memory_set, memory_forget). The prefix keeps it readable, but there is no consistent verb_noun pattern.

Tool Count4/5

15 tools is within the acceptable range for a memory server, and batch/search/export variants earn their place. It feels slightly heavy because several status/introspection tools could be consolidated (e.g., stats vs connection_status vs handoff).

Completeness5/5

Full lifecycle coverage is present: set/upsert, single and batch get, list/search, forget/forget_by_tag, export, and session-start handoff. Batch operations, namespace awareness, and privacy modes round out the surface with no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.
    6
    1
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to share persistent memory via an MCP server using SQLite, supporting multi-tenant, categorized knowledge with TTL and semantic links, without requiring vector databases.
  • A
    license
    B
    quality
    A
    maintenance
    Local-first memory for MCP clients. It provides shared durable memory without requiring hosted accounts, vector databases, or API keys, and works with Codex, Claude Code, Cursor, and other MCP clients.
    25
    702
    3
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/davidmosiah/delx-memory'

If you have feedback or need assistance with the MCP directory API, please join our Discord server