A persistent sticky-note layer for Claude Code, exposed as an MCP server.
Three well-named tools with clear, action-oriented names (stickies_write, stickies_read, stickies_dismiss). All tools have descriptions (50-100 chars, within baseline). Input schemas are present with proper types and enums. However, output schemas are not documented, LLMs cannot predict what fields are returned. Parameter descriptions are present but minimal (10-30 chars), lacking guidance on format, constraints, or dependencies. Error handling is not visible in the provided code. Tool composition is sound (each does one thing), but the lack of output documentation and sparse parameter guidance limits production readiness.
Soft-delete a sticky by id (marks it dismissed; it is no longer read back).
Retrieve active stickies relevant to the current session, ordered by importance.
Create a persistent sticky note. Call this when a durable fact emerges (a decision, blocker, preference, context, or todo) that future sessions should retain.
Output schemas not documented. LLMs cannot predict what fields stickies_read returns (e.g., does it return id, content, category, created_at, ttl_remaining?). This forces agents to guess and risks parsing failures.
Parameter descriptions are too brief (10-30 chars). 'Freeform note text, max 500 chars' lacks guidance on format (plain text? markdown? code?). 'Absolute project root' lacks examples or validation rules. Descriptions should be 50-200 chars with format hints.
No error handling guidance visible. If stickies_write fails (e.g., project_path invalid, content too long), what does the LLM do? No recovery hints, no categorization (retryable vs user-fixable).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2025-06-18+ | v2 |
stickies_read returns up to 500 items by default (limit max=500). No guidance on pagination or result structure. Returning 500 stickies will exhaust context; should cap at 20-50 and document the limit in the description.
stickies_dismiss has a nullable 'reason' parameter but no guidance on when/why to provide it. Is it logged? Audited? Does it affect TTL? Undocumented parameter relationships invite misuse.