MCP server for personal note-taking — store notes, bookmarks, reminders, and conversation takeaways from AI chats
Nemo MCP Server demonstrates solid definition quality with consistent schema coverage, clear naming conventions, and actionable descriptions. All 12 tools are explicitly registered with input schemas using Zod and have non-trivial descriptions (100-300 chars typical). Naming follows verb_noun pattern well (save_note, search_notes, delete_note, add_reminder, etc.). However, output schemas are not documented, the code shows tools return structured responses but descriptions do not specify return field types, which limits LLM downstream planning. Tool descriptions are good but inconsistent in detail: some tools like nemo_save_note include clear guidance on when to use them ('Use this when the user wants to...'), while others like nemo_list_categories lack actionable context. Error handling is present in the codebase but not described in tool definitions, forcing LLMs to guess recovery paths. No tool annotations visible (readOnlyHint, destructiveHint, idempotentHint) despite clear risk profiles (WRITE, DESTRUCTIVE, READ_ONLY noted in metadata).
Add a reminder with a due date and priority. Use this when the user mentions a deadline, a task to do later, or anything time-sensitive. Args: - title: What to remember - description: Additional details (optional) - due_date: ISO 8601 datetime - priority: low | medium | high | urgent Returns: The created reminder
Mark a reminder as done. Args: - id: UUID of the reminder to mark as complete Returns: Confirmation
Delete a note by its UUID. Args: - id: UUID of the entry to delete Returns: Confirmation of deletion
Retrieve a specific note by its UUID. Args: - id: UUID of the entry Returns: Full entry with all content and metadata
Get statistics about stored data. Returns: Total counts of notes, reminders, bookmarks, and list of categories
List bookmarks, optionally filtered by category. Args: - category: Optional category filter - limit: Max results to return (default 20) Returns: Bookmarks sorted by creation date (newest first)
Output schemas not documented in tool descriptions. Tools return structured responses (e.g., 'The saved entry with its UUID' for nemo_save_note) but do not specify return field types, field names, or data structure. This prevents LLMs from planning downstream tool calls (e.g., knowing that get_note returns an 'id' field to pass to delete_note) and forces unnecessary discovery calls.
Tool annotations missing despite clear risk classifications. Metadata notes WRITE, READ_ONLY, DESTRUCTIVE risk levels but no tool annotations (readOnlyHint, destructiveHint, idempotentHint) are visible in source. This prevents the MCP client from understanding which tools are safe to call without confirmation and which require audit logging.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
List all note categories with entry counts. Returns: Categories sorted by number of entries
List all pending reminders (or all including completed ones). Args: - include_done: Whether to show completed reminders (default: false) Returns: Reminders sorted by due date
Save a bookmark with title, URL, tags, and category. Use this when the user wants to save a link to an article, tool, documentation, or any useful resource. Args: - url: The URL to bookmark - title: Title or description of the bookmarked page - description: Why this bookmark is interesting (optional) - tags: Array of tags for filtering - category: Category (e.g. 'tools', 'articles', 'docs', 'tutorials') Returns: The saved bookmark with its UUID
Save a note to Nemo. Use this when the user wants to store a conversation excerpt, an idea, a code snippet, a summary, or any valuable information for future reference. The AI should: - Choose an appropriate category and tags based on the content - Summarize if the content is long - Set the entry_type based on what's being saved Args: - title: Short descriptive title - content: The full content to store - category: Organization category (e.g. 'devops', 'flutter', 'ideas') - tags: Array of tags for filtering - source: Where this came from (e.g. 'claude-chat') - entry_type: conversation | note | idea | snippet | summary | resource - metadata: Additional key-value data Returns: The saved entry with its UUID
Search through saved bookmarks. Use this to find previously bookmarked resources by title, description, URL, or tags. Args: - query: Search term - tags: Optional tag filter Returns: Matching bookmarks with URL, title, and metadata
Search through saved notes in Nemo. Use this to find previously saved conversations, notes, ideas, snippets, or any stored content. Supports filtering by category and tags. Args: - query: Search terms - category: Optional category filter - tags: Optional tag filter - limit: Max results (default 10) Returns: Matching entries with title, content preview, and metadata
Inconsistent description quality and missing usage context. Tools like nemo_list_categories ('List all note categories with entry counts. Returns: Categories sorted by number of entries') and nemo_get_stats lack actionable guidance on when to call them. nemo_save_note includes helpful context ('Use this when the user wants to...'), but nemo_get_note does not.
No error handling guidance in tool descriptions. Source code likely handles errors (invalid UUIDs, database failures, etc.) but tool descriptions do not specify what errors can occur, how they are classified (retryable vs. fatal), or what the LLM should do next. Try search_users() with a partial name.'
Destructive operations (nemo_delete_note) lack confirmation or dry-run patterns. Agents make mistakes, no explicit mention of confirmation flow, dry-run capability, or undo mechanisms.