frugal-memory
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| rememberA | Stores one fact permanently in memory. Use it for knowledge a later session needs: a decision with its reason, a pitfall, a measured number, an interface. Not for secrets, guesses or short-lived details. Search with recall first; if an entry covers the fact, supersede that one. Returns the new id, existing entries that resemble it (candidates to supersede) and a note when the tag is new - often a misspelling. Args: text: The fact. A text that belongs to two kinds is two entries. tags: The project, i.e. WHERE the knowledge belongs (spaces or commas between several). kind: WHICH KIND of knowledge: interface (signature, file name, command, data format), pitfall (the obvious approach is wrong because ...), decision (with rationale), measurement (a number plus its criterion), workflow (how to work with this user), history (chronicle, hidden from recall's default view). Empty = unsorted. supersedes: Ids this entry replaces, e.g. "12,34". Hidden, not deleted. |
| recallA | Searches memory by words, best matches first. Use it first, before searching files or the web for something noted before. It matches words, not meaning: inflected forms count ("configured" -> "configuring"), synonyms don't - if nothing fits, retry in the other language your notes may use. No search terms? Browse with topics. Returns a preview per hit (id, kind, date, title line). Read the ones you need with show("376,481"), or set full=True for a narrow question. Args: query: Search term(s), FTS5 syntax allowed (e.g. "sqlite AND fts5", "proj*"). limit: Maximum number of hits (default 8). kind: Restrict to kinds of knowledge, e.g. "pitfall,decision". Possible: interface, pitfall, decision, measurement, workflow, history, unsorted, all. Default: everything except history - otherwise the chronicle drowns out every search for a detail. tag: Restrict to a project, e.g. "spaceship". Several tags separated by comma or space are OR-combined. Sub-tags are included: "lighthouse" also matches "lighthouse-project", but "mcp-memory-server" does not match "mcp-memory". topics() lists which tags exist. full: Full text instead of preview (default: no), capped like show. include_superseded: Also show superseded entries (default: no). |
| showA | Returns the named entries in full text. Use it after recall or topics, once you know which entries you need - it takes ids, not search terms. Superseded entries are included: whoever asks for the id means that one. Returns about 6000 characters per call, in the order asked. Whatever doesn't fit comes back as a title line plus the call that fetches it; unknown ids are named as such. Args: ids: One or more entry ids, e.g. "376,481". Most wanted first. full: Everything asked for at once, without the cap (default: no). |
| topicsA | Browses memory: the board of all tags, or the title index of one project. Use it when search terms are missing - a project picked up after months, or "what happened here lately". To find a specific fact, recall is faster. Returns the tag board (entries per tag and kind) or, with a tag, that project's title lines, newest first, one page at a time. Follow up with show("...") or recall(query, tag="..."). Args: tag: Project, e.g. "spaceship". Empty = tag board. limit: Rows per page (default 40 for the board, 30 for the title index). page: Page of the title index (default 1 = the newest). all: Whole title index at once, grouped by kind. |
| consolidateA | Finds groups of entries that say largely the same thing. Use it for tidying up. Read-only, changes nothing: merging is a judgment call - replace a group by one new entry via remember(..., supersedes="..."). Compares shared word stems weighted by rarity, not meaning; identical copies are always found. A few seconds for thousands of entries. Returns how many entries and pairs were compared, then the groups, largest first, each with its best similarity and its entries (id, kind, date, title) - or that nothing reached the threshold. Args: tag: Only consider entries from this project (empty = all). Sub-tags are included, as in recall. kind: Only consider entries of this kind/these kinds, comma-separated. Default "all"; "history" alone is the most rewarding case. threshold: Share of the weighted stems two entries must have in common, 0 to 1. Default 0.5; 0.8 shows only near-copies. groups: Maximum number of groups reported (default 5). |
| checkA | Has a small language model judge how the named entries relate. Use it on a group from consolidate, or on two entries that seem to disagree, to ask whether a CONTRADICTION is behind it, PROGRESS (a newer state), or nothing (INDEPENDENT). Not authoritative: measured 67 % correct on 70 German pairs, so the result says where to look, not what is true. Returns one line per pair. Each pair is asked in both directions; only what comes back the same both times is reported, otherwise "disputed". At most 5 pairs per call, roughly 10 seconds each. Opt-in: needs MEMORY_FC_URL and MEMORY_FC_MODEL (any OpenAI-compatible endpoint; MEMORY_FC_KEY if it wants a key). Without them this tool does nothing and says so. When set up, up to 200 characters of each note are sent there. Args: ids: Two or more entry ids, e.g. "249,255". |
| forgetA | Hides entries that are wrong or obsolete and have no replacement. If a newer entry replaces them, use remember(..., supersedes=...) instead. Nothing is deleted: show and recall(..., include_superseded=True) still find them, undo=True brings them back. Returns the ids changed and names unknown ones. Args: ids: One or more entry ids, e.g. "12,34". reason: Why - shown later next to the superseded entry. undo: True brings superseded entries back. |
| classifyA | Sets the kind of knowledge for existing entries. Use it in passing on entries recall shows as "unsorted"; the backlog need not be sorted in one sitting. Writes only the kind - text, tags, ids and superseded status stay as they are - and is undone by classifying again. Returns the ids changed, names unknown ids, and how many live entries are still unsorted. Args: ids: One or more entry ids, e.g. "376,481"; a range "376-380" means every id in between. kind: Exactly one of: interface, pitfall, decision, measurement, workflow, history. "unsorted" undoes the classification. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
Each tool has a distinct role: remember writes, recall searches by words, show fetches by id, topics browses when no terms exist, classify/forget mutate metadata, and consolidate/check form a two-step duplicate-analysis workflow. The only mild adjacency is recall vs topics vs show, but the descriptions explicitly state when to use which.
Seven of eight names are single lowercase verbs (remember, recall, show, classify, forget, consolidate, check), giving a predictable pattern. 'topics' is a noun, a minor deviation, though its browsing purpose makes the name natural.
Eight tools is well within the sweet spot and each maps to a real operation (write, search, fetch, browse, classify, supersede, dedupe, judge). No tool feels redundant or like padding.
The lifecycle is well covered: create (remember), read (recall/show/topics), update-kind (classify), retire (forget/supersede), and maintenance (consolidate/check). The only gap is no direct text-editing operation — replacement is done via remember(supersedes=...), which is a workaround rather than a dead end.