Remote MCP server + web cockpit for a private markdown second brain on GitHub, wired into claude.ai
Strong tool naming (all verb-first, clear intent) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 11 tools have explicit Zod schemas with typed parameters. Good separation of concerns (read vs write tools). However, output schemas are undocumented, responses are free-text strings without structured field definitions. Error handling is present but generic (GitHubError catch-all). Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications in metadata. Parameter descriptions are solid but lack format constraints (e.g., filename validation rules, path format specs).
Stage a raw note into inbox/ for later classification per ingestion-protocol.md. Safe for anything ambiguous. Never overwrites an existing file.
Append a dated entry to the current month's decisions/YYYY-MM.md. APPEND-ONLY: never rewrites past entries. Creates the month file if absent.
Audit the brain: broken [[links]], orphan files (no inbound links), stale active/volatile files past their per-folder TTL (now.md 14d, context/ 90d, people/ projects/ personal/ 180d), files missing summary_l0, and inbox items awaiting ingestion. Run it at the start of maintenance sessions.
Remove a processed item from inbox/ after ingestion (ingestion-protocol step 5: trace, then clean). ONLY works on inbox/ — nothing else in the brain is deletable through the MCP.
Return the full content of one brain file by its path (e.g. 'identity.md' or 'projects/my-startup.md').
Output schemas undocumented. All tools return TextResult (free-text string) with no structured field definitions. LLMs cannot parse response structure or plan downstream tool calls. get_graph returns JSON but no schema documented; brain_health returns rendered text with no field spec.
Tool annotations missing. Tools are classified as READ_ONLY, WRITE, or DESTRUCTIVE in metadata but not exposed via MCP readOnlyHint/destructiveHint/idempotentHint. Agents cannot infer retry safety or side effects from tool definitions alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Return the brain's link graph as JSON: nodes (every file with id/type/tags/status/updated/degrees) and edges (resolved [[wiki-links]]), plus brokenLinks ([[targets]] that resolve to no file — seams to fill). Use it to reason about connections without reading every file.
List every markdown file in the brain with its frontmatter summary_l0 (one line) and summary_l1 (short paragraph). This is the cheap index — call it FIRST, then pull full files only when relevant.
Plain-text search across all brain files (frontmatter + body). Returns matching paths with snippets. No embeddings.
Replace the body of now.md and bump its 'updated' frontmatter date. Pass summary_l0/summary_l1 whenever the focus changes so the file index stays in sync with the body.
General fallback: create or update a markdown file at a given brain path. Refuses paths outside the brain's known folders and refuses content that looks like a secret. Follow brain-protocol.md.
Create or update projects/<name>.md with proper frontmatter.
Parameter format constraints missing. 'filename' params accept any string but should validate against inbox/ naming rules. 'path' param in get_brain_file lacks format spec (allowed folders, extension requirements). No regex patterns or length limits documented.
Error handling is generic. GitHubError catch-all returns message but does not classify errors as retryable/user-fixable/fatal. No recovery guidance (e.g., 'file not found, try list_brain() first'). Agents cannot distinguish transient failures from permanent ones.
No pagination support. list_brain returns all files unsorted initially (then sorted in-memory). search_brain returns all matches. Large brains could exceed context window. No limit/offset/cursor parameters or result count caps documented.