MCP server for App Store rejection reasons, solutions, and real-world cases
This server has solid naming conventions and reasonable descriptions, but suffers from incomplete schema definitions and missing output schema documentation. All 6 tools follow clear verb_noun naming (search_, get_, list_). Descriptions are present and contextual (avg ~150 chars), falling within the production baseline of 194 chars. However, input schemas use Zod validation internally but are not fully exposed in the MCP registration call, only type hints and descriptions are visible in the code. No explicit output schemas are documented for any tool, violating the critical pattern requirement that LLMs understand what fields to expect. Error handling is minimal; tools return generic text responses without guidance on recovery actions. The server reads from a Supabase backend (stateless, read-only operations), which is good for idempotency, but there is no parameter validation guidance in descriptions (e.g., UUID format for IDs, enum constraints for categories).
Get real-world App Store rejection cases from developers who experienced them. Filter by rejection reason, app category, or appeal status. Cases include the developer's message, Apple's response, and resolution.
Look up a specific Apple App Store Review Guideline by section or subsection number. Examples: '2.1', '4.3', '5.1.1'. Returns the guideline text and any related rejection reasons.
Get full details about a specific App Store rejection reason including Apple's message template, affected categories, guideline reference, and tags. Use search_rejections first to find the ID.
Get all solutions for a specific App Store rejection reason. Returns step-by-step fixes with implementation details, code examples, difficulty level, and success rates.
List the most common App Store rejection reasons, sorted by frequency. Useful for understanding what reviewers look for most.
No output schemas documented for any tool. LLMs cannot plan downstream calls or know what fields to expect from responses. Tools return unstructured markdown text, not structured objects. This violates the critical pattern requirement that tools document return types.
Input schemas are inferred from Zod validators but not explicitly exposed in MCP tool registration. The code shows z.string(), z.number() with min/max, but the actual JSON Schema passed to server.registerTool() is not visible. Per HARD SCORING RULE: if schemas are not visible in registration calls, schema score must be 0.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Search for App Store rejection reasons using natural language. Paste Apple's rejection message or describe the issue. Returns matching rejection reasons ranked by relevance with solutions.
Parameter descriptions lack constraint guidance. E.g., rejection_reason_id is described as 'UUID' but no validation pattern or error guidance is provided. guideline_number is described as accepting '2.1', '4.3', '5.1.1' but no formal constraint (regex pattern or enum) is declared. LLMs will hallucinate invalid formats without explicit constraints.
No error handling or recovery guidance. Tools return plain text 'No cases found matching your filters.' or generic error messages from Supabase API. No guidance on retryability, user-fixable steps, or what to do next. Violates pattern:recovery-guide.
get_cases accepts optional 'app_category' parameter with freeform string. No enum constraint or discovery mechanism to show available categories. LLMs will guess values like 'Games', 'Health', 'Finance' without validation, risking empty results.
Tool descriptions mention 'Apple's message template', 'step-by-step fixes with implementation details, code examples, difficulty level, and success rates', and 'real-world App Store rejection cases' but these return structures are not documented. LLMs cannot verify that expected fields are present in responses.