LM-Pocket
Enables Ollama-based local model clients to access the user's memory through local MCP, fully offline end to end.
Click on "Deploy 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., "@LM-Pocketwhat do you remember about my Q3 planning decisions?"
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.
LM-Pocket — Longitudinal Memory Pocket
Your AI memory, physically yours.
Your model can change. Your history doesn't have to.
LM-Pocket is a personal, portable, local-first, model-agnostic memory layer that you own. It lives in a folder — on a USB stick, an external SSD, or your laptop — and keeps your context, preferences, decisions and learnings across time, regardless of which LLM, app, company or device you use.
It is not an assistant and not a model. It is a continuity layer: storage, provenance, governance and access control for your long-term memory, exposed to any LLM through MCP or through copy/paste prompt bridges.
Status: v0.1 prototype. The first demo works end to end on a real USB-style volume: encrypted pocket, passphrase unlock, MCP reads limited by profile, proposals approved in a localhost UI, prompt-bridge import/export, and MCP access cut off when the pocket is locked or unplugged. Not audited, not for real secrets yet. Spec frozen at tag
spec-v0.2-frozen.
Quick start
Needs uv. Offline machines: see docs/offline.md.
git clone https://github.com/jmfraga/lm-pocket && cd lm-pocket
uv sync
uv run lm-pocket init /Volumes/MyUSB/LM-Pocket --sample # prints your recovery key once
uv run lm-pocket open /Volumes/MyUSB/LM-Pocket # opens the localhost UI; unlock thereThe home page shows the exact MCP config for each permission profile. For Claude Code:
claude mcp add pocket-work -- "$(uv run which python)" -m lm_pocket mcp --profile workThen ask Claude something that depends on your memory. Lock the pocket (or unplug the USB) and ask again.
See the first demo — including a real Claude session — or run it yourself on macOS with a throwaway exFAT disk image:
uv run python scripts/demo_usb_macos.pyRelated MCP server: agent-memory-os
Why
Every AI provider is building memory, and every one of them keeps it on their servers, in their format, under their rules. Switch providers and you start from zero. Lose your account and your history goes with it.
LM-Pocket bets on the opposite: the canonical copy of your memory belongs to you, in an open format, and the model is a replaceable processor that reads only what you allow.
What makes it different
Pieces of this exist elsewhere (memory engines, MCP memory servers, portable agent memory formats). What LM-Pocket combines:
Physically yours — the canonical copy is a folder you can unplug.
Spaces —
personal,portable_professional,work:<id>… isolated by default. Your employer's LLM never sees your personal life or your previous employer's secrets.Proposal → review → durable — no LLM ever writes directly to your canonical memory.
Provenance on everything — every memory answers "where did this come from?" and inferences are distinguished from facts you stated.
Portable experience — keep the lesson ("validate small hypotheses before scaling") without carrying the proprietary data it came from.
Open export format — nothing should stop another program from reading your memory.
How models connect
Client | Path | Notes |
Claude Desktop / Claude Code / Cursor | Local MCP (stdio) | Native, nothing leaves your machine except what the model reads. |
Gemini CLI | Local MCP (stdio) | Native MCP support. |
Local models (LM Studio, Open WebUI, Ollama-based clients) | Local MCP (stdio or HTTP) | Fully offline end to end. |
ChatGPT | Remote MCP bridge (Cloudflare Tunnel or similar) or prompt bridge | ChatGPT only accepts remote HTTPS MCP. Optional, off by default. See docs/bridge.md. |
Gemini app and other closed chats | Prompt bridge | Copy a context package in; paste the model's memory export back. |
Client support changes fast — see docs/mcp.md for details and please send corrections.
Documents
SPEC.md — the MVP specification (v0.2, frozen for v0.1)
docs/demo.md — the first demo, step by step, with real output
docs/spec-conflicts.md — what implementation found that the spec must decide
docs/threat-model.md — what LM-Pocket protects against, and what it cannot
docs/mcp.md — MCP tools, permission profiles, client setup
docs/bridge.md — exposing a read-only bridge for ChatGPT and other remote clients
docs/memory-format.md — the open export format
schemas/ — JSON Schemas for the format
examples/ — a fictional sample memory export
ROADMAP.md — what gets built, in what order
CONTRIBUTING.md — how to join
Spanish versions live in docs/es/.
Principles that must not break
The memory belongs to the user.
The system works offline.
An LLM never writes directly to canonical memory.
Spaces are isolated by default.
Every memory has provenance.
The format is exportable.
MCP is an interface, not the memory.
The model is replaceable.
The user can physically disconnect their memory.
The developer disappearing must not destroy the user's history.
License
Code: Apache-2.0
Specification, documentation and schemas: CC-BY-4.0
The business, if there ever is one, can live in hardware, UX, support, enterprise administration, optional sync or managed services. Never in charging rent to access your own memory.
Available Tools
8 toolsget_contextBRead-only
A compact, budgeted context package about a topic, grouped by preferences, history, goals and inferences. Prefer this at the start of a task.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | ||
| purpose | No | ||
| max_tokens | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish this as a safe, read-only, closed-world read, so the safety profile is covered. The description adds the 'compact, budgeted' framing and the grouping categories, but does not disclose truncation behavior, what happens when the token budget is exceeded, or any auth/scope requirements – with an output schema present, return shape need not be repeated.
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?
Two sentences, no padding, with the substantive characterization of the payload leading and the usage hint trailing. Efficient and front-loaded, though the second sentence could have carried parameter guidance instead of just a preference cue.
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?
An output schema exists, so return values are handled elsewhere, and the description covers the artifact's nature adequately. The gap is parameter guidance for topic/purpose/max_tokens at 0% schema coverage, which leaves an agent guessing about how to steer the result.
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 full burden. It implies topic ('about a topic') and budget ('budgeted'), but never mentions the purpose parameter and gives no format, default, or interaction guidance for any of the three, leaving two of three params only obliquely hinted.
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 a concrete resource – a compact, budgeted context package grouped into preferences, history, goals and inferences. That level of detail lets an agent picture the artifact without opening the schema, though it never distinguishes itself from siblings like get_recent_context or get_profile.
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?
'Prefer this at the start of a task' gives one concrete trigger point, which is more than nothing. However, it names no alternatives (get_recent_context, get_profile, search_memories are all nearby) and offers no when-not-to-use condition, so the routing decision is only half supported.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memoryCRead-only
One memory by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that: no behavior when the id is unknown, no mention of scoping/permissions, no note on whether memory content is trimmed. With annotations carrying the load, this is minimal-but-not-broken.
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?
At four words there is zero waste and the key qualifier ('by id') is front-loaded. Size is not the problem; the phrasing is a sentence fragment rather than a usable statement, so it reads as under-specification rather than true conciseness.
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?
An output schema exists, so return values need not be described, and annotations cover the safety profile. What remains missing is the piece only the description can supply: how this differs from search_memories/get_recent_context and what an id looks like, which is thin for a tool in a 7-sibling cluster.
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 full burden for the single id parameter. It only says 'by id' and gives no expected format (UUID, slug, opaque handle) or example, leaving the agent to guess what a valid identifier looks like.
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 fragment identifies the resource (a single memory) and its lookup key (id), which weakly distinguishes it from query-based siblings like search_memories. However, it lacks a verb and reads as a trimmed restatement of the name 'get_memory'. The purpose is inferable but not stated with 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?
There is no when-to-use guidance and no mention of alternatives, despite a dense sibling set (get_context, get_recent_context, search_memories, list_spaces). The agent must infer that it should call this only when it already holds a memory id, and nothing warns what to do if it does not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_policiesBRead-only
Read-only view of this profile's rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so 'Read-only view' largely restates structured data. The only added context is that the rules belong to 'this profile', which is mild scope information; nothing about what policies contain or how they are scoped.
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?
A single short, front-loaded sentence with no padding. It loses a point because part of that sentence ('Read-only') duplicates the annotations rather than adding information.
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 zero-parameter read with an output schema and full annotation coverage, the description is nearly sufficient — return values and safety are handled elsewhere. The remaining gap is that 'rules' is never defined and no sibling routing is given.
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 tool takes zero parameters, so the baseline is 4 and there is nothing for the description to clarify beyond that.
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 names a specific verb ('Read-only view') and resource ('this profile's rules'), which is distinct from siblings like get_profile, list_spaces, and search_memories. It does not explicitly contrast itself with those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this versus get_profile or get_context, nor any prerequisites or exclusions. The agent must infer usage purely from the noun 'rules'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileCRead-only
What this connection may do: readable spaces and where proposals go.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered and the bar is lower. The description adds only content hints ('where proposals go'), not behavioral traits such as permission requirements, caching, or connection-specific scoping that would go 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?
It is short and free of filler, but it is a sentence fragment with no subject or verb, so the information is not front-loaded in a way the agent can act on. The length is fine; the structure is weak.
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?
With zero parameters, an output schema covering the return shape, and rich annotations, the description does not need to carry much. However, it never states that this returns the current connection's profile or how it relates to list_spaces/propose_memory, so the routing information an agent needs is only partially present.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. No parameter meaning is lost.
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 fragment identifies the content of the resource ('readable spaces and where proposals go') but never states an action ('returns/retrieves') or names the resource as a profile, so an agent must infer that get_profile returns the current connection's permission scope. It is meaningfully different from get_context, but the purpose is expressed obliquely rather than as a verb+resource.
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?
There is no when-to-use statement, no prerequisites, and no alternative named, despite siblings list_spaces (readable spaces) and propose_memory (proposal destination) overlapping with the two things this description mentions. The description only implies usage; nothing tells the agent when to pick get_profile over get_context or list_spaces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_contextCRead-only
The most recently updated durable memories this profile can read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, closed-world operation, so the description carries a lighter burden. It does add two useful behavioral facts beyond the annotations: results are limited to 'durable' memories and to what 'this profile can read' (a permission scope). It says nothing about ordering guarantees, refresh cadence, or what happens when no recent memories exist.
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?
A single short fragment with no wasted words, and the ordering criterion is front-loaded. However, it is a sentence fragment rather than a complete statement, leaving the reader to supply the implicit verb and the limit behavior.
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?
An output schema exists, so return-value explanation is not required, and the annotations cover the safety profile. What is missing is any mention of the limit parameter and the absence of guidance relative to the many sibling retrieval tools, which is a real gap for a one-parameter list tool.
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?
There is one parameter (limit, default 10) with 0% schema description coverage, and the description never mentions it, so nothing explains what the limit constrains or what happens past the cap. The description therefore fails to compensate for the schema gap on the only parameter that exists.
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 conveys the resource (recently updated durable memories) and a scope qualifier ('this profile can read'), but it is a noun phrase with no verb and no differentiation from siblings such as get_context, search_memories, or list_spaces. An agent can infer it returns recent memories but not clearly why it exists alongside get_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?
There is no when-to-use guidance, no exclusions, and no reference to any alternative such as search_memories for filtered lookups or get_context for broader context assembly. The 'most recently updated' ordering is the only implicit hint about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spacesBRead-only
Spaces of the user's memory that this profile can read.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond that: results are filtered to spaces this profile can read, i.e. access-scoped rather than exhaustive. It still says nothing about ordering, pagination, or whether the list can be empty.
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?
A single short sentence with no filler, so it is well within budget. However, it is a noun phrase rather than a front-loaded action statement, which slightly weakens the lead.
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?
With an output schema present, return-value detail is not required, and zero parameters need no explanation. What remains thin is that the description never explicitly confirms this is a complete enumeration or whether pagination/limits apply, which an agent planning a discovery call would want.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool applies. No parameter semantics are needed or missing.
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 fragment names the resource ('spaces of the user's memory') and scopes it to what the profile can read, which hints at a listing operation, but it never states a verb. It does not distinguish itself from siblings like get_context or search_memories, so the agent must infer that this is the enumeration call.
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?
There is no when-to-use guidance and no mention of alternatives. Nothing tells the agent whether to call list_spaces first to discover scope, or to prefer search_memories/get_context instead. The permission scoping is the only implicit usage signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_memoryAIdempotent
Propose a new memory about the user. It is saved as a CANDIDATE that the user must approve. type: fact | preference | event | interpretation | skill | decision | relationship | goal. Use 'interpretation' for anything inferred. provider/model: identify yourself for provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| type | No | fact | |
| model | No | ||
| content | Yes | ||
| provider | No | ||
| confidence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds genuinely useful behavioral context not in the annotations: the memory is saved as a CANDIDATE that the user must approve, which tells the agent the write is not immediately committed.
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?
Front-loaded with the action and the candidate-approval behavior, then follows with parameter guidance. The type enumeration is long but earns its place since the schema has no enum. No filler sentences.
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?
With an output schema present, return values need no explanation. The description covers the key behavioral trait (candidate/approval) and the highest-value parameter (type), but is silent on tags and confidence, leaving a gap for a 6-parameter tool.
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 carry the load. It usefully enumerates the allowed 'type' values (which the schema omits, having no enum) and explains provider/model for provenance, but leaves tags and confidence (default 0.5) entirely unexplained out of 6 parameters.
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?
States a specific verb and resource ('Propose a new memory about the user'), which clearly distinguishes the write path from the read-oriented siblings (search_memories, get_memory, get_context). It doesn't explicitly name a sibling alternative, but the verb 'propose' plus the resource makes the purpose unambiguous.
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?
Usage is implied rather than stated. The description explains that results become a CANDIDATE requiring approval and gives a routing rule for the 'type' field ('Use interpretation for anything inferred'), but it never says when to call this tool versus not call it, or what prerequisites exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoriesBRead-only
Full-text search over the user's durable memories (accent-insensitive). Empty query = most recent. Each result includes provenance: who stated it, how and when.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| space | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior ('accent-insensitive', empty-query fallback), but says nothing about limit/pagination behavior or what a space filter does, so it only modestly exceeds the annotation baseline.
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?
Three short, front-loaded sentences with no filler; the core operation leads and the two useful behavioral facts follow. It does not sprawl, though the formatting is fragmentary.
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?
Since an output schema exists, the description need not explain return values, and its provenance note is a nice complement. But for a 3-parameter search tool with zero schema documentation, the unspecified limit and space parameters leave real gaps in an agent's ability to call it correctly.
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% for three parameters, so the description carries the full burden. It explains the query parameter's edge case (empty = most recent results), but 'limit' and especially 'space' are left completely undefined, leaving two of three parameters undocumented in both places.
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?
States a specific verb and resource ('full-text search over the user's durable memories') plus a qualifier (accent-insensitive) that scopes the search behavior. However, it does not distinguish itself from close siblings like get_memory or get_recent_context, leaving the agent to infer the boundary.
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 'Empty query = most recent' clause implies one usage mode, but there is no explicit when-to-use guidance versus get_memory (single lookup) or get_recent_context (recency browsing). The agent must infer which sibling to pick for a given intent.
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.
8 tool updates
v0.1.0- First observed
get_context - First observed
get_memory - First observed
get_policies - First observed
get_profile - First observed
get_recent_context - First observed
list_spaces - First observed
propose_memory - First observed
search_memories
TDQS
Scored across 8 tools
Most tools have distinct targets (memory by id, spaces, policies, profile, search), but get_recent_context overlaps with search_memories (whose empty query returns most recent), and get_profile vs get_policies have a subtle boundary (permissions vs rules) that could cause misselection.
All tools follow a clean snake_case verb_noun pattern (get_context, get_recent_context, get_policies, propose_memory, get_profile, list_spaces, search_memories, get_memory) with no deviation.
Eight tools sit comfortably in the ideal 3-15 range and each maps to a distinct facet of the memory domain (retrieve, search, propose, inspect spaces/policies/profile).
Read coverage is strong (context, recent, search, get by id, spaces, policies), but the proposal lifecycle is a dead end: propose_memory creates a candidate yet there is no tool to list, review, revise, withdraw, or delete memories or pending candidates.
Maintenance
Related MCP Connectors
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
Person-owned AI memory: portable context for any MCP client.
Private, portable memory and reusable skills for AI agents.
Governed local-first memory and continuity for AI agents — signed receipts, optional hosted lane.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLocal-first, file-based memory layer for AI agents — one shared Markdown vault across Claude, Codex, Gemini, Cursor and any MCP client. Provides read/write memory tools with an audit trail, per-agent trust levels, and Git sync; no cloud and no lock-in.2MIT
- AlicenseAqualityBmaintenanceLocal-first memory engine for AI-agent teams: private/team/project ACL, associative recall, and federated sync across nodes. One SQLite file, no LLM required.127Apache 2.0
- AlicenseAqualityDmaintenanceUser-owned portable memory vault as an MCP server: agents can fetch context, search entries, and propose new memories, while humans curate the vault via a web app.3MIT

fimemoryofficial
FlicenseNot gradedqualityAmaintenanceEnables AI assistants to read and write a local, encrypted-by-default memory store, so they can share persistent notes and context across sessions and models on your machine.85 npm-