Read-only MCP server for your Gumroad store: products, fully-paginated sales, and revenue summaries for AI agents.
Three well-named, read-only tools with clear descriptions (avg 156 chars, within 10-1024 baseline). All tools have explicit input schemas with typed parameters and descriptions. Output is structured JSON with pagination awareness and safety caveats. Naming follows verb_noun pattern (list_, sales, revenue_summary). Key strength: descriptions include operational context ('what am I actually selling right now?', 'store health check'). Weakness: no error handling guidance, no parameter constraints (enums/ranges), no output schema documentation in code comments.
List all products in the store: name, permalink, price, published state, and sales count. Answers 'what am I actually selling right now?'
One-call store health check: product count, published count, lifetime sales counts per product, and revenue since `after` (YYYY-MM-DD, default: start of current month). The number an operator actually wants first.
List sales, fully paginated. Dates are YYYY-MM-DD (after defaults to today — pass e.g. after='2026-01-01' for history). Returns per-sale price, product, email domain (full buyer email withheld), refund state, and totals.
No parameter constraints (enums, ranges, patterns). Date parameters accept free-form strings with no validation guidance. LLMs may pass invalid dates like '2026-13-45' without format enforcement.
No error handling guidance in tool descriptions. If API returns 401 (invalid token), 429 (rate limit), or 500, the LLM has no recovery path. Descriptions should hint at prerequisites (valid GUMROAD_ACCESS_TOKEN) and common failure modes.
Output schemas not documented in code. While JSON responses are well-structured, there is no formal schema definition (JSON Schema or docstring) describing the fields, types, and nesting of returned objects. Agents must infer structure from examples.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
sales() and revenue_summary() accept date strings but do not validate format. Descriptions say 'YYYY-MM-DD' but no regex pattern or format constraint is enforced. Invalid dates silently fail or produce unexpected results.
No pagination limit documented for list_products(). If a store has thousands of products, the response could be very large. sales() documents MAX_PAGES=50 cap and truncation warning, but list_products() does not mention any limit or pagination strategy.