A FastAPI-based MCP server that provides CRUD operations for managing reminders with MongoDB backend
Server has 5 tools with complete schemas and descriptions. Naming follows verb_noun convention (create_, read_, update_, delete_). Descriptions are present (avg ~150 chars) and explain WHAT each tool does. However, parameter descriptions lack actionable constraints (no enums, ranges, or format details beyond type). Error handling is basic (404 responses documented but no recovery guidance). Output schemas are implicit in Pydantic models but not explicitly documented in tool definitions. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. Missing pagination guidance for read_reminders (returns up to 1000 items with no limit parameter or cursor). Parameter naming is clear but could benefit from type suffixes (reminder_id is good; title/description are generic).
Create a new reminder with the following parameters: - **title**: Required title of the reminder - **description**: Optional description with details - **due_date**: Optional date when the reminder is due Returns the created reminder with generated ID and creation timestamp.
Delete a specific reminder by ID. - **reminder_id**: The unique identifier of the reminder to delete Returns no content (204) if successful, otherwise raises a 404 error.
Retrieve a specific reminder by ID. - **reminder_id**: The unique identifier of the reminder Returns the reminder if found, otherwise raises a 404 error.
Retrieve all reminders. Returns a list of all reminders in the database (limited to 1000 entries).
Update a specific reminder by ID. - **reminder_id**: The unique identifier of the reminder to update - **reminder**: The updated reminder data Returns the updated reminder if found, otherwise raises a 404 error.
read_reminders lacks pagination controls and result limits. Returns up to 1000 items with no limit parameter, offset/cursor, or total count. Large result sets waste tokens and risk context window exhaustion.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. delete_reminder is DESTRUCTIVE, read_* are READ_ONLY, create_/update_ are WRITE. Annotations guide agent safety reasoning.
Parameter descriptions lack actionable constraints. 'due_date' has format='date-time' in schema but description does not explain format or timezone handling. 'title' has no length constraints. LLMs cannot infer valid ranges from type alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error responses (404) documented in descriptions but no recovery guidance. 'Reminder with ID {reminder_id} not found' does not suggest next steps (e.g., 'Call read_reminders() to list available IDs').
Output schemas not explicitly documented in tool definitions. Pydantic models define structure (Reminder with id, title, description, due_date, created_at) but tool descriptions do not state what fields are returned or their types.