An MCP server for managing a personal knowledge vault with semantic search, graph-based note relationships, contradiction detection, and daily context retrieval.
Second Brain MCP has 10 tools with clear verb-noun naming (search_notes, list_all_notes, get_note, etc.). All tools have descriptions (avg ~150 chars, within baseline 194). However, input schemas are minimal: most parameters lack explicit type definitions in the visible schema declarations. Parameter descriptions are present but generic. Output schemas are not documented. Error handling is basic (e.g., get_note returns {"error": ...} but lacks recovery guidance). The create_note tool is the only write operation and has proper parameter documentation. Overall, the server demonstrates competent naming and basic descriptions but falls short on schema rigor, output documentation, and error guidance expected of production tools.
Creates a new markdown note in the vault with optional YAML frontmatter tags and wikilink mentions. The file watcher will automatically index the note into the graph and vector databases. Returns an error if a note with the same title already exists.
Returns notes tagged with that date or modified on that day. Input date format: YYYY-MM-DD.
Finds 1-hop and 2-hop related notes for a specific note title using graph traversal.
Retrieves the full content, tags, outgoing links, and incoming backlinks for a specific note from the graph.
Returns vault-wide statistics including: - total_notes: number of notes indexed - total_links: number of [[wikilink]] relationships - unique_tags: number of distinct tags - avg_note_length_chars: average note body size in characters - top_hub_notes: top 10 most-connected notes (highest in+out link count) - recently_modified: top 10 most recently changed notes
Returns all notes stored in the vault, ordered by last-modified date (newest first). Each entry contains: title, tags, and last_modified timestamp.
Output schemas not documented. Tools return lists and dicts but LLMs cannot infer field structure (e.g., search_notes returns list[dict] with 'title', 'content' fields, not specified). Agents cannot plan downstream calls without knowing response shape.
Input parameter schemas lack explicit type definitions in visible code. Parameters are declared as Python type hints (str, list) but JSON Schema type field is not visible in tool registration. Schema completeness cannot be verified.
Error handling lacks recovery guidance. get_note returns {"error": "Note not found"} but does not suggest alternatives (e.g., 'Try search_notes() or list_all_notes()'). Agents cannot self-correct without explicit guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Returns all unique tags used across the vault, each with a note count. Results are sorted by usage count (most-used tags first).
Returns all notes that carry the specified tag (case-insensitive). Each result includes the note title, its full tag list, and last_modified date.
Performs semantic search across all note contents in the vault using ChromaDB. Returns the top-5 most relevant unique notes.
Finds notes with conflicting statements on a given topic using local semantic search and NLI/lexical checks.
List tools (list_all_notes, list_tags, search_by_tag) lack pagination parameters (limit, offset, page_size). No indication of result count limits. Large vaults could return unbounded lists, exhausting context windows.
daily_context parameter 'date' lacks format validation. Description says 'YYYY-MM-DD' but no regex pattern or enum constraint. LLMs may pass invalid dates (e.g., '2024-13-45') without validation feedback.