MCP server for InvoiceShelf (invoices, estimates, customers, dashboard)
23 tools with consistent verb_noun naming (get_, create_, update_, delete_, send_). All tools have descriptions (10-200 chars, baseline 194). Input schemas present with Zod validation. However, parameter descriptions are sparse or null, most params lack explanatory text beyond the name. Output schemas are not documented; responses are text-wrapped rather than structured JSON. Error handling is minimal (ApiError exists but recovery guidance is absent). No parameter constraints (enums, ranges) beyond the status filter on get_invoices. Composition is sound (single responsibility per tool), but parameter documentation falls short of A+ baseline (100% of A+ tools have param descriptions).
Convert an accepted estimate into an invoice.
Create a new customer.
Create a new estimate. Handles InvoiceShelf's undocumented required fields internally.
Create a new invoice. Handles InvoiceShelf's undocumented required fields internally.
Delete a customer by ID.
Delete an estimate by ID.
Parameter descriptions are null or missing for most inputs. Zod schemas define types but lack explanatory text. LLMs cannot infer parameter meaning from names alone (e.g., 'page', 'limit', 'search' lack context on expected ranges, formats, or use cases).
Output schemas are not documented. Tools return text-wrapped responses (via text() helper) rather than structured JSON. LLMs cannot parse fields or chain results to downstream tools. Baseline: 100% of A+ tools have documented return types.
No error recovery guidance. ApiError class exists but tool handlers do not catch/transform errors into actionable messages. If an API call fails, the LLM receives a raw error with no guidance on retry, user-fixable issues, or alternatives.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Delete an invoice by ID.
Get full details for a single customer by ID.
Get all invoices for a specific customer, optionally filtered by status.
List customers, with optional pagination and search.
Get dashboard summary stats (totals due, paid, overdue, etc.).
Get full details for a single estimate by ID.
List estimates, with optional pagination, search and customer filters.
Get full details for a single invoice by ID.
List invoices, with optional pagination, search, status and customer filters.
Get full details for a single user by ID.
List users on the InvoiceShelf instance.
Email an estimate to its customer. Looks up the sender address and the customer's email automatically.
Email an invoice to its customer. Looks up the sender address and the customer's email automatically.
Verify the API base URL and token work by calling /me.
Update fields on an existing customer.
Update fields on an existing estimate.
Update fields on an existing invoice.
Destructive operations (delete_customer, delete_estimate, delete_invoice) lack confirmation or dry-run support. Agents can permanently delete records without a safety gate. No idempotent hints or confirmation patterns.
Pagination is supported (page, limit params) but no total count or next_cursor returned. LLMs cannot determine if more results exist or how many pages to fetch. Baseline: paginated results should return total count.