Skip to content

Add the root Cursor marketplace manifest so the plugin can be ingested [sc-143999] - #5

Merged
ssathy2 merged 1 commit into
mainfrom
siddharthsathyam7349/sc-143999-cursor-plugin-metadata
Sep 21, 2026
Merged

ssathy2 merged 1 commit into
mainfrom
siddharthsathyam7349/sc-143999-cursor-plugin-metadata

Conversation

@ssathy2

@ssathy2 ssathy2 commented Sep 21, 2026 •

Copy link
Copy Markdown
Collaborator

Unblocks Cursor's marketplace review of this repo. [sc-143999]

Why

Cursor's reviewer came back on our resubmission saying the plugin is "missing some metadata we need" to properly ingest it, and pointed at their plugin spec.

Nothing was wrong inside plugins/ifttt/ — the gap is one level up. This repo uses the multi-plugin layout, so the plugin manifest lives at plugins/ifttt/.cursor-plugin/plugin.json. Cursor's ingester looks at the repo root for one of .cursor-plugin/plugin.json, .cursor-plugin/marketplace.json, or an Agent Plugins plugin.json, and we shipped none of them. Their submission checklist spells out the requirement: "Multi-plugin repos have .cursor-plugin/marketplace.json with unique names."

What changed

  • .cursor-plugin/marketplace.json (new, repo root) — the actual fix. Lists the one ifttt plugin with source: "plugins/ifttt", owned by IFTTT <channels+cursor@ifttt.com> (the submission account). Field shape mirrors Cursor's own live marketplace manifest and validates against their marketplace.schema.json, where source is a marketplace-root-relative directory — nested sources like third_party/gmail are already ingested in their repo today.
  • plugins/ifttt/.mcp.json → plugins/ifttt/mcp.json — every official Cursor plugin uses this filename, and it's both the documented auto-discovery path and what the Agent Plugins standard expects; no dot-prefixed variant exists anywhere in cursor/plugins. Contents unchanged (type: http, https://ifttt.com/mcp); the manifest now points at ./mcp.json. All prose references updated across the repo.
  • scripts/validate.mjs — new marketplace checks so this can't regress: the root manifest must exist and parse; each entry needs a unique kebab-case name matching the target plugin.json name; each source must resolve to a directory containing .cursor-plugin/plugin.json; and no plugins/<name>/ directory may go unlisted. Also added an allow-list of Cursor's schema fields that errors on unknown top-level keys, since both of their schemas are additionalProperties: false.
  • .github/workflows/validate.yml — JSON-parse glob covers the new paths.
  • Docs — README.md, AGENTS.md, CONTRIBUTING.md, llms.txt, the plugin README, the setup skill, and the lifecycle rule.

Notes for review

  • Cursor's JSON schemas, not the docs prose, are authoritative. The field table on the docs page omits category, tags, and displayName; plugin.schema.json allows all three and all 83 official manifests use them. Our existing manifest fields were already correct, so plugin.json changes by one line.
  • No Agent Plugins root plugin.json. The reviewer offered it as an alternative, but that format loads only skills + MCP servers — it would drop rules/ifttt-lifecycle.mdc — Cursor documents no precedence when both manifests exist, and one mcp.json can't satisfy both schemas (Agent Plugins requires type: "streamable-http" plus a $schema; all 65 ingested Cursor configs use type: "http"). The Cursor-format path answers the request on its own and is the well-trodden one.

Verification

node scripts/validate.mjs passes. Both manifests were also checked with ajv against the real schemas pulled from cursor/plugins, and the new guards were confirmed to fail as intended on a scratch copy (missing manifest, unknown field, name mismatch, bad source, duplicate names, unlisted plugin dir, .. traversal).

Follow-up after merge

Cursor ingests from the default branch, so once this is on main we reply on the existing review thread asking them to re-ingest, rather than filing a fresh submission.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a Cursor marketplace listing for the IFTTT plugin and its hosted MCP integration.
  • Documentation

    • Updated setup, repository layout, and manifest guidance for Cursor plugins and MCP configuration.
    • Added an LLM-friendly reference file with links and manifest descriptions.
    • Clarified the current MCP configuration filename and plugin registration requirements.
  • Validation

    • Expanded automated checks for marketplace listings, plugin manifests, MCP manifests, required metadata, naming consistency, and safe plugin sources.

…43999]

Cursor's marketplace reviewer could not ingest the plugin: this repo uses
the multi-plugin layout (plugins/<name>/.cursor-plugin/plugin.json) but had
no .cursor-plugin/marketplace.json at the root, which is the file Cursor's
ingester reads to find plugins in that layout.

- Add .cursor-plugin/marketplace.json listing the ifttt plugin with
  source "plugins/ifttt", shaped per cursor/plugins' marketplace.schema.json.
- Rename plugins/ifttt/.mcp.json to mcp.json, the name Cursor discovers by
  default and the one the Agent Plugins layout expects; repoint the
  manifest's mcpServers field and every doc reference. Keep "type": "http",
  the value used by every ingested Cursor plugin.
- Keep category, tags, and displayName: Cursor's plugin.schema.json lists
  them even though the prose docs' field table omits them.
- Teach scripts/validate.mjs to require the marketplace manifest, check
  that plugin names are unique and match each target plugin.json, that each
  source resolves to a directory with .cursor-plugin/plugin.json, that every
  plugins/<name>/ is listed, and that plugin.json uses no fields outside
  Cursor's schema (which sets additionalProperties: false).
- Widen the CI JSON-parse glob and update README, AGENTS.md, CONTRIBUTING,
  llms.txt, and the plugin README to describe the real layout.

An Agent Plugins root plugin.json was deliberately not added: Cursor's docs
say that format loads only skills and MCP servers (no rules), document no
precedence when both manifests exist, and its mcp.json schema requires
"type": "streamable-http" plus a $schema key that no ingested Cursor plugin
uses, so a single mcp.json cannot satisfy both.
@coderabbitai

coderabbitai Bot commented Sep 21, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

Understand this PR’s impact

Explore downstream dependencies and potential security impact with Blast Radius.

View blast radius →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: IFTTT/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Essentials

Run ID: 55cff7aa-8e12-4076-ac3a-e862e75e2c2e

📥 Commits

Reviewing files that changed from the base of the PR and between 4eabcc0 and 1246c20.

📒 Files selected for processing (12)
  • .cursor-plugin/marketplace.json
  • .github/workflows/validate.yml
  • AGENTS.md
  • CONTRIBUTING.md
  • README.md
  • llms.txt
  • plugins/ifttt/.cursor-plugin/plugin.json
  • plugins/ifttt/README.md
  • plugins/ifttt/mcp.json
  • plugins/ifttt/rules/ifttt-lifecycle.mdc
  • plugins/ifttt/skills/ifttt-setup/SKILL.md
  • scripts/validate.mjs

Included review availability: 4 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour.


📝 Walkthrough

Walkthrough

The repository adds a root Cursor marketplace manifest for the IFTTT plugin, changes the MCP configuration path to mcp.json, expands manifest validation, updates CI coverage, and revises repository documentation.

Changes

Cursor marketplace integration

Layer / File(s) Summary
Marketplace and plugin manifest contract
.cursor-plugin/marketplace.json, plugins/ifttt/.cursor-plugin/plugin.json
Adds the IFTTT marketplace entry and changes the plugin MCP configuration reference to ./mcp.json.
Manifest validation coverage
scripts/validate.mjs, .github/workflows/validate.yml
Adds Cursor plugin schema checks and marketplace validation for metadata, sources, names, manifests, and complete plugin registration. CI validates the updated manifest paths.
Repository guidance and path updates
AGENTS.md, CONTRIBUTING.md, README.md, llms.txt, plugins/ifttt/README.md, plugins/ifttt/rules/ifttt-lifecycle.mdc, plugins/ifttt/skills/ifttt-setup/SKILL.md
Updates repository layout, setup instructions, validation scope, MCP configuration references, and authentication guidance.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the primary change: adding the root Cursor marketplace manifest required for plugin ingestion.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

@ssathy2
ssathy2 merged commit fa9181e into main Sep 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant