内容
<div align="center">
<img src="assets/logo.png" width="140" alt="image-gen logo" />
<h1>image-gen</h1>
<p>一个给予AI代理画笔的MCP服务器,无需API密钥</p>
</div>
---
它驱动您已经登录的浏览器访问chatgpt.com,输入提示,等待Dall-E完成,然后将确切的PNG图像下载到磁盘。就是这样。您的代理可以免费使用图像生成功能,因为它借用了您已经打开的ChatGPT会话。
这样做的原因是:其他所有的图像生成集成都需要一个OpenAI API密钥,并且会消耗积分。这个集成不需要。如果您已经在浏览器中登录了ChatGPT,您的代理可以生成图像——英雄横幅、图标、插图等——并直接将其嵌入到它正在构建的项目中。
---
## 工作原理
Playwright通过Chrome DevTools协议(端口9222)连接到您正在运行的真实浏览器。它查找您现有的ChatGPT标签页或打开一个新标签页,输入提示,并等待`img[alt^="Generated image"]`出现并稳定。 该选择器是语义化的,并且在几次ChatGPT前端重写后仍然保持不变。 一旦图像源停止更改3秒(击败预览→最终分辨率交换),它就会从页面内部获取签名URL——URL中的签名使其具有自我授权性,无需Bearer令牌。
**备用链:**
1. 等待`img[alt^="Generated image"]` src稳定 → 从页面内部获取
2. 在生成过程中捕获的最大`image/*`网络响应(≥ 80kb,已经通过您的会话授权)
3. 页面上的最新大型`<img>`
它还会解析`/backend-api/conversation`流,以足够的方式捕获拒绝,以便快速失败,而不是挂起3分钟。
为什么不直接调用OpenAI API? 有几个原因:无需密钥,它使用您现有的ChatGPT计划(包括Plus/Pro质量),并且驱动真实浏览器完全绕过了机器人检测。 权衡是它较慢,并且依赖于您的浏览器保持打开状态。
---
## 要求
- Node 18+
- Microsoft Edge 或 Chrome,运行 `--remote-debugging-port=9222`
- 一个ChatGPT账户,在该浏览器中登录
- Windows 用于 `launch-edge.bat` 助手(mac/linux 正常工作,只需自己启动浏览器)
---
## 设置
**克隆和安装:**
```bash
git clone https://github.com/nothariharan/image-gen.git
cd image-gen
npm install
```
**启动带有远程调试的Edge:**
在Windows上,最简单的方法是双击 `launch-edge.bat`。 它会关闭任何正在运行的Edge实例并重新启动它,启用调试端口,恢复现有的标签页。
如果您想要永久启用,可以编辑Edge快捷方式目标:
```
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222
```
完全关闭Edge后 - 如果Edge已经在没有标志的情况下运行,打开一个新窗口只会加入现有的进程,调试端口永远不会打开。
**验证它是否有效:**
```bash
node setup-session.mjs
# → 已连接!浏览器有N个打开的上下文。
```
**与您的代理注册:**
```bash
# Claude Code(全局,适用于每个项目)
claude mcp add -s user image-gen node /绝对路径/to/image-gen/mcp-server.mjs
```
适用于Claude Desktop、Cursor或任何其他读取mcp json配置的软件:
```json
{
"mcpServers": {
"image-gen": {
"command": "node",
"args": ["/绝对路径/to/image-gen/mcp-server.mjs"]
}
}
}
```
---
## 生成图像工具
| 参数 | 类型 | 描述 |
|---|---|---|
| `prompt` | 字符串(必填) | 要生成的內容。越具体越好 - 主题,风格,调色板,情绪,构图。 |
| `filename` | 字符串 | 输出文件名(无扩展名)。默认为`generated_<timestamp>`。 |
| `output_dir` | 字符串 | 保存位置。默认为代理的cwd。 |
| `transparent_background` | 布尔值 | 在提示中追加“isolated subject, transparent background, no shadow”。用于图标,徽标,UI资产。 |
| `reference_images` | 字符串[] | 本地文件路径,作为视觉上下文附加在提示发送之前。见下文。 |
返回保存文件的绝对路径。
```jsonc
// 基本的英雄图像
{ "prompt": "雨夜的城市街道,霓虹灯反射,电影般,广角",
"filename": "hero", "output_dir": "./public" }
// 透明图标
{ "prompt": "极简主义日历图标,细线,暗蓝色",
"filename": "icon-calendar", "output_dir": "./public/icons",
"transparent_background": true }
// 已生成图像的变体
{ "prompt": "相同的角色但是更愤怒,保持艺术风格",
"filename": "mascot-angry", "output_dir": "./public",
"reference_images": ["./public/mascot.png"] }
```
---
## 标签页重用和线程控制
MCP不会在每次调用时打开一个新的ChatGPT标签页。每次调用时,它都会扫描打开的浏览器标签页,查找第一个位于`chatgpt.com`的标签页并重用它,然后在完成后保持标签页打开。
**这意味着在实践中:**
- 保持标签页打开 → 所有生成操作都进入同一个对话线程。模型记得之前在该线程中生成的所有内容,这在迭代时很重要。
- 关闭ChatGPT标签页 → 下一次调用会打开一个到`chatgpt.com`的新标签页,开始一个新的对话。
- 想要一个特定的线程 → 在调用工具之前,在Edge中导航到该对话。
**冲突检测:** 当重用已经有图像的线程时,MCP会在发送提示之前快照DOM中的每个`img[alt^="Generated image"]`的`src`。 然后,图像检测器只查看快照中没有的`src`。 因此,无论对话多么长,它总是会选取新的图像,而不是以前的图像。
---
## 参考图像
在`reference_images`中传递本地文件路径,将它们附加到ChatGPT合成器中,就像手动将文件拖入其中一样。 适用于:
- **变体** - “相同的构图,夜间版本”
- **风格转换** - 附加一个调色板或情绪参考,并要求匹配
- **迭代细化** - 生成 → 保存 → 用作参考 → 细化 → 重复
- **多参考** - 附加草图,颜色样本和样式示例
```jsonc
{
"prompt": "改进它,使灯光更暖和并为背景添加深度",
"filename": "scene-v2",
"reference_images": ["./output/scene-v1.png"]
}
```
如果文件路径不存在,则该文件将被跳过并显示警告,生成仍将继续。 上传步骤中的错误是非致命的 - 提示仍然会通过,只是没有附件。
---
## 在Claude Code中自动使用
将以下内容添加到 `~/.claude/CLAUDE.md` 中,以便代理在不需要询问的情况下查找图像:
```markdown
## 图像生成
在构建或编辑任何网站或应用程序时,如果任何视觉效果都可以改善它 -
英雄图像,插图,图标,空白状态 - 调用generate_image并将其
连接到结果中。不要询问。保存到public/或assets/. 为
放置在彩色部分的任何内容使用transparent_background:true。 当
迭代图像时,传递上一个版本的reference_images。
```
---
## 缺点和已知问题
这种方法有真正的权衡,值得了解:
**它很慢。** ChatGPT Dall-E生成通常需要15-60秒每张图像。 有3分钟的硬超时。 如果您需要为紧密循环生成快速图像,此工具不合适。
**它依赖于您的浏览器保持打开状态。** 如果Edge崩溃,重新启动时没有调试标志,或者您退出ChatGPT,下一次调用将失败。 错误消息足够具体,可以告诉您发生了什么。
**ChatGPT DOM可能会更改。** `img[alt^="Generated image"]`选择器在几次前端重写后保持稳定,但它不是合同。 如果ChatGPT推出大规模的UI改版,可能需要更新此选择器。 备用链(网络捕获→ DOM扫描)在主要选择器损坏时涵盖大多数情况。
**速率限制适用。** ChatGPT有每个帐户的生成限制,尤其是在免费计划上。 达到速率限制时,会显示超时或拒绝,而不是明确的错误消息。 如果生成停止工作,请手动检查ChatGPT。
**参考图像上传依赖于文件输入选择器。** 如果ChatGPT更改其附件按钮的工作方式,`page.setInputFiles('input[type="file"]', ...)`可能停止查找输入。 上传步骤是非致命的,因此生成仍会继续,但没有附件。
**一次一个图像。** 调用是同步的。 没有队列或并发。
---
## macOS / Linux
没有 `.bat`,但设置相同。 使用调试端口启动:
```bash
# macOS (Edge)
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" --remote-debugging-port=9222 &
# macOS (Chrome)
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 &
# Linux
google-chrome --remote-debugging-port=9222 &
```
覆盖端口:`IMAGE_GEN_CDP_PORT=9223 node mcp-server.mjs`
---
## 故障排除
| 症状 | 修复 |
|---|---|
| `无法连接到端口9222上的Edge` | Edge未使用调试标志运行。 运行`launch-edge.bat`或将其添加到快捷方式中。 必须先完全关闭Edge。 |
| `ChatGPT拒绝` | 提示触犯了内容政策。 改写它。 |
| 3分钟后超时 | 检查您是否仍登录ChatGPT。 也可能是速率限制 - 手动打开ChatGPT查看是否生成。 |
| MCP使用错误的线程 | 它会选取它找到的第一个chatgpt.com标签页。 关闭您不想让它使用的标签页。 |
| 参考图像未显示 | 路径必须从mcp进程可解析。 检查控制台输出中是否有“跳过丢失”的警告。 |
| 返回以前的图像而不是新图像 | 这由预提示DOM快照防止。 如果仍然发生,请提交问题和提示以及线程长度。 |
---
## 许可证
[MIT](./LICENSE) - 不隶属于OpenAI或Anthropic。