A local-first memory service for AI assistants with two MCP server adapters: mcp_server.py (four model-facing tools) and mcp_admin_server.py (read-only admin tools)
Membro demonstrates solid naming conventions (verb-noun patterns: recall_memory, search_history, save_memory) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 6 tools have descriptions explaining WHAT they do and WHEN to use them. However, input schemas are incomplete: most parameters lack type definitions beyond 'string', and several lack descriptions entirely. The save_memory tool omits descriptions for its 'content' parameter. Output schemas are undocumented, LLMs cannot infer what fields to expect from recall_memory or memory_summary responses. Error handling is minimal; tools return generic error strings without recovery guidance. The admin server (search_facts, review_queue) shows better parameter documentation but still lacks output schema clarity.
The current structured profile summary of the user, rebuilt from their memory ledger (newest facts win). The output is stamped with when the summary was generated — a stale summary reads as authoritative, so time-sensitive or active-thread status should be verified with recall.
Search the user's complete memory ledger — the durable, never-summarized record of facts about them (hybrid semantic + keyword search). Empty query returns the most recent entries.
Read-only: the held-for-review queue (quarantined, not yet dismissed) — exact ids, text, and dates, optionally filtered to rows containing a keyword. Requires an owner MEMORY_AUTH_TOKEN — enforced by the service itself, even on loopback. Never approves, dismisses, edits, or deletes anything.
Propose a durable fact about the user for their permanent memory ledger (one clear sentence). External saves are held for the user's review before becoming part of their memory. Optionally pass event_date as YYYY-MM-DD when the fact is about a specific past/future date rather than today.
Read-only: exact fact ROWS (id, status, text, event/source date, origin) matching a keyword, across every status — approved, pending review, dismissed, superseded (status: valid|superseded|quarantined|all, default all). For confirming and remediating specific rows, not general recall. Requires an owner MEMORY_AUTH_TOKEN — enforced by the service itself, even on loopback. Never approves, dismisses, edits, or deletes anything.
Output schemas completely undocumented. recall_memory, search_history, and memory_summary return unstructured strings; LLMs cannot plan downstream operations or extract structured data. No field definitions, types, or pagination info visible.
Input parameter descriptions missing or incomplete. save_memory's 'content' parameter has no description. search_facts and review_queue lack descriptions for the 'query' parameter explaining what constitutes a valid keyword search.
No error recovery guidance. Tools return generic error strings ('Error reaching Membro at...') without actionable next steps. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Verbatim full-text search across every ingested message in the user's conversation history. Owner-gated like the HTTP route (#81): register the server with -e MEMORY_AUTH_TOKEN=<the service's token> to enable it.
Parameter type definitions incomplete. Most parameters declared as 'string' with no format, length, or pattern constraints. search_facts 'status' parameter accepts 'valid|superseded|quarantined|all' but is not declared as an enum.
No pagination or result-limiting documented. recall_memory and search_history may return unbounded result sets; no limit, offset, or cursor parameters visible. Large result sets risk context window exhaustion.