owned, portable working memory. A plain-files brain template and a tiny MCP server that lets any model read it. Files, not a login.
br8n defines 3 read-only tools with clear, action-verb names (brain_list, brain_read, brain_search) and concise descriptions (avg 155 chars, within baseline 194). All tools have input schemas with Zod validation and proper type annotations. Tool annotations (readOnlyHint, idempotentHint, openWorldHint) are correctly applied. However, parameter descriptions are minimal or absent: brain_list has no input schema at all (empty {}), brain_read's 'path' param lacks format/constraint guidance, and brain_search's 'limit' param lacks min/max documentation in the description text (only in Zod). Output schemas are not documented, LLMs cannot predict the structure of returned JSON. Error handling is absent: no guidance on path traversal failures, missing files, or invalid search queries. No pagination guidance for brain_search despite potentially large result sets.
List every markdown file in the brain (relative path, size, last modified).
Read one file from the brain by relative path (e.g. decisions/2026-03-change-orders.md).
Literal, case-insensitive search across the brain. Returns file, line number and the matching line, so answers can cite the source.
brain_list has empty input schema ({}). LLMs cannot infer whether parameters are required or optional.
Parameter descriptions lack format constraints and ranges. brain_read's 'path' param has no guidance on allowed characters, max length, or examples. brain_search's 'limit' param (1-200) is enforced in Zod but not documented in the description text, LLMs cannot read JSON Schema and will rely on description alone.
Output schemas are not documented. brain_list returns BrainFile[] (rel, bytes, mtime), brain_read returns raw text, brain_search returns Hit[] (rel, line, text), but LLMs have no schema to plan downstream operations or extract fields reliably.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
No error handling or recovery guidance. If brain_read receives a path outside the brain root, safeResolve() throws 'refusing path outside the brain', but the LLM sees only the error message with no guidance on what to do next (e.g., 'Try brain_list() to see valid paths').
brain_search lacks pagination guidance. With limit capped at 200 and no offset/cursor, large result sets could exhaust context. Description should state 'Results are capped at 200; refine your query if truncated.'