Review times
← Grok Plugins
Rejection library

Why Grok plugins get rejected

What xAI has said when it turned Grok plugins down, what causes each reason, and how to fix it before you submit.

9 reasons
2 rejections reported, 0 with a reason
rejections came back in a median of 43 days

How rejections arriveSubmissions are pull requests to xai-org/plugin-marketplace. Reviewers ask for changes in the pull request; a maintainer closing it is the rejection, often with no comment.

Free, nothing stored. From a terminal: npx mcplane preflight --url https://your-server/mcp (mcplane docs).

At a glance

ReasonApplies toReportsCaught by
Test cases failedChatGPT Plugins, Grok Plugins, Microsoft 365 Agent Store–mcplane CLI
Name too genericChatGPT Plugins, Grok Plugins–By hand
Descriptions instruct the modelClaude Connectors, Claude Plugins, ChatGPT Plugins, Microsoft 365 Agent Store, Grok Plugins, ClawHub–Server check
Description doesn’t matchChatGPT Plugins, Claude Connectors, Grok Plugins–mcplane CLI
Catch-all request toolClaude Connectors, ChatGPT Plugins, Grok Plugins–Server check
Plugin repository problemClaude Plugins, Cursor Marketplace, Grok Plugins, Gemini CLI Extensions, Docker MCP Catalog–mcplane CLI
Personal account, not an organisationGrok Plugins–mcplane CLI
Duplicate submissionGrok Plugins, Docker MCP Catalog–By hand
No reason givenChatGPT Plugins, Claude Plugins, Grok Plugins, Docker MCP Catalog, Gemini CLI Extensions, Cursor Marketplace–By hand

Tool definitions

Applies to Claude Connectors · Claude Plugins · ChatGPT Plugins · Microsoft 365 Agent Store · Grok Plugins · ClawHub

What reviewers and the rules say

“Describe what the tool does, and don’t tell Claude how to behave.”
Claude Connectors · Anthropic’s connector checklist
manipulative ranking language in tool descriptions
ChatGPT Plugins · A developer listing their rejection reasons on the OpenAI developer forum (paraphrased)
“Instructional phrases, for example, 'if the user says X', 'ignore', 'delete', 'reset', 'new instructions', 'Answer in Bold', or 'Do not print anything'.”
Microsoft 365 Agent Store · Microsoft’s agent validation guidelines (must fix)
“authority too broad / could change agent behavior without clear guardrails”
ClawHub · ClawHub’s security scan, quoted in an issue

Lines such as “always call this tool first” or “never tell the user” read as an attempt to steer the model, the same shape as prompt injection. Anthropic rejects descriptions that tell Claude to call tools the user didn’t ask for or interfere with other tools. OpenAI’s rules say tool metadata must not override platform instructions or safeguards. Microsoft rejects instructional phrases in any description, xAI looks for prompt injection in SKILL.md and descriptions, and ClawHub’s scanner flags text that could change an agent’s behaviour. Naming a sibling tool to call first is common in approved listings and isn’t the problem.

How to fix it

  • Describe what the tool does and returns, as facts.
  • Move usage guidance into the server’s instructions or your docs.
  • If a line has to stay, explain it in the submission’s notes for reviewers.

How common it is: in our scan of Claude’s connector directory on 29 September, 21% of servers tell the model what to do inside a tool description (118 of 564).

Caught by

Applies to ChatGPT Plugins · Claude Connectors · Grok Plugins

What reviewers and the rules say

A skill file still described the old API-key sign-in after the plugin had moved to browser OAuth.
Grok Plugins · An xAI reviewer on a pull request (paraphrased)
“The description must match the tool’s actual behavior.”
Claude Connectors · Anthropic’s connector checklist
Second rejection: feedback on how our tools are described.
ChatGPT Plugins · A developer on the OpenAI developer forum (paraphrased)

Reviewers compare what your listing, tool descriptions and skill files promise with what the tools do. They drift: a renamed tool, a removed feature or an old sign-in method still described in a skill file reads as misleading.

How to fix it

  • Describe each tool precisely: what it does, what it returns and when to use it.
  • Re-read the listing, tool descriptions and skill files after every change to the server.
  • Before resubmitting, compare what the store is reviewing with what the server does now.

Caught by

  • listing.test-tools Test cases use tools the server hasmcplane CLI
  • mcplane drift: what each store is reviewing against what the server does nowmcplane CLI

Applies to Claude Connectors · ChatGPT Plugins · Grok Plugins

What reviewers and the rules say

“a shell-exec MCP server when a scoped tool would do.”
Grok Plugins · xAI’s contributing guide, on over-broad scope
“Don’t ship a catch-all api_request tool with a method parameter.”
Claude Connectors · Anthropic’s connector checklist
“Do not use discovery, operation selection, or schema fetching with a generic executor to enable operations not individually exposed for review.”
ChatGPT Plugins · OpenAI’s plugin guidelines

A tool such as api_request with a method and a path does reads and writes through one door, so its hints can’t be honest and nobody can review what it will do. Anthropic rejects a tool that accepts both safe and unsafe HTTP methods, OpenAI wants every operation the model can call exposed as its own tool, and xAI questions broad shell access where a narrow tool would do.

How to fix it

  • Split it into read tools and write tools, each with honest hints.
  • Expose each operation as its own tool, with its own description and input schema.
  • If a tool has to accept free-form paths or queries, name or link the API it calls in the description.

Caught by

Listing details

Applies to ChatGPT Plugins · Grok Plugins

What reviewers and the rules say

“The keywords and domains fields power the plugin CTA feature in Grok Build. For this reason, we are pushing back on generic keywords.”
Grok Plugins · An xAI reviewer on a pull request
“Avoid overly generic names, especially single-word dictionary terms that aren’t explicitly tied to your brand.”
ChatGPT Plugins · OpenAI’s plugin guidelines
The auto rejection for app name being too generic is kind of crazy.
ChatGPT Plugins · A developer on the OpenAI developer forum (paraphrased)

ChatGPT rejects names it judges too generic, sometimes automatically as soon as you submit, especially single dictionary words that aren’t tied to your brand. Its guidelines also rule out adding “MCP”, “MCP Server” or “Plugin” to a product name. Grok uses your keywords and domains to suggest your plugin in conversation, so its reviewers push back on generic ones.

How to fix it

  • Use your brand or product name, not a category word.
  • Don’t add “MCP”, “MCP Server” or “Plugin” to the name for ChatGPT.
  • For Grok, keep keywords and domains scoped to your brand.

Caught by

No script can see this one. A server check rules out the mechanical causes first.

Testing

Applies to ChatGPT Plugins · Grok Plugins · Microsoft 365 Agent Store

What reviewers and the rules say

“could you share a short Grok Build demo covering sign-in, OAuth consent, and a harmless request”
Grok Plugins · An xAI reviewer on a pull request
“One or more of your test cases did not produce correct results. Please re-run all submitted test cases and align tool behavior/output with the documented expected outcomes.”
ChatGPT Plugins · A rejection posted on the OpenAI developer forum
“All sample prompts must be functional and return responses.”
Microsoft 365 Agent Store · Microsoft’s agent validation guidelines

Reviewers run what you give them, as the account you gave them, against your live server: ChatGPT’s five positive and three negative test cases, Microsoft’s sample prompts, or a demo for Grok. A test that names a tool you have since renamed, or expects data that has since changed, reads as a broken app. OpenAI also expects the same test cases to pass on ChatGPT web and mobile.

How to fix it

  • In each test case, name only tools the live server has.
  • Seed the demo account with the data every test case expects, and check it again right before you submit.
  • Record ChatGPT’s video walkthrough in developer mode, and again whenever tools change.
  • Give write tools a safe target, so reviewers don’t post to a real account.
  • For Grok, be ready to share a short demo of sign-in, OAuth consent and a harmless request.

Caught by

  • listing.test-tools Test cases use tools the server hasmcplane CLI
  • Demo data matches every test case, checked right before submittingBy hand

Plugin package

Applies to Claude Plugins · Cursor Marketplace · Grok Plugins · Gemini CLI Extensions · Docker MCP Catalog

What reviewers and the rules say

“main, v1.2.3, and abbreviated SHAs are rejected by the validator.”
Grok Plugins · xAI’s contributing guide
“Put a README of at least 40 words in the plugin folder”
Claude Plugins · Anthropic’s plugin checklist (blocks if missing)
“looks like there’s a failure in the CI job that ran, you’ll need to fix that first”
Docker MCP Catalog · A Docker maintainer on a pull request
“(MIT or Apache 2 are great, GPL is not).”
Docker MCP Catalog · Docker’s contributing guide

Stores that take plugins read them from a public GitHub repository at a pinned commit, and validate it before anyone reviews it. A private repository, a missing manifest, README or licence, a branch instead of a commit, or a failing CI run leaves nothing to review. Gemini CLI’s gallery skips a repository that fails validation without saying so.

How to fix it

  • Host the plugin in its own public GitHub repository. A private monorepo can’t be pinned.
  • Claude: add .claude-plugin/plugin.json, a README of at least 40 words and a LICENSE, then run claude plugin validate --strict.
  • Don’t leave a SKILL.md at the root beside a skills/ folder. Claude loads it as a single-skill plugin and hides the rest.
  • Grok: pin a full 40-character commit SHA, not main or a tag.
  • Docker: use a licence that lets people run the server, such as MIT or Apache 2.0, and get CI green before asking for review.
  • Gemini CLI: put gemini-extension.json at the root and add the gemini-cli-extension topic.

Caught by

Applies to Grok Plugins

What reviewers and the rules say

“A branded plugin (acme) sourced from some-personal-account/acme-thing reads as a possible impersonation and will be questioned.”
Grok Plugins · xAI’s contributing guide
A developer closed their pull request to resubmit it from the company’s organisation.
Grok Plugins · A Grok marketplace pull request (paraphrased)

xAI wants a branded plugin to come from the organisation that owns the brand. A repository under a personal GitHub account reads as possible impersonation.

How to fix it

  • Transfer the repository to a GitHub organisation named after the product before you open the pull request.

Caught by

Applies to Grok Plugins · Docker MCP Catalog

What reviewers and the rules say

“Not already in the catalog; not a parallel entry for an existing plugin”
Grok Plugins · xAI’s contributing guide, review checklist

Stores that take pull requests close one that adds something already in the catalog, or a second one for the same plugin. Updates go through the existing entry.

How to fix it

  • Search the catalog and the open pull requests before you add an entry.
  • To update a listed Grok plugin, bump its pinned commit instead of adding a new entry.
  • Close your own older pull request when you open a replacement.

Caught by

No script can see this one. A server check rules out the mechanical causes first.

The store itself

Applies to ChatGPT Plugins · Claude Plugins · Grok Plugins · Docker MCP Catalog · Gemini CLI Extensions · Cursor Marketplace

What reviewers and the rules say

The rejection email said “Please see the details below:”, followed by nothing.
ChatGPT Plugins · A developer on the OpenAI developer forum (paraphrased)
The submission portal only shows “Rejected” with no notes.
Claude Plugins · A developer in Anthropic’s plugin issue tracker (paraphrased)

Some reviews end without an explanation. ChatGPT rejection emails have arrived with an empty details section, Claude’s old plugin portal showed “Rejected” with no notes, Grok and Docker maintainers often close pull requests without a comment, Gemini CLI’s crawler skips repositories silently, and Cursor’s publish form sends no confirmation.

How to fix it

  • ChatGPT: reply to the rejection email with your case ID and ask for the specific finding.
  • On a pull request, ask what would make it acceptable.
  • Rule out the mechanical causes with a server check before you resubmit.

Of the 6 pull requests maintainers closed in the Grok and Docker queues we track, none had a comment saying why (checked 1 October).

Caught by

No script can see this one. A server check rules out the mechanical causes first.

How this is counted

Reports count rejected submissions where the developer picked the reason, or wrote a note that names it. So far 2 rejections have been reported for Grok Plugins, and 0 say why. Pull requests closed in the Grok and Docker queues count as rejections, but carry no reason.

The reasons themselves come from rejection emails developers have shared, public posts, the stores’ own docs and our own submissions. Each check is open source in mcplane, and the server check runs the ones marked “Server check”. Tool checks need tools that list without sign-in; for a server behind sign-in, run mcplane with --token.

Rejected?

Add it with the reason. The next developer sees it here, and the store’s review times include it.

Add your rejection

Already reported it as waiting? Open your private link and mark it rejected; the reason is on the same form.