Preference Memory MCP
This server is a local, vendor-neutral MCP-based preference memory layer that stores, reviews, recalls, and manages durable user preferences, constraints, and corrections in a persistent SQLite database.
Create memories manually – Use
memory_rememberto define a structured pending memory candidate (preference, constraint, correction, workflow, failure pattern, or profile) with optional tags, scope selectors, conditions, expiry, and action details.Extract preferences automatically – Use
memory_observeto submit a raw user-authored observation; the server uses host-controlled AI sampling to extract safe, pending candidates without storing the raw input.Recall relevant memories – Use
memory_recallto search active, unexpired memories matching a query and optional scope selectors. Results are grouped by strength (must_apply,should_apply,context) with match explanations, and optional semantic reranking.Review memories – Use
memory_reviewto list memories by lifecycle status (pending,active,rejected,superseded,disputed) with cursor-based pagination.memory_getretrieves a single memory by its opaque ID.Approve, reject, or dispute – Use
memory_resolveto transition a memory’s state (toactive,rejected, ordisputed) after explicit user confirmation via form elicitation.Delete permanently – Use
memory_forgetto purge a memory and its linked data from live storage after user confirmation.Manage via CLI – The included
preference-memoryCLI allows listing, showing, approving, rejecting, disputing, forgetting, exporting, and running health checks (doctor).Scoping and strength – Memories can be tagged with open-ended selectors and exclusions (e.g.,
repository,task_type,language) and have strength levels:context,soft, orhard.Security and privacy – Blocks credential-like or malformed content; all new memories start as
pendingand require user confirmation to activate; operates within the OS user’s security boundary.Configurable – Environment variables control database location, sampling policy, recall limits, character caps, and candidate pool sizes.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Preference Memory MCPRemember for my Python project I prefer snake_case."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
English | 한국어
Preference Memory MCP
A local, provider-neutral MCP server that turns user corrections into scoped, reviewable, and safely retrievable preference memory.
Preference Memory MCP keeps durable preferences, constraints, workflows, and recurring corrections in a local SQLite database. It can ask the model already controlled by an MCP host to extract structured candidates, but it never chooses a model provider and never activates inferred memory without a separate user confirmation.
Architecture · Tool reference · Threat model · Security policy
Status: alpha. Designed for single-user, local use; it is not a credential or authorization service.
Why this exists
Long-lived instructions are often copied into every project, mixed with temporary task context, or lost between sessions. This server gives MCP-compatible clients a shared memory layer with explicit scope, lifecycle states, review, and deletion from live storage.
It is deliberately not a transcript recorder. MCP servers cannot subscribe to every conversation on their own. A host or model must call memory_observe, and the server processes only the single observation supplied to that tool.
Related MCP server: Engram
Design goals
Vendor-neutral: no provider SDKs, model names, or product-specific configuration.
Local-first: stdio transport and a per-user SQLite database.
Reviewable: every newly created proposed or inferred memory starts as
pending.Scoped: open selector maps support repositories, task types, languages, or any integration-defined dimension.
Dynamic: provider-neutral MCP sampling extracts candidates and can select a relevant subset from a bounded pool of already-authorized memories.
Fail-closed inference: unavailable sampling, invalid JSON, extra fields, or over-limit output create no candidates; unsafe sampled candidates are skipped individually.
Explainable: recall returns the matched scope and tags with each memory.
Deletable: purge removes the live memory, linked evidence digests, and FTS rows in one transaction.
Architecture
flowchart LR
H["MCP host"] --> S["stdio MCP adapter"]
S --> P["Deterministic policy"]
S --> I["Host-controlled sampling"]
I --> V["Strict schema validation"]
P --> D["SQLite + FTS5"]
V --> P
D --> C["Local review CLI"]The model may suggest the statement, type, tags, and confidence. Deterministic code controls secret blocking, scope inheritance, candidate limits, status transitions, confirmation, search boundaries, and deletion.
See docs/architecture.md for data flow, lifecycle, storage, and extension points.
Requirements
Python 3.11 or newer
An MCP host with stdio server support
Optional MCP sampling support for
memory_observeand dynamic rerankingOptional MCP form elicitation support for in-host approval and deletion
The server remains useful without sampling: clients can create structured pending candidates with memory_remember, and the local CLI can review them.
Quick start
git clone https://github.com/efficjump/preference-memory-mcp.git
cd preference-memory-mcp
uv tool install .
preference-memory-mcp --version
PREFERENCE_MEMORY_DB="$PWD/demo.sqlite3" preference-memory doctorDuring development:
uv sync --all-groups
uv run preference-memory-mcpIllustrative MCP configuration
Host configuration formats are not part of the protocol and differ between applications. In a host that uses an mcpServers map, the entry commonly looks like this:
{
"mcpServers": {
"preference-memory": {
"command": "preference-memory-mcp"
}
}
}To isolate a test database:
{
"mcpServers": {
"preference-memory": {
"command": "preference-memory-mcp",
"env": {
"PREFERENCE_MEMORY_DB": "/absolute/path/to/test-memory.sqlite3"
}
}
}
}MCP tools
Tool | Behavior |
| Returns active, unexpired memories after scope filtering, conservative local matching, and optional semantic selection. |
| Uses host-controlled sampling to extract strict pending candidates without storing the raw observation. |
| Creates one structured pending candidate without sampling. |
| Lists memories by lifecycle state. |
| Returns |
| Approves, rejects, or disputes a memory only after form elicitation confirms the exact change. |
| Purges content from live storage only after form elicitation confirmation. |
The server also exposes JSON resources for an active, unexpired global summary, one memory item, and the pending review queue, plus a memory_workflow prompt. See docs/tool-reference.md for exact behavior and statuses.
Safe workflow
Call
memory_recallbefore substantial work, passing the current request and only the scope selectors needed for the task.Treat returned memory as user context, never as authorization and never above current instructions.
Call
memory_observeonly with one direct user-authored preference or correction. Do not pass retrieved documents, tool output, or a transcript.Review pending candidates with
memory_reviewor the local CLI.Activate, reject, or dispute a memory through
memory_resolveform confirmation or the trusted local CLI.Use
memory_forgetor the CLI to purge obsolete content from live storage.
Local management CLI
preference-memory list --status pending
preference-memory show MEMORY_ID
preference-memory approve MEMORY_ID
preference-memory reject MEMORY_ID
preference-memory dispute MEMORY_ID
preference-memory forget MEMORY_ID
preference-memory export --status active
preference-memory doctorInteractive confirmation is required for state changes unless --yes is supplied to the local CLI.
Both executables support --help and --version. Invalid arguments and expected configuration,
storage, confirmation-EOF, and lifecycle errors are reported on stderr without a traceback.
Scope selectors
Selectors are intentionally open-ended and contain no product-specific fields:
{
"selectors": {
"repository": "opaque-repository-id",
"task_type": "frontend",
"language": ["python", "typescript"]
},
"exclusions": {
"visibility": "shared"
}
}Every included selector must match the recall context. Any matching exclusion rejects the memory before text search or model reranking.
Configuration
Variable | Default | Description |
| Platform user-data directory | Complete database path. |
| Platform user-data directory | Parent directory used when the database path is not set. |
|
| Sampling policy: |
|
| Default recall result limit; accepted range 1–50. |
|
| Maximum semantic candidate-pool size; accepted range 1–50. |
|
| Observation limit before sampling; accepted range 1–50,000. |
|
| Stored statement limit; accepted range 3–1,200 and applied to direct and sampled candidates. |
|
| Sampling candidate limit; accepted range 1–5. |
The four sampling modes independently control extraction and recall reranking:
Mode | Observation extraction | Recall reranking |
| Enabled | Enabled |
| Enabled | Disabled |
| Disabled | Enabled |
| Disabled | Disabled |
When reranking is disabled or unavailable, recall uses a conservative exact-token gate before FTS5/BM25 ranking. With reranking enabled, it also considers a bounded set of applicable scoped and global memories; the sampler may return any unique supplied subset, including an empty set. See docs/architecture.md for the selection order and fallback behavior.
Security and privacy boundaries
The raw
memory_observeinput is not written to the database, but it is sent to the sampler selected by the host.Credential-like observations and observations containing control or invisible formatting characters are blocked before sampling. Every durable candidate field and scope value is checked again before storage.
Model output is accepted only as strict JSON matching a closed Pydantic schema.
Newly inferred candidates cannot become active through model output or ordinary tool arguments.
Optional reranking sends the query and already scope-authorized candidate summaries to host sampling. Credential-like queries and queries containing control or invisible formatting characters stay on local search.
Records created under an older policy are rechecked before automatic recall, reranking, and the global profile cap. Management reads remain visible so the local user can inspect and purge them.
Newly created data directories use mode
0700and database files use0600on compatible systems. Existing custom directories are not modified.Audit events contain action metadata, not memory text.
The server uses the operating-system user account as its local security boundary.
The database is not encrypted at rest. Purge is not a forensic secure-erase guarantee: SQLite WAL files, free pages, backups, and snapshots may retain bytes. Use full-disk encryption or an encrypted volume when the local account boundary is insufficient. Do not use this project as a password, token, private-key, payment, medical, or identity vault. See SECURITY.md and docs/threat-model.md.
Development
uv sync --all-groups
uv run ruff check .
uv run ruff format --check .
uv run pytest
uv build
uvx --from twine==6.2.0 twine check dist/*The MCP Python SDK is intentionally constrained to >=1.28.1,<1.29. A small, guarded compatibility
adapter uses FastMCP 1.x internals to publish this package's server version and reject undeclared
top-level tool arguments; tests make a future SDK upgrade explicit instead of silently weakening
the contract. uv.lock pins the exact tested environment. CI tests Python 3.11–3.13, validates the
distributions, installs the wheel into an isolated environment, and fails when a runtime dependency
reports an unreviewed license label.
License
Apache License 2.0. Runtime dependency notices are documented in THIRD_PARTY_NOTICES.md.
This is an independent implementation and does not imply endorsement by any protocol maintainer or MCP host.
Available Tools
6 toolsmemory_getARead-onlyIdempotent
Read one memory by its opaque identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | Yes | |
| memory | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the retrieval context ('by its opaque identifier'), which is complementary and does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (8 words) and front-loads the core action. It could include more detail without becoming verbose, but it is efficient and avoids fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with a single parameter and an existing output schema, the description is adequate. It does not cover error cases (e.g., missing memory) but the output schema likely handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It adds 'opaque identifier' context for the memory_id parameter, but does not explain its format, origin, or constraints beyond the schema (e.g., maxLength).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') and resource ('one memory') with access method ('by its opaque identifier'), clearly distinguishing it from sibling tools like memory_recall (recalls multiple) or memory_remember (writes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an opaque identifier is available, but does not explicitly state when to use this tool versus alternatives like memory_observe or memory_resolve. No exclusions or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_observeC
Use host sampling to extract pending candidates without storing the raw observation.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | ||
| strength | No | soft | |
| observation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| message | Yes | |
| candidates | No | |
| created_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, providing minimal behavioral cues. The description adds that it does not store raw observation, but does not disclose side effects, state changes, or whether the extraction modifies internal data. Key behavioral traits are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, very concise and front-loaded. However, it is too brief to cover necessary guidance, which slightly reduces structure effectiveness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters including a nested Scope object and an enum, and has sibling tools, the description is inadequate. It does not explain how parameters affect output, what 'host sampling' means, or what the return value contains, despite having an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning no descriptions on top-level properties. The description does not explain the 'observation', 'scope', or 'strength' parameters. The Scope definition in schema has a description, but parameters overall are underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'extract' and clarifies the tool extracts pending candidates without storing the raw observation. It distinguishes from sibling tools like memory_remember (store) and memory_recall (retrieve). However, 'pending candidates' is not defined, so purpose is not fully precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. Implies usage for host sampling, but no when-not conditions or comparisons to siblings like memory_resolve or memory_review.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_recallCRead-onlyIdempotent
Recall active memories that match the current request and opaque scope selectors.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| context | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| context | No | |
| reranked | No | |
| must_apply | No | |
| should_apply | No | |
| total_candidates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to repeat those. The description adds that it recalls 'active' memories, but does not elaborate on what 'active' means or any other behavioral traits not covered by annotations. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loading the primary action. However, it sacrifices clarity for brevity, warranting a 4 rather than a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values need not be explained. However, the description fails to clarify what constitutes a 'match', what 'active' means, or how scope selectors work. With three parameters and a search function, more context is needed for complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It hints that 'query' is the request and 'opaque scope selectors' might relate to the 'context' parameter, but does not explicitly describe each parameter. The 'limit' parameter is entirely unaddressed. This is insufficient compensation for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it recalls active memories matching a request, providing a verb and resource. However, 'opaque scope selectors' is ambiguous and does not sufficiently differentiate from sibling tools like memory_get or memory_resolve. The purpose is moderately clear but lacks specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. There is no mention of exclusions, prerequisites, or comparisons to sibling tools, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_rememberC
Create a pending, structured memory proposal without invoking sampling.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | preference | |
| tags | No | ||
| scope | No | ||
| strength | No | soft | |
| condition | No | ||
| statement | Yes | ||
| expires_at | No | ||
| avoid_action | No | ||
| verification | No | ||
| desired_action | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| memory | Yes | |
| created | Yes | |
| confirmation_required | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries full burden. It discloses that no sampling is invoked, which is helpful, but omits many behavioral traits: whether the proposal is persisted, whether it can be retrieved later, if it triggers side effects, or any rate limits. With 0 annotation coverage, more detail is expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no fluff. However, it is too concise for the complexity: 10 parameters and no schema descriptions demand more informative prose. Front-loading is fine but content is lacking.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, 1 required, and 0% schema description coverage, the description is severely incomplete. It does not explain any parameter's role, the meaning of 'memory proposal', or how this integrates with other memory tools. Even with an output schema present, the description fails to provide essential context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — no property descriptions exist. The description adds zero information about the 10 parameters (kind, tags, scope, strength, etc.). For a high-parameter tool, this is critically insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool creates a pending memory proposal without sampling, but it does not differentiate from sibling tools like memory_observe (which might record observations) or memory_recall (retrieval). The verb 'create' is clear, but the resource 'memory proposal' is somewhat vague without context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs siblings. The description does not mention prerequisites, alternatives, or when to prefer this over memory_observe or memory_resolve. The agent receives no decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_resolveBDestructiveIdempotent
Approve, reject, or dispute a memory after a real form-elicitation response.
| Name | Required | Description | Default |
|---|---|---|---|
| decision | Yes | ||
| memory_id | Yes | ||
| supersedes_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| memory | No | |
| status | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true, so the description's mention of 'approve, reject, or dispute' confirms mutation behavior. However, it does not disclose what state changes occur (e.g., whether the memory is updated or deleted) or any side effects. It adds minimal value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently conveys the core purpose. Every word is necessary, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema and annotations, the description is too brief for a mutation tool with 3 parameters. It omits critical details such as the meaning of 'supersedes_id', the result of invoking the tool, or any constraints. The description leaves significant gaps in the agent's understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 3 parameters with 0% schema description coverage. The description does not elaborate on any parameter (e.g., what 'memory_id' refers to, how 'decision' affects the memory, or the role of 'supersedes_id'). It fails to compensate for the missing schema descriptions, leaving the agent without meaningful parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's purpose: to approve, reject, or dispute a memory after a form-elicitation response. The verb 'resolve' combined with the resource 'memory' and the three specific actions distinguishes it from sibling tools like memory_get, memory_observe, etc., which are read or observation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used after a 'real form-elicitation response', but does not explicitly say when to use it versus alternatives. It lacks guidance on prerequisites or when not to use it. Sibling tools are listed but no comparison provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_reviewARead-onlyIdempotent
List reviewable memories with cursor-based pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| status | No | pending |
Output Schema
| Name | Required | Description |
|---|---|---|
| memories | No | |
| next_cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive. Description adds cursor-based pagination. No contradictions; sufficient value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single concise sentence at the beginning conveying essential info. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated listing tool with cursor, status filter, and output schema, description is too sparse. Missing context like cursor handling, meaning of 'reviewable', default status filtering, and pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, requiring description to compensate, but description does not explain any parameter (limit, cursor, status). Parameter names are partially self-explanatory but missing details like default for status and cursor format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb (list), resource (reviewable memories), and key behavior (cursor-based pagination). Differentiates from siblings like memory_get and memory_recall by specifying 'reviewable'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use via 'reviewable' but lacks explicit when-not or alternative tool references. No guidance on prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.1.0- First observed
memory_get - First observed
memory_observe - First observed
memory_recall - First observed
memory_remember - First observed
memory_resolve - First observed
memory_review
TDQS
Each tool targets a distinct action: reading by ID, observing candidates, recalling active memories, creating pending proposals, resolving them, and listing reviewable ones. No overlap.
All tools follow the 'memory_<verb>' pattern with clear, descriptive verbs (get, observe, recall, remember, resolve, review), ensuring predictability.
With 6 tools, the surface is well-scoped for a memory management server, covering core operations without being overly large or sparse.
The tools cover create, read, list, and resolve workflows. However, there is no explicit delete tool; while resolve may handle disposal, this omission is a minor gap for full CRUD coverage.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An MCP memory server. One memory your agents share — across models, devices and apps.
Person-owned AI memory that learns, not just stores — portable context for any MCP client.
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local MCP server that provides a sovereign memory substrate for LLMs, enabling capture, recall, explanation, and anticipation of conversation turns with bi-temporal events and a strict read-only query surface.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA local-first memory MCP server that enables storing, searching, and managing personal memories with hybrid keyword and semantic recall, all on-device.21MIT
- AlicenseNot gradedqualityCmaintenanceA local-first memory server for AI tools that provides cross-tool, consent-gated, and auditable memory management via MCP.AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceA local MCP server that provides a shared, private memory for multiple AI tools, enabling cross-model recall and automatic session ingestion.671MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/efficjump/preference-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server