{"name":"Pikes AI","version":"1.0.0","description":"AI-powered image generation and editing. Generate product photography, edit images with AI, remix and combine images, expand canvases.","protocol":{"version":"2025-06-18","supported_versions":["2025-06-18","2024-11-05"],"spec":"https://modelcontextprotocol.io/specification/2025-06-18"},"transports":{"streamable_http":{"description":"Primary transport - POST messages to /mcp endpoint","endpoint":"https://pikes.ai/mcp","features":["session_management","sse_streaming"]},"http_sse":{"description":"Deprecated transport for backward compatibility","endpoint":"https://pikes.ai/mcp/sse","message_endpoint":"https://pikes.ai/mcp/message"}},"authentication":{"type":"oauth2.1","discovery":{"authorization_server":"https://pikes.ai/.well-known/oauth-authorization-server","protected_resource":"https://pikes.ai/.well-known/oauth-protected-resource"},"authorization_url":"https://pikes.ai/mcp/oauth/authorize","token_url":"https://pikes.ai/mcp/oauth/token","registration_url":"https://pikes.ai/mcp/oauth/register","revocation_url":"https://pikes.ai/mcp/oauth/revoke","scopes":["generate_image","edit_image","expand_image","read_images"],"pkce_required":true},"capabilities":{"tools":[{"name":"generate_image","description":"Generate a new image from scratch using a text prompt. Use this when the user wants to create a completely new image without any input images."},{"name":"edit_image","description":"Edit or modify existing images based on instructions. Supports single image editing AND multi-image combining (e.g. placing a product into a scene). For single image: pass imageUrl. For combining images: pass imageUrls — first image is the product/main subject, last image is the scene/context, middle images are style references. Provide exactly one of imageUrl or imageUrls. This replaces the old remix_images tool."},{"name":"expand_image","description":"Extend or outpaint an image's canvas to a new aspect ratio or size. The expansion is content-aware but NOT steerable: the underlying model (Ideogram Reframe) fills the new canvas from the source image alone — there is no directional control and no prompt guidance. Use edit_image if the user wants specific new content added around the image."},{"name":"animate_image","description":"Animate a still image into a short video. Picks between several models via the `model` param:\n- veo3_fast (default): Google Veo 3.1 Fast. 4/6/8s. 16:9 or 9:16. Optional audio + end-frame keyframe mode (pass endImageUrl).\n- veo3: Google Veo 3.1 base — higher quality / higher cost than veo3_fast. Same constraints (4/6/8s, 16:9/9:16, optional audio + end-frame).\n- kling: Kling 3.0 Pro image-to-video. 5–10s. Native audio (toggle with generateAudio). Optional end frame (endImageUrl).\n- seedance: Bytedance Seedance v1.5 Pro at 720p with native audio. 3–12s. No end frame.\n- seedance2: Bytedance Seedance 2.0 at 720p. 4–15s. Optional audio + end frame.\n- seedance25: Bytedance Seedance 2.5 (latest, best quality). 4–30s, 480p or 720p (resolution param), optional audio + end frame. Aspect always follows the source image.\n- seedance2_ref: Bytedance Seedance 2.0 Reference-to-Video. Generates from up to 9 reference images (imageUrl + imageUrls), 3 reference videos (videoUrls) and 3 audio clips (audioUrls) — refer to them in the prompt as @Image1/@Video1/@Audio1 etc. 4–15s, resolutions 480p/720p/1080p/4k, wide aspect set. At least one image or video reference required; audio refs require an image or video ref too. No end frame.\n- seedance25_ref: Bytedance Seedance 2.5 Reference-to-Video (latest). Same reference semantics as seedance2_ref (@Image1/@Video1/@Audio1), but 4–30s, resolutions 480p/720p only, wide aspect set. At least one image or video reference required. No end frame.\n- gemini_omni_edit: Google Gemini Omni Flash video EDIT. Pass the source video as videoUrls[0] plus a short instruction prompt (e.g. \"Make this video anime. Keep everything else the same.\"). Preserves the rest of the scene; no voice editing; imageUrl not used.\n\nEnd-frame mode (pass endImageUrl) is supported by veo3_fast / veo3 / kling / seedance2 / seedance25. Frames should share composition/lighting/crop for clean transitions. Set reverse=true to programmatically reverse the generated video post-hoc (ffmpeg) — never prompt the model to render motion backwards."},{"name":"remove_background","description":"Remove the background from a product image, returning a transparent PNG. Use this when the user wants to isolate a product, cut out the background, or get a transparent version of an image."},{"name":"upload_image","description":"Upload an image to get a publicly accessible URL for use with edit_image, expand_image, etc.\n\nTHREE MODES (use ONE):\n1. PRESIGNED (fastest) - Get upload URLs, then upload directly via pikes.ai:\n   { \"mode\": \"presigned\", \"filename\": \"photo.jpg\" }\n   Returns uploadUrl + publicUrl. Upload via: curl -X POST \"<uploadUrl>\" --data-binary @photo.jpg\n\n2. URL - Fetch from remote URL and re-host:\n   { \"sourceUrl\": \"https://example.com/image.jpg\" }\n\n3. BASE64 - Send image data directly (slower but always works):\n   { \"imageData\": \"data:image/jpeg;base64,...\" }\n\nRECOMMENDED: Use presigned mode for local files - it's 10x faster than base64.\n\nTROUBLESHOOTING: If presigned upload fails with \"domain blocked\" or \"403\", add pikes.ai to allowed domains:\nSettings → Capabilities → Code execution and file creation → Additional allowed domains → add \"pikes.ai\""},{"name":"get_all_context","description":"Retrieve all context files (brand knowledge, guidelines, campaign rules, etc.) with full content. Use when the injected context was truncated or you need inactive files. Context files are the user's persistent brand knowledge base."},{"name":"update_context","description":"Update or create a context file. Context files store persistent brand knowledge (voice, memory, colors, campaign rules, audience info, etc.). If a file with this name exists, its content is replaced. If not, a new file is created. When updating, rewrite the full content with your changes incorporated."},{"name":"get_account_info","description":"Get the user's account information including credits remaining, subscription plan, and usage. Use when the user asks about their account, credits, or usage."},{"name":"get_product_images","description":"Search the user's saved product library and return image URLs. Call this tool IMMEDIATELY — without asking the user first — whenever they mention a product by name or reference (e.g. \"the t-shirt\", \"my sneakers\", \"the coffee bag\", \"possible t shirt\", \"that product\"). Do NOT ask the user to upload an image or confirm — just call this tool. The returned URLs can be passed directly to edit_image."},{"name":"fetch_products_from_website","description":"Fetch product images directly from a brand's website. Use this when the user gives a website URL or domain, or asks to grab/import/pull products FROM a site (e.g. \"grab the products from acme.com\"). Do NOT use it for products already in the user's library — use get_product_images for those; if get_product_images finds nothing and the user has mentioned their website, call this. Works only on Shopify-powered stores (most DTC brands are); non-Shopify sites return a no-products error. By default it also saves the found products into the user's product library; set save_to_library to false only if the user explicitly wants a look without importing. Returns product titles and image URLs you can pass straight to edit_image."},{"name":"find_ads","description":"Search Foreplay's ad library for real ads from any brand/competitor — for INSPIRATION and competitive research, NOT as generation inputs. Signature use: find a competitor's (or a niche's) ads that have run a LONG time, which signals the creative is likely working (\"winning ads\") — set sort:\"longest_running\", live:true, minRunningDays (30=working, 60/90=proven). Also browse by keyword/theme, niche, format, or platform. Returns ad image stills + metadata (brand, days running, headline, CTA). Analyze their composition, then create with the user's OWN product — do NOT pass the returned ad URLs into edit_image as the product."},{"name":"list_boards","description":"List the user's image boards. Use this BEFORE add_images_to_board or update_board to find an existing board's id, or to confirm a board with that name doesn't already exist before calling create_board. Includes personal boards and any team boards the user has access to. Returns: id, name, description, is_public, team_ids, image_count."},{"name":"get_board_images","description":"Read the images on a board and return their downloadable URLs + metadata. Identify the board by boardId (preferred — use list_boards to find it) or by name (returns the most recently updated board you can access with that name). Returns each image's url, videoUrl (for videos), width/height/aspectRatio, assetId, name (display name), model, source, origin, prompt, assetType, and position, plus the board's namingTemplate. `origin` is \"upload\" (the user put it on the board) or \"generated\" (Pikes made it) — boards mix both, since generated results are saved back onto the board holding the references. When sourcing a product shot or style reference to feed into edit_image / submit_image_job, filter to origin \"upload\": reusing a generated image as a source compounds its distortions. `prompt` is the generation prompt that created the image (empty for uploads) — to recreate a similar shot, start from that prompt and adapt it."},{"name":"create_board","description":"Create a new image board. Returns the board id — pass it to add_images_to_board next. Visibility defaults to \"private\"; pass \"team\" + teamIds to share with one or more teams, or \"public\" to make the board world-readable. Public boards return share_url (https://pikes.ai/b/<id>) — when sharing a link, use that exact URL; never construct board URLs yourself."},{"name":"update_board","description":"Edit an existing board's name, description, or visibility. Only the board owner can update. To change visibility, pass the new \"visibility\" value (and teamIds when switching to \"team\"). Pass null for fields to leave unchanged. Boards cannot be deleted via MCP. Public boards return share_url (https://pikes.ai/b/<id>) — when sharing a link, use that exact URL; never construct board URLs yourself."},{"name":"add_images_to_board","description":"Add one or more images to a board. Pass assetId(s) from generate_image / edit_image / expand_image (\"id\" field), OR image URL(s) via publicUrl/publicUrls — Pikes URLs are linked directly, and EXTERNAL http(s) image URLs (e.g. find_ads ad stills, web images) are automatically fetched and re-hosted as the user's assets. Do not run a dummy edit_image just to get an id. The user must be the board owner or a team member with write access."},{"name":"batch_rename_assets","description":"Rename assets on a board (sets each asset's display name — storage URLs never change). Flow: get_board_images first (returns name/model/source/prompt per image), derive a short concept name per image from its prompt/content, then ALWAYS show the user the proposed old → new rename table and wait for confirmation BEFORE calling this tool. Names: lowercase, hyphens inside, underscores between fields, no spaces. This renames the global asset name (visible everywhere); for per-download filename conventions set the board's namingTemplate via update_board instead."},{"name":"list_teams","description":"List the teams the user is a member of. Use this when the user asks to share a board with a team — you need the team id to pass to create_board / update_board with visibility=\"team\"."},{"name":"submit_image_job","description":"Start an image/video generation ASYNCHRONOUSLY and return a jobId immediately (does NOT wait for the render). Use this instead of generate_image/edit_image when you want to avoid long waits/timeouts on 4K or video, run several jobs in parallel, or build a pipeline. After submitting, poll get_image_job with the returned jobId until status is \"completed\", then use the result URLs (e.g. feed one into another submit_image_job with tool=\"edit_image\"). For tool=\"animate_image\", pick the video model via videoModel (NOT model) and use duration/resolution/endImageUrl/generateAudio/videoUrls/audioUrls as with the sync animate_image tool. Credits are charged once, when the job runs."},{"name":"get_image_job","description":"Retrieve a job submitted with submit_image_job. Returns status (\"processing\" | \"completed\" | \"failed\" | \"timed_out\"), progress, and — when completed — the result images/videos with downloadable URLs. Poll until status is \"completed\" (or \"failed\"/\"timed_out\"). On \"completed\", results[] contains { assetId, url, width, height, aspectRatio, assetType }."},{"name":"meta_get_ad_accounts","description":"List all Meta ad accounts the user has access to. Returns account ID, name, currency, and status. Call this first to get the accountId needed for other Meta tools."},{"name":"meta_get_campaigns","description":"List campaigns for an ad account. Returns campaign ID, name, objective, status, budget, and date range.\n\n**Use this to:**\n- See all campaigns and their objectives (CONVERSIONS, TRAFFIC, AWARENESS, etc.)\n- Understand budget allocation across campaigns\n- Get campaignId to filter ads by campaign in meta_get_ads\n- See which campaigns are active vs paused"},{"name":"meta_get_ads","description":"Get ads with creative assets, performance metrics, conversions, and ROAS in a single call.\n\n**Pagination**: one call returns at most `limit` (≤50) ads. For counts or exhaustive pulls, keep calling with `after` = the previous response's `pagination.nextCursor` until `pagination.hasMore` is false — never report a total from a single page.\n\n**Returns per ad:**\n- Creative: image_url, video_url, headline, body, call_to_action\n- Metrics: spend, impressions, clicks, CTR, CPC, CPM\n- Conversions: count, purchase_value, ROAS, CPA\n- Metadata: ad_id, ad_name, campaign_id, status\n\n**Supports:**\n- Custom date ranges (startDate/endDate) or presets (last_7d, last_30d, etc.)\n- Filter by campaign, status, ad type\n- Sort by spend, conversions, ROAS, CPA, CTR, etc.\n- Pagination via cursor for scanning full ad library"},{"name":"meta_get_ad_creative","description":"Get just the creative assets for a specific ad by ID. Use this when you already know the ad_id and only need the creative (not metrics).\n\n**Returns:**\n- image_url or video_url\n- headline\n- body/description\n- call_to_action\n\n**When to use:**\n- User says \"get me the creative for ad XYZ\"\n- You need to refresh creative data for a specific ad\n- You want creative-only data without metrics\n\n**Note:** In most cases, use meta_get_ads instead as it returns creatives + metrics together."},{"name":"meta_get_ad_insights","description":"Get detailed performance insights with conversions, ROAS, and breakdowns.\n\n**Two modes:**\n1. **Single ad**: Pass adId — returns detailed metrics for one ad\n2. **Batch mode**: Pass adIds[] + accountId — returns metrics for up to 50 ads in ONE API call\n\n**Returns per ad:**\n- Metrics: spend, impressions, clicks, CTR, CPC, CPM, reach\n- Conversions: total count + breakdown (purchase, add_to_cart, view_content, initiate_checkout)\n- Revenue: purchase_value, ROAS, CPA\n- Optional breakdowns: age, gender, placement, device, country\n- Optional time series: daily/weekly trends via timeIncrement\n\n**Use batch mode when you need metrics for multiple ads** — much faster than calling one at a time."},{"name":"meta_get_audience_breakdowns","description":"Get available audience and delivery segment rows for specific ads.\n\nThis is a primitive data tool. The agent should compose it with meta_get_ads:\n- For \"older women\", fetch ads first, then call this with adIds, then filter gender=female and age=45-54/55-64/65+.\n- For \"who is this ad working for\", call this for that ad ID and summarize best age/gender, country/region, placement, and device.\n- For \"which ads work in this demo\", call this for many ad IDs and rank the matching segment rows.\n\nReturns per-ad segment data where Meta allows it. Meta may suppress small segments for privacy."},{"name":"meta_get_ad_comments","description":"Read user comments on a Meta ad — Facebook AND Instagram. Resolves the ad to its underlying post automatically (works on dark/unpublished posts too), so pass an adId from meta_get_ads, NOT a post id.\n\n**Returns per comment:** text, created time, like count, replies, platform (facebook/instagram), source (\"ad\"), and the parent adId/adName + pageId.\n\n**Use for:** voice-of-customer, objection mining, sentiment, creative feedback. Note: Meta anonymizes public commenters, so author names are usually unavailable — the comment text is the signal."},{"name":"meta_get_page_comments","description":"Read user comments on a Facebook Page's ORGANIC posts (posts that were never run as ads). Use alongside meta_get_ad_comments for full voice-of-customer coverage. Pass a pageId (e.g. the pageId returned by meta_get_ad_comments, or the part before the underscore in an effective_object_story_id). Returns comments tagged source:\"organic\". Requires that the user administers the page."}],"prompts":[{"name":"product_photography","description":"Generate professional product photography with customizable style and setting"},{"name":"social_media_ad","description":"Create eye-catching social media advertising imagery"},{"name":"brand_lifestyle","description":"Create aspirational lifestyle imagery that represents a brand"},{"name":"product_on_model","description":"Place a product on a model or in a lifestyle context"}],"resources":["pikes://images/recent","pikes://images/{id}","pikes://brand-profiles/active","pikes://brand-profiles/list","pikes://brand-profiles/{id}"]},"mcp_config":{"mcpServers":{"pikes-ai":{"url":"https://pikes.ai/mcp","transport":"streamable-http"}}},"mcp_config_legacy":{"mcpServers":{"pikes-ai":{"url":"https://pikes.ai/mcp/sse","transport":"sse"}}},"documentation":"https://pikes.ai/docs/mcp"}