chrome-store-submit
npx skills add https://github.com/mrsekut/agent-skills --skill chrome-store-submit
Agent 安装分布
Skill 文档
Chrome Web Store Submission
Automate the Chrome Web Store new extension submission process using playwright-mcp browser automation.
Prerequisites
- playwright-mcp configured as MCP server. See references/setup.md if not set up.
- Pillow installed (
pip install Pillow) for image generation. - Extension source code with valid
manifest.jsonin the working directory. - Extension packaged as ZIP file ready for upload.
Workflow
- Gather extension info from source code
- Create privacy policy page â generate
PRIVACY_POLICY.mdand push to GitHub - Launch browser â user logs in â upload ZIP
- Scan all tabs to identify required fields and current state
- Ask user only for info that cannot be determined from source code
- Generate store images and listing text
- Fill all forms across all tabs
- Save as draft and prompt user to review
Step 1: Gather Extension Info
Read these files from the project to extract info:
manifest.json â name, short_name, description, permissions, version, icons
README.md â feature descriptions, usage details (if exists)
Extract:
name(max 75 chars for store)description(used as short description, max 132 chars)permissions(needed for privacy justification)versionicons(path to largest icon for image generation)
Step 2: Create Privacy Policy Page
Chrome Web Store requires a privacy policy URL. Repository top pages or unrelated pages are not accepted as a valid privacy policy and will be rejected. A dedicated privacy policy page must be created.
2-1: Generate PRIVACY_POLICY.md
Based on manifest.json permissions and source code behavior gathered in Step 1, generate a PRIVACY_POLICY.md file in the extension’s repository root.
Write the content in the user’s target language (default to English if unknown), using the following structure:
# Privacy Policy for <Extension Name>
Last updated: <today's date>
## Overview
<Extension Name> ("the Extension") is a browser extension that <1-sentence description>.
## Data Collection
<Based on permissions, specifically describe what data is collected. If no data is collected, explicitly state: "This extension does not collect, store, or transmit any personal data.">
## Data Usage
<Describe the purpose of collected data. If none is collected: "No user data is collected or used.">
## Data Storage
<Describe how and where data is stored. If local only, state that explicitly.>
## Data Sharing
<State whether data is shared with third parties. If not, state that explicitly.>
## Permissions
<Explain why each permission from manifest.json is needed, one line per permission.>
## Changes to This Privacy Policy
We may update this Privacy Policy from time to time. Any changes will be posted on this page with an updated revision date.
## Contact
If you have any questions about this Privacy Policy, please create an issue on the [GitHub repository](<repo URL>).
Key points:
- Even extensions with minimal permissions that collect no personal data must explicitly state so.
- Explain each permission’s purpose individually (e.g.,
activeTabâ “Used to access the current tab’s content only when the user activates the extension”). - Avoid vague wording â be specific about what the extension does and does not do.
2-2: Push to GitHub and Get URL
- Show the generated
PRIVACY_POLICY.mdto the user for review. - Ask the user to:
- Git commit and push
PRIVACY_POLICY.md. - Confirm the GitHub repository is public (private repository pages are not accessible).
- Git commit and push
- Record the privacy policy URL in the format:
https://github.com/<owner>/<repo>/blob/main/PRIVACY_POLICY.md
This URL will be used in Step 7 for the Privacy Practices tab.
Note: A GitHub repository top page (https://github.com/<owner>/<repo>) is not accepted as a valid privacy policy. Always use a direct link to the PRIVACY_POLICY.md file.
Step 3: Browser Launch and Upload
- Navigate to
https://chrome.google.com/webstore/devconsole - Tell the user: “Please log in to your Google Developer account in the browser. Let me know when you’re done.”
- Wait for user confirmation.
- Click “New item” or equivalent upload button.
- Use
browser_file_uploadto upload the ZIP file. - Wait for upload to complete and dashboard to load.
Step 4: Scan All Tabs
After upload, navigate through all tabs in the dashboard to identify required fields.
- Store Listing tab: Use
browser_snapshotto check required fields and their current state. - Privacy Practices tab: Navigate via sidebar â
browser_snapshot. - Distribution tab: Navigate via sidebar â
browser_snapshot.
For each tab, record:
- Required field names and input types (text, dropdown, file upload, checkbox, etc.)
- Fields already populated (some are auto-filled from manifest.json)
- Empty required fields
Step 5: Ask User for Missing Info
Cross-reference source code info from Step 1 with form state from Step 4. Only ask the user about required fields that cannot be filled automatically.
Fields likely determinable from source code (do not ask):
- Extension name, description (from manifest.json)
- Permission justifications (inferred from permissions + source code usage)
- Remote code declaration (typically No for MV3)
- Data collection status (inferred from permissions and source code)
Fields that typically require user input:
- Target language for store listing
- Primary category
- Brand color (hex, for image generation)
- Visibility (Public / Unlisted / Private)
Privacy Policy URL is already generated in Step 2 â no need to ask.
These are general tendencies only. Always decide based on actual form state. Do not ask unnecessary questions.
Step 6: Generate Store Images and Listing Text
Images
python3 scripts/generate_store_images.py <icon_path> <output_dir> --name "Extension Name" --color "#hexcolor"
This generates:
store_icon_128.png(128×128, with 16px transparent padding)promo_tile_440x280.png(440×280, small promo tile)marquee_1400x560.png(1400×560, marquee tile)screenshot_1280x800.png(1280×800, placeholder screenshot)
Ask the user if they want to use these generated images or provide their own.
Listing Text
Based on manifest.json info and README, generate in the user’s target language:
- Detailed description: 2-4 paragraphs covering what the extension does, key features, and how to use it. No HTML, plain text only.
- Single purpose description: 1-2 sentences clearly stating the extension’s primary functionality.
- Permission justifications: One sentence per permission explaining why it’s needed.
Show all generated text to the user for approval before filling forms.
Step 7: Fill All Forms
Navigate back to each tab and fill in the forms. Use browser_snapshot before each field interaction to verify the current state.
Store Listing Tab
- Fill Detailed Description textarea
- Select Primary Category from dropdown
- Select Language from dropdown
- Upload Store Icon (128×128)
- Upload Screenshots (1280×800)
- Upload Small Promo Tile (440×280)
- Optionally upload Marquee Promo Tile
Privacy Practices Tab
- Fill Single Purpose Description
- Fill Permission Justifications (one per permission from manifest)
- Set Remote Code Declaration
- Handle Data Usage Disclosures and Limited Use Certification
- Enter Privacy Policy URL (use the GitHub URL of
PRIVACY_POLICY.mdgenerated in Step 2)
Distribution Tab
- Set Visibility (Public/Unlisted/Private)
- Set Geographic Distribution (default: All regions)
Step 8: Save as Draft
- Click “Save Draft” button (NOT “Submit for Review”)
- Verify save succeeded via
browser_snapshot - Tell user: “Draft saved successfully. Please review all fields in the browser before submitting for review.”
Important Notes
- Always use
browser_snapshotbefore interacting with page elements to find correct selectors. - Chrome Web Store dashboard is a SPA; wait after navigation for content to load.
- If a form field is not found, take a screenshot and ask the user for guidance.
- Never click “Submit for Review” â only save as draft.
- For form field details and constraints, see references/store-fields.md.