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
- 31
- 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 Category31 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
Apply the exact immutable candidate returned by bloom_edit_brand. Call this only after the user or client policy accepts the candidate change_set. The operation is idempotent after success. If the Brand changed while the candidate waited, the edit becomes stale and is not silently rebased; create a new candidate from the latest active Brand instead.
bloom_apply_brand_edit
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, required): Workspace ID from bloom_list_workspaces. If the intended workspace is unknown, call bloom_list_workspaces first rather than choosing one. Returns: { "workspace_id": string, "workspace_name": string, "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. 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 reference images, edit subjects, AI-generated outputs the user wants to keep, screenshots, mood-board inputs, and other images being added to a Brand Library. Does NOT change the brand's logo. For a Brand with an active Brand Skill, use this tool to add the intended logo to the Brand Library, then pass the returned image ID to bloom_update_brand_profile. For a Visual DNA Brand, logo replacement is a separate operation through bloom_create_logo_upload_url. If the Brand system is unclear, inspect it before choosing a logo workflow. 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
Discard a waiting Brand edit without changing the active Brand. The immutable change set remains available as a receipt. To refine the edit, discard this candidate and call bloom_edit_brand again with the revised instruction; candidates are never modified in place.
bloom_discard_brand_edit
Prepare a semantic Brand edit for review. Bloom's Brand Agent loads and inspects the complete active Brand Skill, reasons about the Markdown guidance and supplied evidence, edits the Skill, and snapshots one exact immutable candidate. This is a semantic Agent operation. Supply an instruction, Brand evidence, or both. Evidence supports one website, one Instagram account, and general files up to 25MB. Generalized file processing uses one temporary network-denied Sandbox and runs cleanup before the tool returns. When sources are present, instruction is optional. Authorized attachment ids let the Agent inspect and use images already in this Brand's library. To use a local image, upload it first with bloom_open_upload_ui or bloom_create_image_upload_url, then pass the resulting id in attachment_ids. Args: - brand_session_id (string): Brand session UUID from bloom_list_brands - instruction (string, optional): Natural-language Brand edit (1-4000 characters) - attachment_ids (string[], optional): Image ids in this Brand workspace (max 10) - sources (object[], optional): Website, Instagram, or general file evidence (max 30) Returns the edit handle, deterministic change set, candidate identity, and a short summary. Review the returned change_set, then call bloom_apply_brand_edit to activate that exact candidate or bloom_discard_brand_edit to reject it. To refine a rejected result, discard it and call this tool again with the revised instruction.
bloom_edit_brand
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. For one result, call bloom_get_image with image_id and wait: true. For several results, call bloom_list_images with image_ids and wait: true. 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", "operation": "edit", "message_for_assistant": string } 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. Collect results using the waiting and batch guidance above. 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. Start independent generation calls in parallel when producing several images. For one result, call bloom_get_image with image_id and wait: true. For several results, call bloom_list_images with image_ids and wait: true. 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", "operation": "generation", "message_for_assistant": string } 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. Collect one result with bloom_get_image and wait: true. Collect several with bloom_list_images, image_ids, and wait: true. 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. Call bloom_list_images with all returned image_ids and wait: true. 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 | null, "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 one Brand edit candidate and its current review status. Use the edit_id returned by bloom_edit_brand. The deterministic change_set is the authority for review and remains available after apply or discard. Returns the candidate identity, exact base, current status, change set, summary, and published Skill identity when applied.
bloom_get_brand_edit
Get a bounded page from the exact base and candidate snapshots of one changed Markdown file. Use this when bloom_get_brand_edit marks a Markdown change as truncated. Pass a path from change_set.markdownChanges. If next_cursor is not null, call this tool again with the same Brand, edit, and path plus that cursor. Concatenating each side's content in page order reconstructs the complete immutable file. Args: - brand_session_id (string): Brand session UUID from bloom_list_brands - edit_id (string): Brand edit UUID returned by bloom_edit_brand - path (string): Exact path from change_set.markdownChanges - cursor (string, optional): next_cursor from the previous page Returns exact bounded content for both sides, file and artifact hashes, current edit status, and the next cursor. A side is null when the file was added or removed.
bloom_get_brand_edit_file
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 one generated image, use wait: true to wait for completion or failure, up to the timeout. For several images, use bloom_list_images with image_ids and wait: true. A returned call does not guarantee completion. Check status and image_url before presenting the result as finished. Args: - image_id (string): Image ID (any source) - wait (boolean, optional): Wait for completion or failure, up to the timeout. Only applies to generated images. Recommended: true. - timeout (number, optional): Max seconds to wait (1-295, 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, "variant_group_id": string | null, "workspace_id": string | null, "workspace_name": string, "created_at": string } For generated images: - completed with image_url: the image is ready. - completed with image_url null: the file is missing; generate a new image. - failed with failure_reason "content_safety": retry the generation once with model "standard". If that also fails, ask the user to try a different prompt. - failed with failure_reason "rate_limited": retry the generation shortly. - pending or generating: the wait may have timed out. Call bloom_get_image again with the same image_id and wait: true. For several pending or generating images, repeat bloom_list_images with only those image_ids and wait: true. Do not use rapid status polling.
bloom_get_image
Inspect the complete active Brand Skill for one Brand. Use this when the Brand metadata from bloom_get_brand is not enough to reason about voice, visual language, logo usage, messaging, photography, or other Brand guidance. The result is the exact immutable active revision: SKILL.md, every routed reference file, and the Brand Library asset ids cited by each file. Its structured profile includes each typography role and signed files for custom fonts. SKILL.md includes the canonical YAML frontmatter stored in the immutable artifact. Follow its routing guidance when applying the result. This is a read-only deterministic operation. It does not run Bloom's Brand Agent, summarize the Skill, expose private source evidence, or create a conversation. Args: - brand_session_id (string): Brand session UUID from bloom_list_brands - cursor (string, optional): next_cursor from the previous page for this Brand Returns one bounded page of the inspected revision, profile, and Markdown files. Repeat this call with next_cursor until it is null to retrieve the complete Skill. Keep the same brand_session_id. Pages stay on the original immutable revision. Join file content and append library_asset_ids by file_index in cursor order. Character offsets count Unicode code points. An empty content chunk can carry asset IDs. The profile appears once. If profile_chunk appears, concatenate its content in order and JSON.parse the completed JSON. Omitted profile fields are not null. A small inspection fits in one page. Text and structuredContent contain the same page. Restart without a cursor if the revision is unavailable or profile URLs change. Custom-font URLs are temporary. Download the fonts when needed. Use bloom_get_image to inspect a returned library asset id when its pixels are needed.
bloom_inspect_brand
List brand sessions across every workspace the caller can access, with pagination. Returns brand IDs needed for image generation. Each brand represents a website, Instagram profile, or PDF guide that has been onboarded to Bloom. 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 | null, "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 collection**: Start independent bloom_generate_image calls in parallel. Collect several results with `bloom_list_images({ image_ids: [...], wait: true })`. This also applies to variants, edits, resizes, background removal, and vectorization. For one result, use bloom_get_image with image_id and wait: true. Waiting defaults to true when image_ids is provided. The call waits for completion or failure, up to the timeout. A returned call does not guarantee completion. Check returned statuses and present only completed results with image_url as finished. If images remain pending or generating, repeat the waiting call for only those IDs. Keep several IDs together in bloom_list_images. Do not use rapid status polling. 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): Wait for all `image_ids` to complete or fail, up to the timeout. 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. Pass a workspace_id from this list to target a specific workspace. bloom_check_credits requires one; create tools such as bloom_onboard_brand may default to the personal workspace when their own docs say workspace_id is optional. 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" } If the request is restricted, this tool returns an error immediately with a support reference instead of creating a brand. 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. For a Brand with an active Brand Skill, use this tool to add the intended logo to the Brand Library, then pass the returned image ID to bloom_update_brand_profile. For a Visual DNA Brand, logo replacement goes through bloom_open_logo_upload_ui (UI hosts) or bloom_create_logo_upload_url (shell hosts). If the Brand system is unclear, inspect it before choosing a logo workflow. 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. For one result, call bloom_get_image with image_id and wait: true. For several results, call bloom_list_images with image_ids and wait: true. 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", "operation": "background_removal", "message_for_assistant": string } Workflow: 1. Generate or pick an existing completed image 2. Call this tool with the image's ID 3. Collect results using the waiting and batch guidance above. 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. For one result, call bloom_get_image with image_id and wait: true. For several results, call bloom_list_images with image_ids and wait: true. 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", "operation": "resize", "message_for_assistant": string } 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. Collect results using the waiting and batch guidance above. 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. This is a Visual DNA Brand tool. Do not use it for a Brand with an active Brand Skill; upload the image to that Brand's Library and pass its image ID to bloom_update_brand_profile instead. 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
Set the exact primary logo, color palette, or typography for an existing Brand Skill. Use this structured tool only for a Brand with an active Brand Skill. It bundles the exact requested profile change, complete Skill reconciliation, and one immutable revision; image transfer into the Brand Library remains a separate prerequisite for logo changes. Brand-name changes remain on bloom_edit_brand. Workflow: 1. Call bloom_inspect_brand and use its revision_id as base_revision_id. 2. For a logo change, obtain the intended image ID in this same Brand workspace. For a public image URL, call bloom_upload_image. For a local file, use bloom_open_upload_ui in an MCP Apps host or bloom_create_image_upload_url and take the id from the upload response. The upload only creates or reuses the Library asset; this tool performs the actual primary-logo assignment. 3. Pass that ID as primary_logo.asset_id. Do not pass a URL, file path, user ID, or an image from another Brand. bloom_update_brand_logo, bloom_open_logo_upload_ui, and bloom_create_logo_upload_url run the Visual DNA workflow and must not be used for an active Brand Skill. For a palette change, pass colors as an ordered list of one to 8 unique six-digit hex colors. For typography, set Heading or Body to an exact Google family, pass the unchanged family and font_asset_id returned by bloom_upload_brand_font, or use null to remove that role. Omitted roles are inherited. 4. If the base revision is stale, inspect again and confirm the intended update before retrying. 5. If Bloom stops for a material semantic concern and the user confirms the update is intentional, retry the unchanged request with that explanation in context. The selected asset must still exist and be readable when publication begins. Supported logo formats are PNG, JPEG, WebP, AVIF, SVG, and GIF. Supported font formats are TTF, OTF, WOFF, and WOFF2. Logo removal, favicon, and Brand-name updates are not supported by this tool yet. Args: - brand_session_id (string): Brand session UUID from bloom_list_brands - base_revision_id (string): Exact active revision from bloom_inspect_brand - primary_logo.asset_id (string, optional): Image UUID from this Brand's library - colors (object[], optional): Ordered Brand palette; at least one profile change is required - typography (object, optional): Exact Heading and/or Body role update - context (string, optional): Additional user intent relevant to this update Returns the activated revision, exact resulting profile, changed guidance files, and summary after publication completes.
bloom_update_brand_profile
Stage a custom font for an exact Brand Skill typography update. The server downloads and validates one public TTF, OTF, WOFF, or WOFF2 URL, then returns an opaque font asset ID and the resolved family. Staging does not change the active Brand. Pass both values unchanged to bloom_update_brand_profile in the intended Heading or Body role. For a local file with shell access and a Bloom API key, keep bytes out of the conversation and POST multipart data directly: curl -X POST https://www.trybloom.ai/api/v1/brands/<brand-id>/font-assets \ -H "Authorization: Bearer $BLOOM_API_KEY" \ -F "file=@./font.woff2;type=font/woff2" Args: - brand_session_id (string): Brand session UUID from bloom_list_brands - font_url (string): Public font URL, max 5MB Returns the font_asset_id, canonical family, format, weight, and variable flag.
bloom_upload_brand_font
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. For one result, call bloom_get_image with image_id and wait: true. For several results, call bloom_list_images with image_ids and wait: true. 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", "operation": "vectorization", "message_for_assistant": string } Workflow: 1. Generate or pick an existing completed image (ideally a logo or icon) 2. Call this tool with the image's ID 3. Collect results using the waiting and batch guidance above. 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-10, Bloom competes with Alpix, Apixel, HTML/CSS to Image API, Kive, LogoGenic Image Generator, MangaBoom, OEG AI Studio, 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.