MCP server for Pillbox — persistent memory for AI agents
Pillbox-MCP demonstrates solid naming conventions (verb_noun pattern: prescription_open, pill_store, capsule_search) and comprehensive parameter schemas with type definitions. However, parameter descriptions are sparse or missing entirely across most tools. Tool descriptions are present but often lack actionable context about when to use each tool vs. alternatives. Output schemas are not documented in the source code. Error handling guidance is absent. The server exposes 22 tools with clear responsibilities, but lacks the LLM-optimized descriptions (50-200 chars) and per-parameter guidance that would elevate it to A-grade quality.
Navigable index of prescriptions in a bottle: id, title, status, dates and pill_count. Use at the start of a session to see which work sessions exist. To view the pills of a specific prescription, use prescription_context with its id.
Registers a new bottle (project) in Pillbox. Normally done by `pillbox bottle init`; this tool exists for automation. The directory is derived automatically from the cwd of the pillbox process (for scope='local') or from the user's home (for scope='global') — do NOT accept directory paths from the user. The only model choice is scope.
Lists all bottles (projects) registered in Pillbox.
Link a local .pillbox database to the calling user's global registry. Use when a second user needs to access a bottle created by another user on the same machine. Idempotent: returns status='already_linked' if already registered. directory defaults to cwd.
List distinct capsule compounds with their frequency, ordered by count desc.
Parameter descriptions missing or minimal across all tools. Most parameters (e.g., 'id', 'limit', 'query') lack descriptions explaining their purpose, format, or constraints. LLMs cannot infer parameter semantics from names alone.
Output schemas not documented in source code. Tool descriptions do not specify what fields are returned or their types. Agents cannot plan downstream tool calls without knowing response structure.
No error handling guidance in tool descriptions. Tools like prescription_discard and pill_discard are destructive but lack recovery instructions or confirmation patterns. Agents have no guidance on what to do if a call fails.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Soft-deletes a capsule.
Reads the full content of a capsule by its ID.
Updates the title and/or content of an existing capsule.
Searches capsules using full-text search (FTS5). Either 'query' (FTS text) or 'compound' (exact filter) must be provided — at least one. Query terms are split on whitespace and on `-_/.:` separators, then joined with OR; bm25 ranks documents matching more terms higher. If the strict pass returns zero results, the server automatically retries with fuzzy (Jaro-Winkler) expansion — the response includes `used_fuzzy: true` when that happened. If only 'compound' is passed, lists capsules of that compound without FTS filtering. Capsules are global — not filtered by project. fuzzy: force the fuzzy pass from the start, skipping the strict attempt (default false).
Stores personal user knowledge (preferences, conventions, workflow). Use instead of pill_store when the knowledge does NOT belong to a specific project — cross-project, no active prescription. Examples: preferred coding style, environment tools, ways of working. The compound field is free text — check the skill for conventional values.
List distinct pill compounds with their frequency in the current bottle, ordered by count desc.
Soft-deletes a pill. Cannot be undone.
Reads the full content of a pill by its ID.
Updates the title, content and/or compound of an existing pill. Only the provided fields are modified.
Searches pills using full-text search (FTS5). Either 'query' (FTS text) or 'compound' (exact filter) must be provided — at least one. Query terms are split on whitespace and on `-_/.:` separators, then joined with OR; bm25 ranks documents matching more terms higher. If the strict pass returns zero results, the server automatically retries with fuzzy (Jaro-Winkler) expansion — the response includes `used_fuzzy: true` when that happened. If only 'compound' is passed, lists pills of that compound without FTS filtering. Optionally filters by bottle_id. fuzzy: force the fuzzy pass from the start, skipping the strict attempt (default false).
Stores project-specific knowledge inside an open prescription. Use instead of capsule_store when the knowledge belongs to this specific project — requires an active prescription_id. Examples: architecture decisions, fixed bugs, code patterns. The compound field is free text — check the skill for conventional values.
Closes an open prescription. Ends the work session.
Pills of a specific prescription with id, compound, title and 300-char snippet. Use after bottle_context to drill into a specific work session. For the full content of an individual pill, use pill_read.
Discards a prescription and cascades soft-delete to all its pills.
Opens a new prescription (work session) for a bottle. Returns the ID of the created prescription. Multiple prescriptions can be open simultaneously in the same bottle.
Reads the details of a prescription by its ID.
Reopens a closed prescription to allow editing/adding pills. Idempotent: if the prescription is already open, returns it unchanged.
Tool descriptions lack actionable context about when to use each tool vs. alternatives. E.g., pill_store vs. capsule_store distinction is explained but not in a way that guides LLM selection. Descriptions should state prerequisites and use cases.
Pagination parameters (limit) lack constraints. No minimum/maximum specified. Unbounded limits could cause performance issues or context window exhaustion. Descriptions should state valid ranges (e.g., 1-100).