Local-first MCP server that gives AI tools semantic memory of your codebase.
project-brain has 19 well-named tools with consistent verb_noun patterns (search_*, find_*, list_*, get_*, delete_*, manage_*, sync_). Descriptions are present and contextual (avg ~80 chars), explaining WHEN to use each tool. However, input schemas are inferred from the tool list rather than directly visible in source code, no explicit JSON Schema definitions found in the provided src/server.ts excerpt. Parameter descriptions exist but are minimal (10-30 chars). Output schemas are undocumented. Error handling and recovery guidance are absent. Security considerations (permission gates, audit trails) are not evident. Composition is strong, tools chain well (e.g., search_context → expand_context → find_symbol). Risk annotations (READ_ONLY, WRITE, DESTRUCTIVE) are present but not formalized as toolAnnotations in the MCP sense.
Persist a note or decision into the brain so it survives the session.
Embedding service and index status — run it when results look empty or stale.
Delete knowledge from the index.
Delete a project from the registry.
Full body of a chunk_id — cheaper than the assistant re-reading the whole file.
Every symbol this one calls. What X depends on.
Every symbol that calls this one. Who depends on X.
Input schemas not visible in source code. Tool definitions list parameter names and types but no explicit JSON Schema with type constraints, enums, or validation rules. Cannot verify schema completeness.
Output schemas undocumented. No description of what fields each tool returns, their types, or structure. LLMs cannot plan downstream tool calls or extract required data.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Exact definition by name — path, line range, kind, signature.
Stack, modules, chunk and symbol counts in one call. Orientation before drilling in.
Pull a module whole.
Blast radius — everything transitively affected if X changes.
Browse the indexed structure by module.
List all registered projects.
Create or list Architecture Decision Records. Append-only — supersede, never edit.
Token-budgeted overview ranked by PageRank over the call graph.
Exact keyword search (BM25) over indexed code: identifiers, error strings, exact phrases. Works with no Ollama.
Conceptual lookup. Ranked snippets, each with a chunk_id. The one to use when you cannot name the symbol.
Re-index changed files now, incrementally, hash-gated.
Shortest call path from A to B, as an ordered chain.
No error handling or recovery guidance. Destructive tools (delete_knowledge, delete_project) lack confirmation/dry-run patterns. No actionable error messages documented.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) present in metadata but not formalized as MCP toolAnnotations. Risk field is informal; should be structured per spec.
Parameter descriptions are minimal (10-30 chars). 'Module name', 'Symbol name', 'Chunk identifier' lack context on format, constraints, or examples. LLMs cannot infer valid input ranges.