chatgpt-web-images
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., "@chatgpt-web-imagesGenerate 3 independent images of a futuristic city skyline and save the original files."
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.
ChatGPT Web Images 0.7.2
窗口无感(0.7.2)
车道用的是有头浏览器 + 窗口生在屏幕外,不是无头。实测(2026-09-21,隔离 profile 播种真实登录态):去掉 --headed 后 ChatGPT 直接返回 Cloudflare 的 Just a moment...,auth_state=browser_challenge,进不去应用。所以不要改成无头,有守卫钉着。
关键在于时机:隐藏只能在窗口已经存在之后做,而走到那一步要起两个子进程(open,再加一次给页面改标题的脚本),所以冷启动的车道会先在屏幕上闪几秒;四条车道同时冷启动就是四个窗口。现在窗口由 Chrome 在 --window-position=-32000,-32000 直接创建,一出生就在屏幕外。
实测对比(0.5 秒采样、150 秒冷启动 + 生成):
屏幕上的车道窗口 | |
只靠隐藏 | 最多 4 个 |
生在屏幕外 | 0 个 |
另外用 --hide-crash-restore-bubble 等开关掐掉 Chrome 自己的窗口:非正常退出后它会弹标题为 Restore pages? 的气泡,那个标题不是我们设的,找窗口匹配不到,于是永远藏不掉。
隐藏动作仍然保留(让车道也不出现在任务栏),失败只记 window_hidden=False,不影响任务。唯一会把窗口挪回屏幕的是 image_open——那是给你登录用的,check 之后会重新收起来。
Related MCP server: Image Generation MCP Server
对话连续性与出错可调整(0.7.0)
改图不用重头说。 continue_from=<job_id> 把追问发进那个任务自己的对话里,ChatGPT 仍然看得见之前的图,所以"保持版式、配色调深一点"这种说法能直接用。
image_generate({prompt: "保持版式,配色调深一点,标题换成深红", continue_from: "20260919-xxxx"})实测确认的三条机制:
对话属于账号,不属于浏览器 Profile。 同一登录的任意空闲车道都能接续同一个对话,不用等原车道空出来。
同一对话同时只允许一个写入者,避免两条追问在一个会话里交错;不相关的任务照常用其它车道。
追问自动钉到拥有该对话的登录账号;指定了别的账号会明确报
continue_wrong_account。
新开对话仍是默认行为,换个不相关的图就别用 continue_from。
出错要让 agent 能立刻调整(0.7.0)
答完但没出图 → 立刻失败,不再干等 15 分钟。判据取自真实 DOM:一个回合只有完成后才长出操作栏,
copy-turn-action-button是图片回合与文本回合的共同信号。明确回绝报generation_failed,其它情况报no_image_in_reply,两者都带回 ChatGPT 的原话(800 字符)。错误按"谁能处理"分类,结果里的
error.actionable_by:值
含义
例子
agent改提示词重投
no_image_in_reply、generation_failed、数量不符retry等一下重试即可
browser_timeout、busy、观察超时human需要人处理
login_required、browser_challenge、conversation_changed未知错误码一律归
human,绝不谎称 agent 能自行解决。
最大化并行:MCP 说明直接把规则讲出来(0.6.0)
MCP 的 server instructions 和工具描述现在显式写明四条,agent 不读 skill 也能拿到:
并发 = 车道数,不是账号数;
image_status给出每个登录的车道与负载。同一提示词的多张备选 → 一个
image_generate(count=N),一次网页请求出全部 N 张。多个不同提示词 → 一次
image_generate_batch,一次调用排满所有空闲车道。绝不串行:先把已知的活全部提交,再统一轮询;
submit → 等 → submit会让车道空转,这是批量变慢的主因。
新增与改动的工具:
// 一次排入整批不同提示词
image_generate_batch({
requests: [{prompt_file: "...p1.txt", name: "p1", request_id: "20260919-deck-p1"},
{prompt_file: "...p2.txt", name: "p2", request_id: "20260919-deck-p2"}],
output_dir: "C:/.../out"
})
// 一次等待整批,而不是一个一个 poll
image_poll({job_ids: [...], wait_seconds: 20, return_when: "all"}) // "any" 可提前取回先完成的批量提交先整体校验再统一入队,不会留下"半个批次";同 request_id 重发幂等。批量轮询里的未知 job_id 只在结果里标出来,不会让整批失败或空等。CLI 用重复的 --job-id 达到同样效果。
请求形状:一次多张 vs 多个任务(0.5.1)
count=N 让一次网页请求产出 N 张独立图片,早已支持(N=1..20),并非本轮新增。
判据很简单:
同一提示词要多张备选(一页 PPT 的若干方案)→ 一个
count=N请求。只占一条车道、只消耗账号一次请求额度,提交与导航的固定开销也只付一次。提示词确实不同(不同页、不同主题)→ 各自独立任务,这样能并行跑在多条车道上,也能各自成败。
同一个 output_dir 下 15 分钟内同时在途 3 个以上 count=1 任务时,提交结果会带 hint.code=consider_one_multi_image_request。它只是提醒,不改变行为;只统计在途任务,所以失败后的重投不会被误判成批量。
合并的代价要知道:N 张在一个任务里,少交付就整体记 partial,不像拆开时能各自成败。
并行度与账号均衡(0.5.0)
并发等于车道数,不等于账号数。一条车道 = 一个独立浏览器 Profile,一次一个任务。
account-scale --account-id primary --lanes 4一次把某个已登录账号扩到 4 条车道;减少数量时只停用不删除 Profile。auto 任务按登录账号均衡派发:某个账号已经在跑的任务更多时,它的空闲车道让另一个账号先拿。显式指定账号名仍然优先,并且可以落到该账号的任意一条车道。
空闲车道 5 分钟后主动关闭浏览器交还内存,下次有活从持久 Profile 重开,不需要重新登录。实测一条车道常驻约 0.6 GB,16 条就是约 10 GB,这条回收是大车道池可用的前提。
车道总数上限 16,限制来自本机内存,不是 ChatGPT。
status里logins给出每个账号的车道数、可用车道和在跑任务数。
吞吐与卡死修复(0.4.0)
暂停的任务不再长期占用它的账号。超过 120 秒无人处理就 parked:交回浏览器,保留同一账号、同一会话和已下载文件,排队任务立即继续。parked 不是失败,也不重发提示词。
parked 任务按 60/300/900 秒退避自动回到原会话重新观察,最多三次;仍不成功才等人处理,此时 next_action 为 inspect_account_then_resume。resume 只是让它重新排上队,不抢占正在跑的任务。
身份校验失败先强制重载记录在案的会话再判断,最多两次。此前刷新写在校验之后,恢复路径在真正需要它时永远走不到,resume 必然再次失败。
浏览器故障后的账号按 60/300/900 秒自动重检,最多三次;此前 browser_unhealthy 永不自检,一次抖动就让整条车道静默下线直到人工 account_check。
account-clone为同一个已登录账号增加独立 Profile 车道。并发上限来自「一个账号一个浏览器页面」,不是 ChatGPT 的限制。生成期间无新图时后台轮询放慢到 10 秒,减少浏览器子进程启动;出现图片后恢复 3 秒节奏。
并发与故障恢复修复
相同账号的待执行 open/check/select 操作合并;控制操作与任务交替执行,避免多个 agent 的检查请求挤占生成和下载。
MCP 等待使用异步休眠,不占用线程池等待名额。后台启动采用跨进程门锁与 20 秒启动预约;stop 标记阻止新版本客户端反复拉起后台。
浏览器准备或生成失败后,账号进入 browser_unhealthy,停止领取新单;检查浏览器并显式 account_check 成功后恢复。已有失败任务不自动重发。
queued 结果包含 blocking_accounts;status 包含 worker_version 和 worker_stalled。心跳存在但一次操作超过 300 秒会标记停滞,不强杀浏览器或重发请求。
resume 保留原账号、任务和会话,重新给予 15 分钟观察时间,并在确认提示词身份后刷新原会话一次。它不会重新发送提示词。
活动任务期间禁止切换账号;取消连续失败三次后暂停,保留错误,不无限重复操作。
默认返回精简文件信息;detail=true 查看完整记录。后台日志仅记任务阶段、账号别名及错误码,不记提示词、Cookie 或网页正文。
升级后后台 worker 需要在操作间隙重启以加载代码;已有 MCP 客户端需要重新加载或新会话才能获得新的异步等待行为。不要重启生产 AI Hub 或手动删除任务记录。
使用自己的 ChatGPT 网页账号生图,下载网页原图,只返回本地文件路径与文字元数据。非官方 Windows 本地自动化工具,需要 Python 3.11+、Node.js 18+、Chrome 和可生图账号。
多 agent 与多账号
所有 stdio MCP 客户端共用 SQLite 持久队列。每账号一个独立后台进程、独立 Profile,同时执行一个任务。多个 agent 可同时提交,空闲账号领取,其余排队。后台自主检查生成、下载和收尾,客户端断开不会终止任务。
并发上限等于车道数,不等于账号数。 一条车道是一个浏览器 Profile,一次只做一个任务;单个任务从提交到下载完通常要几分钟。想提高并发,给已登录账号加车道:
# 每个账号 4 条车道,合计 8 路并发
chatgpt-web-images account-scale --account-id primary --lanes 4
chatgpt-web-images account-scale --account-id secondary --lanes 4
# 每条新车道各做一次登录检查
chatgpt-web-images check --account-id primary-2扩容会新建独立 Profile 并复制该账号已保存的登录态,源账号必须先 check 过一次;缩容只停用车道,不删除 Profile。账号重新登录后,用 account-reseed --account-id primary-2 把新登录态同步给空闲车道。
auto 任务在登录账号之间均衡:正在跑得多的账号会让空闲车道先给另一个账号,这正是把压力摊到两个账号、少碰官方限流的手段。指定 account_id=primary 仍然可以钉死到某个账号,并落在它的任意车道上。
代价说清楚:ChatGPT 侧会看到同一账号的多个并发会话,与手工多开多个窗口等价;额度、限流和网页可用性仍由服务决定。加车道只让更多张图同时跑,不会让单张图更快。一条车道常驻约 0.6 GB 内存,空闲 5 分钟自动关闭回收。
支持本机的标准 stdio MCP 客户端,不等于认证所有 agent 或提供远程服务。两个账号的实际速度、额度和网页可用性仍由服务决定。
安装与初始化
在项目独立目录安装:
python -m venv .venv
& .\.venv\Scripts\python.exe -m pip install .
& .\.venv\Scripts\chatgpt-web-images.exe setupsetup 安装固定 Playwright CLI 0.1.19。每账号独立配置目录,settings.json 至少含绝对 data_dir、现有 cli_entry 和绝对 output_dir。第二个账号不能复制第一个的 auth_file 或登录状态。
所有客户端设置相同的 CHATGPT_WEB_IMAGES_POOL 绝对路径,建议在 C:\VibeData 下。未设置时优先读配置 pool_dir,回退到浏览器数据目录旁的 ChatGPTWebImagesPool。
chatgpt-web-images account-add --account-id primary --data-dir $primaryData --config-dir $primaryConfig
chatgpt-web-images account-add --account-id secondary --data-dir $secondaryData --config-dir $secondaryConfig
chatgpt-web-images open --account-id secondary
# 用户完成登录后:
chatgpt-web-images check --account-id secondary
chatgpt-web-images statusopen/check/select-account 异步执行;查看 accounts[].last_control 确认结果。account-enable --account-id secondary --disabled 停止领取新任务,不取消正在执行的任务;去掉 --disabled 恢复领取。
Claude、Codex 与其他客户端
客户端启动同一 Python 入口并指定同一队列。工具描述已内含排队和恢复规则,不依赖某个 agent 的私有 skill。无需 API key 或 Cookie 复制。
# Claude Code 用户级注册
claude mcp add --scope user --transport stdio chatgpt-web-images -e PYTHONIOENCODING=utf-8 -e "CHATGPT_WEB_IMAGES_POOL=$poolDir" -- $imagePython -m web_images mcp
# Codex:已用插件安装时不要重复注册
codex mcp add chatgpt-web-images --env PYTHONIOENCODING=utf-8 --env "CHATGPT_WEB_IMAGES_POOL=$poolDir" -- $imagePython -m web_images mcp其他客户端使用标准 mcpServers JSON:command 为安装环境 Python 绝对路径;args 为 ["-m","web_images","mcp"];env 含 PYTHONIOENCODING=utf-8 与 CHATGPT_WEB_IMAGES_POOL。源码安装可把 -m web_images 换为 scripts/web_images.py 的绝对路径。
默认 poll 等待 20 秒,最大 45 秒;浏览器操作在独立后台,不延长等待预算。建议客户端超时至少 60 秒。新会话/重新加载 MCP 后获得新版工具;已运行的旧服务不会自动更新。
工具与状态
工具 | 行为 |
image_generate | 持久入队,立即返回 job_id;account_id=auto 或指定账号;request_id 防重复;continue_from= 在原对话里追问 |
image_generate_batch | 一次排入整批不同提示词,立刻占满所有空闲车道;整体校验、按 request_id 幂等 |
image_poll | 读取/等待自己的任务;传 job_ids 一次等待整批,return_when=any 可提前取回 |
image_status | 缓存健康、后台存活、任务状态数量和账号操作结果 |
image_open | 异步打开指定账号专属浏览器 |
image_account_check | 用户登录后检查账号状态 |
image_select_account | 只选择用户授权的已记住账号,不处理密码或验证码 |
image_resume | 接续 needs_attention 或 parked 原任务,保持同一账号和请求身份 |
image_cancel | 按用户要求取消排队任务,或异步请求取消它自己的网页生成 |
prompt / UTF-8 prompt_file 二选一,参考图最多五个本地 PNG/JPEG/WebP,输出目录为绝对路径。count=1..20 是插件参数上限,不是网页额度保证。
状态为 queued → dispatching → running → complete;phase 是浏览器实际阶段。连续三次操作失败暂停;会话串线、参考文件改变、输出完整性异常也会停止继续操作。处理后显式 resume,不换账号重发。
needs_attention 仍暂停该账号,但只暂停 120 秒:之后转为 parked 交回车道,队列继续推进。parked 保留账号、会话和已存文件,按退避自动重新观察,结果里带 auto_retry_at 与 auto_retry_attempts_left;次数用完才需要人工检查后 resume。从未进入浏览器的任务 parked 后不自动重试,resume 会让它重新派发,start 通过持久请求索引保持幂等。
partial / count_mismatch / failed 明确返回,保留已有文件。完成结果再次读取会检查文件哈希,缺失或修改不能冒充成功。request_id 在整个队列中唯一,不自动过期;不同 agent 使用含日期和任务/席位的 ID。
旧任务与后台运维
旧活动任务保留所有权,不自动取消。import-legacy --account-id primary 把当前旧任务纳入后台观察,只接续查询、不重新提交。旧历史结果可用 poll --legacy --job-id ... 读取。
worker 退出后,下次 status/generate/poll 自动拉起。目前没有安装 Windows 开机自启;系统重启后第一次客户端调用恢复后台,磁盘队列保留。
运维停止某个 worker:在队列目录创建 stop- 文件,等其退出;删除该精确文件后下次调用恢复。不要终止其他浏览器或生产 Hub。
每个 worker 启动时清除其他 CHATGPT_WEB_IMAGES_* 环境覆盖,再设置自己的配置、数据和共享队列。登录态只保存在本机专属 Profile。队列含提示词、文件路径和任务记录,按本机私有数据管理,不提交到仓库。
验证
python scripts/test_web_images.py
python scripts/test_mcp_protocol.py
python scripts/test_image_pool.py
python scripts/test_pool_protocol.py
python scripts/test_account_contracts.py
python scripts/test_throughput.py
python scripts/test_account_browser.py模拟测试覆盖多客户端、双进程、去重、断开继续执行、故障隔离、取消与恢复,不代表真实账号生成成功。真实验收单独验证登录与原图下载。内部图片模型未核实,不宣称精确型号,不绕过网页校验或额度。
This server cannot be deployed
Maintenance
Related MCP Connectors
Generate images with your own ChatGPT subscription (Plus, Pro or Team), without spending API credits
Generate image thumbnails, resize, convert and compress photos from your AI chat. Local files.
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
AI image + video generation for agents: --flag prompt DSL, async generate/poll, x402 pay-per-use.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables image generation and editing via third-party relay services. Returns local file paths and Markdown display hints.-
- AlicenseNot gradedqualityCmaintenanceEnables image generation and editing via ChatGPT web without API keys, saving images locally with conversation-aware editing.10 npm2MIT
- AlicenseAqualityBmaintenanceEnables image generation and editing through OpenAI's gpt-image-2 model, supporting text-to-image, reference-guided generation, and editing with local files or URLs.275 npm2MIT
- AlicenseAqualityCmaintenanceEnables AI coding assistants like Codex, Claude Code, and ZCode to generate images through CLIProxy's ChatGPT image API, saving original images locally and returning previews.384 npmMIT