Skip to main content
Glama

🧠 MemCurve

Persistent memory for AI assistants β€” with forgetting curves, decay, and graph clustering.

Python License MCP Domain

CortexGraph MCP server. Stores memories as a weighted knowledge graph, decays stale nodes via configurable half-life, clusters related memories, and surfaces the right context at the right time through activation-pattern retrieval.


🧠 What Is This?

For non-technical readers: Most AI assistants have no persistent memory β€” every conversation starts completely blank. MemCurve gives an AI assistant long-term memory that works like human memory: important things are remembered more strongly, rarely-accessed memories fade over time, and related memories are grouped together so that recalling one makes nearby ones more accessible. It exposes this memory system to AI tools via a standard protocol (MCP), so any compatible assistant can use it.


Related MCP server: my-memory-mcp

πŸ—οΈ CortexGraph Architecture

MemCurve implements the CortexGraph memory system β€” a weighted knowledge graph where nodes are memory entities, edges encode semantic relationships, and node weights decay over time according to configurable half-life schedules. Retrieval uses activation spreading: querying one node activates its neighbors with diminishing strength, surfacing contextually related memories.

πŸ’¬ Conversation / Tool Call
         β”‚
         β–Ό
πŸ” Entity Extraction & Message Analysis
   Detects entities, topics, facts, and relationships
   worth persisting in the memory graph
         β”‚
         β–Ό
🧠 CortexGraph (Weighted Knowledge Graph)
   β”œβ”€β”€ Nodes: memories, facts, entities
   β”œβ”€β”€ Edges: semantic relations + co-occurrence weights
   └── Node weights: decay via half-life schedule
         β”‚
         β”œβ”€β”€ ⏱️  Background Decay Process
         β”‚       Stale memory weights decay exponentially
         β”‚       GC prunes nodes below activation threshold
         β”‚
         └── πŸ”— Memory Clustering
                 Related nodes grouped into clusters
                 for efficient neighborhood retrieval
         β”‚
         β–Ό
πŸ”Ž Activation-Pattern Retrieval
   Query activates seed nodes, spreads to neighbors
   Returns ranked memory context for generation

πŸ”¬ Technical Design

Half-Life Decay β€” Memory node weights decay exponentially over time: w(t) = wβ‚€ Γ— (Β½)^(t/Ο„) where Ο„ is the configurable half-life. Frequently accessed memories are "touched" (weight refreshed) on each recall, preventing useful information from decaying. The decay function is calculated by cortexgraph.core.decay.calculate_halflife and runs on a background scheduler.

MCP Tool Surface β€” CortexGraph exposes memory operations as MCP tools that any compatible AI client can call:

Tool

Purpose

save

Persist a new memory entity to the graph

search

Semantic search over memory nodes

search_unified

Combined graph traversal + semantic search

auto_recall_tool

Context-aware memory retrieval based on current conversation

analyze_message

Extract entities and facts worth saving from a message

cluster

Group related memories into topic clusters

consolidate

Merge redundant or contradictory memory nodes

gc

Prune decayed nodes below activation threshold

promote

Boost a memory node's weight (mark as important)

touch

Refresh a node's decay timer without modifying weight

Activation Spreading β€” On search_unified, queried seed nodes activate their graph neighbors with weight proportional to edge strength Γ— query relevance. This surfaces associated memories without requiring exact semantic match β€” related context emerges from graph structure.

Security Layer β€” The server includes secret scanning on config files (should_warn_about_secrets) and enforces secure storage paths (ensure_secure_storage) before starting β€” preventing accidental exposure of API keys in the memory store.


πŸš€ Getting Started

git clone https://github.com/nathaniel-gordon/memcurve
cd memcurve
pip install -e .

Start the MCP Server

python -m cortexgraph

Visualize the Memory Graph

python scripts/visualize_graph.py

Convert to MCP Memory Format

python scripts/convert_to_memory_mcp.py

πŸ“ Project Structure

memcurve/
β”œβ”€β”€ src/cortexgraph/
β”‚   β”œβ”€β”€ server.py           # MCP server entrypoint & tool registration
β”‚   β”œβ”€β”€ context.py          # Shared db & mcp context
β”‚   β”œβ”€β”€ config.py           # Half-life and decay configuration
β”‚   β”œβ”€β”€ background.py       # Background decay scheduler
β”‚   β”œβ”€β”€ performance.py      # Performance monitoring
β”‚   β”œβ”€β”€ activation/         # Activation spreading & entity extraction
β”‚   β”‚   β”œβ”€β”€ detectors.py
β”‚   β”‚   β”œβ”€β”€ entity_extraction.py
β”‚   β”‚   └── patterns.py
β”‚   β”œβ”€β”€ tools/              # All MCP tool implementations
β”‚   └── security/           # Secret scanning & secure storage enforcement
└── scripts/

Built by Nathaniel Gordon

Available Tools

17 tools
analyze_for_recallA

Analyze message for recall/search intent.

Args: message: User message text.

Returns: Dict with: should_search, confidence, suggested_query, suggested_tags, suggested_entities, reasoning, phrase_signals.

Raises: ValueError: Invalid input.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description must carry the safety and behavior burden. It does disclose the output contract and the ValueError condition, which is helpful, but it does not state whether the tool is read-only, whether it performs side effects, or any auth/rate constraints.

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 compact docstring: one summary sentence plus Args/Returns/Raises sections that each add useful information. No filler or redundancy.

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

Completeness4/5

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

Given a single required parameter, an output schema, and an enumerated return dict, the description is nearly complete for invocation. It is only slightly incomplete by not explaining how this tool fits with siblings such as analyze_message or search_memory.

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?

Input schema coverage is 0%, so the description's 'message: User message text' is the only semantic guidance. It clarifies that the parameter is the user's message text, but adds no constraints or format details; this is adequate but minimal for a single string parameter.

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 opening line 'Analyze message for recall/search intent' names a specific verb, resource, and intent. This clearly separates it from the generic sibling analyze_message, and the returned should_search field confirms the recall-specific purpose.

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 when to use it: when a message needs recall/search intent analysis. However, it never names alternatives like analyze_message or says when not to use this tool, so routing decisions are left to inference.

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

analyze_messageB

Analyze message for memory-worthy content.

Args: message: User message text.

Returns: Dict with: should_save, confidence, suggested_entities, suggested_tags, suggested_strength, reasoning, phrase_signals.

Raises: ValueError: Invalid input.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose the return shape and that ValueError can be raised, which is useful. However, it does not explicitly state whether the tool has side effects or whether it only returns a suggestion, although the 'should_save' return field weakly implies it does not persist anything.

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?

The description is compact and uses a clear docstring structure with Args, Returns, and Raises. The opening sentence is front-loaded and immediately states the tool's purpose. The Raises line is terse ('Invalid input') and somewhat vague, but the overall structure is efficient and scannable.

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 single input, the output dict keys, and the error condition, so a caller can invoke the tool with a message and understand the return value. It is incomplete in the context of sibling tools because it does not explain the relationship to save_memory or when to prefer this over other memory-analysis tools. For a one-parameter pure-analysis tool, this is adequate but not comprehensive.

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 compensate for the single parameter. It adds 'User message text' to message, which provides minimal semantic context beyond the schema's type and title. The parameter is simple and self-explanatory, but no format, constraints, or examples are given.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Analyze message for memory-worthy content.' It clearly indicates that this tool evaluates a message rather than saving it, which differentiates it from siblings like save_memory. It could be stronger by explicitly distinguishing it from analyze_for_recall_process, but the core purpose is clear.

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

Usage Guidelines2/5

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

The description does not state when to use this tool versus alternatives such as save_memory, analyze_for_recall_process, or search_memory. The purpose implies it should be used to decide whether something is worth saving, but that is left to inference. No explicit when-to-use or when-not-to-use guidance is provided.

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

auto_recall_process_messageC

Automatically recall and reinforce memories related to message topics.

Args: message: User message to analyze (non-empty string).

Returns: Dict with success, enabled, topics_found, memories_found, memories_reinforced, mode, and message.

Raises: ValueError: If message is empty or invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the Description carries the full burden of behavioral disclosure. The Returns section partially fills this gap by listing success, enabled, topics_found, memories_found, memories_reinforced, mode, and message as output fields, and the Raises section mentions ValueError for empty input. However, it does not clarify the 'mode' behavior, whether 'enabled=False' means the tool is turned off, or the exact side effects of reinforcementβ€”leaving the tool's runtime behavior only partially transparent. Additionally, the Description is internally corrupted with unrelated schema text, raising trust concerns about its reliability.

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

Conciseness3/5

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

The Args/Returns/Raises structure is readable and efficient for the core content. However, the Description contains a long, seemingly accidental concatenation of unrelated text ('schema_description_coverage ... <span style...>'), which severely harms readability. Without this corruption, the structure would warrant a 4; as presented, the excessive and jumbled text brings it down to a 3.

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

Completeness2/5

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

There is an output schema, which helps clarify return values, and the Raises clause covers error conditions. Yet the lack of annotations combined with the missing behavioral context (what 'mode' means, when 'enabled' is false, what exactly 'reinforce' does) means the Description does not fully equip an agent to correctly invoke the tool. The corrupt text further degrades confidence, leaving this definition incomplete for a tool with 1 parameter and notable behavioral nuances.

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%, so the schema already documents 'message' minimally as a string. The Description adds 'message: User message to analyze (non-empty string)', which does provide semantic value beyond the schema by specifying the required non-emptiness. However, this is the only parameter, and the Description is cluttered with the corrupted schema-coverage text, which works against the otherwise reasonable parameter documentation.

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 title 'Automatically recall and reinforce memories related to message topics' was very informative, but the actual Description text is corrupted with a concatenation of unrelated words ('schema_description_coverage... title...'). The verb 'recall and reinforce memories' clearly describes what the tool does. However, the Description text quality is compromised by this corruption. The tool name 'auto_recall_process_message' is descriptive, and the core intent is clear, but the Description's clarity is obscured by the extraneous string.

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?

The Description provides no explicit guidance on when to use this tool versus any alternatives. The Args/Returns/Raises sections describe the mechanicsβ€”analyzing a message to recall and reinforce memoriesβ€”but offer no context about prerequisite conditions, when this automatic recall is appropriate, or what distinguishes it from other memory-related tools. The ambiguity is compounded by the corrupted Description text.

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

backfill_embeddingsA

Generate embeddings for memories that lack them.

Args: model: Model name (default: all-MiniLM-L6-v2). limit: Max memories to process (1-10k, None=all). force: Regenerate existing embeddings. dry_run: Preview only.

Returns: Dict with: success, processed, errors, model, total_memories, memories_without_embeddings, message.

Raises: ValueError: Invalid limit. ImportError: sentence-transformers not installed.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
limitNo
modelNoall-MiniLM-L6-v2
dry_runNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden, and it does a good job: it explains parameter effects (force, dry_run, limit), lists possible exceptions (ValueError, ImportError), and summarizes the return value. It could go further by noting potential resource cost or persistence side effects, but the core behavior is clear.

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

Conciseness5/5

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

The description is well-structured with a one-sentence purpose followed by Args, Returns, and Raises sections. Every line earns its place and there is no fluff or redundancy with the schema.

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 four-parameter tool with no annotations, the description is sufficiently complete: it covers all parameters, return fields, and error conditions. An agent can understand what the tool does, how to invoke it, and what to expect in response without needing additional context.

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

Parameters5/5

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

The schema has 0% description coverage, so the description fully compensates by explaining all four parameters: model with default, limit range, force to regenerate, and dry_run as preview-only. This adds meaning far beyond the bare schema types and defaults.

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 specific action ('Generate embeddings') and a clear resource/scope ('for memories that lack them'). This distinguishes it from sibling tools like search_memory or cluster_memories, which have different purposes.

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 usage context is implied by the title and first line: use when memories are missing embeddings. However, there is no explicit guidance about when not to use it or how it compares to alternatives among the sibling tools.

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

cluster_memoriesA

Cluster similar memories or find duplicates.

Args: strategy: Clustering strategy (default "similarity"). threshold: Similarity threshold (0.0-1.0, uses config default if None). max_cluster_size: Max cluster size (1-100, uses config default if None). find_duplicates: Find duplicate pairs instead of clustering. duplicate_threshold: Duplicate threshold (0.0-1.0, uses config default if None).

Returns: Dict with clusters or duplicates list, scores, suggested_action.

Raises: ValueError: Invalid threshold or max_cluster_size.

ParametersJSON Schema
NameRequiredDescriptionDefault
strategyNosimilarity
thresholdNo
find_duplicatesNo
max_cluster_sizeNo
duplicate_thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

The description provides useful behavioral detail beyond the schema: it returns clusters or duplicates with scores and a `suggested_action`, and it raises `ValueError` for invalid thresholds or cluster sizes. However, with no annotations provided, the description should also make clear whether this operation mutates or persists memories; it currently does not disclose side effects or read-only behavior.

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

Conciseness5/5

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

The description is well-structured and efficiently front-loaded with the core purpose, followed by compact Args, Returns, and Raises sections. There is no filler or redundant restating of the tool name.

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 arguments, return shape, and errors, and an output schema exists. But it still leaves important context unspecified: whether the operation is read-only, what relationship it has to `consolidate_memories`, and what valid `strategy` values are. For an unannotated tool with five configurable parameters, these omissions prevent full self-sufficiency.

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 Args section compensates strongly for the 0% schema description coverage by documenting defaults, numeric ranges, `None` behavior, and the `find_duplicates` mode toggle for most parameters. The main gap is `strategy`, which is only described as 'Clustering strategy (default "similarity")' with no allowed strategy values, so an agent cannot confidently select a non-default strategy.

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 first line clearly identifies the action and resource: 'Cluster similar memories or find duplicates.' This is specific and understandable, and the duplicate-finding mode gives extra identity. However, it does not explicitly differentiate itself from the sibling `consolidate_memories`, leaving some distinction to inference.

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: call this tool when memories need clustering or duplicate detection, with `find_duplicates` switching the mode and config defaults controlling thresholds. But there is no explicit guidance about when to prefer this tool over related alternatives like `consolidate_memories`, `search_memory`, or `analyze_for_recall`.

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

consolidate_memoriesA

Merge or link similar memories algorithmically.

Args: cluster_id: Cluster UUID to act on (required unless auto_detect=True). mode: "preview" (no changes), "apply" (merge), or "link" (relations only). auto_detect: Find high-cohesion clusters automatically. cohesion_threshold: Minimum cohesion (0.0-1.0).

Returns: Dict with success, mode, consolidated clusters, and results.

Raises: ValueError: If cluster_id invalid or cohesion_threshold out of range.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNopreview
cluster_idNo
auto_detectNo
cohesion_thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses that 'preview' makes no changes, that 'apply' merges, and that 'link' creates relations only, plus the ValueError conditions. However, it does not state whether 'apply' is destructive or irreversible, or what happens to the original memory records after consolidation.

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

Conciseness5/5

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

The description is well-organized into Args, Returns, and Raises sections. Every sentence adds practical information: purpose, parameter semantics, output shape, and error conditions. It is compact without sacrificing needed detail.

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 all parameters, return values, and exceptions, giving an agent enough to call the tool correctly in most cases. The main gaps are the lack of explicit guidance on edge cases like supplying both cluster_id and auto_detect, and no mention of side effects on existing memories during 'apply'.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates. It explains all four parameters, including valid mode values, the threshold range, and the conditional requirement for cluster_id depending on auto_detect. This goes well beyond the bare schema titles.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Merge or link similar memories algorithmically.' It clearly communicates the tool's function, but it does not explicitly differentiate it from sibling tools like cluster_memories or create_relation, which could overlap in purpose.

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 through mode options ('preview', 'apply', 'link') and the note that cluster_id is required unless auto_detect=True, but it gives no explicit guidance on when to prefer this tool over alternatives such as cluster_memories or promote_memory. There are no when-not-to-use conditions or named alternatives.

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

create_relationA

Link two memories with typed relationship.

Args: from_memory_id: Source memory UUID. to_memory_id: Target memory UUID. relation_type: Type (related, causes, supports, contradicts, has_decision, consolidated_from). strength: Relation strength (0.0-1.0). metadata: Optional metadata dict.

Returns: Dict with relation_id, from, to, type, strength.

Raises: ValueError: Invalid UUID or relation type.

ParametersJSON Schema
NameRequiredDescriptionDefault
metadataNo
strengthNo
to_memory_idYes
relation_typeYes
from_memory_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?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does well by indicating the action ('Link'), documenting the return value (a dict with relation_id, from, to, type, strength), and specifying a ValueError for invalid UUID or relation type. It could go further by mentioning persistence, side effects, or whether existing relations are overwritten, so it is strong but not exhaustive.

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

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and uses a clear Args/Returns/Raises structure. Every section earns its place: parameters, expected output, and error behavior. There is no redundant or filler content.

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 five-parameter creation tool with no annotations and zero schema coverage, the description is largely complete: it documents inputs, allowed values, output shape, and failure modes. It does not provide guidance on when to choose this tool over siblings or clarify constraints like whether the two memories must already exist, but those are minor gaps for such a focused operation.

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

Parameters5/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 compensate entirely, and it does. Every parameter is meaningfully explained: from/to as source/target UUIDs, relation_type with an explicit allowed-value list, strength with a 0.0-1.0 range, and metadata as an optional dict. This adds substantial value beyond the bare schema titles.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Link two memories with typed relationship.' It clearly conveys that this tool creates a relation between two memory entities, which is distinct in function from the sibling memory-management tools. However, it does not explicitly name or differentiate itself from any sibling, so it falls 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 Guidelines3/5

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

The usage context is implied: use this tool when you need to create a typed link between two memories. It does not explicitly state when not to use it or name alternatives among the sibling tools, such as consolidate_memories or save_memory, so guidance on tool selection is only implicit.

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

gcA

Remove or archive low-scoring memories.

Args: dry_run: Preview without removing. archive_instead: Archive instead of deleting. limit: Max memories to process (1-10,000).

Returns: Dict with removed_count, archived_count, freed_score_sum, memory_ids.

Raises: ValueError: Invalid limit range.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
dry_runNo
archive_insteadNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and explains the important knobs: dry_run previews, archive_instead selects archiving over deletion, and limit bounds processing. It documents return values and error behavior, though it does not explicitly warn that setting dry_run=false permanently deletes memories.

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 purpose is front-loaded, and the Args/Returns/Raises structure is compact and free of filler. Every sentence adds useful 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?

Since there is no output schema, the description correctly provides the exact return keys and the ValueError condition. The inclusion of dry_run, archive_instead, and limit behavior makes the tool callable without needing external documentation.

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

Parameters5/5

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

Schema description coverage is 0%, and the Args section fully compensates by adding a meaningful one-line explanation for each parameter, including the valid limit range of 1-10,000.

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 specific verb and resource: 'Remove or archive low-scoring memories.' This clearly distinguishes the tool from sibling search, analysis, and consolidation operations, despite the cryptic name 'gc'.

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 first line implies the tool is for low-scoring memory cleanup, but it never explicitly says when to prefer this over sibling tools such as consolidate_memories or promote_memory, and it provides no when-not-to-use guidance.

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

get_performance_metricsA

Get current performance metrics.

Returns: Dict with: operation stats, counts, timings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses the return shape (a dict with operation stats, counts, timings) and implies a read-only operation via 'Get', but it does not explicitly state side-effect-free behavior, whether metrics are reset, or what 'current' means temporally. Adequate for a simple getter but not rich.

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

Conciseness5/5

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

The description is concise and front-loaded: the action and resource appear in the first sentence, and the return format follows immediately. Every sentence earns its place with no fluff 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?

For a parameterless metrics-getting tool with an output schema available, the description is sufficiently complete. The main gap is the absence of usage context (e.g., when to call this vs. analyzing detailed reports), but the core invocation needs are covered.

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 has zero parameters, so there is no parameter ambiguity. The description correctly focuses on return value rather than inputs, which meets the baseline for a parameterless tool.

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 retrieves 'current performance metrics' and specifies the return contents: operation stats, counts, and timings. This verb+resource pairing is distinct from the memory-management siblings, 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives or when to prefer it. There are no explicit conditions, prerequisites, or exclusions. The intended use is arguably implied by the name, but the description does not actively route an agent.

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

open_memoriesA

Retrieve specific memories by IDs with detailed information.

Args: memory_ids: Single ID or list of IDs (max 100). include_relations: Include outgoing/incoming relations. include_scores: Include decay scores and age. page: Page number (1-indexed). page_size: Memories per page (max 100).

Returns: Dict with memories, not_found IDs, and pagination metadata.

Raises: ValueError: If memory ID invalid or list exceeds max length.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
page_sizeNo
memory_idsYes
include_scoresNo
include_relationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It clearly discloses return contents (memories, not_found IDs, pagination metadata), input limits (max 100 IDs, page_size max 100), and error behavior (ValueError for invalid IDs or oversized lists). This goes well beyond the raw schema, though it does not explicitly state side-effect profile beyond the verb 'Retrieve'.

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 structured with Args, Returns, and Raises sections, making it easy for an agent to scan. Every sentence carries operational value, and the one-line purpose statement is front-loaded. There is no redundant filler.

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

Completeness5/5

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

Given zero schema descriptions and no annotations, this description covers all necessary operational details: parameter semantics, limits, pagination behavior, return structure, and error conditions. An agent can call this tool correctly without needing external clarification.

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

Parameters5/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 define every parameter. It does so effectively: memory_ids with max 100, include_relations as outgoing/incoming, include_scores as decay scores and age, page as 1-indexed, and page_size with max 100. This adds substantial meaning beyond the schema's names and types.

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 ('Retrieve') and resource ('specific memories by IDs'), which clearly identifies the tool's function. The 'by IDs' qualifier distinguishes it from sibling search/analysis tools that operate on queries or messages.

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

Usage Guidelines3/5

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

The description implies the tool is for retrieving known memories by ID, but it never explicitly states when not to use it or which sibling tool to prefer (e.g., search_memory for queries). The usage context is inferable but not explicitly compared to alternatives.

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

promote_memoryA

Promote high-value memories to long-term storage.

Args: memory_id: Memory UUID to promote. auto_detect: Detect promotion candidates automatically. dry_run: Preview without promoting. target: Storage format ("obsidian"). force: Promote even if criteria not met.

Returns: Dict with candidates, promoted_ids, and statistics.

Raises: ValueError: If memory_id invalid or target unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
targetNoobsidian
dry_runNo
memory_idNo
auto_detectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It usefully discloses dry-run preview, force behavior, return shape, and ValueError conditions, but it does not explain what promotion does to the source memory, the promotion criteria, or whether the operation is reversible.

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 docstring is compact and front-loaded with a one-sentence purpose, followed by meaningful Args, Returns, and Raises sections. Every line contributes information, with no redundant or filler text.

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 parameters, return values, and errors, and an output schema exists, so the agent has much of what it needs. However, it leaves open important calling questions: whether memory_id and auto_detect are mutually exclusive, what happens if neither is supplied, and what qualifies as 'high-value'.

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

Parameters5/5

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

Schema coverage is 0%, and the Args section compensates fully by explaining each parameter's purpose: memory_id is a UUID, auto_detect finds candidates, dry_run previews, target indicates format, force overrides criteria. This adds meaning entirely beyond the schema's bare type/default fields.

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 opening sentence 'Promote high-value memories to long-term storage' names a specific action and resource, so an agent can understand the tool's core function. It does not explicitly differentiate from sibling tools like consolidate_memories or save_memory, so it misses the top score.

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?

The description says only what the tool does and documents parameters; it gives no guidance on when to choose promote_memory versus sibling tools such as consolidate_memories. There are no exclusions or alternative conditions, so the agent must infer usage context from the purpose line.

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

read_graphA

Return entire knowledge graph with memories and relations.

Args: status: "active", "promoted", "archived", or "all". include_scores: Include decay scores and age. limit: Max memories (1-10,000). page: Page number (1-indexed). page_size: Memories per page (max 100).

Returns: Dict with memories, relations, stats, and pagination metadata.

Raises: ValueError: If status invalid or limit out of range.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
statusNoactive
page_sizeNo
include_scoresNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It discloses the return payload shape and raises ValueError for invalid status values or out-of-range limits. It does not mention auth, rate limits, or side effects, but the read-oriented behavior is adequately conveyed.

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

Conciseness5/5

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

The description is compact and well-organized: one-sentence purpose, a scannable Args list, Returns, and Raises. Every sentence adds meaningful information without filler.

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

Completeness5/5

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

Given 5 parameters, no annotations, and a rich sibling set, this description covers parameter meaning, defaults, output shape, and error behavior. An agent has enough information to invoke the tool correctly without needing additional context.

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

Parameters5/5

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

Schema description coverage is 0%, yet the description fully documents every parameter: status options, include_scores meaning, limit range, page indexing, and page_size cap. This is high-value semantic detail that the bare schema completely lacks.

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 specific verb, 'Return,' and a specific resource, 'entire knowledge graph with memories and relations.' This clearly distinguishes the tool's scope from sibling search-oriented 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 phrase 'entire knowledge graph' implies this tool is for full-graph retrieval, whereas siblings like search_memory suggest targeted lookup. However, the description does not explicitly state when to use this tool instead of alternatives or when not to use it.

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

reset_performance_metricsB

Reset all performance metrics.

Returns: Dict with: success, message.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations available, the description carries the full burden of behavioral disclosure. 'Reset all' implies a mutating/destructive action, but the description does not state severity, irreversibility, or potential impact on other operations. It only promises a return dict.

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?

The description is brief and to the point, with the core action stated first. It could be improved by adding a sentence about when to reset, but it wastes no words.

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?

For a zero-parameter tool with an output schema, the description is minimally sufficient to invoke it. However, it omits usage context, side effects, and any caution about resetting all metrics, which leaves the agent guessing about appropriate use.

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 has zero parameters, so deep parameter semantics are unnecessary. No param description is required, and the baseline of 4 applies.

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 a specific verb ('Reset') and resource ('all performance metrics'), making the tool's purpose understandable. It is not a tautology and is distinct from the sibling tools, which focus on analysis, search, or memory operations.

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 about when to use this tool versus alternatives, such as gc or analyze_for_recall. There are no prerequisites, conditions, or exclusion criteria.

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

save_memoryA

Save memory to short-term storage with auto-enrichment.

Args: content: Memory content (max 50k chars). tags: Tags (max 50). entities: Named entities (max 100, auto-extracted if None). source: Source (max 500 chars). context: Context (max 1k chars). meta: Custom metadata dict. strength: Base strength (1.0-2.0, auto-calculated if None).

Returns: Dict with: success, memory_id, message, has_embedding, enrichment_applied.

Raises: ValueError: Invalid input.

ParametersJSON Schema
NameRequiredDescriptionDefault
metaNo
tagsNo
sourceNo
contentYes
contextNo
entitiesNo
strengthNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It does disclose useful behaviors: auto-enrichment, auto-extraction of entities if None, auto-calculation of strength, and the return fields. However, it does not clarify what auto-enrichment actually does, whether saving overwrites existing memories, or what side effects might occur.

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 docstring-style format is compact and well organized: a one-line summary, a bullet-like Args list, Returns, and Raises. Every section adds value, and there is no redundant fluff.

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 parameters and return values well, and an output schema is indicated, but it lacks context about the tool's role relative to the many sibling memory tools, storage lifecycle semantics, and side effects. Given the tool's complexity and the absence of annotations, some guidance on when to save to short-term as opposed to promoting or consolidating would make it complete.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates by explaining every parameter, including type constraints, maximums, defaults, and automatic behaviors. This is substantially richer than the bare schema definitions.

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 verb ('Save') and resource ('memory to short-term storage'), and adds 'auto-enrichment' to signal a distinctive behavior. It does not explicitly differentiate itself from siblings like promote_memory or consolidate_memories, though 'short-term storage' hints at the distinction.

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 explicit guidance is provided about when to use this tool versus alternatives such as promote_memory, consolidate_memories, or search_memory. The description implies saving a memory, but it does not address selection criteria, prerequisites, or when not to use it.

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

search_memoryA

Search memories with filters and pagination.

Args: query: Search text (max 50k chars). tags: Filter by tags (max 50). status: Filter by status ('active', 'promoted', 'archived' or list of these). Defaults to ['active', 'promoted'] if None. top_k: Max results (1-100). window_days: Recent memories only (1-3650 days). min_score: Min decay score (0.0-1.0). use_embeddings: Enable semantic search. include_review_candidates: Include review-due memories. page: Page number (default: 1). page_size: Results per page (10-100, default: 10). preview_length: Content chars (0-5000, default: 300).

Returns: Dict with results list and pagination metadata.

Raises: ValueError: Invalid parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
tagsNo
queryNo
top_kNo
statusNo
min_scoreNo
page_sizeNo
window_daysNo
preview_lengthNo
use_embeddingsNo
include_review_candidatesNo

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?

With no annotations, the description carries the behavioral burden. It discloses important behavior: default status filtering, pagination metadata, supported parameter ranges, ValueError on invalid parameters, and semantic search via use_embeddings. It does not explicitly state read-only semantics, but the 'search' verb makes that reasonably clear.

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?

The description is well structured with clear Args, Returns, and Raises sections, and the one-line purpose is front-loaded. It is somewhat long due to 11 parameters, but each line carries useful constraint information rather than padding.

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 an 11-parameter tool with no annotations, the description covers parameter semantics, defaults, return shape, and error behavior, which is sufficient for invoking the tool correctly. The main gap is the lack of guidance on when to choose this tool over sibling search tools, but that is more of a usage-guidance issue.

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

Parameters5/5

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

Schema description coverage is 0%, yet the Args section compensates fully by explaining every parameter with constraints and defaults, including max query length, tag count, status allowed values, top_k range, and preview_length range. This is exactly the added meaning the schema lacks.

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 opening line 'Search memories with filters and pagination' uses a specific verb and resource, making the core purpose clear. However, it does not differentiate itself from sibling tools like search_unified or open_memories, so the agent is left to infer which search tool fits.

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?

The description documents filters and pagination but provides no guidance on when to use this tool versus alternatives. There is no mention of search_unified, open_memories, or any condition that would select one search entry point over another.

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

search_unifiedA

Search across STM and LTM with unified ranking.

Args: query: Search text (max 50k chars). tags: Filter by tags (max 50). status: Filter STM by status ('active', 'promoted', 'archived' or list of these). Defaults to ['active', 'promoted'] if None. limit: Max results (1-100). stm_weight: STM multiplier (0.0-2.0). ltm_weight: LTM multiplier (0.0-2.0). window_days: Recent STM only (1-3650 days). min_score: Min STM score (0.0-1.0). page: Page number (default: 1). page_size: Results per page (10-100, default: 10). preview_length: Content chars (0-5000, default: 300).

Returns: Dict with results from both STM/LTM and pagination metadata.

Raises: ValueError: Invalid parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
tagsNo
limitNo
queryNo
statusNo
min_scoreNo
page_sizeNo
ltm_weightNo
stm_weightNo
window_daysNo
preview_lengthNo

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?

With no annotations, the description carries the transparency burden and does a solid job: it discloses the return shape, pagination metadata, and ValueError on invalid parameters, and lists ranking/filter behavior. It does not explicitly state read-only/no-side-effect status, but the verb 'Search' and absence of mutation language make the behavior reasonably clear.

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 opens with a one-line purpose, then uses compact Args/Returns/Raises sections that are information-dense without padding. Given 11 parameters, the length is justified and every line 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 an 11-parameter, all-optional search tool with no annotations, the description covers parameters, return type, pagination metadata, and error behavior, which is largely complete. It leaves two minor ambiguities: how limit and page_size interact, and whether tags apply to both STM and LTM.

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

Parameters5/5

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

Schema description coverage is 0%, and the description compensates fully: every parameter is explained with type, allowed range, default, and meaning, including query max length, status default, weight ranges, window_days range, and page_size constraints. This is exactly the semantic enrichment the schema lacks.

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 first line names a specific action (search), a clear resource scope (both STM and LTM), and the unified-ranking behavior. It is not a tautology and is understandable, but it does not explicitly contrast with search_memory or other siblings, so differentiation is left to inference.

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 its use case: run a combined STM/LTM search with configurable ranking and filters. There are no explicit when-to-use, when-not-to-use, or alternative-tool statements, and a sibling search_memory exists, so the agent must infer routing from the name and first line.

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

touch_memoryA

Reinforce memory to reset decay.

Args: memory_id: Memory UUID. boost_strength: Increase base strength.

Returns: Dict with old_score, new_score, use_count, strength.

Raises: ValueError: Invalid UUID.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes
boost_strengthNo

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?

With no annotations, the description carries the full burden, and it does enough by stating that it resets decay, that boost_strength increases base strength, and that the return dict exposes old_score, new_score, use_count, and strength. It also discloses the invalid-UUID error case. It does not cover reversibility, permissions, or rate limits, but the core side effects are clear.

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 docstring-style layout is tight and front-loaded: one purpose sentence followed by Args, Returns, and Raises. There is no repetition or filler; every line 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?

Given the tool's simplicity (two flat parameters) and an output schema in context, the description is nearly complete: it specifies inputs, effects, return fields, and an error condition. The main missing piece is guidance for choosing this over related memory tools, which is already counted in usage_guidelines.

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 0%, so the Args block is the only semantic source. It adds real meaning: memory_id is a Memory UUID and boost_strength increases base strength. It could clarify the boolean's true/false behavior and the default, but it compensates for the bare schema well.

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 opening line, 'Reinforce memory to reset decay,' names a concrete operation and resource with a clear goal. It is more specific than the generic tool name, though it does not call out how it differs from memory-related siblings like promote_memory or consolidate_memories.

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?

The description provides no 'use when' guidance, exclusions, or alternatives. An agent cannot tell from the description when touch_memory should be preferred over promote_memory or save_memory; the only trigger is the purpose clause 'to reset decay,' which is not developed into when-to-use guidance.

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. 17 tool updatesv1.2.1
    • First observedanalyze_for_recall
    • First observedanalyze_message
    • First observedauto_recall_process_message
    • First observedbackfill_embeddings
    • First observedcluster_memories
    • First observedconsolidate_memories
    • First observedcreate_relation
    • First observedgc
    • First observedget_performance_metrics
    • First observedopen_memories
    • First observedpromote_memory
    • First observedread_graph
    • First observedreset_performance_metrics
    • First observedsave_memory
    • First observedsearch_memory
    • First observedsearch_unified
    • First observedtouch_memory

TDQS

A3.5/5.0

Scored across 17 tools

Disambiguation4/5

Most tools target distinct actions: analyze_for_recall vs analyze_message are differentiated by intent, and cluster_memories vs consolidate_memories separate detection from action. However, search_memory and search_unified overlap in capability, and auto_recall_process_message could be confused with the analyze_* tools since it also starts with message analysis.

Naming Consistency4/5

The majority follow a clear verb_noun pattern like save_memory, search_memory, promote_memory, and create_relation. Deviations include the abbreviated 'gc' and the awkward compound 'auto_recall_process_message', which break the otherwise predictable pattern.

Tool Count4/5

At 17 tools, the server is slightly above the ideal 3-15 range but still reasonably scoped for a memory system that handles search, recall, consolidation, promotion, graph relationships, and maintenance. Each tool serves a plausible purpose, though a few analysis/search tools could be merged.

Completeness4/5

The toolset covers the core memory lifecycle well: save, retrieve, search, reinforce, promote, consolidate, cluster, relate, and garbage collect. Minor gaps exist such as no explicit edit-memory or delete-relation tool, but the provided operations are mostly sufficient for the perceived domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server enabling AI assistants to store, retrieve, and manage contextual information across conversations with features like persistent memory, advanced search, tagging, and privacy controls.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A MCP server that provides persistent memory for AI assistants, storing personal information, relationships, and observations to enable personalized and contextual conversations.
    4
    -
  • A
    license
    A
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server providing human-like memory dynamics for AI assistants, where memories naturally fade over time unless reinforced through use.
    13
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that implements memory with decay mechanics, allowing AI agents to store and retrieve memories that fade over time unless accessed, with a permanent journal for verification.
    3
    MIT