Skip to main content
Glama
RobertoJoseph

appstore-rejections-mcp

appstore-rejections-mcp

An MCP (Model Context Protocol) server that gives AI assistants access to a curated database of Apple App Store rejection reasons, solutions, and real-world cases.

Built on a database of 48 rejection reasons, 51 solutions, 554 real-world cases, and all 130 Apple Review Guideline subsections.

WebsitenpmGitHubContributing

Tools

Tool

Description

search_rejections

Semantic search — paste Apple's rejection message or describe the issue

get_rejection_reason

Full details for a specific rejection reason (Apple's message, tags, categories)

get_solutions

Step-by-step fixes with code examples, difficulty, and success rates

get_guideline

Look up Apple Review Guidelines by number (e.g. 2.1, 4.3, 5.1.1)

list_common_rejections

Top rejection reasons ranked by frequency

get_cases

Real-world cases filtered by reason, app category, or appeal status

Related MCP server: App Store Connect MCP Server

Installation

Run this command in your terminal:

claude mcp add --transport stdio appstore-rejections -- npx -y appstore-rejections-mcp

That's it! Reload Claude Code and the MCP server will auto-connect.

Cursor

Add to your Cursor config file:

  • macOS/Linux: ~/.cursor/mcp.json

  • Windows: %APPDATA%\Cursor\mcp.json

{
  "mcpServers": {
    "appstore-rejections": {
      "command": "npx",
      "args": ["-y", "appstore-rejections-mcp"]
    }
  }
}

Save the file, restart Cursor, and it will auto-connect.

Claude Desktop (Legacy - Global)

Add to your Claude Desktop config:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "appstore-rejections": {
      "command": "npx",
      "args": ["-y", "appstore-rejections-mcp"]
    }
  }
}

Usage Examples

Once connected, your AI assistant can:

Search for a rejection reason:

"My app was rejected for guideline 4.3, what does that mean?"

Get solutions:

"How do I fix an App Store rejection for missing privacy policy?"

Review your app before submission:

"Review my iOS app codebase for potential App Store rejections"

Look up guidelines:

"What does Apple guideline 5.1.1 say?"

Find real-world cases:

"Show me cases where Finance apps were rejected and the developer appealed"

Data Coverage

  • 48 documented rejection reasons with Apple's actual message templates

  • 51 solutions with implementation steps and code examples

  • 554 real-world cases sourced from Reddit, Stack Overflow, Apple Forums, and developer blogs

  • 130 Apple Review Guideline subsections across all 5 sections

  • 50 app categories tracked

  • Semantic search powered by pgvector embeddings

Requirements

  • Node.js >= 18

Quick Start

For Claude Code Users

claude mcp add --transport stdio appstore-rejections -- npx -y appstore-rejections-mcp

Then in Claude Code, ask:

"Check my iOS app for potential App Store rejections"

For Everyone Else

See Installation section above for Cursor, Claude Desktop, and other setup methods.


Real-World Example

User asks Claude Code:

"My iOS app was rejected for guideline 4.3. What does that mean and how do I fix it?"

Claude uses the MCP tools to:

  1. Look up guideline 4.3

  2. Find related rejection reasons

  3. Get step-by-step solutions

  4. Show real cases where developers fixed similar issues

  5. Provide code examples and best practices


How It Works

The MCP server connects your AI assistant to:

  • 48 Rejection Reasons - Apple's actual rejection messages and patterns

  • 51 Solutions - Step-by-step fixes with difficulty ratings

  • 554 Real Cases - Community experiences and appeals

  • 130 Guidelines - Full Apple Review Guideline subsections

  • Semantic Search - Powered by vector embeddings for smart matching


For Developers

Building from Source

git clone https://github.com/RobertoJoseph/appstore-rejections-mcp.git
cd appstore-rejections-mcp
npm install
npm run build

Environment Variables (Optional)

For custom Supabase instance:

SUPABASE_URL=your-url
SUPABASE_ANON_KEY=your-key

See CONTRIBUTING.md for more details.


Community


Changelog

v1.0.2 - Cleaned up README, clearer installation instructions v1.0.1 - Fixed invalid API key error v1.0.0 - Initial release


Built By

Roberto Joseph - LinkedInTwitterTikTok


License

MIT - See LICENSE file for details


Made with ❤️ for iOS developers everywhere 🚀

Available Tools

6 tools
get_casesGet Real-World Rejection CasesA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of cases to return (default 5, max 20)
app_categoryNoFilter by app category — e.g. 'Games', 'Health', 'Finance'
was_appealedNoFilter by whether the developer appealed
rejection_reason_idNoFilter by rejection reason UUID

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. 'Get' signals a read-only retrieval operation and the description discloses the returned case composition. It omits pagination, ordering, or data-freshness caveats, but for a simple list tool this is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the core purpose, then gives the filtering options and return contents, each earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward read-only list tool, the description covers the selection criteria and expected returned fields, and the schema fills in parameter constraints. It does not explain how multiple filters combine or clarify 'appeal status' against the boolean was_appealed, leaving a small completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters are fully documented in the schema, so the description only needs to reinforce them. It restates filtering by rejection reason, app category, and appeal status, but adds no new semantic meaning beyond the schema, which warrants the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource — 'Get real-world App Store rejection cases from developers' — and details what the cases contain. This clearly distinguishes it from siblings like get_solutions or get_guideline, which return different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly conveys when to use the tool: when the agent needs actual developer-submitted rejection cases with messages, Apple responses, and resolutions. It does not explicitly name sibling alternatives or state when not to use the tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_guidelineGet Apple Review GuidelineA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
guideline_numberYesThe guideline number — e.g. '2.1', '4.3', '5.1.1'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It discloses that the tool returns the guideline text and any related rejection reasons, covering the main behavioral expectation. It does not discuss error behavior or input normalization, but for a simple read-style lookup this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with no filler. The purpose and input format are front-loaded, followed by the return behavior. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter lookup tool with no output schema and no annotations, the description is nearly complete: it specifies the input format and the return content. It could be slightly stronger by explicitly noting this is not the tool for searching or listing guidelines, but the sibling distinction is reasonably inferable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema property already documents the guideline_number format with examples '2.1', '4.3', '5.1.1'. The tool description repeats essentially the same examples, adding no meaningful semantic value beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Look up'), a specific resource ('Apple App Store Review Guideline'), and the exact lookup key (section or subsection number). This clearly distinguishes it from the search-oriented sibling tools like search_rejections and list_common_rejections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by section or subsection number' clearly conveys when to use this tool: when the agent already knows a specific guideline number such as '2.1' or '5.1.1'. It does not explicitly name alternatives or give when-not-to-use conditions, but the intended context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rejection_reasonGet Rejection Reason DetailsA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe rejection reason UUID

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the return content (message template, categories, guideline reference, tags) and implies a read-only lookup, but it does not address missing IDs, error behavior, authorization, or other edge cases. This is acceptable for a simple get operation but not richly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence front-loads the tool's purpose and output contents, and the second sentence immediately gives actionable guidance on obtaining the required parameter. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter get operation with no output schema, the description covers the core needs: what is returned and how to get the ID. It is mostly complete, though it could briefly note that a missing or invalid ID may produce an error or empty result. Overall, the definition gives an agent enough context to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the 'id' parameter as a UUID with 100% coverage, so the baseline is 3. The description adds value beyond the schema by telling the agent the ID comes from search_rejections, which clarifies where to obtain the parameter value and avoids guesswork.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Get') and resource ('a specific App Store rejection reason'), and enumerates what details are included: message template, affected categories, guideline reference, and tags. This differentiates it from sibling search_rejections, which finds IDs rather than returning full details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs agents to 'Use search_rejections first to find the ID,' establishing a clear prerequisite and usage flow. It does not explicitly state when not to use this tool or mention alternatives, but the context is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_solutionsGet Solutions for RejectionA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rejection_reason_idYesThe rejection reason UUID

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It clearly states what the tool returns: 'step-by-step fixes with implementation details, code examples, difficulty level, and success rates.' This gives the agent a solid expectation of the tool's behavior, though it does not discuss error cases or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core action and then lists what the response contains. Every word earns its place; there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one fully documented parameter, the description is mostly complete: it explains the output contents and the required input. It could be strengthened by mentioning when this tool is preferred over sibling tools, but the low complexity keeps this from being a major gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the sole parameter, rejection_reason_id, is already described as 'The rejection reason UUID.' The description does not add further parameter-level meaning beyond referring to a 'specific App Store rejection reason.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get all solutions for a specific App Store rejection reason.' It clearly differentiates from siblings like get_rejection_reason by focusing on solutions/fixes rather than the reason itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a prerequisite—having a specific rejection reason—but provides no explicit guidance on when to use this tool versus sibling tools like search_rejections or get_rejection_reason. No alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_common_rejectionsList Common App Store RejectionsA

List the most common App Store rejection reasons, sorted by frequency. Useful for understanding what reviewers look for most.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return (default 10, max 48)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It discloses the sorting by frequency and the 'most common' scope, but does not mention whether it is a read-only operation, data source, or response format. For a list tool this is adequate, but it is not deeply transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The first sentence front-loads the action and scope; the second provides minimal but useful context. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only list tool with full schema coverage, the description gives enough for an agent to invoke it correctly: what it lists, how it is ordered, and when it is useful. It does not describe exact output fields, but that is not critical at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%—the limit parameter is fully documented with default, max, and min in the schema. The description itself adds no parameter-specific information, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('list') and resource ('most common App Store rejection reasons') with a distinctive qualifier: 'sorted by frequency.' This scope clearly separates it from sibling tools like search_rejections or get_rejection_reason, which imply different retrieval patterns. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Useful for understanding what reviewers look for most' provides clear context for when to use this tool—high-level overview of common pitfalls—but does not explicitly name alternatives or state exclusions. It therefore earns a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_rejectionsSearch App Store RejectionsA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query — e.g. Apple's rejection message, a guideline number, or a description of the problem

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does state the observable behavior — searching and returning matches ranked by relevance with solutions — which is useful. But it does not mention side effects (safe/read-only), any required authorization, rate limits, or limitations, leaving meaningful gaps for a tool with zero annotation support.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: what the tool does, what input to provide, and what output to expect. There is no filler or repetition beyond the title, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter search tool with no output schema, the description covers the key invocation details: natural-language input, search behavior, and returned content (ranked reasons with solutions). It could be more explicit about result format or count limits, but nothing critical prevents an agent from calling it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers the single parameter fully (100% coverage) and gives examples. The description's 'Paste Apple's rejection message or describe the issue' reinforces the schema but adds no new parameter-level semantics, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Search') and object ('App Store rejection reasons') and explains the natural-language input, so an agent can tell it is a free-text lookup rather than an exact-ID fetch. It does not explicitly contrast with sibling tools such as list_common_rejections or get_rejection_reason, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear trigger: paste Apple's rejection message or describe the issue. This tells the agent when the tool is appropriate. However, it does not mention alternatives or exclusions (e.g., use get_rejection_reason when a specific reason/ID is already known), so it lacks explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv1.0.2
    • First observedget_cases
    • First observedget_guideline
    • First observedget_rejection_reason
    • First observedget_solutions
    • First observedlist_common_rejections
    • First observedsearch_rejections

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation4/5

Each tool has a clear primary purpose, and the descriptions are specific enough to avoid major selection errors. Some overlap exists because search_rejections also returns solutions, which could make get_solutions seem redundant, and list_common_rejections overlaps slightly with search_rejections.

Naming Consistency5/5

Tool names consistently follow a verb_noun snake_case pattern using get, search, and list as actions. This is predictable and makes the toolset easy for an agent to navigate.

Tool Count5/5

Six tools is well-scoped for a specialized App Store rejection knowledge base. There are no redundant tools, and the count feels appropriate for the domain's read-only reference purpose.

Completeness5/5

The toolset covers the full reference workflow: searching rejection reasons, retrieving detailed reasons, accessing solutions, looking up guidelines, listing common rejections, and exploring real cases. No significant dead ends or missing core operations are apparent for a read-only reference server.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    An open-source MCP server for live Apple App Store competitor research, enabling AI agents to search apps, fetch metadata, compare competitors, and retrieve reviews and top charts as structured JSON.
    7
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    An unofficial MCP server for the App Store Connect API that enables automation of app management, reviews, TestFlight, analytics, and release processes through natural language.
    63
    40 npm
    2
    MIT