RAG + Context Management MCP server: long-term memory, vector storage, knowledge retrieval. Run with npx, zero external APIs.
Strong foundation with 19 well-named tools following verb_noun convention (rag_ingest_*, memory_remember, etc.). All tools have descriptions (avg ~120 chars, within baseline 34-392 range). Input schemas present for all tools with Zod validation. However, output schemas are undocumented, responses are JSON-stringified without formal schema declarations. Parameter descriptions are present but inconsistent in depth. Error handling is minimal; no recovery guidance or actionable error messages visible. Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications. Some parameters lack constraints (e.g., top_k ranges are enforced in schema but not all numeric params have bounds).
Consolidate memories: remove duplicates, promote frequently-recalled memories, optionally prune stale low-importance ones
Generate a context prompt from memories relevant to a topic, ready to inject into an LLM prompt
Delete a memory by ID
Retrieve a specific memory by ID
List long-term memories with optional filtering by type, tag, or importance
Semantically search long-term memories relevant to a query. This is how you remember past context.
Store a piece of long-term memory (fact, decision, preference, instruction, task, insight, conversation). Use this to persist things that should be remembered across sessions.
Output schemas undocumented. All tools return JSON-stringified text without formal schema declarations. LLMs cannot reliably parse responses or plan downstream tool calls. Responses should declare structured fields (e.g., {chunks: [{docTitle, chunkIndex, score, content}], total: number}).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are classified by Risk (READ_ONLY, WRITE, DESTRUCTIVE) in metadata but not exposed via MCP tool annotations. LLMs cannot infer safety properties without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Get memory storage statistics: count, total tokens, average importance, breakdown by type
Update an existing memory's content, type, importance, or tags
Delete a document and all its chunks by ID
Document storage statistics
Recursively ingest supported source files from a directory
Read a file and store it as a knowledge document
Store raw text as a knowledge document (chunked + embedded for later retrieval)
List all stored knowledge documents
Retrieve relevant context chunks as a ready-to-inject context block for the LLM. Prefer this over rag_search when the result will be used as context.
Hybrid semantic + keyword search over stored documents. Returns chunks ranked by relevance with scores.
Ingest an opencode session's user inputs (or the latest active session) into the RAG store as searchable documents. Use with the session id from opencode, or omit session_id and pass directory to auto-pick the most recent session in that workspace.
Get overall system stats: DB location, documents, chunks, memories, tokens, embedding backend
No error handling or recovery guidance. Tools return JSON.stringify() of results but no error messages with actionable next steps. E.g., if rag_ingest_file fails on invalid path, LLM gets no hint to check path or try rag_ingest_text instead.
Pagination missing from list tools. rag_list_documents and memory_list lack limit/offset and total count. Large result sets will blow context window without pagination support.
Parameter descriptions inconsistent in depth. Some params (e.g., 'metadata' in rag_ingest_text) lack format guidance. 'Optional metadata key-value pairs' does not explain what keys are valid or expected structure.