Keyword memory for AI agents over MCP, CLI and HTTP, for Persian and English text
Borhan is a specialized memory/search system for multilingual text with 13 tools. Overall definition quality is fair, descriptions are present and reasonably detailed, schemas are mostly complete with type definitions, but several critical gaps exist: (1) Tool annotations (readOnlyHint, destructiveHint) are missing entirely despite having tools with clear read/write/destructive semantics. (2) Output schemas are not documented in the visible source, only input schemas are shown. (3) Error handling guidance is absent from descriptions. (4) Some parameter descriptions are vague or lack format constraints. (5) Naming follows verb_noun convention consistently (memory_*, skills_*), which is good. The tools are well-scoped (one concern each) and compose cleanly. However, the lack of output documentation and error guidance prevents a higher score.
Add a message to a memory, splitting it into units (paragraphs, sentences, etc.)
Create a new memory with a name and description
Read the full text of a unit and surrounding context by its ULID cursor
Permanently delete a memory and all its data
Check which words are in a memory and what they fold to after normalization
List all memories with their descriptions, languages, and sizes
List the structure of a memory: its sessions, messages, and message metadata
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are completely missing. Borhan has 7 READ_ONLY and 4 WRITE/DESTRUCTIVE tools but no machine-readable risk annotations in schemas.
Output schemas are not documented. The visible source shows only input parameter schemas; return types and response structures are not visible. LLMs cannot infer what fields memory_search or memory_outline return.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | <=2025-11-25 | v2 |
Replace a message in a memory and reindex affected units
Rebuild the search index for a memory from stored messages
Search a memory by concept using query syntax with word variants and phrase matching
Update an existing memory's description or languages
Generate the MCP skill manifest for the remember slash command
Generate the MCP skill manifest for the survey slash command
Error handling guidance is absent from all tool descriptions. When memory_search fails (malformed query, missing memory, etc.), the description does not indicate what to do. No recovery paths documented.
memory_delete has a 'yes' confirmation parameter (bool, required) but the description does not explain this is a confirmation gate or why it's necessary. LLMs may not understand it's a safety measure.
Parameter 'languages' in memory_create and memory_update is described as 'Comma-separated language codes (e.g., en, fa, en,fa)', but should specify a format constraint: valid codes are 2-letter ISO 639-1 only, no spaces, max 5 languages. Format is ambiguous.
skills_remember and skills_survey have vague descriptions ('Generate the MCP skill manifest') and no input schema visible. Not clear what these tools do, when to call them, or what they return. Likely missing documentation.
memory_search parameter 'fuzzy' is a boolean with minimal description ('Use fuzzy matching for misspelled words'). Does not state performance cost, match quality tradeoff, or when fuzzy is recommended vs exact search.
memory_add and memory_replace accept optional 'ts' (Unix milliseconds timestamp) but do not specify range (past only? future allowed?), validation rules, or what happens if omitted (server uses current time?). Implicit behavior.