Local-first memory operating system for AI agents — exposes knowledge graph via MCP tools for search, remember, trends, and context retrieval
MinionOS demonstrates solid tool design with clear naming, comprehensive descriptions, and proper schema definitions. All 6 tools follow verb_noun patterns (memos_search, memos_remember, etc.). Descriptions are detailed (150-300 chars) and include usage guidance. Input schemas are present with type definitions and parameter descriptions. Tool annotations (readOnlyHint, idempotentHint) are correctly applied. Main gaps: memos_remember lacks explicit error guidance for LLM recovery; output schemas are not formally documented in code; no pagination support despite potential for large result sets in memos_context and memos_trends.
Load background knowledge about a topic before responding to a user request. Call this BEFORE your first response whenever the user gives you a non-trivial task or question. Extract a 2-5 word topic from their message and call this immediately. Absorb the results silently as background — do not narrate that you called it or summarize what you found. This prevents asking users about things they've already told you, and ensures your response reflects everything you know about the topic. Returns entities (people, projects, tools), recent facts (decisions, learnings), and domain breakdown — all filtered to what's relevant to the topic.
Get the user's profile with identity and recent activity. Returns the user's static facts (stable knowledge like role, skills, preferences) and dynamic facts (recent episodic activity from the last 7 days). Useful for personalizing responses without searching. Returns None if user_name is not configured in ~/.minionOS/config.yaml.
Extract and store durable knowledge into the MinionOS knowledge graph. Call this when the user reveals something worth keeping long-term: - A decision ("we chose PostgreSQL for ACID compliance") - A person's role ("Sarah is leading the auth migration") - A deadline or milestone ("the release is March 31") - A technology choice or preference Do NOT call for ephemeral state: error traces, build output, code snippets, debugging steps, or anything that won't matter next week. Text is processed by an LLM to extract entities, relationships, and facts, then stored and linked to existing knowledge. If the LLM is unavailable, text is queued for later processing (raw_queued=true in the response).
Output schemas not formally documented in code. Tool descriptions state what is returned (e.g., 'Returns ranked entities with type, domain, relevance score, and relationships') but the actual dataclass/dict structure is not visible in the provided source. LLMs cannot reliably plan downstream tool chaining without explicit output field documentation.
memos_remember lacks actionable error guidance. Description mentions 'If the LLM is unavailable, text is queued for later processing (raw_queued=true in the response)' but the tool does not document what the LLM should do if queuing fails, or how to verify queued items were processed. Error handling should guide recovery.
No pagination support for potentially large result sets. memos_context and memos_trends accept 'days' and 'fact_days' parameters but do not expose limit/offset or cursor-based pagination. If a topic has hundreds of entities, the response could exhaust context windows. Baseline: A+ tools cap results at 20-50 and offer pagination.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | <=2025-11-25 | v2 |
Search the knowledge graph for a specific entity, person, project, or concept. Use this for targeted lookups — when you need to know about a specific thing. Prefer memos_context when you need broad topical background before starting a task. Call this BEFORE asking the user "who is X?" or "what's the status of Y?" — check memory first. Entity names from results can feed into memos_context for deeper context. Returns ranked entities with type, domain, relevance score, and relationships.
Return a flat Markdown context document for the given topic, ready for agent system-prompt injection. Unlike memos_context (structured JSON for tool chaining), this returns a single paste-ready string. Ideal for filling an agent's system prompt with background knowledge before it tackles a task. Usage pattern: context = memos_squash_context("Python debugging") system_prompt = f"Background knowledge:\n{context}\n\nAnswer the user." Returns: Flat Markdown string with entity sections separated by "---". Returns "" if no entity matches the topic.
Show which entities are rising, stalling, or stable in mention frequency. Use when the user asks what's been active, stalled, or changing recently. Also useful at the start of a knowledge work session to orient yourself — rising entities are likely what the user is currently focused on. Compares mention counts between current period [now-days, now] and previous period [now-2*days, now-days] to classify each entity's trajectory.
memos_profile has empty input schema (no parameters). Description states 'Returns None if user_name is not configured' but does not explain how the tool determines which user profile to return (presumably from config), or what the LLM should do if None is returned. Dependency on external config is undocumented.
Parameter 'domains' is a free-form comma-separated string rather than an enum. Description says 'e.g. "job,health"' but does not enumerate valid domain values. LLMs may hallucinate invalid domains. Should either provide enum constraint or document all valid domain names.