Skip to main content
Glama
PlainTxtOffice

Plain Text Memory MCP

plain-text-memory-mcp

Knowledge-graph memory MCP server that tags every entry with the date it was added and the agent that added it. Memory lives in a plain JSONL file inside each repo, so every agent working in that repo shares it.

It is a drop-in replacement for @modelcontextprotocol/server-memory: the same nine tools and input keys, and it reads files written by the original server. It adds edit_observation, rename_entity, merge_entities, initialize_memory, and export_taxonomy; date and agent filters on read_graph and search_nodes; the cleanup and export prompts; and the memory://taxonomy resource.

Install

The server runs with uv; uvx downloads and starts it on demand, so there is nothing else to install.

uvx plain-text-memory-mcp

Started by hand, it waits for an MCP client on stdin; press Ctrl+C to stop.

Related MCP server: Oceanir Memory

Configure

Add the server to each agent's MCP config. The server finds the repo from the folder the agent starts it in, so register it per project, or set MEMORY_FILE_PATH if a client starts servers somewhere else.

Claude Code, .mcp.json in the repo:

{
  "mcpServers": {
    "plain-text-memory": {
      "type": "stdio",
      "command": "uvx",
      "args": ["plain-text-memory-mcp"]
    }
  }
}

Codex, .codex/config.toml:

[mcp_servers.plain-text-memory]
command = "uvx"
args = ["plain-text-memory-mcp"]

Cursor, .cursor/mcp.json in the repo:

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

VS Code, .vscode/mcp.json in the repo:

{
  "servers": {
    "plain-text-memory": {
      "type": "stdio",
      "command": "uvx",
      "args": ["plain-text-memory-mcp"]
    }
  }
}

Where memory is stored

  1. MEMORY_FILE_PATH, if set. A relative path resolves against the folder the agent starts the server in.

  2. <git root>/.agents/memory.local.jsonl.

  3. <start folder>/.agents/memory.local.jsonl outside a git repo.

Writes hold a lock on memory.local.jsonl.lock beside the memory file, so Claude Code and Codex can write to the same repo's memory at the same time without losing each other's changes. The file stays after the server exits; leave it in place.

Tags

Every entity, relation, and observation carries added_at (local time with UTC offset) and agent (claude-code, codex, or the client's own name). Set MEMORY_AGENT to override the agent name. Entries written by the original server show null for both.

Repo guard

The first write adds a header line recording which repo the memory file belongs to. If the file is later found in a different repo, for example after copying .agents/ from a template, every tool returns an error instead of serving the other repo's memories. Resolve it with the initialize_memory tool:

  • mode: "fresh" renames the old file to memory.local.jsonl.bak-<time> and starts an empty graph.

  • mode: "adopt" keeps the memories and points the header at this repo, for a repo that was moved or renamed.

Files without a header, including ones written by the original server, are claimed by the repo that writes to them first.

Prompts

The server publishes two MCP prompts, which clients offer as commands; Claude Code shows them as /mcp__plain-text-memory__cleanup and /mcp__plain-text-memory__export.

Prompt

Use

cleanup

Propose deletions and merges; nothing is deleted until approved

export

Write the repo's taxonomy and usage to .agents/ and report it

Guidance for agents

On connect, the server sends every MCP client instructions for using memory well: search before planning, verify what memory says against the repo, save only lasting facts, and resolve the repo guard. Tool and parameter descriptions say what each tool does and returns, and the prompts above carry the cleanup and export workflows. No agent-specific setup is needed.

Taxonomy

taxonomy.json lists every record type with its purpose and fields, every tool with its parameters and results, every MCP resource and prompt, and the allowed values for enum fields such as agent and initialize_memory.mode. It is generated from the code; do not edit it by hand. Record type purposes live in RECORD_PURPOSES in records.py. The file ships inside the package, where the server's export_taxonomy tool reads it. MCP clients can also read it as the resource memory://taxonomy.

taxonomy_version follows semantic versioning and bumps itself: a removed item, section, or changed type is major, an added item is minor, and a description, purpose, title, or package version change is patch. Each bump adds a changelog entry listing what changed.

Regenerate it with:

.venv/Scripts/python.exe scripts/build_taxonomy.py

The pre-commit hook runs this and stops the commit when the file changes, so the new version is reviewed and staged. A test also fails when the committed file is stale. Enable the hook once per clone:

git config core.hooksPath .githooks

Exporting to a repo

Ask an agent to call the export_taxonomy tool. It writes .agents/memory.local.taxonomy.jsonc beside the repo's memory file, holding the versioned schema above plus this repo's usage: entry counts, the entity and relation types in use, and entries per agent. // comments explain each section and each record type's purpose. Use it to keep type names consistent within a repo. The export is local, like the memory file; ignore both with .agents/*memory.local.*.

Develop

py -3.13 -m venv .venv
.venv/Scripts/python.exe -m pip install -e . --group dev
.venv/Scripts/python.exe -m pytest

To have agents run your working copy instead of the published package, install it as an editable tool and use plain-text-memory-mcp as the config's command, with no args:

uv tool install -e .

Code changes then take effect the next time an agent starts the server.

License

MIT, copyright Plain Text Office LLC. See LICENSE.

Available Tools

14 tools
add_observationsAdd observationsA
Idempotent

Add observations to existing entities.

Returns the observations added, per entity; a text already on the entity is skipped. Fails without saving anything if any named entity does not exist. To create an entity, see create_entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
observationsYesObservations to add, grouped by entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond them: it discloses the dedup rule (text already present is skipped, which explains *why* the operation is idempotent) and an all-or-nothing failure guarantee ("fails without saving anything"). It does not mention permissions or concurrency 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 core action is front-loaded in the first line, followed by return behavior, failure semantics, and the sibling alternative — four short sentences with no filler. Every sentence carries distinct information.

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 annotations, a complete input schema, and an output schema (so return structure needn't be spelled out), the description covers the remaining non-obvious aspects: dedup, atomic failure, and the create_entities route. It stops short of only minor details such as permission requirements.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented down to the nested contents/entityName level, so the baseline is 3. The description adds nothing about argument shape or formatting beyond what the schema already says.

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

Purpose5/5

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

The description opens with a specific verb+resource ("Add observations to existing entities") and explicitly scopes it to *existing* entities, immediately separating it from create_entities, which it names. An agent can distinguish this from create_entities, edit_observation, and delete_observations without opening any schema.

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

Usage Guidelines4/5

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

It states a precondition (all named entities must already exist, or the whole call fails) and routes the agent to create_entities when the target does not yet exist. That is clear context plus one named alternative, though it does not cover when to prefer edit_observation or how to correct an existing observation.

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

create_entitiesCreate entitiesA
Idempotent

Create new entities, each with a type and observations.

Returns the entities created. A name that already exists, or repeats within the call, is not saved and is listed under "skipped", with its observations unsaved; to add facts to an existing entity, see add_observations.

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYesEntities to create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
skippedYes
entitiesYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare non-readOnly, non-destructive and idempotent, and the description adds genuinely new behavior: duplicate names (existing or repeated in-call) are not saved, are reported under "skipped", and their observations are left unsaved. That partial-failure/dedup semantics is real value beyond the annotations, though it still says nothing about auth needs or size limits.

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?

Three short sentences, front-loaded with the operation and then the failure mode. 'Returns the entities created' is partially redundant since an output schema exists, which is the only wasted clause.

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 explained, and the description covers the key non-obvious outcome (skipped duplicates). What remains thin is anything about ordering, limits, or permissions, but for a single-parameter create tool this is close to sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so name uniqueness, entityType and observation semantics are already documented in the schema. The description only restates that entities carry types and observations, adding no syntax or format detail, which matches the baseline 3.

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?

States a specific verb (Create) and resource (entities) along with what each entity carries (a type and observations). It distinguishes itself from the sibling add_observations by naming it and describing the different job it does.

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?

Explicitly routes the agent to add_observations when the goal is adding facts to an existing entity, which is a clear alternative cue. It does not spell out a full when-not-to-use list beyond that single case, so it stops short of a 5.

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

create_relationsCreate relationsA
Idempotent

Create directed, typed relations between existing entities.

Returns the relations created. A relation that names an entity that does not exist is not saved; it is listed under "skipped" with the missing names. A relation that already exists is neither created nor reported.

ParametersJSON Schema
NameRequiredDescriptionDefault
relationsYesRelations to create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
skippedYes
relationsYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, so the safety profile is covered. The description adds genuinely behavioral context beyond that: missing-entity relations are silently dropped and surfaced under 'skipped', and duplicates are neither created nor reported — a non-obvious edge case consistent with the idempotency hint.

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?

Four short sentences, front-loaded with the action, then layered behavior. Each sentence carries distinct information (return value, failure mode, duplicate handling) and none is padding, though the explicit 'Returns the relations created' line is partly redundant with the output schema.

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, the description needn't explain return structure, and it correctly focuses on the skipped/duplicate behaviors an agent can't infer. Only the create_entities prerequisite for entity existence is left implicit rather than spelled out.

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

Parameters3/5

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

Schema description coverage is 100% and the nested RelationInput documents from, to and relationType with examples ('uses', 'depends_on'). The description adds directional/type semantics but no format or syntax detail beyond what the schema already provides, so the baseline 3 applies.

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?

States a specific verb and resource ('Create directed, typed relations') and scopes it to 'existing entities', which implicitly distinguishes it from create_entities and create_entities-adjacent siblings. An agent can tell this tool's job apart from the other create_* tools without opening a schema.

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 constraint that relations are only saved between existing entities implies that create_entities must run first, but this prerequisite is stated as a behavior rather than as guidance. There is no explicit when-to-use or when-not-to-use framing versus alternatives like create_entities or delete_relations.

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

delete_entitiesDelete entitiesA
DestructiveIdempotent

Delete entities by name, with every relation that touches them.

Returns the deleted entities and relations in full, with a summary message. Names that do not exist are ignored. To remove single facts from an entity, see delete_observations.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNamesYesNames of the entities to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
deletedEntitiesYes
deletedRelationsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive=true and idempotentHint=true, but the description adds real beyond-annotation context: deletions cascade to all touching relations, nonexistent names are silently ignored, and the deleted entities/relations are returned in full. The only redundancy is restating the return payload, which the output schema already covers.

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

Conciseness5/5

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

Three short sentences, front-loaded with the destructive action and its cascade scope, then the routing hint. No filler and nothing buried.

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

Completeness5/5

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

For a destructive one-parameter tool with full annotations and an output schema, the description covers what matters: scope of destruction, no-op behavior for missing names, and the alternative tool. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

One required parameter (entityNames) with 100% schema description coverage, so the schema already documents it fully. The description adds no extra semantics such as case sensitivity, exact-match rules, or batch size limits, so the baseline 3 applies.

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?

States a specific verb+resource ("Delete entities by name") plus the non-obvious cascade scope ("with every relation that touches them"). It also names a sibling, delete_observations, so an agent can distinguish it from the fact-level deletion tool without opening a schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent elsewhere when the intent differs: "To remove single facts from an entity, see delete_observations." Combined with the cascade statement, the agent knows both when to use this tool and when not to.

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

delete_observationsDelete observationsA
DestructiveIdempotent

Delete observations from entities, matched by exact text.

Returns the deleted observations in full, per entity, with a summary message; entities that lost nothing are left out. Entities and texts that do not exist are ignored. To delete a whole entity, see delete_entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
deletionsYesObservations to delete, grouped by entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
deletedObservationsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that: it returns the deleted observations in full per entity plus a summary, omits entities that lost nothing, and ignores unknown entities/texts — the latter consistent with the idempotent hint.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core operation, then return behavior, then the sibling redirect. No filler and no repetition of the name/title.

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?

Despite a simple one-parameter schema, the description covers matching semantics, partial-failure behavior, return shape, and the alternative tool. With an output schema present, return details are a bonus rather than a necessity, and nothing an agent needs is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the property descriptions already explain entityName as 'name of the entity to change' and observations as 'exact texts'. The description's 'matched by exact text' reiterates rather than extends the schema, so the baseline 3 applies.

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?

States a specific verb (delete), resource (observations), and matching mode (exact text), which immediately separates it from add_observations/edit_observation. It also names the sibling to use for a related-but-different task (delete_entities).

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

Usage Guidelines4/5

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

Gives a clear routing rule: use delete_entities to delete a whole entity rather than this tool. It also clarifies that non-existent entities/texts are silently ignored, which tells the agent this call will not fail on a partial match. No prerequisites or permission caveats are stated.

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

delete_relationsDelete relationsA
DestructiveIdempotent

Delete relations matched by source, target, and relation type.

Returns the deleted relations in full, with a summary message. Relations that do not exist are ignored. Deleting an entity with delete_entities already removes its relations.

ParametersJSON Schema
NameRequiredDescriptionDefault
relationsYesRelations to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
deletedRelationsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds real semantics beyond that by explaining that unmatched relations are ignored (concrete idempotency behavior) and that the full deleted relations are returned with a summary message. Permission requirements and any cascading effects are not mentioned.

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

Conciseness5/5

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

Three short sentences, each carrying distinct information: the match criteria first, then the return shape, then two behavioral caveats. No filler or restatement of the title.

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 single-parameter deletion tool with an output schema and destructive/idempotent annotations, the description covers what is deleted, how matching works, behavior on misses, and the interaction with sibling delete_entities. An agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and each RelationInput field is documented in the schema, so the baseline is 3. The description's mention of 'source, target, and relation type' only mirrors the schema's from/to/relationType fields without adding format or constraint detail.

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?

States a specific verb (Delete) plus resource (relations) and the matching keys (source, target, relation type), so the agent knows exactly what gets removed. It also explicitly distinguishes itself from delete_entities, which is the sibling most likely to be confused with it.

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

Usage Guidelines4/5

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

The description gives two useful routing conditions: nonexistent relations are silently ignored, and deleting an entity via delete_entities already removes its relations, implying the agent need not call this afterward. That is clear when-to-use context, though it stops short of an explicit 'use this instead of X when Y' statement.

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

edit_observationEdit observationA
DestructiveIdempotent

Replace one observation's text in place.

Keeps the observation's original added_at and agent, and records the edit in edited_at and edited_by. Returns the edited observation. Fails without saving when the entity or old text does not exist, or when the entity already has the new text. To add a new fact, see add_observations.

ParametersJSON Schema
NameRequiredDescriptionDefault
newTextYesReplacement text, one plain sentence.
oldTextYesExact current text of the observation.
entityNameYesName of the entity that has the fact.

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
entityNameYes
observationYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare a destructive, idempotent write, and the description goes well beyond them: it preserves original added_at/agent, records edited_at/edited_by, returns the edited observation, and enumerates three no-save failure conditions. This is exactly the behavioral context an agent needs before mutating data.

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 core action and the alternative tool are front-loaded, and the atomic-failure clause is a genuinely useful single sentence. The unusual line-wrapping is cosmetic, though the failure sentence is slightly dense.

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 3-parameter mutation with annotations and an output schema, nothing material is missing: the agent knows what is replaced, what is preserved, what is returned, how failure manifests, and where to go for a different operation.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds real semantic value: oldText must match the exact current text and the call fails without saving if it does not exist or the new text already exists. That ties parameter values directly to observable outcomes.

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?

States a precise verb+resource+scope: 'Replace one observation's text in place.' It is clearly distinguishable from sibling add_observations, which it explicitly names, and from delete_observations by virtue of being an in-place edit.

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?

Routes the agent to add_observations for adding new facts and spells out the failure conditions (entity missing, old text missing, new text already present). It does not discuss alternatives like delete_observations plus add_observations for multi-fact changes, so it is clear context rather than full when/when-not guidance.

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

export_taxonomyExport taxonomyA
Idempotent

Write this repo's memory taxonomy to a JSONC file the user can read.

The file sits beside the memory file as memory.local.taxonomy.jsonc. It holds the server's versioned schema (record types, tools, allowed values, resources, prompts) and this repo's usage: entry counts, entity and relation types in use, and entries per agent. Comments explain each section and the purpose of each record type. Returns the file path, the taxonomy version, and entry counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
countsYes
taxonomy_versionYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description goes beyond them by disclosing the side-effect target (memory.local.taxonomy.jsonc beside the memory file), the file's contents (versioned schema, usage counts, comments), and the return values, which is real added context for a write operation.

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 core action and output file are front-loaded in the first sentence, and the following sentences add necessary detail about contents and return values. Slightly verbose with the multi-line breakdown of file contents, but every element is informative.

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?

With an output schema present and annotations carrying the safety profile, the description is more than complete: it explains the file location, what the file contains, and even summarizes the return values. Nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description correctly implies the tool operates implicitly on 'this repo' with no required input.

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 and resource: 'Write this repo's memory taxonomy to a JSONC file.' It names the exact artifact produced and where it lives, and no sibling tool does anything comparable, so an agent can identify it instantly.

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 only implied ('a JSONC file the user can read') – the description never states when to prefer this over siblings like read_graph or search_nodes, nor any trigger condition. It is adequate because the purpose makes the context fairly obvious, but no explicit guidance is given.

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

initialize_memoryInitialize memory fileA
DestructiveIdempotent

Claim the memory file for this repo, or start a new one.

Resolves the error other tools return when the memory file's header names a different repo. 'fresh' renames the old file to a timestamped backup and starts an empty graph, for a file copied from another repo; 'adopt' rewrites the header to this repo, for a repo that was moved or renamed. Returns the status, the header, and the backup path if one was made. Changes nothing when the file already belongs to this repo.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes'fresh' starts an empty graph and keeps the old file as a backup; 'adopt' keeps the memories and claims them for this repo.

Output Schema

ParametersJSON Schema
NameRequiredDescription
backupYes
headerYes
statusYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructive=true, idempotent=true, readOnly=false, and the description goes well beyond them by disclosing exactly what happens: 'fresh' renames the old file to a timestamped backup and starts an empty graph, 'adopt' rewrites the header while keeping memories, and the tool changes nothing when ownership already matches. It also previews the return payload (status, header, backup path).

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 purpose in the first sentence and then layers the error-resolution context and mode semantics. Slightly wordy in the second paragraph but every clause carries operative 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?

Covers purpose, trigger, mode selection, destructive side effects, backup behavior, and return shape. With an output schema present and annotations set, nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the enum is already documented, so the baseline is 3. The description adds scenario framing beyond the schema by explaining when each mode applies (file copied from another repo vs. repo moved/renamed), which helps an agent pick the right value.

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

Purpose5/5

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

States a concrete verb and resource ('Claim the memory file for this repo, or start a new one') and is unmistakably distinct from the entity/relation CRUD siblings. An agent can identify it as the header-ownership/repair tool without opening the schema.

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

Usage Guidelines5/5

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

Names the precise trigger condition ('the error other tools return when the memory file's header names a different repo') and gives the selection rule for each mode: 'fresh' for a file copied from another repo, 'adopt' for a repo that was moved or renamed. It also states the no-op case when the file already belongs to this repo.

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

merge_entitiesMerge entitiesA
DestructiveIdempotent

Fold one entity into another and delete the first.

Moves the source's observations to the target with their original tags; a text the target already has keeps the target's copy. Points the source's relations at the target, dropping any that would repeat an existing relation or point the target at itself. The target keeps its own name and type. Returns the merged target and the relations moved to it. Fails without saving when either entity does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNameYesEntity to fold in and delete, such as a typo.
targetNameYesEntity that receives everything and stays.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entityYes
messageYes
movedRelationsYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, but the description goes well beyond them: observations move with original tags, duplicate texts keep the target's copy, relations are repointed with duplicate and self-relations dropped, and the operation aborts without saving when either entity is absent.

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 destructive action is front-loaded in sentence one, and the following sentences each carry distinct behavioral facts. It is dense but every clause earns its place; a slightly tighter phrasing of the dedup rules could cut a few words.

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

Completeness5/5

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

For a destructive two-parameter merge, the description covers the edge cases an agent needs (missing entities, duplicate text, duplicate/self relations, target identity preservation), and since an output schema exists it does not need to detail return fields.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds real semantic meaning on top: the source is the one deleted and its data migrated, while the target retains its own name and type. That clarifies the role distinction beyond the schema's terse parameter blurbs.

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 sentence states a specific verb and resource with unambiguous direction: 'Fold one entity into another and delete the first.' This is clearly distinct in behavior from siblings like rename_entity or delete_entities, though the description never names those siblings to route the agent explicitly.

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 schema notes the source is 'such as a typo,' which hints at the dedup use case, and the description explains failure when an entity is missing. But there is no explicit when-to-use guidance or comparison against rename_entity, delete_entities, or edit_observation.

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

open_nodesOpen entitiesA
Read-onlyIdempotent

Open entities by exact name.

Returns the named entities and every relation that touches them; a relation's other end may be outside the results. Names that do not exist are ignored. To find entities by keyword, see search_nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesYesExact names of the entities to open.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
relationsYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuine context the annotations cannot: results include every relation touching the entities, a relation's far end may fall outside the result set, and nonexistent names are silently ignored rather than erroring. That last point is the most valuable 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.

Conciseness5/5

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

Three short sentences, purpose front-loaded, with the alternative-tool pointer and the relation-expansion caveat each earning their place. No 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?

For a one-parameter read tool with an output schema, the definition covers what it does, what comes back (including relations that reach outside the result), how missing names behave, and which sibling to use instead. Nothing needed to call it correctly is absent.

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

Parameters4/5

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

Schema coverage is 100%, so the single 'names' parameter is already documented, giving a baseline of 3. The description still adds meaning by stressing 'exact name' matching and the ignore-missing-names semantics, which the schema's 'Exact names of the entities to open' only hints at.

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?

States a specific verb and resource ('Open entities') and pins the matching mode to 'exact name', which immediately separates it from keyword-oriented siblings. An agent can tell it apart from search_nodes without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent to the alternative: 'To find entities by keyword, see search_nodes,' giving the condition (exact vs keyword) that selects between them. No prerequisites or exclusions are left to inference beyond that.

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

read_graphRead memory graphA
Read-onlyIdempotent

Read every entity and relation, or only those in a date range.

Returns the whole graph, which grows with the repo's memory. With since, before, or agent, returns only entries whose tags match: an entity appears when it or any of its observations matches, with only the matching observations. Any filter leaves out untagged entries. To read part of the graph by topic, see search_nodes and open_nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoOnly entries written by this agent, such as claude-code or codex.
sinceNoOnly entries added at or after this time: an ISO date such as 2026-10-01, or a timestamp; local time when no offset is given.
beforeNoOnly entries added before this time, in the same format as since.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
relationsYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description goes further and discloses non-obvious filter semantics: matching is tag-based, an entity is included when it or any observation matches (returning only matching observations), and any filter drops untagged entries. It also warns the graph 'grows with the repo's memory'.

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 ('Read every entity and relation, or only those in a date range') before the filtering detail. It is information-dense but every sentence carries meaning; the tag-matching sentence is slightly convoluted but not wasteful.

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?

An output schema exists, so return values need no explanation. The description covers purpose, filter semantics, and alternatives, leaving nothing an agent needs in order to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents agent, since, and before, making the baseline 3. The description adds some meaning beyond the schema by explaining that these filters operate on tags and that observations are filtered along with entities, which the per-parameter descriptions do not convey.

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?

States a specific verb (Read) and resource (entity and relation graph) with clear scope: the whole graph or a filtered subset. It explicitly contrasts itself with search_nodes and open_nodes, so an agent can distinguish it from siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use: read everything, or narrow by date/agent filters. It also names the alternatives ('To read part of the graph by topic, see search_nodes and open_nodes'), routing the agent to the right tool for topic-scoped reads.

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

rename_entityRename entityA
DestructiveIdempotent

Rename an entity and every relation that names it.

Keeps every tag, so the entity and its observations still show when and by which agent they were added. Returns the renamed entity and a message counting the relations updated. Fails without saving when the entity does not exist or the new name is taken; to combine two entities, see merge_entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
newNameYesNew name; no other entity may have it.
entityNameYesCurrent name of the entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entityYes
messageYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructiveHint and idempotent; the description adds what annotations cannot: the rename cascades across every relation, tags are preserved to keep provenance metadata, failure is atomic ('fails without saving'), and the response summarizes relations updated. That is rich consequence disclosure beyond the structured hints.

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 cascade behavior and provenance preservation lead; failure semantics and the sibling pointer close. Every sentence carries information and nothing is padded.

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 mutation tool with an output schema and full annotation coverage, the agent has cascade scope, failure behavior, data preservation, and an alternative tool pointer. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are self-documented ('current name', 'no other entity may have it'), so the description adds no syntax or format meaning beyond the schema. Baseline 3 applies.

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?

States a specific verb (rename), the resource (entity), and an important scope detail: every relation naming it is also renamed. It also distinguishes itself from merge_entities by name, so an agent can separate the two without opening schemas.

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 concrete failure conditions (entity missing, name already taken) and routes the combine case to merge_entities. It stops short of a full when-to-use narrative against create/edit paths, but the alternative is named explicitly.

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

search_nodesSearch memoryA
Read-onlyIdempotent

Search entities by name, type, or observation text.

The query is split into words, and a "quoted phrase" stays one term. Returns the entities whose name, type, or any observation contains at least one term, ignoring case, ordered by how many terms they contain, plus every relation that touches them; a relation's other end may be outside the results. A blank query returns every entity. Since, before, and agent narrow the search to matching entries, as in read_graph. To fetch entities by exact name, see open_nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoOnly entries written by this agent, such as claude-code or codex.
queryYesWords to find in entity names, types, and observations, ignoring case; a "quoted phrase" matches as one term.
sinceNoOnly entries added at or after this time: an ISO date such as 2026-10-01, or a timestamp; local time when no offset is given.
beforeNoOnly entries added before this time, in the same format as since.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entitiesYes
relationsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description adds genuinely non-obvious behavior: word-splitting of the query, quoted-phrase handling, case-insensitive matching, ordering by number of matched terms, and the fact that returned relations may have their other endpoint outside the result set. That last point is the kind of surprise an agent needs warned about.

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?

Purpose is front-loaded in the first sentence, followed by mechanics and routing. Every sentence carries information, though the result-ordering paragraph is dense enough that it could be tightened slightly without loss.

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?

With an output schema covering the return shape and annotations covering the safety profile, the description supplies the remaining behavioral contract: matching rules, ranking, relation inclusion, blank-query behavior, and the sibling to use for exact-name lookup. Nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (query, since, before, agent) is already documented in the schema, including the quoted-phrase syntax and the date formats. The description restates the query syntax and the filter intent but adds no format or default details beyond the schema, so baseline 3 applies.

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?

States a specific verb and resource plus the three fields searched (name, type, observation text), which pins down the semantics precisely. It also explicitly differentiates itself from open_nodes ('To fetch entities by exact name, see open_nodes') and references read_graph for the filter semantics, so an agent can route correctly without opening a schema.

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

Usage Guidelines5/5

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

Names the alternative (open_nodes) with the condition that selects it, explains the filter parameters' scope ('narrow the search to matching entries, as in read_graph'), and states the degenerate case ('A blank query returns every entity'). When-to-use, when-not-to-use, and alternatives are all covered.

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. 14 tool updatesv0.2.0
    • First observedadd_observations
    • First observedcreate_entities
    • First observedcreate_relations
    • First observeddelete_entities
    • First observeddelete_observations
    • First observeddelete_relations
    • First observededit_observation
    • First observedexport_taxonomy
    • First observedinitialize_memory
    • First observedmerge_entities
    • First observedopen_nodes
    • First observedread_graph
    • First observedrename_entity
    • First observedsearch_nodes

TDQS

A4.4/5.0

Scored across 14 tools

Disambiguation5/5

Every tool has a clearly distinct purpose, and descriptions explicitly cross-reference related tools (e.g., 'to add facts to an existing entity, see add_observations') to prevent misuse. Boundary cases like edit_observation vs. add_observations vs. merge_entities are well delineated.

Naming Consistency5/5

Tool names follow a strict verb_noun pattern throughout (create_entities, add_observations, edit_observation, rename_entity, merge_entities, delete_entities, read_graph, search_nodes, open_nodes, etc.). The single exception, initialize_memory, is still verb_noun and clearly consistent with the rest.

Tool Count5/5

With 14 tools covering entity CRUD, relation CRUD, observation CRUD, querying, merging, renaming, initialization, and export, the count is well-scoped. Each tool earns its place; no redundant or trivially thin operations.

Completeness5/5

The surface covers full lifecycle operations for entities, relations, and observations, plus graph-level read/search, taxonomy export, and memory file initialization. No obvious dead ends; the domain of a plain-text knowledge graph is fully served.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides persistent long-term memory for AI coding agents by storing entities, relations, and observations across different sessions. It enables users to manage and query structured knowledge like coding preferences, project patterns, and technical solutions via a graph-based storage system.
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides persistent knowledge graph memory for AI agents, enabling them to store, recall, and query facts about people, projects, and relationships across sessions.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to store, query, and update persistent project knowledge as a local, Git-friendly knowledge graph, providing structured memory across sessions.
    9
    Apache 2.0