Multi-purpose MCP server with tools for coding challenges, notes, code snippets, and uncertainty tracking
Mario's MCP provides 30 tools across four domains (coding challenges, notes, snippets, uncertainty tracking). Tool naming follows verb_noun conventions well (save_note, get_snippet, list_unknowns, etc.), and all tools have descriptions. However, parameter descriptions are minimal, output schemas are undocumented, and error handling is sparse. The uncertainty/assumption/decision tools are conceptually rich but lack dependency documentation. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. Input validation exists (empty string checks) but error messages are generic. The codebase shows consistent patterns across the four modules, but falls short of production-grade documentation and recovery guidance.
Find solution files for a specific coding challenge by name (e.g., 'redis', 'wc').
List the names of all available coding challenges in the SharedSolutions repository.
Fetch and return the full content of a solution file given its relative path (e.g., 'Solutions/challenge-wc/solution.md').
Append text to an existing note. Creates the note if it doesn't exist yet.
Add a piece of challenging evidence to an assumption.
Park an unknown as deferred — not urgent right now.
Delete a note by its key.
Parameter descriptions are minimal or missing context. Most parameters have only a short label (e.g., 'Unique key for the unknown', 'Search keyword') without format/constraint guidance. LLMs cannot infer whether 'key' accepts 'foo/bar' or 'foo-bar' or 'foo_bar' without explicit format hints.
Output schemas are not documented. Tools return JSON objects (e.g., list_notes returns [{"key": k, "updated_at": v}], get_snippet returns a dict) but the MCP tool definitions do not declare return types or field names. LLMs cannot plan downstream calls or extract the right fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 36 | - | v1 |
Delete a code snippet by its key.
Retrieve the content of a note by its key.
Retrieve a code snippet by its key. Returns the code, language, and description.
Mark an assumption as proven wrong.
Connect a decision to the unknowns and assumptions that existed when it was made.
Link an unknown to an assumption, building the graph.
List assumptions, optionally filtered by area or minimum risk score.
List all decisions, optionally filtered by status: pending | made | revisited | regretted.
List all saved note keys along with their last-updated timestamps.
List all saved snippets. Optionally filter by language (e.g., 'python', 'go').
List unknowns, optionally filtered by area, status, or priority.
Record a decision made under uncertainty. confidence: 0.0–1.0.
Mark an unknown as resolved and record the answer.
Flag a decision for re-evaluation given new context.
Log an assumption you're acting on. confidence: 0.0–1.0.
Save or overwrite a note under a given key. Use descriptive keys like 'project-x/todo' or 'research/llm-notes'.
Save a reusable code snippet under a given key. Use descriptive keys like 'python/binary-search' or 'go/http-client'.
Log a new open question / unknown. priority: low | medium | high | critical.
Keyword search across belief and consequences of all assumptions.
Search notes by keyword (case-insensitive). Returns matching keys and content snippets.
Search snippets by keyword across keys, descriptions, and code (case-insensitive).
Keyword search across question and context of all unknowns.
Add confirming evidence to an assumption.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. MCP spec supports these to signal intent. Destructive tools (delete_note, delete_snippet, invalidate_assumption, defer_unknown) should carry destructiveHint=true so agents know they are irreversible. Read-only tools (get_*, list_*, search_*) should carry readOnlyHint=true.
Error messages are generic validation errors ('Key cannot be empty', 'Content cannot be empty') with no recovery guidance. Missing resources return KeyError without suggesting available keys or next steps. Per pattern:recovery-guide, errors should guide the agent on what to do next.
Relationship between uncertainty tracking tools (unknowns, assumptions, decisions) is complex but undocumented. link_unknown_to_assumption and link_decision accept arrays but the semantics of linking (one-to-one? one-to-many?) and what happens if a referenced key doesn't exist are not defined.
Enum constraints not declared. Parameters like priority (low|medium|high|critical), status (pending|made|revisited|regretted), and language filters accept free-form strings. These should be enums in the schema so LLMs pick valid values without hallucinating.
Idempotency not declared. Tools like save_note, save_snippet, save_assumption are idempotent (calling twice with same input produces same state), but this is not signaled. Agents retry on ambiguous failures; undeclared idempotency risks duplicate side effects if the agent is uncertain.
search_* tools offer no pagination. search_notes, search_snippets, search_unknowns, search_assumptions could return large result sets. Without limit/offset/cursor parameters and a total count, LLMs cannot retrieve paged results or know if results are truncated.
Confidence scores (0.0 - 1.0) in save_assumption and log_decision are not constrained in the schema. LLMs may pass strings, negative numbers, or values >1. Schema should declare type:number, minimum:0, maximum:1.