Skip to main content
Glama
Oleg67

halflife-mcp

by Oleg67

halflife-mcp

Local long-term memory for AI agents, served over MCP. It runs on your own laptop: no account, no cloud service, no telemetry. Works with any MCP client that can launch a stdio server, such as Claude Code, Claude Desktop, Cursor, Zed or VS Code.

The agent gets five kinds of memory:

Kind

Holds

Fades (half-life)

preference

how you like things done ("use uv, not pip")

180 days

procedural

workflows that worked ("release = tag, then make release")

365 days

fact

durable facts not in the code or docs

180 days

episodic

what happened in a past task: goal, decisions, open items

30 days

trace

short-lived log of files/commands, for resuming work

7 days, deleted after 30

Memories you use get reinforced and stay. Unused ones fade and are archived: moved, never silently deleted. Inferred memories stay provisional (hidden) until confirmed. A correction supersedes the old memory instead of contradicting it.

Install

You need uv. Then add the server to your client.

Claude Code

claude mcp add memory --scope user -- uvx halflife-mcp

Claude Desktop (Settings → Developer → Edit Config → claude_desktop_config.json), Cursor (~/.cursor/mcp.json) and most other clients use the same shape:

{
  "mcpServers": {
    "memory": {
      "command": "uvx",
      "args": ["halflife-mcp"]
    }
  }
}

If the client can't find uvx, put its absolute path in command (which uvx).

Local HTTP mode

For clients that connect by URL instead of launching a command, run the server yourself:

uvx halflife-mcp serve --http  # http://127.0.0.1:8765/mcp
claude mcp add --transport http memory http://127.0.0.1:8765/mcp  # e.g. Claude Code

There is no authentication, so it listens on loopback only: other machines can't reach it. Requests whose Host or Origin isn't local are rejected, which stops a web page from talking to it. --port changes the port. A non-loopback --host is refused unless you pass --allow-network; don't use that flag on a network you don't control.

claude.ai (web/mobile) can't use this. Its custom connectors are called from Anthropic's servers, so they can't reach your localhost. They need a public HTTPS URL with authentication, which this project doesn't provide.

The default install is light: keyword (BM25) and graph search, with no ML dependencies. For semantic matching (finding "k8s workloads" from a memory about "the kubernetes cluster"), use the vector extra:

"args": ["--from", "halflife-mcp[vector]", "halflife-mcp"]

This adds fastembed (ONNX, CPU only). The first start downloads a 65 MB model (BAAI/bge-small-en-v1.5); after that it runs offline. Existing memories are embedded automatically.

Related MCP server: heropen

Tools

Tool

What it does

memory_brief(scope?)

Start-of-task pack: top preferences and procedures, the strongest facts, recent episodes (capped at 8/6/5/3)

memory_recall(query, scope?, k?, kinds?)

Hybrid search: keyword + vector + graph, fused by reciprocal-rank fusion. Read-only

memory_remember(kind, content, scope?, description?, provisional?, contradicts?, entities?, relations?, source?)

Store a memory; a near-duplicate reinforces the existing one instead

memory_reinforce(id)

A memory was confirmed or useful: confidence up, decay reset, provisional → active

memory_forget(id)

Permanently delete (file, graph, archived copy, index)

memory_get(id) / memory_list(scope?, kind?, status?) / memory_stats()

Inspect

The server sends the model instructions on when to use each tool. It should call brief and recall at the start of a task, remember preferences when you state them, write an episode at the end, and forget on request. Memory only works as well as the model follows them, because an MCP server can't see the conversation. If memory isn't being used, tell the agent "check your memory" or "remember that…".

Scope. Pass the project path as scope and it is normalized to the git root, so subfolders share one project memory. Omit it, or use global, for things that apply everywhere. Project queries include global memories but not other projects' memories. Scope keeps memory organized; it is not access control: any connected client can ask for any scope, and project paths that differ only in punctuation (my-app, my_app) share one scope.

Where your data lives

OS

Default location

Linux

~/.local/share/halflife (or $XDG_DATA_HOME/halflife)

macOS

~/Library/Application Support/halflife

Windows

%APPDATA%\halflife

Set HALFLIFE_HOME to put it elsewhere, for example a synced folder.

memories/<scope>/<name>.md            one memory per Markdown file: readable, editable, greppable
memories/<scope>/_graph/<name>.json   its entities and relations
memories/<scope>/_archive/            faded and superseded memories
index.sqlite3                         derived index (SQL, vectors, graph); rebuildable
models/                               embedding model (vector extra only)

The Markdown files are the source of truth. Edit or delete them by hand and the index catches up on the next call. halflife-mcp rebuild recreates the index from the files.

Privacy

  • Memories are stored only on your machine, and the server makes no network calls apart from the one-time model download with the vector extra. But whatever the agent recalls goes into its prompt, so a client that uses a cloud model sends those memories to its provider.

  • Writes that look like secrets are refused, not redacted. That covers API keys, tokens, passwords, private keys, user:pass@ URLs and JWTs.

  • memory_forget deletes for real, including archived copies.

  • The data directory is created with mode 0700.

CLI

uvx halflife-mcp stats              # what's stored, where
uvx halflife-mcp brief --scope ~/code/my-app
uvx halflife-mcp recall "how do we deploy" --scope ~/code/my-app
uvx halflife-mcp maintain           # archive faded, expire traces
uvx halflife-mcp rebuild            # rebuild the index from files

Configuration

Variable

Default

HALFLIFE_HOME

per-OS path above

data directory

HALFLIFE_EMBED

on (if the extra is installed)

off disables vector search

HALFLIFE_EMBED_MODEL

BAAI/bge-small-en-v1.5

another fastembed model (recall thresholds are tuned for the default)

Development

uv venv && uv pip install -e ".[vector]" pytest anyio
.venv/bin/python -m pytest -q

uvx --from <local path> caches the built package. After changing the code, run it once with uvx --no-cache --from …, or use the editable venv's .venv/bin/halflife-mcp as the client command.

License

Apache License 2.0; see the LICENSE file.

Available Tools

8 tools
memory_briefA
Read-only

What to know before starting work: the top preferences (up to 8) and procedures (6), the strongest facts (5) and the most recent episodes (3) for this scope (plus global). Bodies are clipped; use memory_get for a full memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered, but the description adds genuine behavioral context: result counts are capped, bodies are clipped rather than complete, and results span the given scope plus global. That clipping/cap behavior is exactly the kind of trait annotations cannot express.

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

Conciseness4/5

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

Two tight sentences: the use-case framing and result composition come first, followed by the clipping caveat and the alternative tool. Every clause carries information, though the parenthetical count list, while informative, makes the sentence dense.

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?

An output schema exists so return structure need not be explained, yet the description still usefully previews contents and limits. For a one-parameter, non-destructive aggregation tool, the only real gap is the default/null scope behavior.

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 single scope parameter has 0% schema description coverage, so the description must carry the burden. It clarifies that results include the given scope plus global memory, which is real added meaning, but it never explains what happens when scope is null (the default) or what a valid scope value looks like.

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 specifies exactly what the tool returns (top preferences up to 8, procedures 6, strongest facts 5, recent episodes 3) and routes to the sibling memory_get for full bodies, so it is distinguishable from other memory tools. It lacks an explicit verb ("retrieve"/"summarize"), framing the purpose as contents rather than an action, which keeps it just short of a 5.

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?

"What to know before starting work" gives a clear situational context, and it explicitly names the alternative memory_get with the condition for using it (when full bodies are needed). It does not distinguish itself from memory_recall or memory_list, so the when-not guidance is partial rather than complete.

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

memory_forgetA
Destructive

Permanently delete a memory (file, graph, archived copy, index). Only when the user asks to forget something.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 readOnlyHint=false. The description reinforces this by emphasizing 'Permanently' and enumerating the artifacts destroyed, which adds useful consequence context beyond the boolean. It doesn't cover auth or reversibility guarantees, hence a 4.

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 tight sentences, front-loaded with the destructive nature and the usage gate; nothing wasted.

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?

Output schema exists, so return values needn't be explained, and the safety profile is covered by annotations. The main missing piece is what the id refers to and how to find it before calling a destructive operation.

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?

One parameter 'id' with 0% schema description coverage, so the description must compensate—and it doesn't mention what the id is (file id, graph id, memory id?) or how to obtain it. This is a real gap for identifying the target object.

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?

'Permanently delete a memory' states a specific verb and resource, and the parenthetical enumerates exactly what gets removed (file, graph, archived copy, index), distinguishing it from read siblings like memory_recall and memory_get.

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 qualifier 'Only when the user asks to forget something' gives a clear gate on when to use it, effectively signaling when-not. It doesn't point to a specific alternative, but the constraint is actionable.

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

memory_getB
Read-only

One memory in full, with its metadata and graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the payload includes metadata and the graph, which tells the agent the response is heavier than a brief lookup, but it says nothing about permissions, missing-id behavior, or traversal cost.

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

Conciseness4/5

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

A single short fragment with no filler, and the key scope word ('One') is front-loaded. It is a sentence fragment lacking a verb, which slightly undercuts readability but not efficiency.

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?

An output schema exists, so return values need not be explained, and the tool is a simple one-parameter lookup. However, with 0% schema coverage on the id and no usage routing among seven siblings, the definition is only minimally 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% and the single 'id' parameter carries no description in the schema. The description only implies 'one memory' is identified by something; it never states the identifier format (UUID, slug, composite) or whether a missing id errors or returns null.

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 phrase 'One memory in full, with its metadata and graph' names a specific resource and scope (a single memory), which distinguishes it from list/brief siblings by implication. It never names a sibling explicitly, so an agent must infer the boundary with memory_list or memory_recall rather than being told.

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?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives among the seven sibling tools. The agent is left to guess that this is the 'fetch by id' path rather than a search path.

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

memory_listA
Read-only

List memories of a scope (plus global), newest first. status: active | provisional. Use when the user asks what you remember.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
limitNo
scopeNo
statusNoactive

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: results are ordered newest first and the scope implicitly includes global memories. It does not mention pagination or what happens when no scope is supplied.

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

Conciseness4/5

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

Two short sentences plus a fragment, with the core behavior front-loaded and no filler. The 'status: active | provisional' fragment is telegraphic rather than a clean sentence, but it earns its space by documenting an undocumented enum-like parameter.

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?

An output schema exists, so return values need no explanation, and annotations cover the safety profile. Still missing for a 4-parameter tool: the meaning of 'kind', the limit/pagination behavior, and any routing guidance among the seven sibling memory tools.

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 0%, so the description must carry the load. It explains 'scope' (includes global) and 'status' (active | provisional), but 'kind' and 'limit' are left entirely undefined in both the schema and 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?

States a specific verb and resource ('List memories'), scopes it ('of a scope (plus global)'), and specifies ordering ('newest first'), so the operation is unambiguous. It stops short of differentiating itself from siblings like memory_recall or memory_get, which an agent must infer from the name alone.

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?

Gives one explicit trigger: 'Use when the user asks what you remember.' That is clear context, but there are no exclusions or pointers to alternatives, and it overlaps conceptually with memory_recall and memory_get without explaining which to pick.

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

memory_recallA
Read-only

Search memory with hybrid keyword + vector + graph ranking. query: a short description of the task or question (names of files, tools and projects help). kinds defaults to all except trace. Returns the best matches, best first, with the signals that found them. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNo
kindsNo
queryYes
scopeNo
include_provisionalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the trailing 'Read-only' is largely redundant. What the description does add is genuine behavioral context beyond the annotations: the ranking is hybrid keyword/vector/graph, results are ordered best-first, and matched results carry the signals that surfaced them, plus the non-obvious default that 'kinds' excludes trace.

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?

Five tight sentences, no filler, and the core capability is front-loaded before the per-parameter notes. Every clause carries information an agent can act on.

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?

An output schema exists, so return-value detail is unnecessary, and the description's note about best-first ordering is sufficient. But for a 5-parameter tool with 0% schema description coverage, leaving k, scope, and include_provisional entirely undefined is a real completeness gap.

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 0%, so the description carries the full parameter burden, and it only partially does: it explains what to put in `query` (task/question phrasing, including file/tool/project names) and the default behavior of `kinds`. The three remaining parameters (k, scope, include_provisional) get no explanation anywhere.

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?

States a specific verb ('search memory') plus the retrieval mechanism ('hybrid keyword + vector + graph ranking'), which separates it from get/list/brief siblings at a glance. It stops short of naming an alternative explicitly, so a 4 rather than a 5.

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?

Usage is implied by the query guidance ('a short description of the task or question'), which tells the agent what kind of input fits. However there is no explicit when-to-use vs when-not, and nothing routes the agent between recall and memory_get, memory_list, or memory_brief.

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

memory_reinforceA

A memory was confirmed or proved useful: raises its confidence, resets its decay and activates it if provisional.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations only declare the mutation/safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false); the description goes beyond them by disclosing the actual state changes — confidence increase, decay reset, provisional activation. It does not explain whether repeated calls stack confidence or what happens to an already-active memory, which would be the remaining behavioral 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?

A single sentence that leads with the trigger condition and then the effects. No filler, no repetition of the tool name, nothing to cut.

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?

An output schema exists, so return values need not be described, and annotations carry the safety profile. The description covers the observable effects well; only the unidentified id parameter and idempotency/stacking behavior leave a small gap.

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?

There is a single required parameter, id, with 0% schema description coverage, and the description never mentions it — not what a memory id looks like, nor where to obtain one. The description fails to compensate for the schema gap, so this sits below the 3 baseline.

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 names the operation (reinforce a memory) and spells out three concrete effects: raises confidence, resets decay, activates if provisional. It is clearly distinct from memory_recall/remember/forget in substance, but it never explicitly names or contrasts a sibling tool.

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 opening clause 'A memory was confirmed or proved useful' implicitly states the triggering condition, which is real usage context. However, it offers no explicit when-to-use vs. when-not guidance and never routes the agent to or away from alternatives such as memory_remember or memory_recall.

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

memory_rememberA

Store one memory. kind: preference | procedural | fact | episodic | trace. content: the memory itself, short (for preference/procedural include why and how to apply). description: one keyword-rich line (used for matching; defaults to the first line). provisional: true when inferred rather than stated by the user. contradicts: id of a memory this one replaces. entities: [{"name", "type"}] for the specific files/tools/projects/people/concepts it is about (type: file, repo, tool, library, service, person, concept, ticket, command, project, organization). relations: [{"src", "rel", "dst"}] between those entities (rel: uses, depends_on, part_of, configures, fixed, caused, contradicts, supersedes, related_to, owns, prefers). source: where it came from (URL, file path). A near-duplicate reinforces the existing memory instead of creating a new one.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
nameNo
scopeNo
sourceNo
contentYes
entitiesNo
relationsNo
confidenceNo
contradictsNo
descriptionNo
provisionalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly=false, destructive=false, openWorld=false), so the bar is lower, and the description adds real behavior: near-duplicates reinforce instead of creating a new memory, description defaults to the first line, and contradicts replaces an existing memory. It omits what happens on write failure or how the returned id is used.

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

Conciseness4/5

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

Front-loads the core action, then uses compact per-field clauses with no filler; every line maps to a parameter or behavior. It is dense and list-like but appropriate for an 11-parameter tool.

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?

With an output schema present, return values need not be described, and the description compensates well for 0% schema coverage by documenting most fields and the dedup/replacement behavior. The unaddressed name, scope, and confidence parameters keep it from being fully 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?

Schema coverage is 0%, so the description carries the full burden and does most of it, defining kind values, content expectations, description, provisional, contradicts, entities (with allowed types), relations (with allowed rel values), and source. However, three parameters (name, scope, confidence) are never explained, leaving a real gap.

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?

Opens with a specific verb+resource ('Store one memory') and enumerates the kind taxonomy, so the agent knows exactly what is being written. It does not explicitly contrast with the closest sibling memory_reinforce, though the near-duplicate note gestures at it.

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?

Usage is implied rather than stated: the kind list and the 'provisional: true when inferred rather than stated' note hint at when to write, but there is no explicit when-to-use/when-not or routing to memory_recall/memory_forget. Adequate but leaves the agent to infer intent.

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

memory_statsB
Read-only

Counts per scope, kind and status; where the data lives; whether vector search is on.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 and openWorldHint=false, so the safe-read profile is covered. The description adds useful context about what the stats include (scope/kind/status counts, storage location, vector-search status), but since an output schema exists this is largely a peek at return values rather than deep behavioral disclosure.

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

Conciseness4/5

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

A single terse sentence with semicolon-separated facets and no filler; the most important element (counts per scope/kind/status) is front-loaded. It is a noun-phrase fragment rather than a full clause, but nothing is wasted.

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 zero-parameter, read-only stats tool with an output schema present, the description need not detail return format. It covers what the tool reports and its safety profile implicitly via annotations, leaving only usage routing unaddressed.

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 takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify about inputs, and schema coverage is trivially 100%.

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?

States a specific resource (memory statistics) and enumerates the dimensions counted: per scope, kind, and status, plus storage location and vector-search state. It is clearly distinct from siblings like memory_recall, memory_list, or memory_remember, though it does not explicitly name any alternative.

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 when-to-use guidance is given beyond the implicit fact that this is a stats/inspection tool. There is no mention of prerequisites, when to prefer it over memory_list or memory_brief, or any exclusions.

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. 8 tool updatesv0.1.1
    • First observedmemory_brief
    • First observedmemory_forget
    • First observedmemory_get
    • First observedmemory_list
    • First observedmemory_recall
    • First observedmemory_reinforce
    • First observedmemory_remember
    • First observedmemory_stats

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation4/5

The verbs are largely distinct: remember/get/forget/reinforce/stats are unambiguous. However, memory_recall, memory_list, and memory_brief all surface memories and could be confused—recall is query-driven search, list is scoped enumeration, and brief is a curated pre-work digest. The descriptions do clarify the boundary, so it's a minor overlap rather than a real ambiguity.

Naming Consistency5/5

Every tool uses the same memory_ prefix followed by a short, readable suffix (recall, reinforce, forget, get, list, stats, brief, remember). The pattern is uniform throughout with no casing or convention drift.

Tool Count5/5

Eight tools is well-scoped for a memory subsystem, with each tool earning its place (store, search, get, list, stats, reinforce, forget, brief). Nothing feels padded or missing.

Completeness5/5

The lifecycle is fully covered: create (remember), read (get/list/recall/brief), reinforce, and delete (forget), plus stats. Updates are handled via the contradicts/supersedes fields and reinforcement, so there is no dead end for the memory domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides a local, persistent long-term memory service for MCP-compatible AI agents, enabling them to store, search, and recall information across sessions.
    1
    GPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    A local memory server for AI agents that stores and retrieves information via MCP, keeping all data in SQLite on your machine.
    310 PyPI
    1
    Apache 2.0
  • A
    license
    C
    quality
    A
    maintenance
    Provides AI agents with a human-inspired memory layer via MCP, enabling episodic and semantic memory recall, forgetting curves, consolidation, and contradiction detection. It integrates with MCP clients to offer local-first, dependency-free memory management.
    98
    1
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    Local-first, governable long-term memory for AI agents. Provides SQLite-backed storage, cross-session recall, and traceable memory corrections through a standard MCP interface.
    40
    1
    MIT