Production-grade subscription billing coordinator that computes next payment dates, tracks dunning states, and formats Stripe API payloads for subscription lifecycle management
Single tool with adequate schema and description, but significant gaps in error handling, parameter guidance, and composition principles. Tool name lacks action verb clarity, descriptions omit critical operational context, and no error recovery guidance is present. The schema is present and typed, but parameters lack inline validation constraints and dependency documentation. This server provides basic functionality but falls short of production-grade standards.
Calculates subscription dates, dunning states, and structures mock payment gateway payload.
Tool name lacks action verb: 'process_lifecycle' is generic and ambiguous. LLMs cannot infer whether this creates, updates, fetches, or simulates a subscription state. Should be 'calculate_subscription_lifecycle' or 'simulate_subscription_billing'.
Missing error recovery guidance. Tool raises ValueError on invalid date format but provides no recovery hint (e.g., 'Please use YYYY-MM-DD format' is included in the error, but the tool description and schema do not explain how an LLM should handle unexpected inputs or what next actions are available).
Parameter 'interval' accepts free-form strings; should be constrained to enum ['month', 'year']. Current implementation allows 'mon', 'monthly', 'annually', etc., risking silent misuse or unexpected defaults.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | 2026-07-28+ | v2 |
Output schema not documented. Tool returns a dict with keys 'next_billing_date', 'dunning_status', and 'action_payload', but the MCP tool definition does not declare the output structure. LLMs cannot predict return fields for chaining or data extraction.
Parameter descriptions are minimal and lack constraints. 'Stripe customer identifier' tells an LLM nothing about format validation, required prefix ('cus_'), or what happens if the ID is invalid. Should state: 'Stripe customer ID (format: cus_XXXX; must exist in Stripe account).'
'failures' parameter lacks guidance on behavior boundaries. Tool transitions from 'active' (0 failures) to 'suspended_canceled' (3+ failures) but does not explain if retry/grace periods differ, whether failures reset, or what LLM should do if failures >= 10.
No idempotency or side-effect declaration. Tool description says 'structures mock payment gateway payload' (read-only simulation) but does not explicitly state whether calling it multiple times with same inputs is safe or whether it triggers any external API calls.