Firefly MCP Server
The Firefly MCP Server exposes 14 Adobe Firefly Services tools to generate, edit, composite, and upscale media, plus manage references, jobs, and credentials.
Generate images with v3 (
generate_image) or Image 5 (generate_image5), including reference-based natural-language edits.Create variations of a source image (
generate_similar).Fill masked regions (
generative_fill) or expand images (generative_expand).Create object composites (
generate_object_composite), precise composites (precise_composite), or adaptive composites (adaptive_composite).Upscale images (
upscale_image).Generate five-second videos (
generate_video).Upload reference images to get upload IDs (
upload_image).Check async job status (
get_job_status).Verify authentication/credentials (
verify_credentials).List available custom models (
list_custom_models).Use safety controls: paid media tools require confirmation (
confirm/--confirm), read-only mode, spending blocks, and optional audit logging.Use the same capabilities through either MCP tools or the matching CLI commands.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Firefly MCP Servermake a square product photo of a ceramic mug and confirm before spending credits"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Adobe Firefly MCP Server & CLI
Adobe Firefly MCP server and CLI for Claude Code, Codex and AI agents. 14 tools for Image 5 generation and editing, video, generative fill, expansion, composites, upscaling, reference uploads, jobs and custom models.
One package gives you two ways in: firefly-mcp connects the tools to your AI app, and firefly-cli makes the same tools shell commands. Claude Desktop also has a bundled .mcpb extension.
Built and maintained by Navid Moazzez. The complete setup guide is on navid.me.
The terminal illustrates shipped tool names and the confirmation flow. It is a presentation preview, not a recording of a paid Adobe job.
You need Adobe Firefly Services API entitlement, with OAuth Server-to-Server credentials from an Adobe Developer Console project. A consumer Firefly plan and your Adobe account password do not supply that access. Generation uses your Adobe credits.
Validation: builds, behavioral tests, clean package installation, real MCP discovery and desktop bundle discovery are checked. Live account generation and fresh token benchmarks are still pending; no generation success rate or efficiency percentage is claimed.
Two ways to use it
Command line
npm install -g @thenavidm/firefly-mcp-cli@latest
firefly-cli
firefly-cli generate-image5 --help
firefly-cli schema generate-image5
firefly-cli verify-credentials --agent
firefly-cli list-custom-models --limit 10 --agent
firefly-cli generate-image5 --prompt "A ceramic cup in warm morning light" --aspectRatio 1:1 --confirm --agent--confirm is the terminal spelling of confirm: true. It authorizes the paid operation you requested. --agent and --yes do not authorize spending.
MCP server, for your AI app
claude mcp add --scope user firefly -- npx -y @thenavidm/firefly-mcp-cli@latestConfigure the credentials in private local settings first, then ask: "Make a square product image. Confirm the credit-spending operation before you run it."
All client configurations and operating-system steps are in INSTALL.md.
Which one
Where you work | What to use |
Claude Code, Codex, Cursor or another agent with a terminal | MCP, CLI or both; use the CLI when a shell command fits the workflow |
Claude Desktop chat | The local MCP server or desktop extension |
Scripts, cron or CI | CLI commands, or MCP through an MCP client |
A web client that accepts only a remote MCP URL | This package needs a local stdio-capable client; it does not host a public HTTP endpoint |
Related MCP server: BudgetPixel MCP Server
Features
Capability | CLI command | MCP tool |
Image 5 generation and reference editing |
|
|
v3 image generation |
|
|
Variations from a source image |
|
|
Fill a masked region |
|
|
Expand an image |
|
|
Scene around a product |
|
|
Background/object compositing |
|
|
Upscale an image |
|
|
Five-second video |
|
|
Upload a reference image |
|
|
Resume an existing job |
|
|
Check authentication |
|
|
Available custom models |
|
|
Diagnose setup |
| CLI utility |
Contents
Number | Section | What it covers |
1 | Practical prompts | |
2 | MCP, CLI and desktop | |
3 | Entitlement, credentials and revocation | |
4 | Every client and OS | |
5 | Doctor, authentication and first read | |
6 | Scripts and agent mode | |
7 | Method, standing context and task cost | |
8 | All 14 tools, grouped | |
9 | Real argument shapes | |
10 | Polling, timeouts and downloads | |
11 | Separate configurations | |
12 | Credit confirmation, read-only and audit | |
13 | Shared schemas and handlers | |
14 | Hosts, files and credentials | |
15 | Credentials, safety and tuning | |
16 | npm, desktop and disconnecting | |
17 | Symptoms and fixes | |
18 | Official and community alternatives | |
19 | Release history and migration | |
20 | Common questions |
1. What you can ask it
Make a square product image with warm morning light. Show me the prompt before spending credits.
Change this reference image's background to soft blue with Image 5.
Fill this masked area without changing the rest of the image.
Expand this image to a wider canvas using the supplied mask and size.
Put this product into a generated scene, or use a background I supply.
Create a five-second video from this prompt and return the job immediately.
Check the job I already submitted; do not generate it again.
Upload this reference file and use its upload ID for the requested edit.
List the custom models available to this Adobe project.
The account needs permission for the relevant API. A successful OAuth check does not prove that it can run every generation model.
2. Quick install
Node 22 or newer is required for the CLI and manual MCP configuration. The desktop bundle carries the server's production dependencies.
Claude Code
claude mcp add --scope user firefly -- npx -y @thenavidm/firefly-mcp-cli@latestClaude Desktop
Download the .mcpb from the latest GitHub release. In Claude Desktop, open Settings → Extensions → Advanced settings → Install Extension…, select the bundle and enter the two credential fields.
Terminal
npm install -g @thenavidm/firefly-mcp-cli@latest
firefly-cli --version
firefly-cliInstall the package first, configure Adobe credentials second, and connect your client third. INSTALL.md supplies copyable blocks for Claude Code, Claude Desktop, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Zed, Cline and other stdio clients.
3. Set up Adobe access
Before the credential fields
Adobe documents a provisioned Firefly Services project and organization access. Follow Adobe's getting-started requirements or check entitlement with your organization administrator or Adobe representative.
Set it up yourself
Open Adobe Developer Console and select the organization with Firefly Services access.
Open the provisioned project containing the Firefly API.
Open its OAuth Server-to-Server credential.
Copy the Client ID and Client secret into your private client environment settings or local shell. Do not paste them into an issue, chat, repository or shared config.
Keep the scopes assigned to the project. Use
FIREFLY_SCOPESif they differ from the tutorial defaults.Run
firefly-cli doctor --network, then the first read below.Restart your AI client so its server process sees the updated environment.
For a temporary Unix shell, replace the placeholders locally:
export FIREFLY_CLIENT_ID='YOUR_FIREFLY_SERVICES_CLIENT_ID'
export FIREFLY_CLIENT_SECRET='YOUR_FIREFLY_SERVICES_CLIENT_SECRET'
firefly-cli doctor --networkPowerShell:
$env:FIREFLY_CLIENT_ID = 'YOUR_FIREFLY_SERVICES_CLIENT_ID'
$env:FIREFLY_CLIENT_SECRET = 'YOUR_FIREFLY_SERVICES_CLIENT_SECRET'
firefly-cli doctor --networkThe CLI does not read .env files automatically. Set variables in the process that launches it. An MCP desktop client launched from the Dock may not inherit your terminal variables; use its private environment settings or the bundle's credential fields.
Let your AI help with setup
Set up the Adobe Firefly MCP server and CLI for me.
1. Verify the package installs and both firefly-cli and firefly-mcp report a version.
2. Guide me to the provisioned Adobe Developer Console project with Firefly API access.
3. Ask me to enter the client ID and secret in private local settings. Never ask me to paste credentials into chat or put them in a repository.
4. Configure my chosen MCP client with npx -y @thenavidm/firefly-mcp-cli@latest.
5. Run doctor, then doctor --network, and explain which check failed.
6. Try list-custom-models as a read-only account check.
7. Do not upload a file or generate media while checking setup.Existing access token
FIREFLY_ACCESS_TOKEN replaces the client secret, but FIREFLY_CLIENT_ID is still needed. A supplied token is verified with a read from the custom-model API. OAuth Server-to-Server credentials are verified by exchanging them for a token. Neither path proves image/video generation entitlement.
Disconnect or rotate
Rotate or revoke credentials in Adobe Developer Console, then update private client settings and restart its MCP connection. Existing output files remain on your disk.
4. Connect your client
Client | Setup route |
Claude Code |
|
Claude Desktop | GitHub release |
Codex |
|
Cursor | User |
Windsurf | Private user |
VS Code / GitHub Copilot |
|
Gemini CLI | User |
Zed | User |
Cline and other local MCP clients | The same command, args and private environment |
For the full JSON blocks, paths on each OS, logs, restarting, Docker and remote-client limits, use INSTALL.md. No public HTTP endpoint is included.
5. Check it works
firefly-cli --version
firefly-cli doctor
firefly-cli doctor --network
firefly-cli verify-credentials --agent
firefly-cli list-custom-models --limit 1 --agentdoctor checks whether local credential settings are present. doctor --network verifies OAuth or performs a custom-model read for a supplied access token. It does not generate media or spend generation credits.
verify-credentials returns authenticated, validation and entitlementChecked. The last remains false because generation permissions are only tested when that operation runs.
An empty custom-model list can be a valid response. A 403 can be a project permission problem. To verify generation, request one small image deliberately and confirm that credit-spending action; the source has not yet been validated against a live entitled account.
6. Output, flags and exit codes
Tool results go to stdout. Errors are JSON on stderr. Reads and generation return structured JSON, so --select can retain nested fields.
firefly-cli get-job-status --jobId JOB_ID_FROM_ADOBE --agent --select status,result.outputs,outputs
firefly-cli list-custom-models --limit 10 --compact
firefly-cli schema generate-image5Flag | What it does |
| JSON output |
| Single-line JSON |
| JSON, compact, no input and no color |
| Keep selected fields; dotted paths descend and arrays are traversed |
| Confirm the requested paid media operation |
| Automation switches; none overrides the spending guard |
| Return an accepted job instead of polling |
| Save completed media locally; requires waiting for completion |
Global output flags apply to tool commands. doctor has its own --network option and returns a JSON diagnostic.
Exit code | Meaning | What a script should do |
0 | Success | Read stdout |
2 | Usage, invalid input or a refused write | Fix the input or confirm only the requested action |
3 | Job or local upload file not found | Check the ID/path |
4 | Authentication or entitlement rejected | Check private credential settings and permissions |
5 | API, network or polling failure | Inspect an accepted job before another paid submission |
7 | Rate limited | Wait; do not loop over paid submissions |
10 | Credentials not configured | Complete local setup |
The underscore spelling also works. generate_image5 and generate-image5 call the same tool. Nested objects use quoted JSON. Arrays of objects use repeated flags, one JSON object at a time.
7. MCP or CLI and token cost
Both surfaces reach the same 14 tools. The comparison concerns model context and workflow, not a cheaper Adobe credit price.
Measurement | MCP | CLI |
Every tool loaded | Pending measured usage | No MCP tool list; include any installed skill description |
Claude Code default tool search | Pending measured usage | Include skill discovery text |
Skill read when Firefly is needed | Selected tool schemas and results still count | Pending measured skill cost |
Complete matched task | Include discovery, schemas, results, reasoning and retries | Include discovery, help, commands, results, reasoning and retries |
The fresh benchmark was blocked by the Claude Code weekly usage limit on October 2, 2026. No zero, estimate, borrowed result or efficiency percentage is substituted.
Claude Code can defer full tool definitions with MCP tool search. A client that eagerly loads everything behaves differently. A CLI skill also has a recurring description when installed.
The method is one neutral prompt with and without the server, both with tool search disabled and with default discovery, followed by separate skill and skill-description measurements. Record the client and model versions, server version, date, loading settings and API usage figures.
For a complete task, use the same request, permissions, selected result fields and completion behavior. Report input/output tokens, latency, retries and Adobe credits separately. Schema overhead alone is not the full bill.
To reduce standing context, disconnect an unused MCP server, keep tool search enabled in clients that support it, or use FIREFLY_READ_ONLY=1 to expose only the three reading tools. --select reduces result text; it does not change Adobe's generation credit usage.
8. Every tool and argument
There are 14 tools: three reads, one upload and ten paid media operations. Every paid operation requires confirmation. The tables below come from the running server's input schemas, rather than a separately maintained tool list.
Image/source arguments that have a URL alias accept either the nested source object or that alias. The Adobe body still requires the image where its operation specifies one.
Images
MCP tool | CLI command | What it does | Kind |
|
| Generate images | Uses credits; confirmation required |
|
| Generate images with Image5 | Uses credits; confirmation required |
|
| Generate similar images | Uses credits; confirmation required |
|
| Fill image | Uses credits; confirmation required |
|
| Expand image | Uses credits; confirmation required |
|
| Upscale image | Uses credits; confirmation required |
generate_image
Generate images. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| string | No | Directs the style of a generated image to be photographic or like fine art. Values: |
| string | No | Include the specific custom model ID when a custom model type is designated in the |
| string | No | A negative prompt of things Firefly will try to avoid generating in the image. Not supported for Firefly Custom Models on Image Model 3 or Firefly Custom Models on Image Model 4. Maximum length: 1024 |
| integer | No | The number of variations to generate. numVariations defaults to the number of seed images, or to 1 if you do not specify |
| string | Yes | A text prompt to support the generation of an image. The longer the prompt the better Firefly performs. Minimum length: 1. Maximum length: 1024 |
| string | No | A hyphen-separated string combining the ISO 639-1 language code and the ISO 3166-1 region (like en-US). When a locale is set, the prompt will be biased to generate more relevant content for that region. If not specified, the locale will be auto-detected based on your profile and the accepted language header. |
| array of integer | No | An array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. For example, use the same seed to generate a similar image in different styles. If specified along with numVariations, the number of seeds provided must equal numVariations. Minimum items: 1. Maximum items: 4 |
| object | No | The desired width and height for the final image, in pixels. Supported sizes for the output images with |
| object | No | An object with the reference image details for structure. |
| object | No | An object with the reference image details for style. |
| string | No | Only supported with the model version |
| integer | No | Adjust the overall intensity of your photo's characteristics, such as contrast, shadow, and hue. This is not supported with the model version |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 4 |
| integer | No | Compatibility alias: provide together with height instead of size. Minimum: 1. Maximum: 4096 |
| integer | No | Compatibility alias: provide together with width instead of size. Minimum: 1. Maximum: 4096 |
Exact schema: firefly-cli schema generate-image. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
generate_image5
Generate images with Image5. Image 5 supports natural-language edits through referenceBlobs. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| string | Yes | The prompt used to generate the image. The longer the prompt, the better. Minimum length: 1. Maximum length: 1500 |
| string | No | The aspect ratio of the requested generations. This controls the size of the generated image. When referenceBlobs is included in the request, this property should be omitted or set to auto. Values: |
| string | No | The resolution level. Values: |
| string | No | The specific model to use for image generation. Available options: 'firefly_image' for Firefly Image model. Values: |
| object | No | Additional model-specific parameters for controlling the generation process. |
| integer | No | The number of image variations to generate. Greater than 1 is not supported. Only one image per variation is allowed. For multiple variations, send separate requests. Maximum: 1 |
| array of object | No | List of reference blobs that will be used as additional input for the generation process. Only one reference image is supported. When this array is not empty, aspectRatio must be omitted or set to auto. Pre-signed URLs can be used from supported domains. Maximum items: 1 |
| array of integer | No | The seed value to vary the image generation. Only one seed per variation is allowed. If specified alongside with numVariations, the number of seeds must be equal to numVariations. Maximum items: 1 |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Maximum: 1 |
Exact schema: firefly-cli schema generate-image5. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
generate_similar
Generate similar images. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| object | No | Firefly will create similar variations. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . |
| integer | No | Generate this number of variations. numVariations defaults to the number of seed images, or to 1 if you do not specify |
| array of integer | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. If specified along with numVariations, the number of seeds must equal numVariations. Minimum items: 1. Maximum items: 4 |
| object | No | The desired width and height for the final image in pixels. The supported sizes for the output images are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px (7:4) - width 1344px, height 768px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px . |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 4 |
| integer | No | Compatibility alias: provide together with height instead of size. Minimum: 1. Maximum: 4096 |
| integer | No | Compatibility alias: provide together with width instead of size. Minimum: 1. Maximum: 4096 |
| string | No | Compatibility URL alias for image.source.url. Format: uri |
Exact schema: firefly-cli schema generate-similar. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
generative_fill
Fill image. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| object | No | The image to expand. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains for input URLs in the request: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . |
| object | No | Required. Selected areas of a background image that Firefly uses to fill the source image. |
| string | No | An optional text prompt up to 1024 characters. Avoid these characteristics in the generated image. Not supported for Firefly Custom Models on Image Model 3 or Firefly Custom Models on Image Model 4. Maximum length: 1024 |
| integer | No | Generate this number of variations. numVariations defaults to the number of seed images, or to 1 if you do not specify seeds. Minimum: 1. Maximum: 4 |
| string | No | An optional text prompt up to 1024 characters. The longer the prompt the better Firefly performs. Minimum length: 1. Maximum length: 1024 |
| string | No | A hyphen-separated string combining the ISO 639-1 language code and the ISO 3166-1 region, such as en-US. When a locale is set, the prompt will be biased to generate more relevant content for that region. The locale will be auto-detected if not specified based on your profile and the accepted language header. |
| array of integer | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. For example, you can use the same seed to generate a similar image with different styles. If specified along with numVariations, the number of seeds must equal numVariations. Minimum items: 1. Maximum items: 4 |
| object | No | The desired width and height for the final expanded image in pixels. The supported sizes for the output images are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px (7:4) - width 1344px, height 768px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px . |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 4 |
| integer | No | Compatibility alias: provide together with height instead of size. Minimum: 1. Maximum: 4096 |
| integer | No | Compatibility alias: provide together with width instead of size. Minimum: 1. Maximum: 4096 |
| string | No | Compatibility URL alias for image.source.url. Format: uri |
| string | No | Compatibility URL alias for mask.source.url. Format: uri |
Exact schema: firefly-cli schema generative-fill. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
generative_expand
Expand image. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| object | No | The image to expand. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains for input URLs in the request: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . |
| object | No | Mask image which will be used to expand the given image. |
| integer | No | Generate this number of variations. numVariations defaults to the number of seed images, or to 1 if you do not specify seeds. Minimum: 1. Maximum: 4 |
| object | No | The position of the source image after Firefly resizes it. The value describes the horizontal and vertical placement and dimensions of the image in the output. Note you cannot use placement for source images when you also apply a mask image. |
| string | No | An optional text prompt up to 1024 characters. The longer the prompt the better Firefly performs. Minimum length: 1. Maximum length: 1024 |
| array of integer | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. For example, you can use the same seed to generate a similar image with different styles. If specified along with numVariations, the number of seeds must equal numVariations. Minimum items: 1. Maximum items: 4 |
| object | No | The desired width and height for the final expanded image in pixels. The maximum size for the output images is 3999px by 3999px. |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 4 |
| integer | No | Compatibility alias: provide together with height instead of size. Minimum: 1. Maximum: 4096 |
| integer | No | Compatibility alias: provide together with width instead of size. Minimum: 1. Maximum: 4096 |
| string | No | Compatibility URL alias for image.source.url. Format: uri |
| string | No | Compatibility URL alias for mask.source.url. Format: uri |
Exact schema: firefly-cli schema generative-expand. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
upscale_image
Upscale image. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| object | No | The input image for the upsampler (source uploadId or url). |
| array of integer | Yes | The seed for each variation. Provide one seed per output (1–4 seeds). Minimum items: 1. Maximum items: 4 |
| integer | No | The upscale factor (2, 3, 4, or 6). Output dimensions are input dimensions multiplied by this factor. Values: |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| string | No | Compatibility URL alias for image.source.url. Format: uri |
Exact schema: firefly-cli schema upscale-image. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
Composites
MCP tool | CLI command | What it does | Kind |
|
| Generate object composite | Uses credits; confirmation required |
|
| Generate precise composite | Uses credits; confirmation required |
|
| Generate adaptive composite | Uses credits; confirmation required |
generate_object_composite
Generate object composite. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| string | No | The content class of the image. Values: |
| object | No | The image to expand. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains for input URLs in the request: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . |
| object | No | Selected areas of a background image that Firefly uses to fill the source image. |
| integer | No | Generate this number of variations. Defaults to the number of seed images, or to 1 if you do not specify seeds. Minimum: 1. Maximum: 4 |
| object | No | The position of the source image after Firefly adjusts it. The value describes the horizontal and vertical placement and dimensions of the image in the output. Note you cannot use placement for source images when you also apply a mask image. |
| string | Yes | A text prompt up to 1024 characters. The longer the prompt the better Firefly performs. Minimum length: 1. Maximum length: 1024 |
| array of integer | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. If specified along with numVariations, the number of seeds must equal numVariations. Minimum items: 1. Maximum items: 4 |
| object | No | The desired width and height for the final image in pixels. The supported sizes for the output images are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px (7:4) - width 1344px, height 768px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px . |
| object | No | See the exact structure with schema for this command. |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 4 |
| integer | No | Compatibility alias: provide together with height instead of size. Minimum: 1. Maximum: 4096 |
| integer | No | Compatibility alias: provide together with width instead of size. Minimum: 1. Maximum: 4096 |
| string | No | Compatibility URL alias for image.source.url. Format: uri |
| string | No | Compatibility URL alias for mask.source.url. Format: uri |
Exact schema: firefly-cli schema generate-object-composite. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
precise_composite
Generate precise composite. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| object | Yes | Background image and fill area mask specifying object placement. |
| object | Yes | Object image to be placed on the background. |
| integer | No | Number of output variations to generate. Minimum: 1. Maximum: 3 |
| array of integer | No | Random seeds for each variation. Count must match numVariations if both are provided. Defaults: 1 variation → [333], 2 → [333, 222], 3 → [333, 222, 111]. Minimum items: 1. Maximum items: 3 |
| number | No | Controls blend between harmonized and original object appearance (0.0 = fully harmonized, 1.0 = original preserved). Minimum: 0. Maximum: 1. Format: float |
| object | No | Output format specification. |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 3 |
Exact schema: firefly-cli schema precise-composite. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
adaptive_composite
Generate adaptive composite. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| object | Yes | Background image and fill area mask. |
| object | Yes | Object image and optional mask. |
| integer | No | Number of output variations to generate. Minimum: 1. Maximum: 3 |
| array of integer | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. If specified alongside numVariations, the number of seeds must equal numVariations. Defaults: 1 variation → [333], 2 → [333, 222], 3 → [333, 222, 111]. Minimum items: 1. Maximum items: 3 |
| number | No | Controls how much the object's colors and lighting are adjusted to match the background scene. Minimum: 0. Maximum: 1. Format: float |
| number | No | Controls shadow intensity in the composited result. Lower values reduce shadow. Minimum: 0. Maximum: 1. Format: float |
| boolean | No | When true, preserves original background details within the masked area during compositing. |
| object | No | Output format specification. |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
| integer | No | Compatibility alias for numVariations. Do not supply both. Minimum: 1. Maximum: 3 |
Exact schema: firefly-cli schema adaptive-composite. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
Video
MCP tool | CLI command | What it does | Kind |
|
| Generate video | Uses credits; confirmation required |
generate_video
Generate video. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
Argument | Type | Required | What it does |
| integer | No | The constant rate factor for encoding video. 0 indicates a lossless generation, with the highest quality and largest file size. 63 indicates the worst quality generation with the smallest file size. The suggested value range is 17-23. Minimum: 0. Maximum: 63 |
| object | No | The details of the image used as a keyframe for the generated video. Provided images are used as a first frame or final frame to guide the video generation. |
| string | No | The prompt used to generate the video. The longer the prompt, the better. |
| array of integer | No | The seed reference value. Currently only 1 seed is supported. Minimum items: 1. Maximum items: 1 |
| array of object | No | The dimensions of the generated video. Consult the supported aspect ratios in the usage notes for allowed values. |
| object | No | The camera and shot control settings. |
| boolean | Yes | Must be true to spend Firefly Services credits for the operation the user requested. |
| boolean | No | Wait for completion, default true. Set false to return the job immediately. |
| boolean | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. |
Exact schema: firefly-cli schema generate-video. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
References
MCP tool | CLI command | What it does | Kind |
|
| Upload a reference image | Uploads |
upload_image
Upload a local JPEG, PNG, WebP, TIFF or JXL image, up to 15 MB. Returns an uploadId, valid for seven days. File content is sent to Adobe.
Argument | Type | Required | What it does |
| string | Yes | Local image path on the computer running this server. Minimum length: 1 |
Exact schema: firefly-cli schema upload-image. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
Jobs
MCP tool | CLI command | What it does | Kind |
|
| Read an async job | Reads |
get_job_status
Read an existing Adobe async job by jobId. Use after a polling timeout instead of submitting generation again.
Argument | Type | Required | What it does |
| string | Yes | Job ID or URN returned by Adobe. Minimum length: 1 |
Exact schema: firefly-cli schema get-job-status. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
Account
MCP tool | CLI command | What it does | Kind |
|
| Verify authentication | Reads |
|
| List available custom models | Reads |
verify_credentials
Check OAuth by exchanging credentials, or validate an existing access token through a custom-model API read. Does not generate media, prove generation entitlement or reveal tokens.
Argument | Type | Required | What it does |
None | None | No | Run without tool arguments |
Exact schema: firefly-cli schema verify-credentials. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
list_custom_models
Read custom models available to the Adobe project. FIREFLY_USER_TOKEN is optional for user-specific access. Returns a page; use start and limit to continue.
Argument | Type | Required | What it does |
| string | No | Values: |
| integer | No | Minimum: 0 |
| integer | No | Minimum: 1. Maximum: 50 |
| string | No | Values: |
Exact schema: firefly-cli schema list-custom-models. Nested objects use one quoted JSON object; arrays of objects use one repeated flag per object.
9. Image, editing and video workflows
Generate with Image Model 5
firefly-cli generate-image5 --prompt "A ceramic cup in warm morning light" --aspectRatio 1:1 --resolutionLevel 4MP --agent --confirmImage 5 uses /v4/images/generate-async and x-model-version: image5. Its request differs from the v3 image endpoint: inspect firefly-cli schema generate-image5. The reviewed schema accepts one variation per request.
Upload a reference, then instruct an edit
firefly-cli upload-image --filePath /absolute/path/reference.png --agent
firefly-cli generate-image5 --prompt "Change the background to a soft blue studio wall" --referenceBlobs '{"source":{"uploadId":"UPLOAD_ID_FROM_PREVIOUS_RESULT"},"usage":"general"}' --agent --confirmReplace the placeholder with the returned upload ID. An Image 5 reference edit requires aspectRatio omitted or auto. Upload IDs expire after seven days. Image URLs must use the storage providers Adobe accepts, described in its usage notes.
Fill a masked region
firefly-cli generative-fill --prompt "A small green plant" --image '{"source":{"uploadId":"SOURCE_UPLOAD_ID"}}' --mask '{"source":{"uploadId":"MASK_UPLOAD_ID"}}' --agent --confirmimage and mask describe separate sources. The corrected endpoint is /v3/images/fill-async. Keep the mask interpretation consistent with Adobe's current operation docs.
Submit video without waiting
firefly-cli generate-video --prompt "Slow camera movement through a sunlit forest" --wait=false --agent --confirm
firefly-cli get-job-status --jobId JOB_ID_FROM_RESULT --agentThe API generates a five-second video. Video uses x-model-version: video1_standard; sizes and keyframes follow the generated schema. A timeout can mean the operation is still running. Check its job before submitting again.
Upscale or composite
firefly-cli upscale-image --image '{"source":{"uploadId":"SOURCE_UPLOAD_ID"}}' --seeds 333 --upscaleFactor 2 --agent --confirm
firefly-cli precise-composite --help
firefly-cli adaptive-composite --helpUse precise_composite or adaptive_composite when you supply both a background and an object. generate_object_composite generates a scene around the product image and uses a different schema. Do not interchange their request structures.
Optional downloads
Pass --download on a media command to save completed outputs under FIREFLY_OUTPUT_DIR, defaulting to ~/outputs/images. Downloads default off and need wait=true. Each filename is unique, so multiple variations do not overwrite one another. URLs and optional downloaded_to paths are returned as data; images and videos are not printed as binary terminal output. Each downloaded output is limited to 250 MB.
Source object shapes
An uploaded image:
{"image":{"source":{"uploadId":"986e8b25-6d40-4c5c-b2e5-f0d0dbf8ac36"}}}A presigned storage URL:
{"image":{"source":{"url":"https://YOUR_BUCKET.amazonaws.com/reference.png"}}}Each source requires exactly one uploadId or HTTPS url. The UUID above is an example; use the real ID from your requested upload. Do not supply both source forms.
Image 5 reference editing uses a different wrapper:
firefly-cli generate-image5 --prompt "Change only the background to soft blue" --referenceBlobs '{"source":{"uploadId":"986e8b25-6d40-4c5c-b2e5-f0d0dbf8ac36"},"usage":"general"}' --aspectRatio auto --confirm --agentModel and storage constraints
Operation/input | Constraint in the reviewed Adobe documentation |
Image 5 | One variation and at most one reference blob in the current operation schema |
Image 5 with a reference | Omit aspectRatio or use auto |
Image 5 request fields | Use its v4 fields; do not reuse v3-only negativePrompt or size |
Video | Five-second output; provide a prompt or image conditions/keyframes |
Seeds and variations | One seed per requested variation when both are supplied |
Image upload | Nonempty JPEG, PNG, WebP, TIFF or JXL, at most 15 MB |
Uploaded reference lifetime | Adobe documents seven days; upload again if expired |
Presigned input URL | Use an Adobe-supported storage domain; a local path is not a URL |
Local output download | Explicit opt-in, 250 MB cap, supported HTTPS storage host and no forwarded Adobe authorization |
Some operations have narrower source-size requirements than the generic upload endpoint. Consult Adobe's usage notes and the specific operation before a composite.
Current documentation discrepancy
Adobe's Image 5 migration article and its current OpenAPI operation disagree about several fields. The reviewed v4 operation includes aspectRatio, resolutionLevel, modelId, modelSpecificPayload and referenceBlobs. This implementation validates against that operation and records its exact snapshot hash. The discrepancy still needs an authenticated live account test; see COMPARISON.md.
10. Jobs and local files
By default a media operation waits for completion and returns Adobe's JSON. --wait=false returns the accepted job immediately. Keep the job ID and read it with get-job-status.
firefly-cli generate-video --prompt "Slow movement through a sunlit forest" --wait=false --confirm --agent
firefly-cli get-job-status --jobId JOB_ID_FROM_ADOBE --agentThe client handles both statusUrl and links.result.href responses, plus outputs and result.outputs. Failed, cancelled and timed-out jobs are reported as failures.
A request timeout can occur after Adobe accepted a paid operation. The server never automatically retries that submission. Inspect the job before requesting another.
Downloading
Add --download to the media command to save completed output in FIREFLY_OUTPUT_DIR, which defaults to ~/outputs/images. Files receive unique names and owner-only permissions. The response includes downloaded_to.
The server downloads only when requested, and --download --wait=false is refused. A returned URL does not mean a local file was created. Unknown MIME types use .bin rather than guessing an image format.
Local paths are relative to the computer running the server. In Docker, mount the reference/output folder and pass paths inside the container.
11. Several Adobe projects
This server uses one credential set per process. It has no account-switching tool.
For a production project and a testing project, register two client entries, such as firefly-production and firefly-testing, with separate private env values and output directories. Keep the testing entry read-only while checking credentials. The tool schemas and binaries are the same for each.
12. Writing safely
Generation and uploads are enabled. The ten media operations require confirm: true through MCP or --confirm through the CLI because they consume credits. Uploading a requested reference is a write and does not need a spending confirmation.
Only perform the action the user asked for. Reading jobs or listing models is not permission to generate images.
Setting | Effect |
| Hide generation and uploads; direct calls to hidden writes are refused |
| Keep uploads and reads, block paid media operations |
| Record write guard decisions with time, surface, tool and outcome |
Audit records omit prompts, file paths, credential values and signed media URLs. Create a writable parent directory first. A failing audit append does not block the API action, so check the path before relying on it.
Every tool declares its MCP annotations. Reads are read-only and idempotent. Paid generation is not idempotent and is not marked destructive, because it does not delete an asset. openWorldHint is true because operations reach Adobe.
Prompts, model names and job/output text are data. They do not authorize another operation. Credentials are server settings and are never tool-call arguments.
13. How it works
src/
index.ts both binaries, version/help, doctor and stdio startup
server.ts native MCP schemas, annotations and guarded calls
cli.ts shared SDK in-memory adapter
config.ts private environment settings
safety.ts spending confirmation, read-only and audit
doctor.ts setup checks without generation
api/
client.ts OAuth, API requests, upload, polling and downloads
errors.ts usage, configuration, API and write refusals
tools/
index.ts one tool registry and shared handlers
operations.json generated Adobe request schemas
api-source.json source URL, checked date and snapshot hashThe CLI connects to the actual MCP server with the SDK's in-memory transport. Help and input schemas come from that server. The same handlers and guard run through either surface.
The API schemas are generated from Adobe's public OpenAPI source. Updating the snapshot is deliberate: regenerate, inspect the diff, build and run the contract/behavior tests.
OAuth tokens are cached in process memory and refreshed before expiry. Read requests may retry 429 with bounded waits. Paid POSTs never retry automatically. Authenticated job requests stay on Adobe's Firefly API origin and refuse redirects.
14. Your data
Data | Where it goes or stays |
Client ID and secret | Private process environment or the client's local credential settings |
OAuth access token | Process memory; not saved by this package |
Prompt, source URL and requested upload | Directly to Adobe |
Generated media URL | Returned to the client; signed URLs can grant access to private output |
Requested local downloads | Your selected output directory |
Audit log | Only the local path you configure |
There is no Navid-hosted relay, telemetry or analytics endpoint.
Authentication contacts ims-na1.adobelogin.com. API requests contact firefly-api.adobe.io. Requested downloads may contact Adobe output storage within the supported Amazon S3, Azure, Google Cloud, Dropbox or Adobe host families. They never receive Adobe authentication headers.
Adobe's own Firefly Services documentation and service terms govern upstream processing. Review those before uploading confidential reference material.
15. Environment variables
Credentials
Variable | Default | Purpose |
| Empty | Firefly Services OAuth client ID |
| Empty | OAuth client secret |
| Empty | Optional existing access token, replacing the secret |
| Empty | Optional user-level custom-model access |
| Adobe tutorial scopes | Scope string from the provisioned project |
| Empty | Adobe tutorial alias for client ID |
| Empty | Adobe tutorial alias for client secret |
| Empty | Adobe tutorial alias for access token |
Safety
Variable | Default | Purpose |
| Off |
|
| On |
|
| Empty | Append guard decisions to this local path |
Tuning
Variable | Default | Purpose |
|
| Folder for explicitly requested downloads |
| 30000 | Per-request deadline |
| 300000 | Maximum job polling duration |
| 2000 | Interval between polls |
The program reads the environment directly. It does not automatically load .env files. Never commit real values in an environment file, client JSON or a desktop manifest.
16. Updates and removal
npm and client updates
Configs using npx -y @thenavidm/firefly-mcp-cli@latest resolve the current published version when they launch. Reconnect or restart the MCP client after an update.
npm install -g @thenavidm/firefly-mcp-cli@latest
firefly-cli --versionGlobal installs need that command to update. Desktop bundles are separate downloads: install the new .mcpb from the latest release through Extensions settings. Do not assume a manually installed custom bundle updates itself.
Every release is recorded in CHANGELOG.md. Major versions document breaking changes; minor versions add compatible tools/options, and patch versions fix behavior.
Migrating from the old MCP-only server
Keep the old tool names where supported, but change the package to @thenavidm/firefly-mcp-cli@latest. Node 22 is required. Paid media calls now need confirmation. Downloads now require an explicit flag.
n maps to numVariations where supported. width and height must be supplied together. Fill uses the current async endpoint. Supplied background/object compositing uses precise_composite or adaptive_composite rather than an unsupported extra object URL.
Remove it
npm uninstall -g @thenavidm/firefly-mcp-cli
claude mcp remove --scope user fireflyIn other clients, remove the Firefly entry you added. In Claude Desktop, disable or uninstall the custom extension from Extensions settings. Remove private credential settings and revoke/rotate Adobe credentials if they are no longer needed.
Output images and audit logs are your files and are kept. Remove them yourself if desired.
17. Troubleshooting
Start with firefly-cli doctor, then doctor --network.
What you see | Likely cause | What to do |
Exit 10 / credentials not configured | The server process has no usable credential set | Enter private local values; restart the client |
401 | Invalid or expired credentials/token | Rotate or replace them in Adobe Console/private settings |
403 | API entitlement, scopes or project permissions | Check the provisioned organization and operation access |
429 | Adobe rate or quota limit | Wait; do not repeatedly resubmit paid operations |
Image 5 argument refused | v3 field or invalid reference ratio/variation | Use |
Source refused | Missing/both source forms, invalid UUID or URL | Provide exactly one uploadId or HTTPS URL |
Upload not found, exit 3 | Path points to a different machine/container | Use a path visible to the server process |
Upload too large or wrong format | Generic upload limit or unsupported extension | Use a nonempty supported image no larger than 15 MB |
Polling timeout | A job may still be running | Keep the original job ID and read it; do not submit again |
Submission timed out | The paid outcome is unknown | Inspect the original operation before another request |
Tools missing | Read-only mode or stale client connection | Check settings and reconnect |
Local file missing | Download was not requested, or waiting was disabled | Use |
Audit log empty | Unwritable/missing parent folder | Fix the local path before relying on the log |
Desktop extension fails to start | Runtime/configuration or organization extension policy | Check Extensions logs and approved custom-extension settings |
Node not found in a GUI app | GUI PATH differs from your terminal | Use an absolute Node path in manual configuration |
Invalid JSON in client config | Missing comma or wrong root key | Validate locally; use the exact client block in INSTALL |
Do not attach credential-bearing configs, OAuth response bodies, private prompts or signed output URLs to an issue.
18. API coverage and comparisons
The current implementation covers the ten media operations in the reviewed Adobe Firefly OpenAPI snapshot, plus upload, job status, authentication and custom-model reads. It is Firefly-specific and does not expose the Photoshop or Lightroom APIs.
Adobe supplies official APIs and SDKs. A dedicated Adobe-published Firefly task MCP/CLI was not identified in the reviewed documentation; that is a dated finding, not a claim that one cannot exist.
Community MCPs can offer broader services or remote deployment. COMPARISON.md records the actual sources, checked versions/claims, scope differences and outstanding matched-task measurements. Tool count alone does not prove broader coverage, lower token use or faster completion.
19. Versions
Version | What changed | Status |
2.0.0 | 14 tools, current Adobe schema coverage, CLI, desktop bundle, spending guard and complete setup | |
1.0.0 | Seven MCP-only tools in the legacy implementation | Historical source |
The release history lives in CHANGELOG.md, and downloads in GitHub Releases.
20. FAQ
MCP is the standard an AI client uses to discover and call outside tools. This server exposes Adobe Firefly operations so the client can act on an explicit request.
The CLI is the same tool registry as shell commands. Agents with a terminal, scripts and people can run it. Tool names use dashes in the command form.
Use MCP in a local AI chat and the CLI for shell workflows. Both share schemas and handlers. Token overhead depends on discovery, the skill and the actual task; fresh measurements are pending.
No. Navid Moazzez maintains this independent package against Adobe’s official API documentation. It is not endorsed by Adobe.
The package source is available under AGPL-3.0-or-later. Adobe API access and generation credits have separate costs, so installing it does not provide free generation.
Use OAuth Server-to-Server credentials from a provisioned Firefly Services project. A consumer subscription is not proof of API entitlement. Your Adobe password is never a tool setting.
Yes. The release carries a self-contained .mcpb extension. Configure its client ID and sensitive secret field locally. npm, MCP and desktop packaging use the same version.
generate_image5 uses the v4 operation with referenceBlobs. The current schema allows one variation and one reference; with a reference use auto or omit the ratio. Live account generation validation is pending.
generate_video uses Adobe’s documented five-second video operation. It accepts a prompt or image conditions. The source handles asynchronous job responses without automatically resubmitting.
No. It covers Firefly image and video operations. The comparison explains where other implementations expose those separate services.
No publish/delete tool is exposed. It can spend credits and upload requested references, so those changes still deserve deliberate authorization.
Every paid media tool refuses without confirm: true or --confirm. READ_ONLY hides writes and ALLOW_SPENDING can block paid actions. The agent should pass confirmation only for the user’s requested action.
Uploads read a local path on the server’s machine. Requested downloads go to FIREFLY_OUTPUT_DIR or ~/outputs/images. A returned output URL alone does not create a local file.
No. Source, Git history and bundle scans are checked before publication. Credential examples are placeholders; actual values belong in private local settings or encrypted publishing secrets.
Use separate MCP entries/processes with distinct credentials and output folders. There is no account-switching tool inside this server.
Read the accepted job if you have its ID. A submission timeout can have an unknown paid outcome, so do not automatically request the same generation again.
npx configurations use @latest when they start. Global CLI installations need an npm update/install command. A manually installed custom desktop bundle must be updated through Extensions settings.
Only if that client can reach a local stdio server through its own supported integration. This package does not supply a remote HTTP URL for web-only connectors.
Build/typecheck, behavioral tests, native MCP discovery, guard/refusal behavior, a clean npm tarball installation and an unpacked desktop bundle. Live Adobe generation and fresh token measurements remain pending.
Questions
Run into a problem or have a question? Open an issue and I will help.
Found a security vulnerability? Report it privately. SECURITY.md explains the credential and spending boundaries.
See CONTRIBUTING.md for the contribution policy.
About the author
Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This Adobe Firefly MCP server and CLI is one piece of that system.
Links
Personal website: navid.me
Link in bio: navid.bio
Navid Media: navid.media
YouTube: @thenavidm and @thenavidai
X: @thenavidm
Instagram: @thenavidm
LinkedIn: thenavidm
If this is useful, star the repo and come say hi on X.
Dependencies
Library/source | License | What it does |
MIT | MCP server, stdio and shared in-memory CLI transport | |
MIT | Validate the official JSON Schema request shapes | |
MIT | URI, UUID and other field formats | |
Apache-2.0 | Upstream operation schemas; original notices ship in licenses/ |
TypeScript, Vitest, JSON Schema Ref Parser and MCPB are build/test tools. The desktop bundle carries production runtime dependencies. THIRD_PARTY_NOTICES.md records attribution.
License
AGPL-3.0-or-later. Use, modification and redistribution are subject to its terms. Adobe schema material retains its original Apache-2.0 notices.
Not affiliated with, endorsed by or connected to Adobe Inc.
© 2026 Navid Media. Made with ❤️ by Navid Moazzez.
Available Tools
14 toolsadaptive_compositeGenerate adaptive compositeB
Generate adaptive composite. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| seeds | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. If specified alongside numVariations, the number of seeds must equal numVariations. Defaults: 1 variation → [333], 2 → [333, 222], 3 → [333, 222, 111]. | |
| object | Yes | Object image and optional mask. | |
| output | No | Output format specification. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| background | Yes | Background image and fill area mask. | |
| harmonization | No | Controls how much the object's colors and lighting are adjusted to match the background scene. | |
| numVariations | No | Number of output variations to generate. | |
| shadowIntensity | No | Controls shadow intensity in the composited result. Lower values reduce shadow. | |
| preserveBackground | No | When true, preserves original background details within the masked area during compositing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, but the description adds genuinely new behavioral context: it consumes Firefly Services credits (a cost signal the annotations do not carry) and returns Adobe output URLs, plus the async-job behavior when wait=false. It stops short of noting that confirm=true is required to spend credits or that download requires wait=true, but it meaningfully exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with no padding; credit consumption and return format come early. The opening sentence is redundant with the title, which costs a point but the rest is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, deeply nested tool with no output schema, the description does supply the return shape (Adobe output URLs) and the sync/async switch, which is the most important missing piece. However it leaves the core ambiguity unresolved: with two other composite tools in the sibling list, an agent has no basis for picking adaptive_composite specifically, and the confirm-credit workflow is not surfaced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the nested object structures, seeds defaults, harmonization, shadowIntensity and the n/numVariations aliasing conflict are all already documented in the schema. The description adds only the wait=false async hint, which the schema's own description also states, so baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence is essentially a verbatim restatement of the tool title ('Generate adaptive composite') and never explains what an 'adaptive' composite actually does or how it differs from generate_object_composite or precise_composite. The verb+resource pairing is present, but an agent cannot distinguish the three composite siblings from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no reference to any of the composite siblings (generate_object_composite, precise_composite) that an agent would need to choose between. The only usage-like hint is 'Set wait=false to return an async job', which is a parameter behavior rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_imageGenerate imagesB
Generate images. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| size | No | The desired width and height for the final image, in pixels. Supported sizes for the output images with `image3` are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px Widescreen (16:9) - width 2688px, height 1512px (7:4) - width 1344px, height 768px (7:4) - width 1344px, height 756px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px Supported sizes for the output images with `image4` are: (1:1) - width 2048px, height 2048px (4:3) - width 2304px, height 1792px (3:4) - width 1792px, height 2304px (16:9) - width 2688px, height 1536px (9:16) - width 1440px, height 2560px . | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| seeds | No | An array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. For example, use the same seed to generate a similar image in different styles. If specified along with numVariations, the number of seeds provided must equal numVariations. | |
| style | No | An object with the reference image details for style. | |
| width | No | Compatibility alias: provide together with height instead of size. | |
| height | No | Compatibility alias: provide together with width instead of size. | |
| prompt | Yes | A text prompt to support the generation of an image. The longer the prompt the better Firefly performs. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| structure | No | An object with the reference image details for structure. | |
| contentClass | No | Directs the style of a generated image to be photographic or like fine art. | |
| customModelId | No | Include the specific custom model ID when a custom model type is designated in the `x-model-version` header parameter. | |
| numVariations | No | The number of variations to generate. numVariations defaults to the number of seed images, or to 1 if you do not specify `seeds`. | |
| upsamplerType | No | Only supported with the model version `image4_custom`. The `default` setting upscales generated images to 2k. The `low_creativity` setting refines the image generation by removing distortions, smoothing textures, and sometimes adding details (like freckles to faces in close-up). This setting is recommended for generating images with human subjects. | default |
| negativePrompt | No | A negative prompt of things Firefly will try to avoid generating in the image. Not supported for Firefly Custom Models on Image Model 3 or Firefly Custom Models on Image Model 4. | |
| visualIntensity | No | Adjust the overall intensity of your photo's characteristics, such as contrast, shadow, and hue. This is not supported with the model version `image4_custom`. | |
| promptBiasingLocaleCode | No | A hyphen-separated string combining the ISO 639-1 language code and the ISO 3166-1 region (like en-US). When a locale is set, the prompt will be biased to generate more relevant content for that region. If not specified, the locale will be auto-detected based on your profile and the accepted language header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, openWorld=true, idempotent=false), and the description adds genuinely new context: it consumes Firefly Services credits, returns Adobe output URLs, and supports an async path via wait=false. It does not mention the confirm flag requirement for spending credits, which is a notable omission for a cost-incurring tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with no filler; purpose comes first, followed by cost, output, and the async toggle. Tight and readable, though the async note duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with nested objects and no output schema, the description is thin: it does not explain the credit-confirmation flow (confirm=true), the download-to-directory path, or how job results are retrieved. The rich schema compensates somewhat, but the async workflow is only half-described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 18 parameters are already documented in the schema, making 3 the baseline. The description only adds the wait=false async behavior, which the schema already states, so it contributes little param-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource (generate images) so the agent knows exactly what it produces. However, it offers no differentiation from close siblings like generate_image5, generate_similar, or generate_video, which an agent must choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is 'Set wait=false to return an async job,' which is a mode toggle rather than when-to-use-this-tool guidance. There is no mention of when to prefer this over generate_image5, generate_similar, or the composite tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_image5Generate images with Image5A
Generate images with Image5. Image 5 supports natural-language edits through referenceBlobs. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| seeds | No | The seed value to vary the image generation. Only one seed per variation is allowed. If specified alongside with numVariations, the number of seeds must be equal to numVariations. | |
| prompt | Yes | The prompt used to generate the image. The longer the prompt, the better. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| modelId | No | The specific model to use for image generation. Available options: 'firefly_image' for Firefly Image model. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| aspectRatio | No | The aspect ratio of the requested generations. This controls the size of the generated image. When referenceBlobs is included in the request, this property should be omitted or set to auto. | |
| numVariations | No | The number of image variations to generate. Greater than 1 is not supported. Only one image per variation is allowed. For multiple variations, send separate requests. | |
| referenceBlobs | No | List of reference blobs that will be used as additional input for the generation process. Only one reference image is supported. When this array is not empty, aspectRatio must be omitted or set to auto. [Pre-signed URLs can be used from supported domains](https://developer.adobe.com/firefly-services/docs/firefly-api/getting-started/usage-notes/#image-api-usage). | |
| resolutionLevel | No | The resolution level. | 2.4MP |
| modelSpecificPayload | No | Additional model-specific parameters for controlling the generation process. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and non-idempotent, non-destructive, non-readOnly. The description adds genuinely useful context beyond that: it consumes Firefly Services credits (a cost/side-effect warning not in annotations), returns Adobe output URLs, and can run asynchronously. It omits any note about the confirm-gate or how an async job is later retrieved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero filler, with the core purpose front-loaded and the operational caveats (credits, async) placed immediately after. Every sentence carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It correctly notes that output URLs are returned, which compensates for the absent output schema. However, for a 12-parameter, credit-spending, potentially asynchronous tool, it never explains the confirm requirement, how to poll after wait=false (the get_job_status sibling), or the credit-cost/verification flow — real gaps given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly; baseline is 3. The description adds only two marginal notes (referenceBlobs enables natural-language edits, wait=false yields async) that largely restate the schema, and never explains the interplay of confirm, seeds, or modelSpecificPayload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate images with Image5') and adds two distinguishing capabilities: natural-language edits via referenceBlobs and async job return. It does not, however, distinguish itself from the sibling 'generate_image' or explain which generation tool an agent should pick, leaving the intent boundary ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage cue ('Set wait=false to return an async job') and notes the credit cost, but never states when to choose this over siblings like generate_image, generate_similar, or the composite tools. Usage is implied by capability rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_object_compositeGenerate object compositeB
Generate object composite. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| mask | No | Selected areas of a background image that Firefly uses to fill the source image. | |
| size | No | The desired width and height for the final image in pixels. The supported sizes for the output images are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px (7:4) - width 1344px, height 768px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px . | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| image | No | The image to expand. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains for input URLs in the request: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . | |
| seeds | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. If specified along with numVariations, the number of seeds must equal numVariations. | |
| style | No | ||
| width | No | Compatibility alias: provide together with height instead of size. | |
| height | No | Compatibility alias: provide together with width instead of size. | |
| prompt | Yes | A text prompt up to 1024 characters. The longer the prompt the better Firefly performs. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| maskUrl | No | Compatibility URL alias for mask.source.url. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| imageUrl | No | Compatibility URL alias for image.source.url. | |
| placement | No | The position of the source image after Firefly adjusts it. The value describes the horizontal and vertical placement and dimensions of the image in the output. Note you cannot use placement for source images when you also apply a mask image. | |
| contentClass | No | The content class of the image. | |
| numVariations | No | Generate this number of variations. Defaults to the number of seed images, or to 1 if you do not specify seeds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, openWorld=true, and idempotent=false, so the safety profile is covered. The description usefully adds three facts beyond the annotations: it consumes Firefly Services credits (a real cost implication), it returns Adobe output URLs, and wait=false yields an async job. It omits that 'confirm' must be true to actually spend credits, which is a notable gap given the cost disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the operation and then the cost, return, and async facts. Each sentence is compact and there is no padding, though the opening line largely duplicates the title rather than adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with deep nesting and no output schema, the description does state that Adobe output URLs are returned and mentions the async option, which is helpful. However, it gives no guidance on how to handle the async path (e.g., polling via get_job_status), no mention of the confirm requirement, and no direction on choosing between the many compatibility aliases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 94%, so the schema already documents nearly every parameter, including aliases, domain restrictions, and the confirm flag. The description adds no parameter-level meaning beyond what the schema provides, making the baseline of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence, 'Generate object composite,' is essentially the tool title restated, giving a clear verb+resource but no information that separates it from close siblings like adaptive_composite and precise_composite. The remaining sentences describe cost and return format rather than purpose, so an agent cannot tell from the description alone what this composite operation actually does with the inputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no explicit comparison against alternatives such as adaptive_composite, precise_composite, or generative_fill, despite several overlapping siblings. The only conditional hint is 'Set wait=false to return an async job,' which is an invocation detail rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_similarGenerate similar imagesA
Generate similar images. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| size | No | The desired width and height for the final image in pixels. The supported sizes for the output images are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px (7:4) - width 1344px, height 768px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px . | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| image | No | Firefly will create similar variations. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . | |
| seeds | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. If specified along with numVariations, the number of seeds must equal numVariations. | |
| width | No | Compatibility alias: provide together with height instead of size. | |
| height | No | Compatibility alias: provide together with width instead of size. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| imageUrl | No | Compatibility URL alias for image.source.url. | |
| numVariations | No | Generate this number of variations. numVariations defaults to the number of seed images, or to 1 if you do not specify `seeds`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, open-world behavior, but the description adds genuinely useful context the annotations lack: it consumes Firefly Services credits, returns Adobe output URLs (important given no output schema), and supports async job return. It omits that confirm=true is required to spend credits, which is a notable behavioral gate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with no filler; purpose, cost, output, and async option each get one line. Minor redundancy in restating the wait parameter already covered by the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the three biggest gaps for a no-output-schema tool: cost implication, return form (Adobe URLs), and async behavior. It does not mention that a source image (URL or uploadId) is effectively required, which matters for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the wait=false async behavior already documented in the schema and adds no new parameter semantics (aliases, credit-gating via confirm, seeds/numVariations coupling are all left to the schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Generate similar images'), which is distinguishable from generate_image (prompt-driven) in principle. However, it never says the operation is driven by a source image, so the differentiation from siblings like generative_expand/generative_fill relies on the name and schema rather than the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no alternatives named despite many closely related siblings (generate_image, generate_image5, upscale_image, generative_expand). The only conditional instruction is 'Set wait=false to return an async job', which is a parameter behavior, not tool selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_videoGenerate videoA
Generate video. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| image | No | The details of the image used as a keyframe for the generated video. Provided images are used as a first frame or final frame to guide the video generation. | |
| seeds | No | The seed reference value. Currently only 1 seed is supported. | |
| sizes | No | The dimensions of the generated video. Consult the [supported aspect ratios in the usage notes](https://developer.adobe.com/firefly-services/docs/firefly-api/getting-started/usage-notes/#supported-aspect-ratios) for allowed values. | |
| prompt | No | The prompt used to generate the video. The longer the prompt, the better. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| bitRateFactor | No | The constant rate factor for encoding video. 0 indicates a lossless generation, with the highest quality and largest file size. 63 indicates the worst quality generation with the smallest file size. The suggested value range is 17-23. | |
| videoSettings | No | The camera and shot control settings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-read-only, open-world, non-idempotent), and the description adds genuinely useful behavior beyond them: it consumes Firefly Services credits, returns Adobe output URLs, and supports an async job mode. It still omits that the confirm flag must be set true before credits are spent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with zero filler. The purpose, cost implication, return behavior, and async mode are all stated up front, and every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter, nested-object, credit-spending tool with no output schema, the description covers cost and return shape but omits key operational facts: that confirm=true is required to spend credits, that download requires wait=true, and that prompt/images drive the generation. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters in detail. The description's only parameter-related content (wait=false → async job) merely restates what the wait property description already says, adding no new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate video'), which cleanly separates it from image-oriented siblings like generate_image and upscale_image. It does not, however, name or distinguish itself from any specific alternative, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no routing to alternatives such as generate_similar or generative_expand. The only actionable hint ('Set wait=false to return an async job') is about a single parameter's mode, not about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generative_expandExpand imageB
Expand image. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| mask | No | Mask image which will be used to expand the given image. | |
| size | No | The desired width and height for the final expanded image in pixels. The maximum size for the output images is 3999px by 3999px. | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| image | No | The image to expand. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains for input URLs in the request: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . | |
| seeds | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. For example, you can use the same seed to generate a similar image with different styles. If specified along with numVariations, the number of seeds must equal numVariations. | |
| width | No | Compatibility alias: provide together with height instead of size. | |
| height | No | Compatibility alias: provide together with width instead of size. | |
| prompt | No | An optional text prompt up to 1024 characters. The longer the prompt the better Firefly performs. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| maskUrl | No | Compatibility URL alias for mask.source.url. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| imageUrl | No | Compatibility URL alias for image.source.url. | |
| placement | No | The position of the source image after Firefly resizes it. The value describes the horizontal and vertical placement and dimensions of the image in the output. Note you cannot use placement for source images when you also apply a mask image. | |
| numVariations | No | Generate this number of variations. numVariations defaults to the number of seed images, or to 1 if you do not specify seeds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotation coverage exists (readOnlyHint=false, openWorldHint=true, idempotentHint=false), but the description adds genuinely useful context beyond them: that the call consumes paid Firefly Services credits, that it returns Adobe-hosted output URLs, and that wait=false switches to async job semantics. It stops short of noting the credit-spend confirmation requirement or the relationship between async jobs and get_job_status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler; purpose, cost, return shape, and async switch appear in order of importance. Its terseness is close to under-specification rather than padding, which is preferable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with nested objects and no output schema, mentioning the Adobe output URLs is a helpful return-value cue. However, it omits the required source image, the credit-confirmation flag, the deprecated image.mask property, and the multiple compatibility aliases, leaving real gaps an agent must discover in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every one of the 15 parameters is documented in the schema, including aliases, deprecations, and domain restrictions, so the baseline is 3. The description's only parameter-level addition (wait=false → async) merely restates the schema's own text for wait.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Expand image'), which is unambiguous about the core operation. It does not differentiate from the sibling generative_fill, which performs a closely related filling/extending operation, so an agent cannot tell the two apart from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no pointer to alternatives such as generative_fill or the composite tools. The only conditional ('Set wait=false to return an async job') is invocation syntax, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generative_fillFill imageB
Fill image. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| mask | No | Required. Selected areas of a background image that Firefly uses to fill the source image. | |
| size | No | The desired width and height for the final expanded image in pixels. The supported sizes for the output images are: Square (1:1) - width 2048px, height 2048px Square (1:1) - width 1024px, height 1024px Landscape (4:3) - width 2304px, height 1792px Portrait (3:4) - width 1792px, height 2304px Widescreen (16:9) - width 2688px, height 1536px (7:4) - width 1344px, height 768px (9:7) - width 1152px, height 896px (7:9) - width 896px, height 1152px . | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| image | No | The image to expand. Use a URL or an uploadID as the source for the image. Firefly only allows these listed domains for input URLs in the request: amazonaws.com windows.net dropboxusercontent.com storage.googleapis.com . | |
| seeds | No | Array of seed image IDs. These reference images help ensure consistent image generation across multiple API calls. For example, you can use the same seed to generate a similar image with different styles. If specified along with numVariations, the number of seeds must equal numVariations. | |
| width | No | Compatibility alias: provide together with height instead of size. | |
| height | No | Compatibility alias: provide together with width instead of size. | |
| prompt | No | An optional text prompt up to 1024 characters. The longer the prompt the better Firefly performs. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| maskUrl | No | Compatibility URL alias for mask.source.url. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| imageUrl | No | Compatibility URL alias for image.source.url. | |
| numVariations | No | Generate this number of variations. numVariations defaults to the number of seed images, or to 1 if you do not specify seeds. | |
| negativePrompt | No | An optional text prompt up to 1024 characters. Avoid these characteristics in the generated image. Not supported for Firefly Custom Models on Image Model 3 or Firefly Custom Models on Image Model 4. | |
| promptBiasingLocaleCode | No | A hyphen-separated string combining the ISO 639-1 language code and the ISO 3166-1 region, such as en-US. When a locale is set, the prompt will be biased to generate more relevant content for that region. The locale will be auto-detected if not specified based on your profile and the accepted language header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower, and the description still contributes non-obvious traits: credit consumption, an output-URL return shape, and an async mode via wait=false. It does not say whether credits are consumed on failure or how long async jobs persist, but the additions are genuinely beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences, front-loaded with cost and return-shape information before the async hint. Only waste is the opening 'Fill image,' which merely echoes the title. No padding or hedging.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, fully schema-documented, no-output-schema tool, the description covers the two things the schema cannot: return shape (Adobe output URLs) and credit cost. It omits any routing against the 13 siblings, which is the main remaining gap, but nothing needed to invoke a call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 16 parameters in detail (aliases, size presets, deprecated image.mask, confirm). The description adds only the wait=false semantics, which the schema also states. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opener 'Fill image' is verbatim the title, so it is close to tautological, and it never explains what 'fill' means operationally (masked-area inpainting/expansion) nor how it differs from siblings like generative_expand, generate_similar, or precise_composite. The description does add that it consumes Firefly credits and returns Adobe output URLs, which gives some concrete scope. An agent cannot confidently distinguish this tool from other image-generation siblings on the strength of the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage cue is 'Set wait=false to return an async job,' which is a mode switch rather than selection guidance. There is no statement of when to choose this tool over generative_expand or the composite tools, no prerequisites, and no exclusion conditions despite 13 siblings competing for the same intent. Cost awareness ('consumes credits') is implied but not framed as a decision factor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusRead an async jobARead-onlyIdempotent
Read an existing Adobe async job by jobId. Use after a polling timeout instead of submitting generation again.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Job ID or URN returned by Adobe. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety and repeat-call semantics are covered structurally. The description adds useful operational context (this is the recovery path after a polling timeout rather than a re-submit), but says nothing about what a returned job state looks like or how to interpret it while no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the purpose is front-loaded ahead of the usage condition. Every clause carries information an agent needs to act.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full annotation coverage, purpose and usage are complete. The one remaining gap is return semantics: with no output schema, the description could say what job states/progress it surfaces, which an agent polling a job would want to know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single jobId parameter is already documented as 'Job ID or URN returned by Adobe.' The description only restates that lookup is by jobId and adds no format, provenance, or error-handling detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read an existing Adobe async job by jobId.' The contrast with 'submitting generation again' implicitly separates it from the generation-heavy sibling set (generate_image, generate_video, etc.), so an agent can tell this is the read-status tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger condition ('after a polling timeout') and the alternative to avoid ('instead of submitting generation again'), which is exactly the anti-pattern an agent would otherwise fall into. Nothing about when to reach for this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_custom_modelsList available custom modelsBRead-onlyIdempotent
Read custom models available to the Adobe project. FIREFLY_USER_TOKEN is optional for user-specific access. Returns a page; use start and limit to continue.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| start | No | ||
| sortBy | No | ||
| publishedState | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely new behavior: the optional token changes the result scope (user-specific vs project-wide) and the call returns a single page requiring start/limit iteration — neither is derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core purpose front-loaded and pagination guidance last. It is tight, though the auth note could be a touch more explicit about what happens without the token.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, and the page-return note covers the return shape minimally. For a 4-parameter filter tool with 0% schema coverage, the description omits sortBy and publishedState entirely, which are the main levers an agent would need to use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, so the description must carry the burden. It covers start and limit for pagination but says nothing about sortBy (6 enum values) or publishedState (8 enum values), leaving half the parameters' semantics to inference from enum names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read custom models available to the Adobe project') with a clear scope qualifier. It is readily distinguishable from the generation-oriented siblings, though the description never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete operational guidance: FIREFLY_USER_TOKEN is optional for user-specific access, and 'use start and limit to continue' for pagination. However, it never states when to call this versus alternatives (e.g., verify_credentials, get_job_status) or any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
precise_compositeGenerate precise compositeB
Generate precise composite. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Compatibility alias for numVariations. Do not supply both. | |
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| blend | No | Controls blend between harmonized and original object appearance (0.0 = fully harmonized, 1.0 = original preserved). | |
| seeds | No | Random seeds for each variation. Count must match numVariations if both are provided. Defaults: 1 variation → [333], 2 → [333, 222], 3 → [333, 222, 111]. | |
| object | Yes | Object image to be placed on the background. | |
| output | No | Output format specification. | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| background | Yes | Background image and fill area mask specifying object placement. | |
| numVariations | No | Number of output variations to generate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false), so the bar is lower and the description clears it by adding credit consumption, the shape of the return value (Adobe output URLs), and the async escape hatch via wait=false. It stops short of documenting polling (get_job_status), cost magnitude, or the mandatory confirm flag, so it is not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose and free of filler; nothing is padded or repeated. It is efficient, though the extreme terseness leaves semantic gaps that a slightly longer description could have closed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 10 parameters, required nested objects (background, object, fillAreaMask), and no output schema, the description is far too thin. It omits the mandatory confirm flag, the URL-vs-uploadId input requirement, polling of async jobs, and any distinction from the sibling composite tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters, including wait, confirm, seeds, and the n/numVariations alias exclusivity. The description's only parameter-related statement ('Set wait=false to return an async job') merely paraphrases the schema text for wait, adding no new syntax, constraints, or defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Generate precise composite' is essentially a restatement of the tool title, so it does little beyond the name. It never explains what a 'precise' composite is or how it differs from closely-named siblings like adaptive_composite and generate_object_composite. The agent learns it produces a composite image, but not what distinguishes this operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no when-not-to-use, and no mention of the three sibling composite tools (generate_object_composite, adaptive_composite, generative_fill) that an agent must choose between. The only usage-like detail (wait=false for async) is a parameter restatement, not routing guidance, and the 'confirm' prerequisite for spending credits is never surfaced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload a reference imageA
Upload a local JPEG, PNG, WebP, TIFF or JXL image, up to 15 MB. Returns an uploadId, valid for seven days. File content is sent to Adobe.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Local image path on the computer running this server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, open-world, non-idempotent profile, so the description needn't restate safety. It adds genuinely new behavioral facts: the 15 MB ceiling, the accepted formats, that the returned uploadId expires after seven days, and that file content leaves the system to Adobe — a privacy-relevant disclosure not present in any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. Constraints (formats, size) come first, then the outcome and expiry, then the external-transmission caveat — front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully covers the return value and its seven-day lifetime, plus size/format limits and the external data flow. What's missing is any tie-in to how the uploadId is consumed by sibling tools, which would complete the picture for a single-param upload tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema description coverage is 100%, so the schema fully documents filePath as a local path. The description's format and size constraints apply to the file but add no syntax or path-resolution detail beyond the schema; baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Upload) and resource (local image), enumerates accepted formats and the 15 MB cap, and names the return value (uploadId). An agent can distinguish this from siblings like generate_image or upscale_image without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the upload produces a reference image usable downstream, but never states when to use it versus the generative siblings or that the returned uploadId is the input to them. Usage is inferable from context only, which matches the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upscale_imageUpscale imageA
Upscale image. Consumes Firefly Services credits. Returns Adobe output URLs. Set wait=false to return an async job.
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Wait for completion, default true. Set false to return the job immediately. | |
| image | No | The input image for the upsampler (source uploadId or url). | |
| seeds | Yes | The seed for each variation. Provide one seed per output (1–4 seeds). | |
| confirm | No | Must be true to spend Firefly Services credits for the operation the user requested. | |
| download | No | Download completed media to FIREFLY_OUTPUT_DIR, default false. Requires wait=true. | |
| imageUrl | No | Compatibility URL alias for image.source.url. | |
| upscaleFactor | No | The upscale factor (2, 3, 4, or 6). Output dimensions are input dimensions multiplied by this factor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable context beyond annotations: it discloses credit consumption, output format (Adobe URLs), and async behavior via wait=false. Annotations already cover readOnlyHint=false and destructiveHint=false, so this complements them. However, it omits that confirm=true is required to actually spend credits, which is a critical behavioral gate documented only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with zero waste. The most critical operational facts (credits, output format, async toggle) are stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with credit implications and no output schema, the description covers key behaviors but omits the confirm=true requirement, which is essential to avoid failed or unintended credit spends. It also doesn't mention commercial output handling or download directory behavior, though those are in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters thoroughly, including the credit-spending confirm flag and upscaleFactor options. The description only echoes the wait parameter behavior, adding no new parameter semantics beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('Upscale image') that distinguishes it from sibling generation tools like generate_similar or generative_expand. However, it does not explicitly differentiate itself from those siblings beyond the name, leaving the agent to infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like generate_similar or generative_fill. The mention of wait=false hints at async behavior but does not explain when to choose sync vs async, nor does it caution about credit consumption conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_credentialsVerify authenticationARead-onlyIdempotent
Verify OAuth credentials or a supplied access token without generating media. A supplied token is checked through a custom-model API read. Does not prove generation entitlement or reveal tokens.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds real context beyond that: it discloses the mechanism (token is checked via a custom-model API read) and explicit negative guarantees (no entitlement proof, no token disclosure), which is meaningful behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, none wasted: purpose, mechanism, then scope limits. Front-loaded and readable, though the mechanism sentence is slightly terse for the concept it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no parameters, but the rich annotations plus the description's stated mechanism and negative guarantees give enough to call it correctly. It stops short of saying how failure surfaces or what a success result looks like, which is the only meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters the baseline is 4, but the description references 'a supplied access token' while the schema exposes no properties at all, creating a mismatch an agent could act on. The mechanism note is useful, but the phantom-input reference costs a point.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verify OAuth credentials or a supplied access token') and immediately differentiates from the generate_* siblings by noting it operates 'without generating media'. An agent can identify this as the auth-check tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is only implied - one would infer this is a pre-flight check before calling generation tools, but there is no explicit 'use this when...' or reference to sibling alternatives. The limitations ('does not prove generation entitlement') hint at scope but do not guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v2.0.0- First observed
adaptive_composite - First observed
generate_image - First observed
generate_image5 - First observed
generate_object_composite - First observed
generate_similar - First observed
generate_video - First observed
generative_expand - First observed
generative_fill - First observed
get_job_status - First observed
list_custom_models - First observed
precise_composite - First observed
upload_image - First observed
upscale_image - First observed
verify_credentials
TDQS
Scored across 14 tools
Most tools map to distinct Firefly operations, but generate_image and generate_image5 both 'Generate images', and the three composite tools (generate_object_composite, precise_composite, adaptive_composite) have terse, near-parallel descriptions. An agent may need to infer distinctions from names or external knowledge.
All tool names use snake_case, which is consistent. However, prefixes are mixed: many are verb-led (generate_, upload_, verify_, get_, list_), while others are adjective-led (generative_, precise_, adaptive_), and generate_image5 carries a version suffix.
14 tools is within a reasonable range for a media-generation server covering image, video, compositing, upload, credentials, and job utilities. The count is well-scoped and does not appear padded or severely under-provisioned.
Core generation, editing, compositing, upload, and async job status operations are covered. Minor gaps remain, such as read-only custom models and no obvious job cancel/list/download lifecycle tools beyond get_job_status.
Maintenance
Related MCP Connectors
- MorphedOAuthapp.morphed
Create AI images and videos, manage projects and credits, and use workspace campaign context.
Generate and edit images, create videos, quote credit costs, and retrieve private results.
Generate and edit images, video, voice, lip-sync and 3D models from your AI agent.
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI image generation and editing using Google's Gemini models via natural language, supporting multi-turn editing, search grounding, storyboards, icon sets, and video-to-image.514 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP-compatible clients to generate and upscale AI images, videos, music, and sound effects, manage generation jobs, access model catalogs, and track credits.3MIT
- AlicenseAqualityCmaintenanceEnables generating images, video, and audio through a single capability-oriented interface, with server-side routing, safety screening, job lifecycle management, concurrency limits, and retention.5MIT
- AlicenseNot gradedqualityBmaintenanceEnables image and video generation and editing through MCP tools, including image editing, upscaling, background removal, video generation, image-to-video, and video extension. Video generation runs asynchronously with job status and result retrieval.MIT