{"schemaVersion":"1.0","id":"appstorecopilot","name":"AppStore Copilot","description":"Agent-native App Store Connect and Google Play launch operations.","homepage":"https://appstorecopilot.com","documentation":"https://appstorecopilot.com/agents","endpoints":{"mcp":"https://appstorecopilot.com/api/mcp","capabilities":"https://appstorecopilot.com/.well-known/appstorecopilot-capabilities","health":"https://appstorecopilot.com/api/health"},"authentication":{"methods":["oauth_2_1","api_key","firebase_id_token"],"pairing":"https://appstorecopilot.com/onboarding","oauth":true},"safety":{"publishRequiresApproval":true,"credentialsAcceptedInChat":false,"projectScopedAuthority":true,"internalToolsExcluded":true,"untrustedContentIsData":true},"capabilities":[{"name":"get_onboarding_status","category":"onboarding","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Get Onboarding Status","description":"Start here for a newly paired account. Returns the shared onboarding state, projects, store connection status, approval policy, and the next safe action.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"Project ID selected during agent authorization"}}},"annotations":{"title":"Get Onboarding Status","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"list_importable_apps","category":"onboarding","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"List Importable Apps","description":"List apps available through the saved App Store Connect account. Never ask the user to paste store private credentials into chat; use the secure connection URL when credentials are missing.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"List Importable Apps","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"create_onboarding_project","category":"onboarding","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Create Onboarding Project","description":"Create/import one iOS or Android project after the user confirms whether a store-console record already exists. Unpublished apps in App Store Connect/Play Console count as existing; apps not created there yet can start as local pre-store projects.","inputSchema":{"type":"object","properties":{"requestId":{"type":"string","description":"Stable unique request ID used to make retries idempotent"},"name":{"type":"string","description":"Customer-facing app/project name"},"storeType":{"type":"string","enum":["ios","android"],"description":"Target store platform"},"storeRecordStatus":{"type":"string","enum":["existing","not_created"],"description":"Whether the app already exists in App Store Connect/Play Console, even if unpublished"},"appStoreAppId":{"type":"string","description":"Numeric App Store app ID for iOS"},"playStorePackage":{"type":"string","description":"Google Play package name for Android"},"primaryLocale":{"type":"string","description":"Primary locale, default en-US"}},"required":["requestId","name","storeType","storeRecordStatus"]},"annotations":{"title":"Create Onboarding Project","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"attach_onboarding_store_record","category":"onboarding","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Attach Onboarding Store Record","description":"Attach a local pre-store project after its app record is created in App Store Connect or Play Console. This is safe for an unpublished app and is idempotent for the same store identifier.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"Existing AppStoreCopilot pre-store project ID"},"appStoreAppId":{"type":"string","description":"Numeric App Store app ID for an iOS project"},"playStorePackage":{"type":"string","description":"Google Play package name for an Android project"}},"required":["projectId"]},"annotations":{"title":"Attach Onboarding Store Record","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"start_store_connection","category":"onboarding","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Start Store Connection","description":"Return the secure browser handoff for store authorization and current connection state. Store private keys must remain in the browser flow and must never be requested in chat.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Start Store Connection","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"set_agent_policy","category":"onboarding","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Set Agent Policy","description":"Set the human-approved operating mode. Publishing always requires explicit approval and destructive actions remain unavailable during onboarding.","inputSchema":{"type":"object","properties":{"mode":{"type":"string","enum":["read_only","draft_with_approval","publish_with_approval"],"description":"Recommended default is draft_with_approval"}},"required":["mode"]},"annotations":{"title":"Set Agent Policy","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"run_store_readiness_audit","category":"onboarding","requiredScope":"write","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Run Store Readiness Audit","description":"Run the first read-only store-readiness audit. Returns exact blockers, the approval boundary, and the smallest useful next action.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"Project ID; defaults to the first onboarding project"}}},"annotations":{"title":"Run Store Readiness Audit","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"render_readiness_workspace","category":"onboarding","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Render Readiness Workspace","description":"Render the inline AppStoreCopilot readiness workspace from the result of run_store_readiness_audit. Always call the audit first, then pass its project, ready, blockers, approvalBoundary, and nextAction fields unchanged.","inputSchema":{"type":"object","properties":{"project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"storeType":{"type":"string","enum":["ios","android"]},"storeRecordStatus":{"type":"string"},"syncStatus":{"type":"string"}},"required":["id","name","storeType"]},"ready":{"type":"boolean"},"blockers":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"deferrable":{"type":"boolean","description":"True when local draft work can continue before this blocker is resolved"}},"required":["code","message"]}},"approvalBoundary":{"type":"string"},"nextAction":{"type":"string"}},"required":["project","ready","blockers","approvalBoundary","nextAction"]},"annotations":{"title":"Render Readiness Workspace","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"complete_onboarding","category":"onboarding","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Complete Onboarding","description":"Complete onboarding only after an operating policy is set and the first store-readiness audit has run.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Complete Onboarding","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"translate_metadata","category":"metadata","requiredScope":"translate","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Translate Metadata","description":"ONLY use when user EXPLICITLY requests translation to other languages. Translates metadata to specified non-English locales using AI. Saves to AppStoreCopilot only - does NOT push to stores. For updating English metadata, use update_metadata instead. IMPORTANT: Only send store-relevant fields — App Store: title, subtitle, description, keywords, whatsNew. Play Store: title, shortDescription, fullDescription.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"store":{"type":"string","enum":["appstore","playstore"],"description":"Target store"},"locales":{"type":"array","items":{"type":"string"},"description":"Target locales to translate to"},"force":{"type":"boolean","description":"Force re-translation even if cached","default":false},"metadata":{"type":"object","properties":{"title":{"type":"string","description":"App name/title (both stores, max 30 chars)"},"subtitle":{"type":"string","description":"App Store only — max 30 chars"},"description":{"type":"string","description":"App Store only — max 4000 chars"},"keywords":{"type":"string","description":"App Store only — comma-separated, max 100 chars"},"whatsNew":{"type":"string","description":"App Store only — release notes, max 4000 chars"},"shortDescription":{"type":"string","description":"Play Store only — max 80 chars"},"fullDescription":{"type":"string","description":"Play Store only — max 4000 chars"}},"description":"Metadata fields to translate. Only send fields relevant to the target store."}},"required":["projectId","store","locales","metadata"]},"annotations":{"title":"Translate Metadata","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"update_metadata","category":"metadata","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Update Metadata","description":"Update/save metadata for any locale (including English) in AppStoreCopilot. Use this for setting base English metadata or editing any locale directly. Does NOT push to stores. IMPORTANT: Only send store-relevant fields — App Store: title, subtitle, description, keywords, whatsNew, promotionalText. Play Store: title, shortDescription, fullDescription. Other fields will be ignored.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"store":{"type":"string","enum":["appstore","playstore"],"description":"Target store"},"locale":{"type":"string","description":"Locale to update (e.g., en-US, fr-FR, de-DE)"},"metadata":{"type":"object","properties":{"title":{"type":"string","description":"App name/title (both stores, max 30 chars)"},"subtitle":{"type":"string","description":"App Store only — max 30 chars"},"description":{"type":"string","description":"App Store only — max 4000 chars"},"keywords":{"type":"string","description":"App Store only — comma-separated, max 100 chars"},"whatsNew":{"type":"string","description":"App Store only — release notes, max 4000 chars"},"promotionalText":{"type":"string","description":"App Store only — max 170 chars"},"shortDescription":{"type":"string","description":"Play Store only — max 80 chars"},"fullDescription":{"type":"string","description":"Play Store only — max 4000 chars"}},"description":"Metadata fields to update. Only send fields relevant to the target store."}},"required":["projectId","store","locale","metadata"]},"annotations":{"title":"Update Metadata","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"read_metadata","category":"metadata","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Read Metadata","description":"Read the current locally-saved metadata for a project. Returns all fields (name, subtitle, description, keywords, whatsNew, etc.). By default only returns the primary locale to avoid overload. Set primaryOnly=false to get all locales.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"locale":{"type":"string","description":"Optional: specific locale to read (e.g., en-US, fr-FR). Overrides primaryOnly."},"primaryOnly":{"type":"boolean","description":"Only return the primary locale. Defaults to true. Set to false to return all locales.","default":true}},"required":["projectId"]},"annotations":{"title":"Read Metadata","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"check_metadata_compliance","category":"metadata","requiredScope":"write","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Check Metadata Compliance","description":"Run an App Store / Play Store review-guideline compliance check on a locale's metadata. Combines legal-document pre-checks (Privacy Policy, EULA for subscriptions) with AI analysis (Gemini) against Apple App Store Review Guidelines (2.3, 2.3.2, 2.3.7, 3.1.2, 5.1.1) or Google Play Store Policies. Returns issues grouped by severity (error/warning/info) with guideline references and fix prompts. Use BEFORE uploading to stores to catch rejection risks. Does NOT modify metadata.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"locale":{"type":"string","description":"Locale to check (e.g., en-US, fr-FR). Defaults to the project's primary locale."},"storeType":{"type":"string","enum":["ios","android"],"description":"Which store's guidelines to check against. Defaults to ios.","default":"ios"}},"required":["projectId"]},"annotations":{"title":"Check Metadata Compliance","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_appstore_metadata","category":"metadata","requiredScope":"publish","risk":"publish","approval":"always","cost":"store-operation","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":true,"title":"Upload Appstore Metadata","description":"CAUTION: Uploads metadata to LIVE App Store Connect. IMPORTANT: You MUST call with dryRun=true first to preview, show the preview to the user, and only call with dryRun=false after the user explicitly confirms.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"locales":{"type":"array","items":{"type":"string"},"description":"Locales to upload"},"dryRun":{"type":"boolean","description":"RECOMMENDED: Preview what would be uploaded without actually uploading. Always use true unless user explicitly confirms upload.","default":true},"translations":{"type":"object","description":"Optional translations to upload (uses cached if not provided)"}},"required":["projectId","locales"]},"annotations":{"title":"Upload Appstore Metadata","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_playstore_metadata","category":"metadata","requiredScope":"publish","risk":"publish","approval":"always","cost":"store-operation","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":true,"title":"Upload Playstore Metadata","description":"CAUTION: Uploads metadata to LIVE Google Play Console. IMPORTANT: You MUST call with dryRun=true first to preview, show the preview to the user, and only call with dryRun=false after the user explicitly confirms.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"locales":{"type":"array","items":{"type":"string"},"description":"Locales to upload (iOS locales auto-converted to Android)"},"dryRun":{"type":"boolean","description":"RECOMMENDED: Preview what would be uploaded without actually uploading. Always use true unless user explicitly confirms upload.","default":true},"translations":{"type":"object","description":"Optional translations to upload (uses cached if not provided)"}},"required":["projectId","locales"]},"annotations":{"title":"Upload Playstore Metadata","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"sync_stores","category":"metadata","requiredScope":"publish","risk":"publish","approval":"always","cost":"store-operation","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":true,"title":"Sync Stores","description":"CAUTION: Uploads metadata to BOTH live App Store AND Play Store. IMPORTANT: You MUST call with dryRun=true first to preview, show the preview to the user, and only call with dryRun=false after the user explicitly confirms. This is a destructive operation affecting live store listings.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"locales":{"type":"array","items":{"type":"string"},"description":"Locales to upload"},"dryRun":{"type":"boolean","description":"RECOMMENDED: Preview what would be uploaded without actually uploading. Always use true unless user explicitly confirms upload.","default":true}},"required":["projectId","locales"]},"annotations":{"title":"Sync Stores","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_screenshot","category":"screenshots","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Screenshot","description":"Generate a single marketing screenshot from a raw app screenshot using AI. Saves to AppStoreCopilot only - does NOT upload to stores.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"rawImageUrl":{"type":"string","description":"URL of the raw app screenshot"},"headline":{"type":"string","description":"Marketing headline text (max 50 chars)"},"subtitle":{"type":"string","description":"Optional supporting marketing text beneath the headline (keep short, about 55-60 chars max)."},"styleSource":{"type":"object","oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"category"},"category":{"type":"string","enum":["kids","productivity","fitness","social","finance","utility","entertainment","education","lifestyle","health"]},"customColors":{"type":"object","properties":{"primary":{"type":"string"},"secondary":{"type":"string"}}}},"required":["type","category"]},{"type":"object","properties":{"type":{"type":"string","const":"reference"},"referenceImageUrl":{"type":"string"}},"required":["type","referenceImageUrl"]},{"type":"object","properties":{"type":{"type":"string","const":"custom"},"style":{"type":"object","properties":{"gradientColors":{"type":"object","properties":{"primary":{"type":"string","description":"Primary gradient color (hex)"},"secondary":{"type":"string","description":"Secondary gradient color (hex)"}},"required":["primary","secondary"]},"fontStyle":{"type":"string","description":"Font description (e.g. \"bold sans-serif in white\")"},"styleDescription":{"type":"string","description":"Overall style description"},"decorativeElements":{"type":"array","items":{"type":"string"},"description":"Decorative elements (e.g. [\"motion curves\", \"energy waves\"])"}},"required":["gradientColors","fontStyle","styleDescription","decorativeElements"]}},"required":["type","style"]}],"description":"Style source - app category template, reference image, or custom style config"},"anchorImageUrl":{"type":"string","description":"Optional: previously generated screenshot to use as style anchor"},"provider":{"type":"string","enum":["gemini","kie"],"description":"Image generation provider. Defaults to gemini. Use kie with model nano-banana-2 for Nano Banana 2 screenshot edits."},"model":{"type":"string","description":"Optional provider model override, e.g. \"nano-banana-2\" for provider=kie."},"resizeToSizes":{"type":"array","items":{"type":"string","enum":["6.9","6.5","6.3","6.1","5.5","ipad-13","ipad-12.9","ipad-11","watch-ultra-3","watch-ultra","watch-10","watch-7","watch-4","watch-3"]},"description":"Optional: resize to specific App Store sizes"}},"required":["projectId","rawImageUrl","headline","styleSource"]},"annotations":{"title":"Generate Screenshot","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_screenshot_set","category":"screenshots","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Screenshot Set","description":"Generate a consistent set of marketing screenshots with matching style. Uses anchor pattern for visual consistency. Saves to AppStoreCopilot only - does NOT upload to stores.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"screenshots":{"type":"array","items":{"type":"object","properties":{"rawImageUrl":{"type":"string"},"headline":{"type":"string"},"subtitle":{"type":"string","description":"Optional supporting marketing text beneath the headline."}},"required":["rawImageUrl","headline"]},"description":"Array of screenshots to generate (max 10)"},"styleSource":{"type":"object","oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"category"},"category":{"type":"string","enum":["kids","productivity","fitness","social","finance","utility","entertainment","education","lifestyle","health"]},"customColors":{"type":"object","properties":{"primary":{"type":"string"},"secondary":{"type":"string"}}},"anchorIndex":{"type":"number","description":"Which screenshot to generate first as anchor (default: 0)"}},"required":["type","category"]},{"type":"object","properties":{"type":{"type":"string","const":"reference"},"referenceImageUrl":{"type":"string"}},"required":["type","referenceImageUrl"]},{"type":"object","properties":{"type":{"type":"string","const":"custom"},"style":{"type":"object","properties":{"gradientColors":{"type":"object","properties":{"primary":{"type":"string","description":"Primary gradient color (hex)"},"secondary":{"type":"string","description":"Secondary gradient color (hex)"}},"required":["primary","secondary"]},"fontStyle":{"type":"string","description":"Font description (e.g. \"bold sans-serif in white\")"},"styleDescription":{"type":"string","description":"Overall style description"},"decorativeElements":{"type":"array","items":{"type":"string"},"description":"Decorative elements (e.g. [\"seedlings\", \"leaves\"])"}},"required":["gradientColors","fontStyle","styleDescription","decorativeElements"]}},"required":["type","style"]}],"description":"Style source - category template, reference image, or custom style config"},"deviceFrame":{"type":"string","enum":["iphone","android","generic","none"],"description":"Device frame style. \"iphone\" (default): iPhone mockup. \"android\": Pixel-style mockup. \"generic\": brand-neutral device shape (works for both stores). \"none\": no device frame, just app UI on background."},"provider":{"type":"string","enum":["gemini","kie"],"description":"Image generation provider. Defaults to gemini. Use kie with model nano-banana-2 for Nano Banana 2 screenshot edits."},"model":{"type":"string","description":"Optional provider model override, e.g. \"nano-banana-2\" for provider=kie."},"resizeToSizes":{"type":"array","items":{"type":"string","enum":["6.9","6.5","6.3","6.1","5.5","ipad-13","ipad-12.9","ipad-11","watch-ultra-3","watch-ultra","watch-10","watch-7","watch-4","watch-3"]},"description":"Optional: resize to specific App Store sizes"}},"required":["projectId","screenshots","styleSource"]},"annotations":{"title":"Generate Screenshot Set","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_screenshots_from_plan","category":"screenshots","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Screenshots From Plan","description":"Generate a set of App Store marketing screenshots from raw screenshots with a pre-defined plan. Unlike generate_screenshot_set which auto-analyzes for enhancements, this tool accepts pre-defined enhancement instructions per screenshot — use when you already know what to emphasize. Supports custom style configs. Saves to AppStoreCopilot only - does NOT upload to stores.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"screenshots":{"type":"array","items":{"type":"object","properties":{"rawImageUrl":{"type":"string","description":"URL of the raw app screenshot"},"headline":{"type":"string","description":"Marketing headline text (max 50 chars)"},"subtitle":{"type":"string","description":"Optional supporting marketing text beneath the headline (keep short, about 55-60 chars max)."},"enhancement":{"type":"object","properties":{"focusArea":{"type":"string","description":"UI element to emphasize (e.g. \"the streak counter card\")"},"visualTechnique":{"type":"string","enum":["none","pop-out","floating-element"],"description":"pop-out: 3D depth effect. floating-element: pull element outside device frame. none: no emphasis."},"contextualNote":{"type":"string","description":"Why this element connects to the headline"},"enhancementPrompt":{"type":"string","description":"Specific instruction for the image generator"}},"description":"Optional: pre-defined visual emphasis (skips AI analysis)"}},"required":["rawImageUrl","headline"]},"description":"Raw screenshots with headlines and optional enhancements (max 10)"},"styleSource":{"type":"object","oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"category"},"category":{"type":"string","enum":["kids","productivity","fitness","social","finance","utility","entertainment","education","lifestyle","health"]},"customColors":{"type":"object","properties":{"primary":{"type":"string"},"secondary":{"type":"string"}}}},"required":["type","category"]},{"type":"object","properties":{"type":{"type":"string","const":"reference"},"referenceImageUrl":{"type":"string"}},"required":["type","referenceImageUrl"]},{"type":"object","properties":{"type":{"type":"string","const":"custom"},"style":{"type":"object","properties":{"gradientColors":{"type":"object","properties":{"primary":{"type":"string","description":"Primary gradient color (hex)"},"secondary":{"type":"string","description":"Secondary gradient color (hex)"}},"required":["primary","secondary"]},"fontStyle":{"type":"string","description":"Font description (e.g. \"bold sans-serif in white\")"},"styleDescription":{"type":"string","description":"Overall style description (e.g. \"Energetic fitness aesthetic with motion elements\")"},"decorativeElements":{"type":"array","items":{"type":"string"},"description":"Decorative elements (e.g. [\"motion curves\", \"energy waves\"])"}},"required":["gradientColors","fontStyle","styleDescription","decorativeElements"]}},"required":["type","style"]}],"description":"Style source - category template, reference image, or custom style config"},"appContext":{"type":"object","properties":{"name":{"type":"string","description":"App name for context"},"description":{"type":"string","description":"App description for context"}},"description":"Optional app context for better generation"},"deviceFrame":{"type":"string","enum":["iphone","android","generic","none"],"description":"Device frame style. \"iphone\" (default): iPhone mockup. \"android\": Pixel-style mockup. \"generic\": brand-neutral device shape (works for both stores). \"none\": no device frame, just app UI on background."},"provider":{"type":"string","enum":["gemini","kie"],"description":"Image generation provider. Defaults to gemini. Use kie with model nano-banana-2 for Nano Banana 2 screenshot edits."},"model":{"type":"string","description":"Optional provider model override, e.g. \"nano-banana-2\" for provider=kie."},"resizeToSizes":{"type":"array","items":{"type":"string","enum":["6.9","6.5","6.3","6.1","5.5","ipad-13","ipad-12.9","ipad-11","watch-ultra-3","watch-ultra","watch-10","watch-7","watch-4","watch-3"]},"description":"Optional: resize to specific App Store sizes"}},"required":["projectId","screenshots","styleSource"]},"annotations":{"title":"Generate Screenshots From Plan","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"check_screenshot_job","category":"screenshots","requiredScope":"screenshots","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Check Screenshot Job","description":"Check the status of an async screenshot generation job. Use this after generate_screenshot_set or generate_screenshots_from_plan returns a jobId. Poll until status is \"completed\" or \"failed\".","inputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"The job ID returned by the screenshot generation tool"}},"required":["jobId"]},"annotations":{"title":"Check Screenshot Job","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"translate_screenshots","category":"screenshots","requiredScope":"translate","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Translate Screenshots","description":"Translate existing marketing screenshots into other languages. Takes the primary-locale screenshots and generates localized versions with translated headline text. Returns a jobId — use check_screenshot_translation_job to poll for completion. Requires screenshots to already exist (via generate_screenshot_set or import_screenshots).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"targetLocales":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Target locales to translate to (e.g. [\"de-DE\", \"fr-FR\", \"ja\", \"es-ES\"])"},"displayTypes":{"type":"array","items":{"type":"string"},"description":"Optional: specific display types to translate (e.g. [\"APP_IPHONE_69\"]). If omitted, translates all device sizes that have screenshots."},"screenshotIds":{"type":"array","items":{"type":"string"},"description":"Optional: specific screenshot IDs to translate. If omitted, translates all screenshots in each set."},"translateInAppText":{"type":"boolean","description":"Whether to also translate visible in-app UI text within the screenshots (default: false)"},"preserveInPhoneUI":{"type":"boolean","description":"If true, keep phone/app UI text exactly as-is and translate only marketing text outside the device. Overrides translateInAppText unless translationMode is ui_full."},"translateMarketingOnly":{"type":"boolean","description":"Alias for preserving in-phone UI while translating only the App Store marketing copy."},"translationInstructions":{"type":"string","description":"Optional custom guidance appended to the provider prompt, e.g. \"Use short natural Spanish, avoid clipping, preserve phone UI.\""},"translationMode":{"type":"string","enum":["literal","marketing_short","transcreate","ui_full"],"description":"Translation preset. literal = faithful translation, marketing_short = concise App Store copy, transcreate = natural localized rewrite, ui_full = translate marketing and in-app UI text."},"textLengthPolicy":{"type":"object","description":"Optional text fit constraints for generated localized screenshots.","properties":{"headlineMaxChars":{"type":"number","description":"Maximum headline characters."},"subtitleMaxChars":{"type":"number","description":"Maximum subtitle characters."},"allowLineBreaks":{"type":"boolean","description":"Whether line breaks are allowed to satisfy length/fit constraints."},"shrinkFontLimitPercent":{"type":"number","description":"Maximum font shrink percentage allowed before rephrasing or line breaking."}}},"provider":{"type":"string","enum":["kie","fal","openai"],"description":"Image translation provider. Defaults to kie. Use openai with model gpt-image-2 for highest-quality edits when configured."},"model":{"type":"string","description":"Optional provider model override, e.g. \"gpt-image-2\" for provider=openai or \"nano-banana-2\" for provider=kie."},"perScreenshotInstructions":{"type":"object","description":"Optional screenshot-specific guidance keyed by screenshot id or 1-based screenshot number like \"02\". Values can be a string or an object with headline/subtitle/instructions/headlineMaxChars/subtitleMaxChars.","additionalProperties":{"anyOf":[{"type":"string"},{"type":"object","properties":{"headline":{"type":"string"},"subtitle":{"type":"string"},"instructions":{"type":"string"},"headlineMaxChars":{"type":"number"},"subtitleMaxChars":{"type":"number"}}}]}}},"required":["projectId","targetLocales"]},"annotations":{"title":"Translate Screenshots","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"translate_custom_page_screenshots","category":"screenshots","requiredScope":"translate","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Translate Custom Page Screenshots","description":"Translate screenshots attached to a Custom Product Page localization. Reads screenshots from the source CPP locale, creates translated screenshots in the target CPP localizations, and returns a jobId for check_screenshot_translation_job.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"pageId":{"type":"string","description":"The custom product page Firestore document ID"},"sourceLocale":{"type":"string","description":"Source CPP localization locale, e.g. \"en-US\". Screenshots are read from this locale."},"targetLocales":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Target locales to generate translated screenshots for (e.g. [\"de-DE\", \"fr-FR\", \"ja\"])."},"displayTypes":{"type":"array","items":{"type":"string"},"description":"Optional: specific App Store display types to translate (e.g. [\"APP_IPHONE_69\"]). If omitted, translates all display types attached to the source CPP localization."},"screenshotIds":{"type":"array","items":{"type":"string"},"description":"Optional: specific CPP screenshot IDs to translate. If omitted, translates all screenshots matching the selected display types."},"translateInAppText":{"type":"boolean","description":"Whether to also translate visible in-app UI text within the screenshots (default: false)."},"preserveInPhoneUI":{"type":"boolean","description":"If true, keep phone/app UI text exactly as-is and translate only marketing text outside the device. Overrides translateInAppText unless translationMode is ui_full."},"translateMarketingOnly":{"type":"boolean","description":"Alias for preserving in-phone UI while translating only the App Store marketing copy."},"translationInstructions":{"type":"string","description":"Optional custom guidance appended to the provider prompt, e.g. \"Use short natural Spanish, avoid clipping, preserve phone UI.\""},"translationMode":{"type":"string","enum":["literal","marketing_short","transcreate","ui_full"],"description":"Translation preset. literal = faithful translation, marketing_short = concise App Store copy, transcreate = natural localized rewrite, ui_full = translate marketing and in-app UI text."},"textLengthPolicy":{"type":"object","description":"Optional text fit constraints for generated localized screenshots.","properties":{"headlineMaxChars":{"type":"number","description":"Maximum headline characters."},"subtitleMaxChars":{"type":"number","description":"Maximum subtitle characters."},"allowLineBreaks":{"type":"boolean","description":"Whether line breaks are allowed to satisfy length/fit constraints."},"shrinkFontLimitPercent":{"type":"number","description":"Maximum font shrink percentage allowed before rephrasing or line breaking."}}},"provider":{"type":"string","enum":["kie","fal","openai"],"description":"Image translation provider. Defaults to kie. Use openai with model gpt-image-2 for highest-quality edits when configured."},"model":{"type":"string","description":"Optional provider model override, e.g. \"gpt-image-2\" for provider=openai or \"nano-banana-2\" for provider=kie."},"perScreenshotInstructions":{"type":"object","description":"Optional screenshot-specific guidance keyed by CPP screenshot id or 1-based screenshot number like \"02\". Values can be a string or an object with headline/subtitle/instructions/headlineMaxChars/subtitleMaxChars.","additionalProperties":{"anyOf":[{"type":"string"},{"type":"object","properties":{"headline":{"type":"string"},"subtitle":{"type":"string"},"instructions":{"type":"string"},"headlineMaxChars":{"type":"number"},"subtitleMaxChars":{"type":"number"}}}]}}},"required":["projectId","pageId","sourceLocale","targetLocales"]},"annotations":{"title":"Translate Custom Page Screenshots","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"check_screenshot_translation_job","category":"screenshots","requiredScope":"screenshots","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Check Screenshot Translation Job","description":"Check the status of a screenshot translation job. Use after translate_screenshots returns a jobId. Poll until status is \"completed\" or \"failed\". Supports chained jobs (long translations that auto-continue).","inputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"The job ID returned by translate_screenshots"}},"required":["jobId"]},"annotations":{"title":"Check Screenshot Translation Job","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"get_screenshots","category":"screenshots","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Get Screenshots","description":"Get screenshot image URLs for a project so you can view them. Returns all screenshot sets with their image URLs, headlines, and available translated locales. Use this to inspect screenshots before editing or to get reference images. Image URLs are publicly accessible and can be viewed directly by multimodal agents.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"displayType":{"type":"string","description":"Optional: specific display type to get (e.g. \"APP_IPHONE_69\"). If omitted, returns all display types."},"locale":{"type":"string","description":"Optional: get translated screenshots for this locale. If omitted, returns primary screenshots."},"includeTranslatedLocales":{"type":"boolean","description":"If true, also lists which locales have translated versions available (default: false)"}},"required":["projectId"]},"annotations":{"title":"Get Screenshots","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_screenshot_asset","category":"screenshots","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Upload Screenshot Asset","description":"Upload a raw app screenshot or style reference image into AppStoreCopilot/R2 and return a public URL that can be used by generate_screenshot, generate_screenshot_set, or generate_screenshots_from_plan. Use this to stage local simulator captures and existing style references before Nano Banana/Kie generation.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"filename":{"type":"string","description":"Filename to use in storage, e.g. \"sl-snore-event-list.png\"."},"category":{"type":"string","enum":["raw","reference","temp"],"description":"Storage category. Use raw for simulator captures, reference for existing style screenshots, temp for short-lived helper assets. Defaults to raw."},"sourceUrl":{"type":"string","description":"Public URL to fetch and upload. Provide exactly one of sourceUrl, dataUrl, or imageDataBase64."},"dataUrl":{"type":"string","description":"Data URL in the form data:image/png;base64,... Provide exactly one of sourceUrl, dataUrl, or imageDataBase64."},"imageDataBase64":{"type":"string","description":"Raw base64 image bytes. Provide contentType when using this field. Provide exactly one of sourceUrl, dataUrl, or imageDataBase64."},"contentType":{"type":"string","description":"Content type for imageDataBase64 inputs, defaults to image/png."}},"required":["projectId","filename"]},"annotations":{"title":"Upload Screenshot Asset","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"edit_screenshot","category":"screenshots","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Edit Screenshot","description":"Edit any aspect of a screenshot using AI — text, layout, colors, style, device frame, background, or anything else. Pass a custom prompt describing what to change, and optionally provide reference image URLs (e.g. the base language screenshot for translated versions). Generates the edit and auto-saves. For text-only fixes, fix_screenshot_text is simpler.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"displayType":{"type":"string","description":"Display type (e.g. \"APP_IPHONE_69\")"},"screenshotId":{"type":"string","description":"The screenshot ID within the set"},"locale":{"type":"string","description":"Optional: locale of a translated screenshot to edit. If omitted, edits the primary screenshot."},"prompt":{"type":"string","description":"What to change — describe the edit in detail (e.g. \"Fix the text overflow on the headline\", \"Make the background gradient darker\", \"Center the device mockup better\")"},"referenceImageUrls":{"type":"array","items":{"type":"string"},"maxItems":4,"description":"Optional: reference image URLs for the AI to use as context (e.g. the base language screenshot, a style reference, etc.)"}},"required":["projectId","displayType","screenshotId","prompt"]},"annotations":{"title":"Edit Screenshot","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"import_screenshots","category":"screenshots","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Import Screenshots","description":"Import finished marketing screenshots into the dashboard for a specific device size. Saves them as a ScreenshotSet so they appear in the dashboard and can be pushed to App Store Connect. Images can be provided as URLs (will be downloaded and stored) or R2 keys from previous uploads.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"deviceSize":{"type":"string","enum":["6.9","6.5","6.3","6.1","5.5","ipad-13","ipad-12.9","ipad-11","watch-ultra-3","watch-ultra","watch-10","watch-7","watch-4","watch-3","play-phone","play-tablet","play-feature-graphic"],"description":"Target device size. iOS: 6.9 = iPhone 16 Pro Max (required), ipad-13 = iPad Pro M4. Apple Watch: watch-10 = 416×496 Series 10/11, watch-7 = 396×484, watch-4 = 368×448. Android: play-phone = 1080×1920, play-tablet = 1920×1200, play-feature-graphic = 1024×500 landscape banner."},"screenshots":{"type":"array","items":{"type":"object","properties":{"imageUrl":{"type":"string","description":"URL of the finished marketing screenshot image"},"headline":{"type":"string","description":"Marketing headline text for this screenshot (can be empty)"}},"required":["imageUrl"]},"minItems":1,"maxItems":10,"description":"Array of screenshots to import, in display order"}},"required":["projectId","deviceSize","screenshots"]},"annotations":{"title":"Import Screenshots","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_feature_graphic","category":"screenshots","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Feature Graphic","description":"Generate a Google Play Store Feature Graphic (1024×500 landscape banner) for an Android project using AI. This is a standalone branded promotional banner — it does NOT require a raw app screenshot. The feature graphic appears above screenshots in the Play Store listing. Saves to AppStoreCopilot only — push separately.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID (must be an Android project)"},"headline":{"type":"string","description":"Main marketing headline/tagline for the banner (short, punchy, max ~50 chars)"},"rawImageUrl":{"type":"string","description":"Optional: URL of a raw app screenshot to incorporate as a visual element in the banner. If omitted, generates a standalone branded graphic."},"locale":{"type":"string","description":"Target locale (default: project primary locale)"},"appName":{"type":"string","description":"App name for branding (auto-detected from project if omitted)"},"appDescription":{"type":"string","description":"Short app description for context (auto-detected from project if omitted)"},"styleSource":{"type":"object","description":"Style source: { type: \"category\", category: \"...\" } or { type: \"reference\", referenceImageUrl: \"...\" } or { type: \"custom\", style: { gradientColors: { primary, secondary }, fontStyle, styleDescription, decorativeElements? } }","properties":{"type":{"type":"string","enum":["category","reference","custom"]},"category":{"type":"string","description":"App category (for category style)"},"referenceImageUrl":{"type":"string","description":"Reference image URL (for reference style)"},"style":{"type":"object","description":"Custom style config (for custom style)","properties":{"gradientColors":{"type":"object","properties":{"primary":{"type":"string"},"secondary":{"type":"string"}},"required":["primary","secondary"]},"fontStyle":{"type":"string"},"styleDescription":{"type":"string"},"decorativeElements":{"type":"array","items":{"type":"string"}}},"required":["gradientColors","fontStyle","styleDescription"]}},"required":["type"]}},"required":["projectId","headline","styleSource"]},"annotations":{"title":"Generate Feature Graphic","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"pull_play_store_graphics","category":"screenshots","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Pull Play Store Graphics","description":"Pull existing screenshots and feature graphic from Google Play Store into AppStoreCopilot. Works for all Android image types: phone screenshots, tablet screenshots, and feature graphic.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The Android project ID"},"displayTypes":{"type":"array","items":{"type":"string","enum":["PLAY_PHONE","PLAY_TABLET","PLAY_FEATURE_GRAPHIC"]},"description":"Which image types to pull. Defaults to all types if not specified."},"locales":{"type":"array","items":{"type":"string"},"description":"Optional: specific locales to pull. Defaults to all locales with images."}},"required":["projectId"]},"annotations":{"title":"Pull Play Store Graphics","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"suggest_headlines","category":"screenshots","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Suggest Headlines","description":"AI-analyze a screenshot and suggest marketing headlines based on app metadata","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"screenshotUrl":{"type":"string","description":"URL of the screenshot to analyze"},"appMetadata":{"type":"object","properties":{"title":{"type":"string"},"subtitle":{"type":"string"},"description":{"type":"string"},"keywords":{"type":"string"}},"required":["title"],"description":"App metadata for context"},"appCategory":{"type":"string","enum":["kids","productivity","fitness","social","finance","utility","entertainment","education","lifestyle","health"],"description":"Optional app category"},"numberOfSuggestions":{"type":"number","minimum":1,"maximum":5,"default":3}},"required":["projectId","screenshotUrl","appMetadata"]},"annotations":{"title":"Suggest Headlines","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"list_locales","category":"utilities","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":false,"untrustedData":false,"destructive":false,"title":"List Locales","description":"List supported locales for App Store or Play Store","inputSchema":{"type":"object","properties":{"store":{"type":"string","enum":["appstore","playstore"],"description":"Which store to list locales for"}},"required":["store"]},"annotations":{"title":"List Locales","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"validate_config","category":"utilities","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Validate Config","description":"Validate project configuration including credentials and metadata","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID to validate"}},"required":["projectId"]},"annotations":{"title":"Validate Config","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_icon","category":"icons","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Icon","description":"Generate an app icon using AI from a prompt, app metadata, reference image, or existing App Store icon. Saves to AppStoreCopilot only - does NOT upload to stores.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"source":{"type":"object","oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"prompt"},"prompt":{"type":"string","description":"Direct prompt for icon generation (10-500 chars)"}},"required":["type","prompt"]},{"type":"object","properties":{"type":{"type":"string","const":"metadata"},"appMetadata":{"type":"object","properties":{"title":{"type":"string"},"category":{"type":"string","enum":["kids","productivity","fitness","social","finance","utility","entertainment","education","lifestyle","health"]},"subtitle":{"type":"string"},"description":{"type":"string"}},"required":["title"]}},"required":["type","appMetadata"]},{"type":"object","properties":{"type":{"type":"string","const":"reference"},"referenceImageUrl":{"type":"string"},"prompt":{"type":"string"}},"required":["type","referenceImageUrl"]},{"type":"object","properties":{"type":{"type":"string","const":"appstore"},"appId":{"type":"string","description":"Numeric App Store app ID"}},"required":["type","appId"]}],"description":"Icon source - prompt, app metadata, reference image, or App Store app ID"},"style":{"type":"string","enum":["flat","3d","minimalist","gradient","cute","mascot","glassmorphism","neon","duotone","clay","watercolor","sketch","pixel","isometric","metallic","geometric","line","retro"],"description":"Icon style (flat, 3d, minimalist, cute, gradient)"},"colors":{"type":"object","properties":{"primary":{"type":"string","description":"Primary hex color (e.g., #FF5733)"},"secondary":{"type":"string","description":"Secondary hex color"}}},"background":{"type":"string","enum":["solid","gradient"],"description":"Background style"}},"required":["projectId","source"]},"annotations":{"title":"Generate Icon","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_icon_variations","category":"icons","requiredScope":"screenshots","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Icon Variations","description":"Generate 4 style variations of an app icon (flat, 3d, minimalist, gradient). Saves to AppStoreCopilot only - does NOT upload to stores.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"prompt":{"type":"string","description":"Prompt describing the icon concept (10-500 chars)"},"colors":{"type":"object","properties":{"primary":{"type":"string","description":"Primary hex color"},"secondary":{"type":"string","description":"Secondary hex color"}}}},"required":["projectId","prompt"]},"annotations":{"title":"Generate Icon Variations","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"fetch_appstore_icon","category":"icons","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Fetch Appstore Icon","description":"Fetch an existing app icon from the App Store and resize to iOS/Android sizes","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"appId":{"type":"string","description":"Numeric App Store app ID"}},"required":["projectId","appId"]},"annotations":{"title":"Fetch Appstore Icon","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"resize_icon","category":"icons","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Resize Icon","description":"Resize an existing icon to iOS (1024x1024) and Android (512x512) sizes","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"imageUrl":{"type":"string","description":"URL of the icon image to resize"}},"required":["projectId","imageUrl"]},"annotations":{"title":"Resize Icon","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"update_legal_document","category":"legal","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Update Legal Document","description":"Create or update a privacy policy or terms of service for the app. Returns the public URL that can be used in App Store Connect.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"type":{"type":"string","enum":["privacy_policy","terms_of_service"],"description":"Type of legal document"},"content":{"type":"string","description":"Markdown content of the legal document"}},"required":["projectId","type","content"]},"annotations":{"title":"Update Legal Document","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"read_legal_documents","category":"legal","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"Read Legal Documents","description":"Read the current legal documents (privacy policy and terms of service) for a project. Returns existence, publish status, and public URLs.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"}},"required":["projectId"]},"annotations":{"title":"Read Legal Documents","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"push_legal_to_appstore","category":"legal","requiredScope":"publish","risk":"publish","approval":"always","cost":"store-operation","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":true,"title":"Push Legal To Appstore","description":"CAUTION: Pushes the published privacy policy public URL to LIVE App Store Connect (updates `privacyPolicyUrl` on every appInfoLocalization). Requires the legal doc to already be published via update_legal_document, and the project to have appStoreAppId + App Store credentials configured. Only privacy_policy is supported — Terms of Service should be linked inside the app description (guideline 3.1.2). IMPORTANT: Confirm with the user before calling, as this modifies live store data.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"type":{"type":"string","enum":["privacy_policy"],"description":"Which legal document to push. Only privacy_policy is supported.","default":"privacy_policy"}},"required":["projectId"]},"annotations":{"title":"Push Legal To Appstore","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"list_custom_product_pages","category":"custom-pages","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"List Custom Product Pages","description":"List all Custom Product Pages (iOS) for a project. Custom Product Pages are targeted App Store page variants with custom screenshots and promotional text.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"}},"required":["projectId"]},"annotations":{"title":"List Custom Product Pages","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"create_custom_product_page","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Create Custom Product Page","description":"Create a new Custom Product Page (iOS) locally. Use sync_custom_product_pages to push it to App Store Connect.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"name":{"type":"string","description":"Reference name for the custom product page (max 64 chars)"},"localizations":{"type":"array","description":"Optional initial localizations","items":{"type":"object","properties":{"locale":{"type":"string","description":"Locale code (e.g., en-US)"},"promotionalText":{"type":"string","description":"Promotional text (max 170 chars)"}},"required":["locale"]}}},"required":["projectId","name"]},"annotations":{"title":"Create Custom Product Page","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"update_custom_product_page","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Update Custom Product Page","description":"Update the name of a Custom Product Page (iOS).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"pageId":{"type":"string","description":"The custom product page Firestore document ID"},"name":{"type":"string","description":"New reference name (max 64 chars)"}},"required":["projectId","pageId"]},"annotations":{"title":"Update Custom Product Page","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"update_cpp_localization","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Update Cpp Localization","description":"Create or update the promotional text for a locale on a Custom Product Page (iOS).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"pageId":{"type":"string","description":"The custom product page Firestore document ID"},"locale":{"type":"string","description":"Locale code (e.g., en-US)"},"promotionalText":{"type":"string","description":"Promotional text (max 170 chars)"}},"required":["projectId","pageId","locale"]},"annotations":{"title":"Update Cpp Localization","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"sync_custom_product_pages","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Sync Custom Product Pages","description":"Sync Custom Product Pages with App Store Connect. Use direction=pull to fetch from ASC, or direction=push to create/update CPPs, localizations, and screenshots. Pushes mirror local CPP screenshot display buckets and prune copied template buckets that are not present locally. Use locales to push a small locale chunk for large localized CPPs. Call with confirmed=false first to preview, then confirmed=true to mutate App Store Connect.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"direction":{"type":"string","enum":["pull","push"],"description":"Pull from or push to App Store Connect"},"pageIds":{"type":"array","items":{"type":"string"},"description":"Optional Firestore CPP page IDs to push"},"locales":{"type":"array","items":{"type":"string"},"description":"Optional locale codes to push for each page (useful for chunking large localized CPP screenshot pushes)"},"pushAll":{"type":"boolean","description":"Push all pending local CPP changes (default behavior when no pageIds are provided)"},"force":{"type":"boolean","description":"Push all CPP pages even when marked synced"},"confirmed":{"type":"boolean","description":"Required for push direction to mutate ASC. Set false to preview."}},"required":["projectId","direction"]},"annotations":{"title":"Sync Custom Product Pages","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_cpp_screenshot","category":"custom-pages","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Upload Cpp Screenshot","description":"Add a screenshot reference to a Custom Product Page localization. The image may be an R2/public URL; sync_custom_product_pages pushes it to App Store Connect.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"pageId":{"type":"string","description":"The custom product page Firestore document ID"},"locale":{"type":"string","description":"Locale code"},"displayType":{"type":"string","description":"Screenshot display type (e.g., APP_IPHONE_69)"},"imageUrl":{"type":"string","description":"Public URL of the uploaded image"},"imageKey":{"type":"string","description":"Optional R2 storage key"},"fileName":{"type":"string","description":"Original file name"},"fileSize":{"type":"number","description":"Optional file size in bytes"}},"required":["projectId","pageId","locale","displayType","imageUrl","fileName"]},"annotations":{"title":"Upload Cpp Screenshot","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"list_custom_store_listings","category":"custom-pages","requiredScope":"read","risk":"read","approval":"none","cost":"none","readOnly":true,"openWorld":true,"untrustedData":true,"destructive":false,"title":"List Custom Store Listings","description":"List all Custom Store Listings (Android) for a project. Custom Store Listings are targeted Play Store page variants with custom title, description, icon, and screenshots.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"}},"required":["projectId"]},"annotations":{"title":"List Custom Store Listings","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"create_custom_store_listing","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Create Custom Store Listing","description":"Create a new Custom Store Listing (Android) locally. Use sync_custom_store_listings to push it to Play Store.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"name":{"type":"string","description":"Internal name for the listing"},"targetingType":{"type":"string","enum":["COUNTRY","PRE_REGISTRATION","INSTALL_STATE"],"description":"Targeting type","default":"COUNTRY"},"targetingCountries":{"type":"array","items":{"type":"string"},"description":"Country codes for COUNTRY targeting"},"localizations":{"type":"array","description":"Optional initial localizations","items":{"type":"object","properties":{"locale":{"type":"string","description":"Locale code (e.g., en-US)"},"title":{"type":"string","description":"Title (max 30 chars)"},"shortDescription":{"type":"string","description":"Short description (max 80 chars)"},"fullDescription":{"type":"string","description":"Full description (max 4000 chars)"}},"required":["locale","title"]}}},"required":["projectId","name"]},"annotations":{"title":"Create Custom Store Listing","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"update_custom_store_listing","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Update Custom Store Listing","description":"Update the name or targeting of a Custom Store Listing (Android).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"listingId":{"type":"string","description":"The custom store listing Firestore document ID"},"name":{"type":"string","description":"New internal name"},"targetingType":{"type":"string","enum":["COUNTRY","PRE_REGISTRATION","INSTALL_STATE"],"description":"Targeting type"},"targetingCountries":{"type":"array","items":{"type":"string"},"description":"Country codes"}},"required":["projectId","listingId"]},"annotations":{"title":"Update Custom Store Listing","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"update_csl_localization","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Update Csl Localization","description":"Update title, short description, or full description for a locale on a Custom Store Listing (Android).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"listingId":{"type":"string","description":"The custom store listing Firestore document ID"},"locale":{"type":"string","description":"Locale code"},"title":{"type":"string","description":"Title (max 30 chars)"},"shortDescription":{"type":"string","description":"Short description (max 80 chars)"},"fullDescription":{"type":"string","description":"Full description (max 4000 chars)"}},"required":["projectId","listingId","locale"]},"annotations":{"title":"Update Csl Localization","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"sync_custom_store_listings","category":"custom-pages","requiredScope":"write","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Sync Custom Store Listings","description":"Sync Custom Store Listings with Google Play Store. Use direction=pull to fetch from Play Store, or direction=push (with confirmed=true) to push local changes.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"direction":{"type":"string","enum":["pull","push"],"description":"Pull from or push to Play Store"},"confirmed":{"type":"boolean","description":"Required for push direction. Set to true to confirm push."}},"required":["projectId","direction"]},"annotations":{"title":"Sync Custom Store Listings","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_csl_screenshot","category":"custom-pages","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Upload Csl Screenshot","description":"Upload a screenshot to a Custom Store Listing localization. The image should already be uploaded to R2.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"listingId":{"type":"string","description":"The custom store listing Firestore document ID"},"locale":{"type":"string","description":"Locale code"},"imageType":{"type":"string","enum":["phone","7inch","10inch"],"description":"Screenshot type"},"imageUrl":{"type":"string","description":"Public URL of the uploaded image"},"imageKey":{"type":"string","description":"R2 storage key"},"fileName":{"type":"string","description":"Original file name"},"fileSize":{"type":"number","description":"File size in bytes"}},"required":["projectId","listingId","locale","imageType","imageUrl","imageKey","fileName","fileSize"]},"annotations":{"title":"Upload Csl Screenshot","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_csl_icon","category":"custom-pages","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Upload Csl Icon","description":"Upload a custom icon for a Custom Store Listing localization (Android only).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"listingId":{"type":"string","description":"The custom store listing Firestore document ID"},"locale":{"type":"string","description":"Locale code"},"imageUrl":{"type":"string","description":"Public URL of the uploaded icon"},"imageKey":{"type":"string","description":"R2 storage key"}},"required":["projectId","listingId","locale","imageUrl","imageKey"]},"annotations":{"title":"Upload Csl Icon","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"upload_csl_feature_graphic","category":"custom-pages","requiredScope":"screenshots","risk":"write","approval":"policy","cost":"none","readOnly":false,"openWorld":false,"untrustedData":false,"destructive":false,"title":"Upload Csl Feature Graphic","description":"Upload a custom feature graphic for a Custom Store Listing localization (Android only).","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"listingId":{"type":"string","description":"The custom store listing Firestore document ID"},"locale":{"type":"string","description":"Locale code"},"imageUrl":{"type":"string","description":"Public URL of the uploaded feature graphic"},"imageKey":{"type":"string","description":"R2 storage key"}},"required":["projectId","listingId","locale","imageUrl","imageKey"]},"annotations":{"title":"Upload Csl Feature Graphic","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"generate_custom_page_content","category":"campaign-content","requiredScope":"write","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Generate Custom Page Content","description":"Generate AI-powered content for a custom product page (iOS promotional text) or custom store listing (Android title, descriptions). Uses AI credits.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"pageId":{"type":"string","description":"The custom page/listing Firestore document ID"},"locale":{"type":"string","description":"Target locale for content generation"},"targetAudience":{"type":"string","description":"Description of the target audience (e.g., \"fitness beginners\", \"power users\")"},"keywords":{"type":"array","items":{"type":"string"},"description":"Keywords to emphasize in the generated content"},"tone":{"type":"string","enum":["professional","casual","urgent","playful","informative"],"description":"Writing tone"}},"required":["projectId","pageId","locale"]},"annotations":{"title":"Generate Custom Page Content","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]},{"name":"translate_custom_page_content","category":"campaign-content","requiredScope":"translate","risk":"draft","approval":"policy","cost":"metered-ai","readOnly":false,"openWorld":true,"untrustedData":false,"destructive":false,"title":"Translate Custom Page Content","description":"Translate custom page/listing content from a source locale to multiple target locales using AI. Uses AI credits.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","description":"The project ID"},"pageId":{"type":"string","description":"The custom page/listing Firestore document ID"},"sourceLocale":{"type":"string","description":"Source locale to translate from"},"targetLocales":{"type":"array","items":{"type":"string"},"description":"Target locales to translate to"},"apply":{"type":"boolean","description":"If true, saves translations directly to Firestore. Default false."}},"required":["projectId","pageId","sourceLocale","targetLocales"]},"annotations":{"title":"Translate Custom Page Content","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["openid","email","offline_access"]}]}]}