Bloom
The brand layer for agents
- Category
- Content & Design
- Primary Subcategory
- AI Image & Logo Generation
Integration details
Description
Bloom turns your brand into a working system that powers everything you create.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- AI Image & Logo Generation
- Secondary Subcategories
- None listed
- Brand
- Bloom
- Access
- Account required
- First tracked
- 2026-09-02
- Tool count
- 23
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT AI Image & Logo Generation
View Category23 tools agents can invoke
Show which Bloom account this session is connected to. Returns the email and name of the authenticated user behind the session's API key or login. Use it to confirm whose account is active. Args: (none) Returns: { "email": string, "name": string | null }
bloom_get_account
Check the remaining credit balance for a workspace. Credits are the unit for all image operations in Bloom. Each generation, edit, or resize consumes credits: - Standard resolution (2K): 1 credit per image - High resolution (4K): 2 credits per image Variants (multiple images from one prompt) cost per image (e.g. 3 variants at 2K = 3 credits). Args: - workspace_id (string, optional): Workspace ID. Omit to default to the caller's personal workspace. Returns: { "balance": number, "unlimited": boolean, "subscription_paused"?: true } subscription_paused is present (true) when the workspace's plan is past_due — the last payment failed, so plan credits are on hold until payment is completed (the text includes the link). Top-up credits remain spendable.
bloom_check_credits
Upload one or more local image files for use as a reference or edit subject in bloom_generate_image / bloom_edit_image. Use this for any image being attached to a brand that isn't the logo itself: reference images, edit subjects, AI-generated outputs the user wants to keep, screenshots, mood-board inputs. A user request like "upload this image to brand X" or "attach this image to brand X" fits here unless they explicitly call it a logo. Does NOT change the brand's logo. Logo replacement is a separate operation — only use bloom_create_logo_upload_url when the user explicitly says the image is the logo (e.g. "use this as the logo", "replace the logo for brand X"). If unclear, ask the user before calling either tool. Two surfaces exist for getting local file bytes into a brand session; pick by what the client can do: - bloom_open_upload_ui renders a multi-file picker inline. Use it when the client is an MCP App-capable host. - bloom_create_image_upload_url (this tool) returns one or more signed URLs the client POSTs bytes to itself. Use it when the client has filesystem + HTTP access but cannot render UI. bloom_upload_image is for publicly hosted URLs. Mints short-lived signed URLs that accept raw image bytes with no Authorization header — the token in the URL is the credential. Tokens are single-use and expire in 10 minutes. Args: - brand_session_id (string): Brand session UUID (from bloom_list_brands) - count (number, optional): How many URLs to mint (1-10, default 1) Returns: { "upload_urls": string[], "expires_at": string } Workflow: 1. Call this tool with brand_session_id and the number of files to upload (1-10). 2. For each returned upload_url, POST the file bytes: curl -X POST "$upload_url" -F "file=@./photo.png;type=image/png" The token in the URL is the credential — do not send Authorization. 3. Each URL is single-use (one upload attempt — a failed attempt also burns the token) and expires in 10 minutes. 4. The HTTP response body is: { "data": { "id": string, "imageUrl": string, "width": number, "height": number, "mimeType": string, "existing": boolean } } 5. Use the returned "id" as a reference_image_ids entry in bloom_generate_image / bloom_edit_image, or as image_id in bloom_edit_image. Supported formats: PNG, JPEG, WebP, AVIF Max file size: 10MB per upload
bloom_create_image_upload_url
Replace a brand's primary logo file. The new logo is validated and triggers a fresh visual DNA extraction (the brand re-enters "analyzing" status). Use this when the user explicitly indicates the image is meant to be the brand's logo. Trigger phrases: - "use this as the logo" - "set/update/replace the logo for brand X" - "this is the brand's logo" - "logo for brand X" A bare "upload this image to brand X" is not a trigger for this tool — that's a reference-image upload, use bloom_create_image_upload_url. If the user's intent is ambiguous (e.g. they say "image" or "this" without saying "logo"), ask them whether the image is meant to be the brand's logo before calling either tool — don't guess. Mints a short-lived signed URL that accepts raw logo bytes with no Authorization header. Use this when you need to upload a local logo file (PNG, SVG, etc.) but cannot access a Bloom API key directly (common when the key lives in an MCP client's config rather than your shell environment) — bloom_update_brand_logo with logo_url requires a publicly hosted URL. Two surfaces exist for getting local logo bytes onto a brand; pick by what the client can do: - bloom_open_logo_upload_ui renders a file picker inline. Use it when the client is an MCP App-capable host. - bloom_create_logo_upload_url (this tool) returns a signed URL the client PUTs bytes to itself. Use it when the client has filesystem + HTTP access but cannot render UI. Args: - brand_session_id (string): Brand session UUID (from bloom_list_brands or bloom_onboard_brand) Returns: { "upload_url": string, "expires_at": string } Workflow: 1. Call this tool with the brand_session_id whose logo you want to replace. 2. PUT the file bytes to the returned upload_url: curl -X PUT "$upload_url" -F "file=@./logo.png;type=image/png" The token in the URL is the credential — do not send Authorization. 3. The URL is single-use (one upload attempt — a failed attempt also burns the token) and expires in 10 minutes. 4. The HTTP response body is: { "data": { "id": string, "status": "analyzing" } } 5. Call bloom_get_brand with wait=true to wait for the brand to reach "ready". Supported formats: PNG, JPEG, WEBP, SVG, AVIF Max file size: 10MB
bloom_create_logo_upload_url
Delete a brand from the caller's account. Only call this when the user has explicitly asked to delete the brand. Don't infer it from a vague cleanup request — confirm which brand they mean first (use bloom_list_brands to disambiguate by name). Args: - id (string): Brand session UUID (from bloom_list_brands) Returns: { "id": string, "name": string, "workspace_id": string | null, "workspace_name": string }
bloom_delete_brand
Delete one or more images from the user's library. The images are removed from the user's library and stop appearing in list/search/get results. Re-deleting an already-deleted image is a no-op. Only call this when the user has explicitly asked to delete specific images. For bulk cleanup ("remove the old ones"), first list the candidates with bloom_list_images and confirm the exact set with the user, then call this with those ids. deleted_count may be lower than the number of ids passed — ids that aren't the user's, or were already deleted, are skipped rather than erroring. Args: - image_ids (string[]): IDs of images to delete (1-50). From bloom_list_images, bloom_generate_image, or bloom_get_image. Returns: { "deleted_count": number }
bloom_delete_images
Edit a previously generated or uploaded image using Bloom AI. Submits an edit request and returns immediately with a new image ID. The edit typically takes 60-90 seconds. After calling this tool, use bloom_get_image to check the status and retrieve the result when ready. The aspect ratio is locked to the original image's ratio. Args: - image_id (string): ID of a completed generated image or an uploaded image to edit - prompt (string): What to change (1-2000 chars) - brand_session_id (string): Brand session UUID (from bloom_list_brands) - image_size (string, optional): "2K" (default, 1 credit) or "4K" (2 credits) - model (string, optional): "fast" (cheaper/faster), "standard" (mid tier), or "pro" (default, highest quality) - reference_image_ids (string[], optional): IDs of uploaded/generated images for additional context (max 9). To get an ID for a new image, use bloom_upload_image. Returns: { "image_id": string, "status": "pending" } Workflow: 1. Generate an image with bloom_generate_image, or upload one with bloom_upload_image 2. Call this tool with the image's ID and a prompt describing the change 3. Call bloom_get_image with the returned image_id to poll for results 4. When status is "completed", the edited image_url will be available Prompt guidance: - Describe the change directly: "make the background blue", "remove the text", "add a person on the left side" - Bloom preserves everything not mentioned — only describe what should change - For creating new images (not editing), use bloom_generate_image instead
bloom_edit_image
Semantic search over Bloom's curated library of real, high-performing brand ads. A good fit when the user wants an ad and looking at some concrete examples would help. Let the user pick the one(s) they want — or pick yourself if they've given you autonomy — then recreate the chosen one(s) with bloom_generate_image. Decide what kind of ad fits the user's goal — the angle, layout, hook — and search for that concept. Plain noun phrases describing what the ad looks like work best: "minimalist product on solid color," "before/after split," "bold type over lifestyle photo." Omit the query entirely to get ads that fit the brand's overall style instead — useful when the user has no specific concept yet. By default the search spans all industries; pass `verticals: "brand"` to scope to the brand's own industry, or a list of industries to target those. (The brand's styling is applied later at recreation, so a query search doesn't need to match the brand's look.) Return a small, relevant shortlist (not the whole catalog) and let the user pick the one(s) that fit — then recreate each. If they want something different, refine the concept and search again rather than asking for more results. Args: - brand_session_id (string, optional): Brand session UUID (from bloom_list_brands). Required only when query is omitted or verticals is "brand"; a plain query search is global and needs no brand. - query (string, optional): The ad concept to search for (a visual/format phrase). Omit to get ads that fit the brand's overall style instead. - verticals (string[] | "brand", optional): Industries to search. Omit to search all industries; pass "brand" to scope to the brand's own industry; or pass specific industry names to target those. - top_k (number, optional): Max ads to return (1-24, default 12) - cursor (string, optional): To show the user MORE of the same results, pass the next_cursor from the previous call along with the SAME query and verticals. For different results, change the query instead. - mode ("display" | "select", optional): Default "select" — the user picks. "display" is reserved for a future phase where the agent picks. Returns: { "mode": "display" | "select", "query": string, "ads": [ { "id": string, "image_url": string, "brand_name": string, "description": string } ], "next_cursor": string | null, "has_more": boolean } Each ad carries a description which you can use to tell the ads apart and help choose ads yourself (when operating with autonomy) or help the user choose. Empty array means nothing relevant was found — try a different concept or vertical. When has_more is true and the user wants more like these, call again with next_cursor (same query and verticals). To recreate a chosen ad, call bloom_generate_image with recreate_ad_id set to that ad's id (one call per ad when several are picked).
bloom_find_reference_ads
Generate on-brand images using Bloom AI. Submits a generation request and returns immediately with image ID(s). Each image typically takes 60-90 seconds to generate. After calling this tool, use bloom_get_image to check the status and retrieve the result when ready. Args: - prompt (string): Description of the image to generate (1-2000 chars). Optional only when recreate_ad_id is set. - brand_session_id (string): Brand session UUID (get from bloom_list_brands) - aspect_ratio (string, optional): One of "1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9" - image_size (string, optional): "2K" (default, 1 credit) or "4K" (2 credits) - model (string, optional): "fast" (cheaper/faster), "standard" (mid tier), or "pro" (default, highest quality) - variant_count (number, optional): Generate 1-5 variants from the same prompt (default 1). Each variant costs the same credits. - reference_image_ids (string[], optional): IDs of uploaded/generated images to use as style/content references (max 10). To get an ID for a new image, use bloom_upload_image. You may use bloom_search_user_images tool to recommend users relevant reference images for their generation. - recreate_ad_id (string, optional): ID of a reference ad (from bloom_find_reference_ads) to recreate for this brand. See "Recreating an ad" below. Returns: { "image_ids": [string, ...], "variant_group_id": string | null, "status": "pending" } Workflow: 1. Call bloom_list_brands to get available brand session IDs 2. Consider calling bloom_search_user_images with which you will get existing images from the brand's library, which when passed as references, measurably improve the image outputs. Skip this step if the user has added reference images for this generation and adding more would not help. 3. (Optional) Upload reference images with bloom_upload_image 4. Call this tool with a prompt and brand_session_id (+ optional reference_image_ids) 5. Call bloom_get_image with each returned image_id to poll for results 6. When status is "completed", the image_url will be available Variant workflow: 1. Call this tool with variant_count (2-5) to generate multiple variations 2. Each variant uses the same prompt but produces a different result 3. All variants share a variant_group_id for grouping 4. Poll each image_id separately with bloom_get_image 5. Credits: variant_count × per-image cost (e.g., 3 variants of 2K = 3 credits) Reference image guidance: Reference images help ground image outputs in the brand's world. For a single image, passing all the chosen references is usually fine. For multiple distinct images in one brief (different concepts, settings, or subjects), each generation has its own focus — pass only the references that belong to that specific image. Always mention clearly in the prompt how you want each reference image to be used, so the image generation model uses them correctly. Refer to references by content (e.g. "the image with the cat"), not by positional labels like "image 1" or "the first image" — input ordering isn't a stable contract. Prompt guidance: - Bloom automatically applies brand styling, visual tone, and professional polish from the brand identity. Your prompt should describe WHAT to create (subject, composition, medium/format), not HOW it should look aesthetically. - Do NOT include style/quality filler like "professional", "high-quality", "stunning", "sleek", "premium", "clean" — Bloom handles this automatically. - Specify the medium if it matters: photograph, illustration, 3D render, mockup, poster, etc. - Good: "Product shot of a coffee bag on a marble countertop, soft morning light" - Good: "Grid of 4 phone screens showing different short-form video content" - Bad: "A stunning, professional, high-quality, sleek modern image of coffee" Recreating an ad: Pass recreate_ad_id (from bloom_find_reference_ads) to adapt that ad's layout and composition to the user's brand. prompt is optional here — use it only for extra instructions ("swap in our product", "make it warmer"). Aspect ratio is inherited from the ad, so aspect_ratio is ignored. Any reference_image_ids are added as extra references alongside the ad. To edit an existing image, use bloom_edit_image instead.
bloom_generate_image
Get the status and details of a brand. Looks up the brand across every workspace the caller can access. Call after bloom_onboard_brand to check if onboarding is complete. Brand analysis typically takes 30-60 seconds. Recommended: use wait=true to let the server hold the connection until the brand is ready, instead of polling in a loop. Args: - id (string): The brand ID returned by bloom_onboard_brand - wait (boolean, optional): Hold connection until terminal status. Recommended: true. - timeout (number, optional): Max seconds to wait (1-295, default 120) Returns: { "id": string, "brand_url": string, "status": "analyzing" | "ready" | "logo_required" | "failed", "failure": { "code": string, "message": string } | null, "name": string, "url": string, "logo_url": string | null, "logo_error": string | null, "colors": string[], "fonts": string[], "aesthetic": string | null, "summary": string | null, "workspace_id": string | null, "workspace_name": string, "created_at": string }
bloom_get_brand
Get details of any image — generated, uploaded, or scraped. Looks up the image across every workspace the caller can access. Works with IDs from bloom_generate_image, bloom_upload_image, or bloom_list_images. For generated images, use wait=true to hold the connection until generation completes. Args: - image_id (string): Image ID (any source) - wait (boolean, optional): Hold connection until terminal status. Only applies to generated images. Recommended: true. - timeout (number, optional): Max seconds to wait (1-300, default 120) - include_url (boolean, optional): Ignored — the URL is always included in the response because this tool has an attached UI widget that requires it. Kept for backward compatibility. Returns: { "id": string, "source": "generated" | "uploaded" | "scraped", "status": "pending" | "generating" | "completed" | "failed" | null, // null for uploads/scraped "failure_reason": "content_safety" | "rate_limited" | null, // why a failed generation failed "prompt": string | null, "description": string | null, "image_url": string | null, "aspect_ratio": string | null, "width": number | null, "height": number | null, "action_type": string | null, "workspace_id": string | null, "workspace_name": string, "created_at": string }
bloom_get_image
List brand sessions across every workspace the caller can access, with pagination. Returns brand IDs needed for image generation. Each brand represents a website or Instagram profile that has been onboarded to Bloom with its visual identity extracted. Args: - workspace_id (string, optional): Scope results to one workspace by id (from bloom_list_workspaces). Omit to span every workspace the caller can see; each result is labeled with its workspace. - url (string, optional): Filter brands by website URL (partial match, e.g. "gumroad.com") - limit (number, optional): Results per page (1-100, default 50) - cursor (string, optional): Pagination cursor from previous response Returns: { "brands": [ { "id": string, "brand_url": string, "name": string, "url": string, "status": string, "image_count": number, "workspace_id": string | null, "workspace_name": string, "created_at": string } ], "next_cursor": string | null, "has_more": boolean } Use the returned "id" as the brand_session_id parameter in bloom_generate_image.
bloom_list_brands
List images — generated, uploaded, and scraped — across every workspace the caller can access, with pagination and optional filters. Also the single-call way to fetch a specific set of images (pass `image_ids`), which is preferred over calling bloom_get_image per image. Returns images sorted newest-first with cursor-based pagination. Includes scraped website images from brand onboarding — use these as reference images for generation. **Batch collect pattern**: after firing N parallel bloom_generate_image calls, collect the results in one shot via `bloom_list_images({ image_ids: [...] })`. `wait` defaults to true whenever `image_ids` is provided, so the call holds open until every referenced image reaches a terminal status — no per-image polling, no stuck loading tiles in the gallery widget. Pass `wait: false` only if you want to peek at in-flight statuses. Args: - image_ids (string[], optional): Fetch multiple specific images in one call (e.g., to display a gallery of newly-generated results). Max 50 IDs. - workspace_id (string, optional): Scope results to one workspace by id (from bloom_list_workspaces). Omit to span every workspace the caller can see; each result is labeled with its workspace. - brand_session_id (string, optional): Brand session UUID (from bloom_list_brands). Omit to list across all brands. - source (string, optional): Filter by source — "generated", "uploaded", "scraped" - limit (number, optional): Results per page (1-100, default 50) - status (string, optional): Filter by generation status — "pending", "generating", "completed", "failed". Only applies to generated images; uploaded/scraped are excluded when this filter is active. - action_type (string, optional): Filter by type — "generation", "edit", "resize", "variant", "recreate", "remove-background", "vectorize". Only applies to generated images. - include_urls (boolean, optional): Ignored — image URLs are always included because this tool has an attached UI widget that requires them. Kept for backward compatibility. - wait (boolean, optional): Hold the connection until every image referenced by `image_ids` reaches a terminal status. Defaults to true when `image_ids` is provided, false otherwise. No-op when `image_ids` is omitted. - timeout (number, optional): Max seconds to wait (1-295, default 120). Only meaningful when `wait` is on. - cursor (string, optional): Pagination cursor from previous response Returns: { "images": [ { "id": string, "source": "generated" | "uploaded" | "scraped", "brand_session_id": string | undefined, "prompt": string | null, // null for uploads/scraped "description": string | null, "aspect_ratio": string | null, "width": number | null, "height": number | null, "action_type": string | null, // null for uploads/scraped "status": string | null, // null for uploads/scraped "failure_reason": "content_safety" | "rate_limited" | null, "image_url"?: string, "workspace_id": string | null, "workspace_name": string, "created_at": string } ], "next_cursor": string | null, "has_more": boolean, "brand_name": string | undefined // present only when scoped to a single brand } Every returned image has an id. For generated images: - completed: image_url is present. - failed: image_url is absent; inspect failure_reason. - pending or generating: image_url is absent because processing has not finished. These states can still appear when wait is false or the wait times out. Use next_cursor in a follow-up call to get the next page.
bloom_list_images
List workspaces the caller can access. The personal workspace (is_personal: true) is listed first and is the caller's default: create tools with an optional workspace_id (bloom_onboard_brand, bloom_check_credits) act on it when workspace_id is omitted. Pass a workspace_id from this list to target a specific workspace; each tool's own docs describe how it scopes. Args: (none) Returns: { "workspaces": [ { "workspace_id": string | null, "workspace_name": string, "is_personal": boolean } ] } The caller's personal workspace (auto-created at signup) is listed first and tagged "is_personal": true.
bloom_list_workspaces
Onboard a new brand by analyzing a website or Instagram URL. Queues website or Instagram analysis and returns immediately with the brand ID. Bloom then pulls in the logo, fonts, screenshot/collage, and business summary before starting visual DNA extraction. After calling this tool, use bloom_get_brand to check status and wait for completion. Defaults to the caller's personal workspace; pass `workspace_id` to onboard into a team workspace. Recommended when the caller belongs to multiple workspaces — naming the target explicitly avoids onboarding into the wrong account. Args: - url (string): Website or Instagram profile URL to analyze (e.g., "https://stripe.com" or "https://instagram.com/nike") - workspace_id (string, optional): Workspace ID. Omit to default to the caller's personal workspace. - logo_url (string, optional): Explicit logo URL. If provided, skips automatic logo extraction from the website or Instagram profile. - collect_images (boolean, optional): Whether to collect background images from the website or Instagram profile into the brand's image library. Defaults to true. Setting false does not skip source analysis, crawling, or visual DNA. Returns: { "id": string, "brand_url": string, "status": "analyzing" } Logo problems are discovered asynchronously. bloom_get_brand returns "logo_required" when a replacement logo is needed. Examples: - "Create images for my company at stripe.com" → call with url="https://stripe.com" - "Onboard my Instagram brand" → call with url="https://instagram.com/nike" - "Onboard this brand with our logo" → call with url and logo_url - "Onboard this for the Acme team" → call with url and workspace_id of the Acme workspace - Don't use if the brand already exists — call bloom_list_brands to check first Workflow: 1. Call this tool with a website or Instagram URL 2. Call bloom_get_brand with wait=true to wait for completion (~60s) 3. Once status is "ready", use the brand ID with bloom_generate_image
bloom_onboard_brand
Open an inline file picker so the user can upload one or more local images to a brand session in a single batch. The user picks files in the widget and the bytes are uploaded directly to Bloom — they never enter the conversation. The resulting image ids and metadata are written to the widget's model context, exposed via the host's "read widget context" tool; read that before referencing the uploads in subsequent tool calls. Two surfaces exist for getting local file bytes into a brand session; pick by what the client can do: - bloom_open_upload_ui (this tool) renders a multi-file picker inline. Use it when the client is an MCP App-capable host. If the client doesn't render UI, this tool returns a fallback message pointing at the shell path. - bloom_create_image_upload_url returns one or more signed URLs the client POSTs bytes to itself. Use it when the client has filesystem + HTTP access but cannot render UI. Does NOT change the brand's logo. Logo replacement goes through bloom_open_logo_upload_ui (UI hosts) or bloom_create_logo_upload_url (shell hosts); only use those when the user explicitly says the image is the logo. If unclear, ask the user before calling either tool. Args: - brand_session_id (string): Brand session UUID (from bloom_list_brands) Returns: { "brandSessionId": string } Supported formats: PNG, JPEG, WebP, AVIF Max file size: 10MB
bloom_open_upload_ui
Open an inline file picker so the user can upload a local file as a brand's primary logo. The user picks a file in the widget and the bytes are uploaded directly to Bloom — they never enter the conversation. After upload, the brand re-enters "analyzing" status while a fresh visual DNA extraction runs. The result is written to the widget's model context, exposed via the host's "read widget context" tool; read that before referencing the upload in subsequent tool calls. Two surfaces exist for getting local logo bytes onto a brand; pick by what the client can do: - bloom_open_logo_upload_ui (this tool) renders a file picker inline. Use it when the client is an MCP App-capable host. If the client doesn't render UI, this tool returns a fallback message pointing at the shell path. - bloom_create_logo_upload_url returns a signed URL the client PUTs bytes to itself. Use it when the client has filesystem + HTTP access but cannot render UI. Use this when the user explicitly indicates the image is meant to be the brand's logo. A bare "upload this image to brand X" is not a trigger — that's a reference-image upload, use bloom_open_upload_ui. If the user's intent is ambiguous, ask them whether the image is meant to be the brand's logo before calling either tool. Args: - brand_session_id (string): Brand session UUID (from bloom_list_brands) Returns: { "brandSessionId": string } Supported formats: PNG, JPEG, WebP, SVG, AVIF Max file size: 10MB
bloom_open_logo_upload_ui
Remove the background from an image, returning a transparent PNG. Works on completed generated images and on uploaded/scraped images (from bloom_upload_image, bloom_search_user_images, or bloom_list_images). Returns immediately with a new image ID. The cutout typically completes in under 10 seconds. After calling this tool, use bloom_get_image to check status and retrieve the resulting transparent PNG when ready. Args: - image_id (string): ID of a completed or uploaded image to process - brand_session_id (string): Brand session UUID the image belongs to Returns: { "image_id": string, "status": "pending" } Workflow: 1. Generate or pick an existing completed image 2. Call this tool with the image's ID 3. Call bloom_get_image with the returned image_id to poll for results 4. When status is "completed", the transparent PNG is at image_url
bloom_remove_background
Resize (reflow) an existing image to a different aspect ratio using AI. Submits a resize request and returns immediately with a new image ID. The resize typically takes 30-60 seconds. After calling this tool, use bloom_get_image to check the status and retrieve the result when ready. The source image's resolution (2K/4K) is preserved in the output. The source aspect ratio is read automatically from the image metadata. Args: - image_id (string): ID of a completed image to resize - target_aspect_ratio (string): One of "1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9" - brand_session_id (string): Brand session UUID the image belongs to Returns: { "image_id": string, "status": "pending" } Workflow: 1. Generate an image first using bloom_generate_image 2. Call this tool with the completed image's ID and a new aspect ratio 3. Call bloom_get_image with the returned image_id to poll for results 4. When status is "completed", the resized image_url will be available
bloom_resize_image
Semantic search over a brand's image library — the brand's actual photos (products, design assets, user uploads, images obtained from the onboarding source, etc...). Using these as references measurably improves generation outputs. Search for what would actually appear in the picture, not the format word. For "a billboard for our drone company", search for "drone product shot" or "drone in flight," not just "billboard" — pick what kind of imagery would go on it. Call this multiple times with different concepts to gather a varied set of references for one brief. This tool has two modes — pick deliberately: - "select" (default): you are asking the user to pick references. After calling, on your next turn read the widget's model context to see what the user picked, then generate. - "display": you fetched these to use as references yourself, with no need for user input. Pick the matches that fit, then pass their ids as reference image id(s) to the respective image generation tool calls. Use only when it's clear the user does not need to weigh in. Args: - brand_session_id (string): Brand session UUID (from bloom_list_brands) - query (string): Visual concept to search for. Plain noun phrases work best — e.g., "drone in flight," "team working at desks," "product on white background." - top_k (number, optional): Max results to return (1-20, default 10). - mode ("display" | "select", optional): See modes above. Default "select". Returns: { "mode": "display" | "select", "query": string, "candidates": [ { "id": string, "url": string, "description": string, "width": number, "height": number, "aspect_ratio": string | null } ] } Returns at most top_k candidates whose embeddings sit within the relevance threshold; weak matches are dropped. Empty array means nothing in the library fits — generate without references in that case.
bloom_search_user_images
Update the logo for an existing brand session. Use this when bloom_get_brand returns status "logo_required" — the logo couldn't be extracted from the website or Instagram profile. After updating, the logo is validated and visual DNA extraction starts automatically. Call bloom_get_brand with wait=true to wait for the brand to reach "ready" status. This tool accepts a publicly hosted logo URL. For local logo files (PNG, SVG, etc. on the user's machine), do NOT load the bytes into this conversation — use one of the HTTP paths below. Args: - id (string): The brand ID from bloom_onboard_brand - logo_url (string): Direct URL to the logo image (PNG, JPG, SVG, WEBP) Returns: { "id": string, "brand_url": string, "status": "analyzing" } For local logo files (filesystem / shell access), use one of these HTTP paths — both keep bytes out of conversation context and trigger the same validation + DNA pipeline. A. When you can access a Bloom API key directly (e.g. it's in your shell environment), PUT to the Bearer-authenticated endpoint: curl -X PUT https://www.trybloom.ai/api/v1/brands/<brand_id>/logo/file \ -H "Authorization: Bearer $BLOOM_API_KEY" \ -F "file=@./logo.png;type=image/png" B. When you cannot access a Bloom API key directly (common when the key lives in an MCP client config rather than your shell), first call bloom_create_logo_upload_url to mint a short-lived signed URL, then PUT the bytes with no Authorization header: curl -X PUT "$upload_url" -F "file=@./logo.png;type=image/png" Both HTTP paths return: { "data": { "id": string, "status": "analyzing" } } Supported formats: PNG, JPEG, WEBP, SVG, AVIF (not ICO or GIF) Max file size: 10MB
bloom_update_brand_logo
Upload an image by URL for use as a reference or edit subject. The server downloads and validates the image, then reuses an exact match in the brand session or stores a new one. Returns an image ID that you can use with other Bloom tools: - As a reference in bloom_generate_image (reference_image_ids) - As a reference in bloom_edit_image (reference_image_ids) - As an edit subject in bloom_edit_image (image_id) Args: - image_url (string): Public URL of the image to upload (PNG, JPEG, WebP, AVIF) - brand_session_id (string): Brand session UUID to scope the upload to. Returns: { "id": string, "width": number, "height": number, "mime_type": string, "existing": boolean } Supported formats: PNG, JPEG, WebP, AVIF Max file size: 10MB For local image files (when you have filesystem / shell access), do NOT load the bytes into this conversation. Use one of these HTTP paths — both keep bytes out of conversation context and return the same shape. A. When you can access a Bloom API key directly (e.g. it's in your shell environment), POST to the Bearer-authenticated endpoint: curl -X POST https://www.trybloom.ai/api/v1/images/uploads/file \ -H "Authorization: Bearer $BLOOM_API_KEY" \ -F "file=@./photo.png;type=image/png" \ -F "brandSessionId=<uuid>" B. When you cannot access a Bloom API key directly (common when the key lives in an MCP client config rather than your shell), first call bloom_create_image_upload_url to mint a short-lived signed URL, then POST the bytes with no Authorization header: curl -X POST "$upload_url" -F "file=@./photo.png;type=image/png" Response: { "data": { "id": string, "imageUrl": string, "width": number, "height": number, "mimeType": string, "existing": boolean } } Use the returned "id" anywhere this tool's "id" is accepted.
bloom_upload_image
Convert an image to a scalable SVG. Best for logos, icons, and flat illustrations; not recommended for photos or soft-shaded artwork. Works on completed generated images and on uploaded/scraped images (from bloom_upload_image, bloom_search_user_images, or bloom_list_images). Returns immediately with a new image ID. Vectorization typically completes in under 30 seconds. After calling this tool, use bloom_get_image to check status and retrieve the resulting SVG when ready. Args: - image_id (string): ID of a completed generated image, or an uploaded/scraped image, to vectorize - brand_session_id (string): Brand session UUID (from bloom_list_brands) Returns: { "image_id": string, "status": "pending" } Workflow: 1. Generate or pick an existing completed image (ideally a logo or icon) 2. Call this tool with the image's ID 3. Call bloom_get_image with the returned image_id to poll for results 4. When status is "completed", the SVG is at image_url
bloom_vectorize_image
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Bloom alternatives on ChatGPT?
As of 2026-09-02, Bloom competes with Alpix, Apixel, Kive, LogoGenic Image Generator, MangaBoom, Vivin in ChatGPT AI Image & Logo Generation, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.