wj-mcp-server
Exposes WJ's image generation capabilities as a remote MCP plugin for ChatGPT Work, enabling users to generate images through natural language with OAuth 2.1 security and support for various models, aspect ratios, and reference images.
README
wj-mcp-server
把现有 WJ 生图能力开放为 ChatGPT Work 可连接的远程 MCP 插件。第一版没有团队、成员或后台管理概念,使用一个共享 OAuth 口令控制访问。
已实现
- 标准 MCP Streamable HTTP 端点:
POST /mcp - 图片创作能力只有
generate_image和edit_image,另提供只读的get_image_result结果恢复工具 - 每次工具调用只生成或编辑一张图;用户要求多图时,ChatGPT 应同时发起多个独立工具调用
- 每次成功结果保存到 Redis 30 天,GPT 或图片组件都可通过
get_image_result无额度恢复 - 工具文本同时返回原图链接,Widget 不可用时仍能打开结果
- 支持
nano-banana-2、常用宽高比、1K/2K/4K和参考图 URL - MCP Apps 图片组件,在支持的 ChatGPT 客户端中直接显示图片
- 不支持组件的客户端仍会收到 Markdown 图片和原图链接
- OAuth 2.1 授权码流程、PKCE、动态客户端注册和刷新令牌
- Redis 持久化 OAuth 数据、分钟/每日限额和登录防爆破
- 服务端 WJ Key,不向 ChatGPT 或浏览器泄露
- Docker Compose、健康检查和宝塔/Nginx 反代示例
调用链路
ChatGPT Work
-> HTTPS /mcp + OAuth
-> wj-mcp-server
-> POST https://wj.zaowuwujie.ltd/api/v1/proxy/ai/generate/image
-> wj-server / wj-ai-server / LiteLLM
-> public image URL
-> MCP Apps inline image component
wj-mcp-server 不直接请求 LiteLLM。它使用 WJ 开放平台接口,因此保留 WJ 已有的 Key、额度、日志和模型路由。
本地开发
要求 Node.js 22.13+、pnpm 11.16+ 和 Redis。
pnpm install
cp .env.example .env
pnpm secrets
把 pnpm secrets 输出的两行填入 .env,再设置:
NODE_ENV=development
PUBLIC_BASE_URL=http://127.0.0.1:6070
TRUST_PROXY=false
ALLOWED_HOSTS=127.0.0.1,localhost
REDIS_URL=redis://127.0.0.1:6379
WJ_API_KEY=你的WJ开放平台Key
MCP_SHARED_PASSWORD=至少12位的共享访问口令
启动:
pnpm dev
检查地址:http://127.0.0.1:6070/healthz。MCP Inspector 可用 pnpm inspect 启动,然后连接 http://127.0.0.1:6070/mcp。
Ubuntu 发布
推荐使用独立子域名,例如 mcp.wj.zaowuwujie.ltd,避免 OAuth 的 /auth、/token、/reg 等路径与现有网站冲突。
- 为子域名添加指向腾讯云服务器的 A 记录。
- 在宝塔新建该子域名的 Nginx 站点并申请 Let's Encrypt 证书。
- 把本项目上传到服务器,执行
cp .env.example .env。 - 执行
pnpm secrets,把输出写入.env。 - 设置
WJ_API_KEY、强共享口令、真实PUBLIC_BASE_URL和ALLOWED_HOSTS。 - 参考
deploy/nginx.conf.example配置反向代理;SSL 仍交给宝塔管理。 - 启动并检查:
docker compose up -d --build
docker compose ps
curl https://mcp.wj.zaowuwujie.ltd/healthz
curl https://mcp.wj.zaowuwujie.ltd/.well-known/oauth-protected-resource/mcp
不要把容器的 6070 端口直接暴露到公网。示例 Compose 只绑定 127.0.0.1:6070,公网统一经过 HTTPS Nginx。
在 ChatGPT Work 中连接
- 打开“工作”模式,进入“连接插件”或插件管理页。
- 选择“新插件”。
- 名称填
WJ 生图。 - 服务器 URL 填
https://mcp.wj.zaowuwujie.ltd/mcp。 - 身份验证选择
OAuth。 - 勾选自定义 MCP 风险确认后创建。
- 浏览器会打开 WJ 授权页,输入
.env中的MCP_SHARED_PASSWORD,再确认授权。
每个互不关联的 ChatGPT 账号都重复一次连接即可。成员不需要也不应拿到 WJ_API_KEY。只知道 MCP URL 的人会收到 401,没有共享口令无法取得访问令牌或调用生图。
推荐使用规则见 docs/chatgpt-instructions.md。显式说“使用 WJ 生图”可以稳定触发;ChatGPT 内置生图限流后的回退取决于平台是否把失败暴露给模型,MCP 服务本身无法读取账号内部额度。
生成多张图片时,ChatGPT 应为每张图片分别调用一次 generate_image,并在同一个工具调用轮次中并发发出,不能等待上一张完成后再开始下一张。同提示词变体在每次调用中复用相同提示词,不同图片则分别保留各自提示词。服务端通过 IMAGE_MAX_CONCURRENCY 限制每个 OAuth 插件终端实际同时请求 WJ 的数量,默认每个终端 10 个;不同终端使用彼此独立的并发队列。
每次成功调用都会返回 resultId、expiresAt 和原图链接。结果默认在 Redis 中保存 30 天;如果 ChatGPT 的图片组件没有拿到完整结果,组件会自动调用 get_image_result,GPT 也可以根据 resultId 主动调用该工具并重新展示图片。模型仍可使用返回文本中的原图链接,不能因为组件没有显示而重新生成。恢复操作不会请求 WJ,也不会消耗图片额度。
运维与安全
- 泄露共享口令时,修改
MCP_SHARED_PASSWORD,并清理 Redis 中的 OAuth 状态后让成员重新连接。只修改口令不会撤销已经签发的刷新令牌。 - 泄露 WJ Key 时,在 WJ 开放平台撤销并重发。不要把真实 Key 提交到 Git。
IMAGE_MAX_CONCURRENCY是每个 OAuth 插件终端的并发上限,不是整个服务的共享上限。图片请求不再额外设置每分钟或每日限制。- 图片 CDN 改变时,把新 HTTPS Origin 加入
IMAGE_RESOURCE_DOMAINS,否则 ChatGPT Widget 的 CSP 会阻止图片加载。 - 建议备份 Docker volume
redis-data,否则恢复后需要成员重新授权。
验证
pnpm check
该命令依次运行 TypeScript 检查、自动化测试、MCP Apps 单文件构建和服务端构建。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。