backdraw
Generates and edits images through the user's own ChatGPT account (chatgpt.com) in a background Chrome tab, without an API key. Supports attaching reference images for edits, requesting aspect ratios or transparent backgrounds, saving reference-image collections from the web, and browsing generated images in a gallery; results are saved locally with file paths and chat links returned to the client.
What it does
Backdraw is a local MCP server plus a Chrome extension. Ask Claude for an image "with ChatGPT" and Backdraw opens ChatGPT in a background tab of your own Chrome, where you are already signed in. It sends the prompt, waits for the picture and saves it on your PC. Claude gets the file path, a preview and the link to the chat.
Generate new images, or edit one by attaching it as a reference.
Ask for a shape (
16:9, a4:1banner, …) or a transparent background.Save reference images from any website with a right-click and reuse them as collections.
Browse everything you made in a gallery side panel.
Pure Node.js with zero npm dependencies. Everything runs on your computer.
Personal use, with your own ChatGPT account and at your own risk. Automating the ChatGPT web page may conflict with OpenAI's terms; read Disclaimer and responsible use before you start.
Related MCP server: image-generator-mcp
Why Backdraw?
Your everyday Chrome. No separate browser profile, no second login, no automation browser: Backdraw works in the Chrome you already use, where you are signed in to ChatGPT.
Out of your way. The work happens in a muted background tab that never takes focus, so you keep working while the image is made.
No open ports. The pieces talk over Chrome native messaging and a named pipe that only your Windows user can open. There is no DevTools port (such as 9222) and no local web server.
No API key. It uses your ChatGPT plan; each image counts toward your normal ChatGPT limits.
References from the web. Right-click images on any site to collect them, then generate in their style.
A gallery of everything you made, in Chrome's side panel.
One command to set up:
npx backdraw@latest setup. Loading the extension is the only step left to you.
How it compares
Other open-source projects take different approaches, and several of them do things Backdraw doesn't (macOS or Linux support, an API mode, running on a server). Each row was checked against the project's README and source on 2026-10-25; ? means we couldn't tell. Spotted a mistake? Please open an issue.
Project | Uses your everyday Chrome (no separate profile or login) | Background tab (doesn't take focus) | Open port | API key needed | Right-click reference collections | Gallery | Platforms |
Backdraw | Yes | Yes | No (native messaging + named pipe) | No | Yes | Yes | Windows |
No (own browser profile) | Partly¹ | No | Optional (API mode) | No | No | ? | |
No (own Edge profile) | No | Yes (CDP 9222) | No | No | No | Windows; macOS/Linux by hand | |
No (own Chromium profile) | No | No | No | No | No | ? | |
No (own profile, on a server) | Partly² | Yes (HTTP 8088, remote server) | No (own server token) | No | No | Linux server | |
– (no browser) | – | No | No (Codex sign-in) | No | ? | ? | |
– (no browser, runs Codex) | – | No | No (Codex sign-in) | No | No | macOS, Linux |
¹ Its own browser window, moved off screen or minimized once ChatGPT is ready. ² A browser on a virtual display (Xvfb) on the server, or headless.
Codex users already have built-in image generation; Backdraw is mainly for Claude Code, the Claude desktop app and VS Code.
How it works
Claude Code / Claude desktop app (MCP client)
│ MCP over stdio
▼
mcp-server.js ──── named pipe, your Windows user only ────► host.js
│ Chrome native messaging
▼
Backdraw Chrome extension
│ background tab
▼
chatgpt.com → your Project → new chat → imagemcp-server.jsis what Claude talks to. It forwards every tool call tohost.js.host.jsis started by Chrome when the extension connects. It runs the job queue (one job at a time), saves the images and keeps the job history in%USERPROFILE%\.backdraw\data.The extension opens chatgpt.com in a background tab, inside the ChatGPT Project you selected. The tab is never activated and is muted, no window takes focus, and your mouse and keyboard are never used: only synthetic events inside that one tab. The tab closes when the job is done, unless you are looking at it.
No API key. Backdraw uses the ChatGPT session you already have in Chrome. It never reads cookies, tokens or passwords.
Nothing leaves your PC except what you send to ChatGPT (the prompt and any reference images). There is no Backdraw server and no telemetry.
Images are saved in your Pictures folder under Backdraw, named after the time and the prompt, e.g.
20261021-153012_a-cozy-reading-nook.png.
Requirements
OS | Windows 10 or 11 |
Browser | Google Chrome 116 or newer (Edge, Brave and Chromium are registered too, but only Chrome is tested) |
Runtime | Node.js 20 or newer |
Account | A ChatGPT account that can generate images, signed in to chatgpt.com in Chrome |
Client | Claude Code, the Claude desktop app, Codex, Cursor, VS Code or Gemini CLI (or another MCP client that runs stdio servers) |
Windows only for now — the code is split into a platform module and macOS/Linux contributions are
welcome. Everything OS-specific (named pipe, native host registration, user folders) lives in
platform/win32.js.
Installation
Quick install
Run this in PowerShell or cmd (no admin rights needed):
npx backdraw@latest setupIt runs the backdraw package from npm.
setup does everything except one click in the browser:
It copies Backdraw to
%USERPROFILE%\.backdraw(npx's own copy is temporary) and sets up the images folderPictures\Backdraw(reference collections go toPictures\Backdraw\References). Running it again updates Backdraw and keeps your settings, job history and collections.It registers the native messaging host for your Windows user, for each browser it finds (Chrome, Edge, Brave, Chromium).
It lists the MCP clients it finds (Claude Code, the Claude desktop app, Codex, Cursor, VS Code, Gemini CLI) and asks which ones to add Backdraw to. Only the
backdrawentry is added or updated, and every config file gets a timestamped.bakcopy before it changes.--yestakes every client it found;--clients=claude-code,cursortakes exactly those.It opens the extension folder and your browser's extensions page, copies the folder path to the clipboard, and waits for you to load the extension, the one step left to you:
turn on Developer mode (top right),
click Load unpacked,
pick the folder (paste the path with Ctrl+V).
As soon as the extension connects, setup prints ✓ Ready and an example prompt.
The native host is still named io.github.muhammedtalha04.backdraw, after the project's old GitHub
user name: renaming it would break existing installs.
Install from your client
Your MCP client can also add Backdraw itself; it then starts the server with
npx backdraw@latest mcp. The browser side still needs a one-time setup on the PC, which leaves the
clients alone:
npx backdraw@latest setup --clients=noneClient | Add Backdraw |
Claude Code |
|
Cursor | |
VS Code | |
Codex |
|
Gemini CLI |
|
On Windows the command goes through cmd /c, because clients start npx without a shell. Use one
way per client: if setup already added Backdraw to Claude Code, the plugin would start a second
server with the same tools.
Manual install
Get the code. Clone the repository with git, or download it as a ZIP (Code → Download ZIP) and unzip it:
git clone https://github.com/devtalh/backdraw.git cd backdrawRun the installer in that folder (no admin rights needed):
node install.jsIt does steps 1 and 2 above and adds Backdraw to Claude Code (user scope). For the other clients, run
node bin/backdraw.js setupinstead, or see Use it.Load the extension once: open
chrome://extensions, turn on Developer mode, click Load unpacked and select%USERPROFILE%\.backdraw\extension.
Finish in the popup
Open the popup. Click the Backdraw icon in the toolbar (pin it from the puzzle-piece menu). Until everything works, the popup shows a setup checklist with the fix for each step:
the bridge is connected,
you are signed in to ChatGPT,
a ChatGPT Project is selected,
ready: an example prompt to copy into Claude.
Create and select a ChatGPT Project. In ChatGPT, create a Project for your images (for example "Backdraw"), open it, click the Backdraw icon and press Use the “Backdraw” project. You can also ask Claude: "Select my Backdraw project in ChatGPT for images." Every new image chat is created inside that Project.
The popup also has a language (Auto / English / Türkçe) and a theme (Auto / Light / Dark) setting.
If something doesn't work, run npx backdraw@latest doctor.
Use it
From Claude Code
Start a new Claude Code session after installing (MCP servers are loaded when a session
starts) and ask in plain words, in any language. The backdraw server gives Claude these tools:
generate_image, job_status, cancel_job, fetch_images, list_projects, select_project and
list_collections (see Tools reference).
From the Claude desktop app (chat)
The desktop app keeps its own MCP config for chats. Claude rewrites that config when it exits, so Backdraw only changes it while Claude is closed. If setup found Claude running, add Backdraw later:
Quit Claude completely, also from the system tray.
Run this from PowerShell (not from a Claude session):
npx backdraw@latest setup --clients=claude-desktop(From a manual install:
node install.js --desktopin~\.backdraw.) A timestamped.bakcopy of each config file is written before it is changed.Start Claude again. Backdraw is available in new chats.
From other MCP clients
setup adds Backdraw to Codex, Cursor, VS Code and Gemini CLI too: pick them when it asks, or run
npx backdraw@latest setup --clients=codex,cursor,vscode,gemini. It writes the full path of
node.exe as the command, so a client that doesn't see your PATH still finds it. Restart the
client or start a new session afterwards.
VS Code and Gemini CLI allow comments in their config files. Rewriting such a file would drop the comments, so setup leaves a file with comments alone and tells you; add the entry by hand then.
Backdraw is a plain stdio MCP server: node %USERPROFILE%\.backdraw\mcp-server.js. To add it by
hand, use the examples below. In the config files, replace C:/Users/you with your home folder
(echo %USERPROFILE% in cmd prints it). Forward slashes work on Windows and need no escaping in
JSON. ~ below is your home folder. The PowerShell commands fill in the path themselves.
Codex (the CLI, the IDE extension and the app share ~\.codex\config.toml;
docs). From PowerShell:
codex mcp add backdraw -- node "$env:USERPROFILE\.backdraw\mcp-server.js"or in config.toml:
[mcp_servers.backdraw]
command = "node"
args = ["C:/Users/you/.backdraw/mcp-server.js"]Cursor (~\.cursor\mcp.json for all projects, or .cursor\mcp.json in a project;
docs). Cursor fills in ${userHome} itself:
{
"mcpServers": {
"backdraw": {
"type": "stdio",
"command": "node",
"args": ["${userHome}/.backdraw/mcp-server.js"]
}
}
}VS Code (GitHub Copilot agent mode: run MCP: Open User Configuration for every workspace,
or create .vscode\mcp.json in one; docs).
Here the key is servers and type is required:
{
"servers": {
"backdraw": {
"type": "stdio",
"command": "node",
"args": ["C:/Users/you/.backdraw/mcp-server.js"]
}
}
}Gemini CLI (~\.gemini\settings.json;
docs). -s user
adds it for all projects (the default is the current project only). From PowerShell:
gemini mcp add -s user backdraw node "$env:USERPROFILE\.backdraw\mcp-server.js"or in settings.json:
{
"mcpServers": {
"backdraw": {
"command": "node",
"args": ["C:/Users/you/.backdraw/mcp-server.js"]
}
}
}Example prompts
You say | What Claude passes to |
Generate an image with ChatGPT: a cozy reading nook by a rainy window, warm lamp light. | a detailed |
Make a 16:9 banner for my blog with ChatGPT: "Night Shift Notes", neon city at dusk. |
|
Use ChatGPT to make a sticker of a happy cactus with a transparent background. |
|
Edit |
|
Use my "Cats" collection as reference and make a poster with ChatGPT. |
|
To edit an image, Backdraw needs it as a file on your PC: give Claude its full path (type or paste
it) so Claude can pass it in reference_images. Files saved by earlier calls work directly. A fresh
chat with the image attached is the most reliable way to edit.
You can also ask "What's the status of the ChatGPT image job?" or "Cancel it."
Reference collections
Collect images from the web, then use them as references.
Right-click an image on any web page → Add to Backdraw → pick a collection, or New collection… (a small window asks for the name).
A short note in the page confirms it, e.g. "Added to Cats · 5 images". On pages where Chrome doesn't let extensions show anything, the toolbar icon flashes a ✓ (or a red ! on error) instead.
Ask Claude to use the collection by name.
Each collection is a folder Pictures\Backdraw\References\<collection>\ with the images (named by
Backdraw: 001_<name>.png, …), a collection.json with the source page and date of each image,
and a thumbs\ folder. Adding the same image to a collection twice keeps one copy. PNG, JPEG, WebP
and GIF are kept as they are; other formats Chrome can show (such as AVIF, BMP or SVG) are saved as
PNG. If you delete an image file by hand, it drops out of the collection.
The popup's Collections section lists your collections. Open one to see its thumbnails, delete images, or rename or delete the collection.
Limit | |
References per message | 16 ( |
One reference | 20 MB |
All references of one message | 80 MB |
One collection image | 25 MB (an image over 20 MB stays in the collection; requests leave it out and say so, and naming it in |
A request uses the newest images of the collection that fit in the free slots. To use specific
ones, name them: Claude passes their file names (from list_collections) in reference_files.
Sizes and transparency
aspect_ratio
W:H with whole numbers, anywhere from 1:4 to 4:1: 1:1, 3:2, 2:3, 4:5, 16:9, 9:16,
5:2 (Discord banner), 3:1, 4:1, … 1920:1080 is reduced to 16:9; write 3:2, not 1.5:1.
A few names work too: square, landscape (3:2), portrait (2:3), wide (16:9), tall (9:16),
discord-banner (5:2).
1:3 to 3:1: ChatGPT draws these itself, at about 1.57 megapixels in the asked shape. Observed in October 2026: 1254×1254 (1:1), 1536×1024 (3:2), 1672×941 (16:9), 1983×793 (5:2).
Up to 4:1 / 1:4: ChatGPT is asked for 3:1 (or 1:3) and told to keep subjects, faces and text inside the band that survives the crop; Backdraw then crops it from the centre.
An image more than 1% off the asked ratio is cropped from the centre. The crop is the main file (
<name>.png) and ChatGPT's original stays next to it as<name>_full.<ext>.output_dircopies get the main file only.If ChatGPT drew another shape and the crop had to cut more than planned, the result warns you to check for cut-off subjects or text.
transparent_background
transparent_background: true asks ChatGPT for a PNG with an alpha channel that shows only the
subject. ChatGPT doesn't always deliver, so Backdraw checks the saved image: it reads the PNG header
(alpha channel or tRNS chunk) and measures the share of see-through pixels. The result says
either
Transparent background: yes — PNG with an alpha channel, 61% of the pixels are transparent.or starts with ⚠ TRANSPARENT BACKGROUND MISSING (no alpha channel, or 2% or fewer of the pixels are transparent). Then
retry once in a fresh chat or remove the background with another tool. Previews of transparent
images are drawn over a checkerboard.
Gallery side panel
Click Open gallery in the popup to open Backdraw's side panel next to the page you are on. You can also right-click the Backdraw toolbar icon → Open Backdraw gallery.
Top: the job in progress (step, job id and elapsed time; hover for ChatGPT's message), "Idle", or a not-connected notice.
Gallery: your generated images, newest first, 12 at a time (Load more), each with a thumbnail, the date, the prompt (hover to see its first 300 characters), the size and, if one was asked, the aspect ratio.
Per image: Open chat, Show in folder (Explorer with the file selected), Copy path and Add to collection (an existing collection or New collection…).
The gallery lists the images of the job history, which keeps the last 100 jobs. Thumbnails come from the previews, which are kept for 7 days; older images show a placeholder. The image files themselves stay in your images folder.
Tools reference
Tool | Parameters (default) | What it does |
|
| Starts a new chat in your Project (or continues |
|
| Waits for a job and reports it. Without |
|
| Cancels a queued or running job. If ChatGPT is already generating, it presses Stop in the background tab. |
|
| Downloads the images of the latest answer in an existing chat, without sending anything. |
| – | Lists your ChatGPT Projects and shows the selected one. |
|
| Selects and remembers the Project for new image chats (the name is matched loosely). |
| – | Lists your reference collections with image counts, folders and files (newest first). |
reference_images: local png / jpg / webp / gif files, up to 16; collection images fill the slots that are left.reference_files: file names fromlist_collections, to attach only those images ofreference_collection.conversation_url: ahttps://chatgpt.com/chat link. Fine for quick follow-ups; for exact edits a fresh chat withreference_imagesworks better.auto_reattach: if ChatGPT says it can't see the image and asks for it again, attach it automatically and ask once more.send_as_is: send the prompt word for word, without the short instruction Backdraw adds (e.g. to answer a question ChatGPT asked).output_dir: also copy the result into this folder; the images folder always keeps a copy.wait_seconds: 0 to 900.
What a result can say:
Result | Meaning |
| Saved file path(s), the chat link and a preview. Edits add an edit check line. |
| Not done yet; Claude keeps calling |
| ChatGPT shows a login or human-verification page (see Troubleshooting). |
| ChatGPT couldn't reach the image it should edit. The result lists images already saved from that chat. |
| ChatGPT answered in text (a question, a refusal, a limit); up to 3,000 characters of it are included. |
| With the reason, and the chat link if there is one. |
Fast return
Generating usually takes 1-3 minutes, but generate_image, fetch_images and job_status return
within 45 seconds by default (wait_seconds). If the image isn't ready yet, the result is
STILL RUNNING or QUEUED (with the queue position) plus a job id, and Claude calls
job_status(job_id, wait_seconds=45) again until the job is done.
Clients that reach your PC from the cloud often give up on a tool call after 60 seconds; the
45-second default keeps these calls under that limit. When the client asks for progress, Backdraw
sends progress notifications while it waits. Cancelling a tool call in the client only stops the
waiting; the job keeps running until cancel_job stops it.
CLI
For setup and troubleshooting, run these in the Backdraw folder (%USERPROFILE%\.backdraw, or the
folder you installed from). From anywhere, npx backdraw <command> runs the same commands, e.g.
npx backdraw status. npm run status is the same as node cli.js status. backdraw mcp runs
the MCP server itself on stdio; that is what MCP clients start.
node cli.js status Bridge status (Chrome connected, selected project, queue)
node cli.js projects List ChatGPT projects
node cli.js select <name | link> Select the project where images are generated
node cli.js generate "<prompt>" [--ref IMAGE]... [--url CHAT_LINK] [--aspect W:H] [--transparent]
[--reattach] [--out FOLDER] [--raw] [--wait 300] [--collection NAME [--file FILE]...]
Generate an image (--ref: a reference or the image to edit, up to 16)
node cli.js collect <chat link> [--aspect W:H] [--out FOLDER]
Download the latest images of an existing chat (sends nothing)
node cli.js job <id> [--wait 60] Show a job's status
node cli.js cancel <id> Cancel a job
node cli.js collections List the reference collections
node cli.js collection <name> Show one collection and its images
node cli.js outdir <folder> Change the central images folder
node cli.js debug on|off Verbose logging (logs\host.log)
node cli.js diagnose [link] [--selector CSS] [--max N] [--worker]
Page diagnostics
node cli.js reload Reload the Chrome extensionExamples:
node cli.js generate "a lighthouse at dawn, watercolor" --aspect 16:9
node cli.js generate "close only the eyes" --ref C:\path\to\portrait.png
node cli.js collect https://chatgpt.com/c/<chat id> --aspect 16:9Doctor
npx backdraw@latest doctor checks everything, changes nothing
npx backdraw@latest doctor --fix repairs what is safe to repair, then checks againdoctor prints one line per check, ✓ (fine), ⚠ (worth a look) or ✗ (broken), each with a one-line
fix:
Node.js version, the install folder, and that its files, the extension and this version match.
The host manifest and, for each installed browser, the registry entry it really reads (also from inside the Claude desktop app's MSIX sandbox).
Browser policies that switch off per-user native hosts (
NativeMessagingUserLevelHosts) or block them (NativeMessagingBlocklist). Only an administrator can change these.The bridge (named pipe), the extension and its version, the ChatGPT sign-in as the extension last saw it, and whether a Project is selected.
Every MCP client's Backdraw entry: there, and pointing to this install. It also says whether the Claude desktop app is running.
--fix rewrites the host manifest and the registry entries, and points client entries back at
this install (with a backup; the Claude desktop app only while it is closed). It says what it
couldn't fix. The output is safe to paste into an issue: your home folder is shown as ~, and
project names, prompts and chat links are never printed.
Troubleshooting
Problem | What to do |
Anything | Run |
| Chrome is closed, or the extension is not loaded or turned off. Open Chrome (the extension connects by itself) or turn Backdraw on at |
Red ! on the Backdraw icon | The extension can't reach the local host. The popup shows the error and the fix. Run |
| ChatGPT shows a login or a human verification (CAPTCHA). Open the ChatGPT tab in Chrome and finish it yourself; Backdraw never tries to get around it. The job waits up to 10 minutes for you; as soon as you finish, it continues by itself. After 10 minutes it fails and leaves the ChatGPT tab open. |
| ChatGPT drew a new picture instead of editing (a real edit keeps ~95-100% of the image). Ask again with the original in |
| ChatGPT lost track of the image in a long chat. Attach it with |
| A job gives up after about 10 minutes. If the result has a chat link, |
| Select one in the popup, or ask Claude to list and select your Projects. |
| The Project was deleted or renamed; select it again. |
Two Chrome profiles | The local bridge is one per Windows user, so load Backdraw in one Chrome profile only. |
For a detailed log, run node cli.js debug on and look at %USERPROFILE%\.backdraw\logs\host.log
(turn it off again with node cli.js debug off).
If the ChatGPT web UI changes
Backdraw drives the chatgpt.com web page, so a redesign can break it (for example, it can no longer find the message box).
Run
node cli.js diagnose(ornode cli.js diagnose <chat link>). It prints a summary of the page structure Backdraw sees;--selector CSSand--max Nnarrow it down,--workerlooks at the tab of the running job.The selectors live in
extension/inpage.js.After a fix, run
node install.jsagain: it copies the files and reloads the running extension.Please open an issue with what changed. Remove personal details (chat titles, project names, prompts) from the diagnose output first.
Updating
npx backdraw@latest setupFrom a manual install: git pull (or download the ZIP again), then node install.js.
Both copy the new files over the old ones, keep your settings, job history and collections, register everything again and reload the running extension. If Chrome was closed, it loads the new version when it starts.
Coming from the "ChatGPT image bridge" (1.x)? Setup (or node install.js) migrates it: it copies the
settings and job history from %USERPROFILE%\.claude\chatgpt-image-bridge (never overwriting) and
removes the old native host and the old chatgpt-images MCP entry. Then, at chrome://extensions,
remove the old "Claude ChatGPT Görsel Köprüsü" extension and load %USERPROFILE%\.backdraw\extension
instead; the extension ID stays the same. Delete the old folder by hand once Backdraw works.
Uninstall
npx backdraw@latest uninstall --dry-run shows what would be removed, changes nothing
npx backdraw@latest uninstall(From a manual install: node install.js --uninstall [--dry-run].) This removes the native host
registration of every browser, and the backdraw MCP entry from Claude Code, Codex, Cursor,
VS Code and Gemini CLI and, while Claude is closed, from the desktop app's config (each with a
backup), plus the names used by 1.x. Then remove the extension at chrome://extensions.
Your files are kept, in two places:
%USERPROFILE%\.backdraw: the program, your settings, the job history (with prompts), previews and logs.The images folder,
Pictures\Backdrawby default: your generated images and, underReferences, your reference collections. The dry run lists the folders actually used, and so doesnode cli.js statusbefore you uninstall.
Delete these folders by hand if you want them gone. Coming from 1.x? Delete
%USERPROFILE%\.claude\chatgpt-image-bridge too.
Privacy & security
Everything runs on your PC: no Backdraw server, no telemetry, no API key.
Backdraw never reads cookies, tokens or passwords, and never automates logins or CAPTCHAs: you complete them yourself.
The local bridge is a named pipe, not a network port, and the native host only accepts the Backdraw extension.
Prompts, job history, previews and logs stay in
%USERPROFILE%\.backdraw(data\andlogs\).reference_imagescan attach any local file whose name ends in.png,.jpg,.jpeg,.webpor.gifto a ChatGPT message. Review Backdraw's tool calls when Claude works with content you don't trust.
Details, the threat model and how to report a vulnerability: SECURITY.md.
MCP protocol support
2026-07-28 (stateless): no handshake; each request names its version in
_meta;server/discoveris supported.Legacy
initializehandshake: 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05.Tool titles and annotations, progress notifications,
notifications/cancelledand JSON-RPC batches. An unsupported version gets error-32022with the list of supported ones.
Disclaimer and responsible use
Personal use, your own account. Backdraw is made for one person generating images with their own ChatGPT account in their own Chrome. Don't use it to share an account, to generate images for other people as a service, or as the backend of a product.
OpenAI's terms. OpenAI's Terms of Use say you may not "automatically or programmatically extract data or Output", nor get around rate limits or protective measures. Backdraw drives the ChatGPT web page for you, so using it may conflict with these terms. Read them and decide for yourself.
The risk to your account is yours. OpenAI may limit, suspend or close an account it finds in breach of its terms. Backdraw comes without any warranty (MIT license), and its authors are not responsible for what happens to your account.
One job at a time, at a human pace. There is a single queue: one prompt in one background tab, and the next job starts only after the image is saved. Backdraw doesn't open parallel chats, doesn't resend prompts on its own (apart from the single re-ask of
auto_reattach) and stops at every login or human-verification page until you finish it yourself.Your normal limits apply. Every image counts toward your own ChatGPT usage limits.
Not affiliated with, endorsed or sponsored by OpenAI or Anthropic.
License
Available Tools
7 toolscancel_jobCancel a ChatGPT image jobADestructiveIdempotent
Cancel a queued or running ChatGPT image job. If ChatGPT is already generating, it presses Stop in the background tab and closes that tab.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id to cancel. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuine context beyond that: it explains the underlying mechanism (pressing Stop in the background tab and closing it), which tells the agent the in-progress output is abandoned and the tab is torn down.
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, both load-bearing: the first defines the action and its applicable states, the second explains the mechanism. Front-loaded with no padding.
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 mutation tool with full annotation coverage and no output schema, this is nearly complete: action, applicable job states, and side effects are all stated. Only the behavior on non-cancellable jobs (error vs. no-op) is left unstated.
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?
There is a single required parameter and schema coverage is 100%, so the description need not restate job_id. It adds no format, source, or lookup guidance for the id (e.g., from job_status or generate_image), so 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?
Specific verb+resource: "Cancel a queued or running ChatGPT image job" tells the agent exactly what is affected and over what states. It does not differentiate itself from siblings like job_status or fetch_images, though the verb makes the distinction largely self-evident.
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 scopes usage to queued or running jobs, which implies when the tool is applicable, but it never states when not to use it (e.g., already-completed or failed jobs) nor references job_status as the way to check state first. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_imagesFetch images from a ChatGPT conversationA
Download the generated images of the latest answer in an existing ChatGPT conversation (by its link) without sending anything. Use it when a job timed out or failed after ChatGPT had started, but the chat finished later, or to save images from an earlier chat. Like generate_image it returns within wait_seconds (default 45); if it says STILL RUNNING or QUEUED, keep calling job_status with its job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | No | Optional folder to also copy the image(s) into (absolute path preferred). | |
| aspect_ratio | No | Optional W:H (between 1:4 and 4:1, e.g. 16:9) to crop the downloaded images to, from the centre; the full images are kept too. For the result of a generate_image job, pass its aspect_ratio again. | |
| wait_seconds | No | Return within this many seconds. The default 45 keeps each call under the 60-second tool limit some clients have. If the job has not finished by then, the result says STILL RUNNING or QUEUED: call job_status with its job_id again. | |
| include_preview | No | Attach a downscaled preview. | |
| conversation_url | Yes | ChatGPT conversation link (https://chatgpt.com/…/c/…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the wait_seconds timing behavior, the STILL RUNNING/QUEUED return state, and the follow-up action with the job_id, which is the information an agent needs to drive this tool. It does not spell out that files are written to disk (readOnlyHint=false despite 'without sending anything'), which would have been helpful given the output_dir parameter.
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?
The key action and link requirement are front-loaded, followed by usage triggers and return behavior. It is dense but each clause (timeout/retry, earlier chat, wait_seconds, STILL RUNNING) contributes; only the 'Like generate_image' aside slightly compresses two ideas into one sentence.
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 five parameters, no output schema, and openWorldHint=true, the description covers the essential return semantics (timeout states, job_id) and the non-generating nature of the call. The gap is that file-writing side effects and the output_dir interplay are only implicit, which matters for a remote-fetch 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?
Schema coverage is 100%, so the schema already documents all five parameters thoroughly. The description reinforces wait_seconds' default and explains that aspect_ratio should be re-passed from a generate_image job, but adds little beyond that; 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?
The description states a specific verb and resource ('Download the generated images of the latest answer in an existing ChatGPT conversation (by its link)') and explicitly scopes it to non-generating retrieval ('without sending anything'), which separates it from siblings generate_image and job_status.
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 explicit triggers ('when a job timed out or failed... but the chat finished later', 'or to save images from an earlier chat') and routes the agent to job_status when the result is STILL RUNNING/QUEUED, so there is no ambiguity about when to use it or what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_imageGenerate or edit an image with ChatGPTA
Generate or edit an image with ChatGPT through the user's own logged-in ChatGPT account in Google Chrome (no OpenAI API key, no extra cost). A new chat is started inside the user's selected ChatGPT Project, in a background tab: the user's active tab, window focus, mouse and keyboard are never touched. Waits up to wait_seconds (default 45) and returns: SUCCESS with the saved file path(s) (always kept in the images folder), a preview and the conversation link; NEEDS REFERENCE IMAGE / CHATGPT REPLIED WITHOUT AN IMAGE together with ChatGPT's own reply text; or, while ChatGPT is still working, STILL RUNNING / QUEUED with a job id: then keep calling job_status with that job_id. Use it whenever the user asks for an image, visual, illustration or concept art with ChatGPT, in any language. Write a detailed, self-contained prompt (subject, style, composition, colors, mood); give the shape in aspect_ratio rather than in the prompt. To edit an image or keep a character consistent, pass the image file(s) in reference_images: a fresh chat with reference_images is the most reliable way to edit. To use one of the user's saved reference collections (see list_collections), pass reference_collection.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | Full image description or edit instructions, in any language. | |
| output_dir | No | Optional folder to also copy the image(s) into, e.g. the current project's assets folder (absolute path preferred). The central images folder always keeps a copy. | |
| send_as_is | No | Send the prompt verbatim, without the short instruction the bridge adds (useful to answer a question ChatGPT asked). | |
| aspect_ratio | No | Optional shape as W:H, e.g. 1:1, 3:2, 2:3, 4:3, 3:4, 16:9, 9:16, 4:5, 5:2 (Discord banner) or 3:1 (header). Any W:H with whole numbers between 1:4 and 4:1 works (not 1.5:1: use 3:2). ChatGPT draws 1:3 to 3:1 itself; wider or taller shapes are drawn at 3:1 / 1:3 and cropped. An image more than 1% off is cropped from the centre to this ratio (to the nearest pixel), and the full image is kept too. | |
| wait_seconds | No | Return within this many seconds. The default 45 keeps each call under the 60-second tool limit some clients have. If the job has not finished by then, the result says STILL RUNNING or QUEUED: call job_status with its job_id again. | |
| auto_reattach | No | If ChatGPT answers that it can't access the image and asks for it to be uploaded, attach the chat's latest image (or reference_images) automatically and ask once more. | |
| include_preview | No | Attach a downscaled preview of the result so you can check it. | |
| reference_files | No | Optional file names from list_collections to attach only those images of reference_collection, instead of the newest. | |
| conversation_url | No | Optional ChatGPT conversation link from an earlier result: the prompt is sent in that chat instead of a new one. Fine for quick follow-ups; for exact edits prefer reference_images in a fresh chat. | |
| reference_images | No | Optional local image files (png/jpg/webp/gif, up to 16) attached to the message, e.g. the image to edit or a character sheet. Paths saved by earlier calls work directly. | |
| reference_collection | No | Optional name of one of the user's Backdraw reference collections (see list_collections; matched loosely). Its images are attached after any reference_images, up to 16 references in total: over the limit the newest are used, unless reference_files picks others. | |
| transparent_background | No | Ask for a PNG with a transparent background (stickers, logos, icons, sprites). The result says whether the saved image really has transparent pixels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: no API key or extra cost, work happens in a background tab so the user's active tab and input are never touched, a bounded wait_seconds, and the complete result taxonomy (SUCCESS with saved paths, NEEDS REFERENCE IMAGE, CHATGPT REPLIED WITHOUT AN IMAGE, STILL RUNNING, QUEUED). It also discloses file placement and centre-cropping behavior, none of which the annotations convey. Nothing contradicts readOnlyHint=false / openWorldHint=true / idempotentHint=false.
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?
Front-loaded with purpose, then the safety guarantee, then the outcome handling — a sensible order with no filler. It is a dense single block that partly restates schema text (wait_seconds default 45, aspect_ratio cropping rules), which costs it a point on tightness.
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, asynchronous, open-world tool with no output schema, the description supplies exactly what is missing: the return statuses, the job_id continuation path, where files land, and how references interact with collections. An agent can drive the full poll loop without guessing.
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 coverage is 100%, so the baseline is 3, but the description adds genuine interpretive guidance: put shape in aspect_ratio rather than the prompt, use reference_images for edits and character consistency, and use reference_collection plus list_collections for saved sets. It stops short of explaining output_dir, send_as_is or auto_reattach, leaving those entirely 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?
Names a specific verb pair (generate/edit) plus the resource (an image) and the exact execution channel ('through the user's own logged-in ChatGPT account in Google Chrome'). It clearly separates itself from siblings like job_status, fetch_images and list_collections by describing a chat-driven creation workflow rather than polling, fetching or listing.
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 states 'Use it whenever the user asks for an image, visual, illustration or concept art... in any language', and routes to alternatives: keep calling job_status with the job_id for STILL RUNNING/QUEUED, see list_collections for saved reference sets, and prefer a fresh chat with reference_images over conversation_url for exact edits. This is a full when/when-not/alternative map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_statusChatGPT image job statusAIdempotent
Check a ChatGPT image job by job_id, waiting up to wait_seconds (default 45) for it to finish; call it again while the result says STILL RUNNING or QUEUED. Without job_id it reports the bridge itself: whether Chrome and the extension are connected, the selected ChatGPT project, the images folder, the queue and recent jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | Job id returned by generate_image (e.g. img_1a2b3c4d). | |
| wait_seconds | No | Return within this many seconds. The default 45 keeps each call under the 60-second tool limit some clients have. If the job has not finished by then, the result says STILL RUNNING or QUEUED: call job_status with its job_id again. | |
| include_preview | No | Attach the image preview when the job succeeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the 45-second default exists to stay under a 60-second client tool timeout, unfinished jobs require repeated polling rather than blocking, and the no-job_id branch returns concrete diagnostics (Chrome/extension connectivity, selected project, images folder, queue, recent jobs). The description is consistent with idempotentHint=true and destructiveHint=false, describing only reads and repeated safe polling.
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?
Front-loads the primary job-checking use, then the wait/poll contract, then the fallback no-argument mode. Dense but every clause carries actionable information, with no filler.
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 exists, yet the description names the exact sentinel results an agent must branch on (STILL RUNNING, QUEUED) and enumerates what the diagnostics mode returns. For a zero-required-parameter polling tool, nothing an agent needs in order to call it 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?
Even though schema coverage is 100%, the description supplies semantics the schema cannot: the origin of job_id, the rationale behind the 45-second default and the client timeout it avoids, and the crucial but non-obvious fact that omitting job_id switches the tool into bridge-diagnostics mode. That last point is a behavioral contract, not a restatement of 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 and resource ('Check a ChatGPT image job by job_id') plus a second distinct mode ('Without job_id it reports the bridge itself'). It names the result states (STILL RUNNING, QUEUED) and the connected sibling tool (generate_image) that produces the job_id, so an agent can distinguish it from cancel_job or fetch_images 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?
Gives clear call conditions: use it with a job_id from generate_image, and re-invoke while the result says STILL RUNNING or QUEUED. It also explains the no-argument diagnostic use case. It stops short of explicitly naming when to prefer cancel_job or fetch_images instead, so it is clear context rather than fully enumerated alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionsList Backdraw reference collectionsARead-only
List the reference collections the user saved in Chrome (right-click an image, "Add to Backdraw"): each with its image count, folder and files (newest first, with the site they came from). Pass a collection's name as generate_image's reference_collection to attach its images (up to 16 references; reference_files picks specific ones).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and scope are covered; the description adds genuinely new behavior by describing the return shape and ordering ('each with its image count, folder and files (newest first, with the site they came from)'). The only omission is any note on collection count/volume limits, which is minor for a zero-parameter listing 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?
Two sentences, purpose front-loaded, with the Chrome/right-click parenthetical explaining provenance rather than padding. The nested parentheses ('(right-click an image, "Add to Backdraw")' and '(up to 16 references; reference_files picks specific ones)') are dense but each carries real constraint 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?
There is no output schema, so the description must convey return values itself — and it does, listing per-collection fields, ordering, and the source-site detail. Combined with the annotations covering read-only/closed-world and the schema being empty, an agent has everything needed to call this and use the result.
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?
Zero input parameters, so the baseline is 4 and there is nothing in the schema to contradict. The description still adds downstream semantics by explaining that a returned collection name becomes generate_image's reference_collection value, tying the output to another tool's parameter.
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?
Specific verb + resource ('List the reference collections the user saved in Chrome') with the origin of that data spelled out (right-click an image, 'Add to Backdraw'), so an agent knows exactly what corpus this covers. It also enumerates the fields returned per collection (image count, folder, files newest first, source site), which separates it cleanly from list_projects and the job tools.
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 explicitly routes the agent forward: 'Pass a collection's name as generate_image's reference_collection to attach its images (up to 16 references; reference_files picks specific ones).' That names the sibling tool, the parameter to feed, and the alternative path for a subset of files. It stops short of stating when not to call this (e.g. when the user already named a collection), so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList ChatGPT projectsARead-only
List the Projects in the user's ChatGPT account (read from ChatGPT's sidebar in a background tab) and show which one is selected for images. Use it during setup.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds a genuinely useful behavioral detail — that this reads from a background tab in ChatGPT's sidebar — which explains why latency or tab state may matter. However, it omits what happens if no ChatGPT tab is open or no projects exist, leaving failure behavior undisclosed.
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?
One front-loaded sentence covering purpose, mechanism, and output, followed by a short usage cue. No wasted text, though the parenthetical slightly interrupts the main purpose statement.
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 zero-param, read-only, no-output-schema tool, the description is mostly adequate. But with no output schema, the agent would benefit from knowing the return shape (list of project names? IDs?) and what 'selected for images' looks like, plus prerequisites like having ChatGPT open.
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?
Zero parameters, so the baseline is 4. The description correctly implies no input is needed and describes the selection status surfaced as output ('show which one is selected for images').
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 (List) and resource (Projects in the user's ChatGPT account), which distinguishes it clearly from sibling select_project. The parenthetical about reading from ChatGPT's sidebar in a background tab adds useful implementation scope, though it doesn't explicitly name the sibling it contrasts with.
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?
'Use it during setup' gives only a loose temporal cue. It doesn't say when to prefer list_projects over select_project, nor what to do once results are returned. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_projectSelect the ChatGPT project for imagesAIdempotent
Select and remember the ChatGPT Project where new image chats are created. Pass the project name as shown in ChatGPT (matched loosely) or its https://chatgpt.com/g/g-p-…/project link.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Project link (alternative to name). | |
| name | No | Project name as shown in ChatGPT. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety signals (readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=true). The description adds useful behavioral context: the selection is remembered and affects future image chats, and the name is matched loosely. It does not detail authentication or error behavior, but it adds meaningful state semantics beyond 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?
Two sentences, front-loaded with the primary action and effect, followed by the two input modes. No wasted text.
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 simple state-setting tool with two optional parameters and no output schema, the description covers the essential action, persistence effect, and input formats. It could do slightly more on error handling or confirmation behavior, but it is otherwise complete.
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 coverage is 100%, so the schema already documents both parameters. The description adds important semantics beyond the schema by noting that the name is 'matched loosely' and that the URL is a project link of the form https://chatgpt.com/g/g-p-…/project.
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 description states a specific verb ('Select and remember') and resource ('ChatGPT Project'), plus the scope ('where new image chats are created'). It is clear, though it does not explicitly distinguish itself from sibling tools like list_projects.
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 usage by stating the project is where new image chats are created, and it explains the two input modes (name or URL). However, it gives no explicit guidance on when to use this instead of list_projects or how to recover from a failed match.
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.
7 tool updates
v0.1.0- First observed
cancel_job - First observed
fetch_images - First observed
generate_image - First observed
job_status - First observed
list_collections - First observed
list_projects - First observed
select_project
TDQS
Scored across 7 tools
Each tool targets a distinct operation (generation, polling, cancellation, fetching from an existing chat, project selection, collection listing). The only mild overlap is between fetch_images and job_status, since fetch_images itself spawns a pollable job, but the descriptions explicitly clarify the relationship.
Names mostly follow a verb_noun pattern (generate_image, cancel_job, fetch_images, list_projects, select_project, list_collections). job_status breaks the pattern as a noun_noun status reporter, a minor deviation that is still readable.
Seven tools is well-scoped for a browser-bridge image generator: one core action, one polling tool, one cancel, one fetch, and three small configuration/listing tools. Each earns its place.
The lifecycle is covered: generate, poll, cancel, recover via fetch_images, plus project and collection discovery. Minor gaps remain, such as managing reference collections (adding/removing) from within the MCP rather than via Chrome right-click.
Maintenance
Related MCP Connectors
Generate images from Claude, ChatGPT, Cursor and Codex with 12 top AI image models. Up to 4 images per call, SVG vectorization, background removal, upscaling and image-to-video. Remote MCP with OAuth, no API keys.
Generate images from Claude, ChatGPT, Cursor and Codex with 12 top AI image models and 10 tools: up to 4 images per call, SVG vectorization, editing and more. Remote MCP with OAuth, no API keys. Pay per image, no subscription.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Generate images with your own ChatGPT subscription (Plus, Pro or Team), without spending API credits
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI photo generation, editing, and video creation from MCP-compatible clients like Claude Desktop, Cursor, and Windsurf.87 npmMIT
- AlicenseAqualityCmaintenanceEnables Claude to generate and edit images using OpenAI's GPT Image models, with automatic model selection and local file saving.31MIT

Ads Optimiser MCP serverofficial
AlicenseAqualityBmaintenanceLets Claude Desktop, Claude Code, or any MCP client generate ad images and videos from chat, including batches from folders of local files, prompt lists, and pipelines. Sign-in uses an OAuth device flow with workspace-scoped, revocable tokens, and finished creatives can be saved back to your machine.1625 npmMIT- AlicenseAqualityBmaintenanceImage generation for Claude Code, Claude Desktop and any MCP client, using your existing ChatGPT subscription. Drives the already-signed-in Codex desktop app over the Chrome DevTools Protocol - no API key, and no Codex agent quota. Supports iterative refinement through a reusable conversation. Windows only; requires the Codex desktop app.2MIT