image-generate-mcp-remote 0.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- image_generate_mcp_remote-0.9.1/.env.example +19 -0
- image_generate_mcp_remote-0.9.1/.github/workflows/release.yml +66 -0
- image_generate_mcp_remote-0.9.1/.gitignore +9 -0
- image_generate_mcp_remote-0.9.1/.python-version +1 -0
- image_generate_mcp_remote-0.9.1/AGENTS.md +96 -0
- image_generate_mcp_remote-0.9.1/LICENSE +21 -0
- image_generate_mcp_remote-0.9.1/PKG-INFO +287 -0
- image_generate_mcp_remote-0.9.1/README.md +266 -0
- image_generate_mcp_remote-0.9.1/SYSTEMD_DEPLOYMENT_GUIDE.md +260 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/__init__.py +3 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/config.py +246 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/contracts/__init__.py +1 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/contracts/enums.py +56 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/contracts/image_size.py +131 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/contracts/requests.py +31 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/errors.py +56 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/models/common.py +147 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/server.py +209 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/storage.py +69 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/tools/__init__.py +1 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/tools/catalog.py +95 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/tools/gpt_image_2_official.py +377 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/tools/gpt_image_2_url.py +218 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/tools/nano_banana_2_official.py +379 -0
- image_generate_mcp_remote-0.9.1/image_generate_mcp_remote/tools/size_normalization.py +14 -0
- image_generate_mcp_remote-0.9.1/pyproject.toml +40 -0
- image_generate_mcp_remote-0.9.1/tests/test_catalog.py +35 -0
- image_generate_mcp_remote-0.9.1/tests/test_gpt_image_2_official.py +174 -0
- image_generate_mcp_remote-0.9.1/tests/test_gpt_image_2_url.py +193 -0
- image_generate_mcp_remote-0.9.1/tests/test_nano_banana_2_official.py +131 -0
- image_generate_mcp_remote-0.9.1/tests/test_server.py +9 -0
- image_generate_mcp_remote-0.9.1/uv.lock +868 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
IMG_GEN_GPT_IMAGE_2_OFFICIAL_API_KEY=
|
|
2
|
+
IMG_GEN_GPT_IMAGE_2_OFFICIAL_BASE_URL=https://www.uocode.com/v1
|
|
3
|
+
IMG_GEN_GPT_IMAGE_2_OFFICIAL_MODEL=gpt-image-2
|
|
4
|
+
IMG_GEN_GPT_IMAGE_2_OFFICIAL_SUPPORTED_MODELS=gpt-image-2
|
|
5
|
+
|
|
6
|
+
IMG_GEN_NANO_BANANA_2_OFFICIAL_API_KEY=
|
|
7
|
+
IMG_GEN_NANO_BANANA_2_OFFICIAL_BASE_URL=https://www.uocode.com
|
|
8
|
+
IMG_GEN_NANO_BANANA_2_OFFICIAL_MODEL=gemini-3.1-flash-image-preview
|
|
9
|
+
IMG_GEN_NANO_BANANA_2_OFFICIAL_SUPPORTED_MODELS=gemini-3.1-flash-image-preview
|
|
10
|
+
|
|
11
|
+
IMG_GEN_GPT_IMAGE_2_URL_API_KEY=
|
|
12
|
+
IMG_GEN_GPT_IMAGE_2_URL_BASE_URL=https://www.right.codes/draw/v1
|
|
13
|
+
IMG_GEN_GPT_IMAGE_2_URL_MODEL=gpt-image-2-vip
|
|
14
|
+
IMG_GEN_GPT_IMAGE_2_URL_SUPPORTED_MODELS=gpt-image-2-vip
|
|
15
|
+
|
|
16
|
+
IMAGE_OUTPUT_DIR=storage/images
|
|
17
|
+
IMAGE_BASE_URL=
|
|
18
|
+
IMAGE_HTTP_TIMEOUT_SECONDS=600
|
|
19
|
+
LOG_LEVEL=INFO
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types:
|
|
6
|
+
- published
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
publish:
|
|
11
|
+
name: Build and publish package
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
environment: pypi
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
id-token: write
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Check out repository
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.11"
|
|
26
|
+
|
|
27
|
+
- name: Set up uv
|
|
28
|
+
uses: astral-sh/setup-uv@v6
|
|
29
|
+
with:
|
|
30
|
+
enable-cache: true
|
|
31
|
+
|
|
32
|
+
- name: Install project dependencies
|
|
33
|
+
run: uv sync --frozen --extra dev
|
|
34
|
+
|
|
35
|
+
- name: Run tests before publish
|
|
36
|
+
run: uv run pytest
|
|
37
|
+
|
|
38
|
+
- name: Build distributions
|
|
39
|
+
run: uv build --no-sources
|
|
40
|
+
|
|
41
|
+
- name: Detect publish mode
|
|
42
|
+
id: publish-mode
|
|
43
|
+
env:
|
|
44
|
+
UV_PUBLISH_TOKEN: ${{ secrets.UV_PUBLISH_TOKEN }}
|
|
45
|
+
run: |
|
|
46
|
+
if [ -n "$UV_PUBLISH_TOKEN" ]; then
|
|
47
|
+
echo "mode=token" >> "$GITHUB_OUTPUT"
|
|
48
|
+
else
|
|
49
|
+
echo "mode=trusted" >> "$GITHUB_OUTPUT"
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
- name: Upload distributions to release
|
|
53
|
+
if: github.event_name == 'release'
|
|
54
|
+
env:
|
|
55
|
+
GH_TOKEN: ${{ github.token }}
|
|
56
|
+
run: gh release upload "${{ github.event.release.tag_name }}" dist/* --clobber
|
|
57
|
+
|
|
58
|
+
- name: Publish distributions to PyPI with token
|
|
59
|
+
if: ${{ steps.publish-mode.outputs.mode == 'token' }}
|
|
60
|
+
env:
|
|
61
|
+
UV_PUBLISH_TOKEN: ${{ secrets.UV_PUBLISH_TOKEN }}
|
|
62
|
+
run: uv publish
|
|
63
|
+
|
|
64
|
+
- name: Publish distributions to PyPI with trusted publishing
|
|
65
|
+
if: ${{ steps.publish-mode.outputs.mode == 'trusted' }}
|
|
66
|
+
run: uv publish
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# AGENTS Handbook (image-generate-mcp-remote)
|
|
2
|
+
|
|
3
|
+
本文件定义 `image-generate-mcp-remote/` 范围内的 Python 编码规范。
|
|
4
|
+
|
|
5
|
+
## 1) 类型标注总原则
|
|
6
|
+
|
|
7
|
+
- 所有 Python 函数的入参、返回值必须显式标注类型。
|
|
8
|
+
- 所有类变量、实例变量必须显式标注类型。
|
|
9
|
+
- 禁止在业务代码的函数入参、返回值、类变量定义中直接使用 `Any`。
|
|
10
|
+
- 若能确定具体类型,必须写具体类型;不得为了省事退化成 `Any`、`object`、宽泛 `dict` 或宽泛 `list`。
|
|
11
|
+
|
|
12
|
+
## 2) JSON 相关类型约定
|
|
13
|
+
|
|
14
|
+
涉及通用 JSON 数据时,统一优先使用以下类型别名语义:
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
from typing import TypeAlias
|
|
18
|
+
|
|
19
|
+
JSONScalar: TypeAlias = str | int | float | bool | None
|
|
20
|
+
JSONValue: TypeAlias = JSONScalar | list["JSONValue"] | dict[str, "JSONValue"]
|
|
21
|
+
JSONMap: TypeAlias = dict[str, JSONValue]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- 若值可明确为某个结构体,不得继续使用 `JSONMap` 兜底,必须定义真实类型。
|
|
25
|
+
- `JSONScalar` 仅用于确属标量的值;不要把有明确业务含义的字段长期保留为裸 `str` 或裸 `int`。
|
|
26
|
+
|
|
27
|
+
## 3) 枚举与常量
|
|
28
|
+
|
|
29
|
+
- 若某字段是字符串枚举或数字枚举,必须定义枚举类型,不得在代码中散落魔法字面量。
|
|
30
|
+
- 字符串枚举优先使用 `StrEnum`;数字枚举按语义使用 `IntEnum` 或 `Enum`。
|
|
31
|
+
- 真正使用该值时,应引用枚举成员,而不是再次手写原始字串或数字。
|
|
32
|
+
- 若某值是固定定值且具有明确业务意义,必须提取为命名常量,不得直接硬编码。
|
|
33
|
+
|
|
34
|
+
示例:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from enum import StrEnum
|
|
38
|
+
|
|
39
|
+
REQUEST_STATUS_PENDING = "pending"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class RequestStatus(StrEnum):
|
|
43
|
+
PENDING = "pending"
|
|
44
|
+
RUNNING = "running"
|
|
45
|
+
DONE = "done"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- 若该值属于“有限候选集合”,优先建枚举。
|
|
49
|
+
- 若该值属于“单一协议常量 / 元数据键 / 固定开关值”,优先建常量。
|
|
50
|
+
|
|
51
|
+
## 4) 结构化参数与返回值
|
|
52
|
+
|
|
53
|
+
- 若函数参数本质上是一个固定结构,不得使用 `tuple[...]` 位置拼装多个值传递业务语义。
|
|
54
|
+
- 不得使用 `dict[str, Any]`、`dict[str, object]` 表达稳定结构的入参或返回值。
|
|
55
|
+
- 对于稳定结构,必须定义真实类型,如 `dataclass`、`pydantic.BaseModel`、具名类。
|
|
56
|
+
- 若返回值包含多个具名字段,同样优先返回结构化对象,而不是匿名元组或宽泛字典。
|
|
57
|
+
|
|
58
|
+
推荐方向:
|
|
59
|
+
|
|
60
|
+
- 领域/服务层稳定载荷:优先 `dataclass` 或 `pydantic.BaseModel`
|
|
61
|
+
- 配置对象:优先 `BaseModel` 或明确配置类
|
|
62
|
+
- 协议对象:优先具名模型类与类型别名组合
|
|
63
|
+
|
|
64
|
+
## 5) 宽泛类型禁用清单
|
|
65
|
+
|
|
66
|
+
以下写法在本目录范围内默认禁止,除非是三方库边界适配且无法收窄:
|
|
67
|
+
|
|
68
|
+
- `Any`
|
|
69
|
+
- `dict[str, Any]`
|
|
70
|
+
- `list[Any]`
|
|
71
|
+
- `tuple[Any, ...]`
|
|
72
|
+
- 无业务语义的裸 `object`
|
|
73
|
+
|
|
74
|
+
如确实处于外部系统边界,必须先在边界层完成解析、校验、收窄,再进入业务代码。
|
|
75
|
+
|
|
76
|
+
## 6) 建模要求
|
|
77
|
+
|
|
78
|
+
- 参数一旦存在业务名称、业务约束、字段含义,就应建模,不要把结构藏在 tuple 下标或 dict key 里。
|
|
79
|
+
- 类字段类型应直接表达真实含义,例如状态、模式、资源类型、事件名,应优先使用枚举或具名类型。
|
|
80
|
+
- 不允许因为“当前先跑通”而省略类型;类型本身就是可读性与可靠性的一部分。
|
|
81
|
+
|
|
82
|
+
## 7) 代码评审判定标准
|
|
83
|
+
|
|
84
|
+
出现以下情况,视为不符合本规范:
|
|
85
|
+
|
|
86
|
+
- 新增函数参数或返回值含 `Any`
|
|
87
|
+
- 新增类字段使用 `Any`
|
|
88
|
+
- 业务枚举值仍以裸字符串/裸数字直接流转
|
|
89
|
+
- 固定结构仍以 `tuple`、`dict[str, Any]`、匿名字典传递
|
|
90
|
+
- 明明可以写成具体类型,却退化为宽泛类型
|
|
91
|
+
|
|
92
|
+
## 8) 落地优先级
|
|
93
|
+
|
|
94
|
+
- 第一优先级:新增代码必须完全遵守本规范。
|
|
95
|
+
- 第二优先级:修改旧代码时,若触达相关函数、模型、字段,应顺手把对应类型收窄到本规范要求。
|
|
96
|
+
- 第三优先级:所有新增协议常量、状态值、事件值、模式值,应在首次引入时完成枚举或常量化。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: image-generate-mcp-remote
|
|
3
|
+
Version: 0.9.1
|
|
4
|
+
Summary: Remote MCP server for image generation
|
|
5
|
+
Project-URL: Homepage, https://github.com/zztdandan/image-generate-mcp-remote
|
|
6
|
+
Project-URL: Repository, https://github.com/zztdandan/image-generate-mcp-remote
|
|
7
|
+
Project-URL: Issues, https://github.com/zztdandan/image-generate-mcp-remote/issues
|
|
8
|
+
License: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Python: >=3.11
|
|
11
|
+
Requires-Dist: httpx>=0.28.0
|
|
12
|
+
Requires-Dist: mcp[cli]>=1.12.0
|
|
13
|
+
Requires-Dist: pydantic-settings>=2.10.0
|
|
14
|
+
Requires-Dist: pydantic>=2.11.0
|
|
15
|
+
Requires-Dist: python-dotenv>=1.1.0
|
|
16
|
+
Provides-Extra: dev
|
|
17
|
+
Requires-Dist: pytest-asyncio>=1.0.0; extra == 'dev'
|
|
18
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
19
|
+
Requires-Dist: ruff>=0.12.0; extra == 'dev'
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# image-generate-mcp-remote
|
|
23
|
+
|
|
24
|
+
一个基于 UV + Python 的远程 MCP 图片生成服务,统一封装 OpenAI Images 兼容接口与 Gemini `generateContent` 生图接口。
|
|
25
|
+
|
|
26
|
+
> 本子项目运行时复用工作区根目录 `.venv`。在本目录执行 `uv` 命令时,会通过工作区环境注入使用统一虚拟环境。
|
|
27
|
+
|
|
28
|
+
## 项目能力
|
|
29
|
+
|
|
30
|
+
- 提供 `gpt_image_2_official` 工具,兼容 OpenAI Images 风格的文生图与参考图编辑
|
|
31
|
+
- 提供 `nano_banana_2_official` 工具,兼容 Gemini `generateContent` 风格的文生图与参考图编辑
|
|
32
|
+
- 提供 `gpt-image-2-url` 工具,兼容 `https://www.right.codes/draw/v1/images/generations` 并自动下载返回图片 URL
|
|
33
|
+
- 提供 `list_image_tools_catalog` 工具,用于输出当前服务的默认配置、有效模型与非敏感环境变量信息
|
|
34
|
+
- 默认网关已切换到 `uocode`
|
|
35
|
+
|
|
36
|
+
## 默认上游配置
|
|
37
|
+
|
|
38
|
+
### OpenAI Images 兼容
|
|
39
|
+
|
|
40
|
+
- 默认 `BASE_URL`:`https://www.uocode.com/v1`
|
|
41
|
+
- 默认模型:`gpt-image-2`
|
|
42
|
+
- 典型接口:
|
|
43
|
+
- `POST /v1/images/generations`
|
|
44
|
+
- `POST /v1/images/edits`
|
|
45
|
+
|
|
46
|
+
### Gemini 原生兼容
|
|
47
|
+
|
|
48
|
+
- 默认 `BASE_URL`:`https://www.uocode.com`
|
|
49
|
+
- 默认模型:`gemini-3.1-flash-image-preview`
|
|
50
|
+
- 典型接口:
|
|
51
|
+
- `POST /v1beta/models/{model}:generateContent`
|
|
52
|
+
|
|
53
|
+
## 安装与启动
|
|
54
|
+
|
|
55
|
+
## 通过 uv 安装使用
|
|
56
|
+
|
|
57
|
+
`uv` 本身没有单独的“官方包仓库”,常规做法是把包发布到 `PyPI`,然后让用户通过 `uv` 直接下载运行。
|
|
58
|
+
|
|
59
|
+
当 `v0.9.1` 发布到 `PyPI` 后,可直接这样使用:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 临时运行,不落本地项目源码
|
|
63
|
+
uvx image-generate-mcp-remote --transport stdio
|
|
64
|
+
|
|
65
|
+
# 或安装为全局工具
|
|
66
|
+
uv tool install image-generate-mcp-remote
|
|
67
|
+
image-generate-mcp-remote --transport stdio
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 1. 安装依赖
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
uv sync
|
|
74
|
+
cp .env.example .env
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. 配置环境变量
|
|
78
|
+
|
|
79
|
+
至少填写你要使用的工具对应 API Key:
|
|
80
|
+
|
|
81
|
+
- `IMG_GEN_GPT_IMAGE_2_OFFICIAL_API_KEY`
|
|
82
|
+
- `IMG_GEN_NANO_BANANA_2_OFFICIAL_API_KEY`
|
|
83
|
+
|
|
84
|
+
### 3. 启动服务
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Streamable HTTP(默认)
|
|
88
|
+
uv run image-generate-mcp-remote --transport streamable-http --host 127.0.0.1 --port 3001
|
|
89
|
+
|
|
90
|
+
# SSE
|
|
91
|
+
uv run image-generate-mcp-remote --transport sse --host 127.0.0.1 --port 3001
|
|
92
|
+
|
|
93
|
+
# stdio(本地 MCP 客户端直连)
|
|
94
|
+
uv run image-generate-mcp-remote --transport stdio
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 当前实际部署(systemd --user)
|
|
98
|
+
|
|
99
|
+
本项目当前真正使用中的远端 MCP 服务,不是 `stdio` 直连,而是 `systemd --user` 托管的 `streamable-http` 服务。
|
|
100
|
+
|
|
101
|
+
- 服务名:`image-generate-mcp.service`
|
|
102
|
+
- unit 文件位置模式:`~/.config/systemd/user/image-generate-mcp.service`
|
|
103
|
+
- 工作目录:部署目录 `<deploy-root>`
|
|
104
|
+
- 环境文件:`<deploy-root>/.env`
|
|
105
|
+
- 当前接入地址:`http://127.0.0.1:25235/mcp`
|
|
106
|
+
|
|
107
|
+
部署、更新、修改环境变量、重启服务、OpenCode MCP JSON 配置的完整说明见:
|
|
108
|
+
|
|
109
|
+
- `SYSTEMD_DEPLOYMENT_GUIDE.md`
|
|
110
|
+
|
|
111
|
+
对于当前这个远端服务,需要特别注意:
|
|
112
|
+
|
|
113
|
+
- 改 OpenCode MCP JSON 里的 `env`,不会改变已启动服务的环境变量
|
|
114
|
+
- 要改服务配置,必须修改 `<deploy-root>/.env` 或 `image-generate-mcp.service`
|
|
115
|
+
- 改 `.env` 后执行 `systemctl --user restart image-generate-mcp.service`
|
|
116
|
+
- 改 `.service` 后执行 `systemctl --user daemon-reload && systemctl --user restart image-generate-mcp.service`
|
|
117
|
+
|
|
118
|
+
## MCP 配置方式
|
|
119
|
+
|
|
120
|
+
以下配置示例均为当前项目可直接使用的正确写法。
|
|
121
|
+
|
|
122
|
+
### 方式一:stdio 直连(推荐本地开发)
|
|
123
|
+
|
|
124
|
+
适用于大多数支持本地命令启动 MCP Server 的客户端。
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"mcpServers": {
|
|
129
|
+
"image-generate-mcp-remote": {
|
|
130
|
+
"command": "uv",
|
|
131
|
+
"args": [
|
|
132
|
+
"run",
|
|
133
|
+
"image-generate-mcp-remote",
|
|
134
|
+
"--transport",
|
|
135
|
+
"stdio"
|
|
136
|
+
],
|
|
137
|
+
"cwd": "/absolute/path/to/image-generate-mcp-remote",
|
|
138
|
+
"env": {
|
|
139
|
+
"IMG_GEN_GPT_IMAGE_2_OFFICIAL_API_KEY": "sk-xxxx",
|
|
140
|
+
"IMG_GEN_GPT_IMAGE_2_OFFICIAL_BASE_URL": "https://www.uocode.com/v1",
|
|
141
|
+
"IMG_GEN_GPT_IMAGE_2_OFFICIAL_MODEL": "gpt-image-2",
|
|
142
|
+
"IMG_GEN_GPT_IMAGE_2_OFFICIAL_SUPPORTED_MODELS": "gpt-image-2",
|
|
143
|
+
"IMG_GEN_NANO_BANANA_2_OFFICIAL_API_KEY": "sk-xxxx",
|
|
144
|
+
"IMG_GEN_NANO_BANANA_2_OFFICIAL_BASE_URL": "https://www.uocode.com",
|
|
145
|
+
"IMG_GEN_NANO_BANANA_2_OFFICIAL_MODEL": "gemini-3.1-flash-image-preview",
|
|
146
|
+
"IMG_GEN_NANO_BANANA_2_OFFICIAL_SUPPORTED_MODELS": "gemini-3.1-flash-image-preview",
|
|
147
|
+
"IMAGE_OUTPUT_DIR": "storage/images",
|
|
148
|
+
"IMAGE_BASE_URL": "",
|
|
149
|
+
"IMAGE_HTTP_TIMEOUT_SECONDS": "600",
|
|
150
|
+
"LOG_LEVEL": "INFO"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 方式二:Streamable HTTP 远程接入
|
|
158
|
+
|
|
159
|
+
先启动服务:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
uv run image-generate-mcp-remote --transport streamable-http --host 127.0.0.1 --port 3001
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
服务默认 MCP 路径为:`/mcp`
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"mcpServers": {
|
|
170
|
+
"image-generate-mcp-remote": {
|
|
171
|
+
"url": "http://127.0.0.1:3001/mcp"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 方式三:SSE 远程接入
|
|
178
|
+
|
|
179
|
+
先启动服务:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
uv run image-generate-mcp-remote --transport sse --host 127.0.0.1 --port 3001
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
服务默认路径为:
|
|
186
|
+
|
|
187
|
+
- SSE 入口:`/sse`
|
|
188
|
+
- 消息通道:`/messages/`
|
|
189
|
+
|
|
190
|
+
对于要求分别填写 SSE 地址与消息地址的客户端,可使用:
|
|
191
|
+
|
|
192
|
+
- `http://127.0.0.1:3001/sse`
|
|
193
|
+
- `http://127.0.0.1:3001/messages/`
|
|
194
|
+
|
|
195
|
+
## 工具列表
|
|
196
|
+
|
|
197
|
+
### `list_image_tools_catalog`
|
|
198
|
+
|
|
199
|
+
输出当前服务暴露的图片工具目录,包括:
|
|
200
|
+
|
|
201
|
+
- 默认网关地址
|
|
202
|
+
- 当前有效模型
|
|
203
|
+
- 支持模型列表
|
|
204
|
+
- 非敏感环境变量生效值
|
|
205
|
+
|
|
206
|
+
### `gpt_image_2_official`
|
|
207
|
+
|
|
208
|
+
OpenAI Images 兼容工具。
|
|
209
|
+
|
|
210
|
+
- `mode=generate` 时调用文生图
|
|
211
|
+
- `mode=edit` 时调用参考图编辑 / 图生图
|
|
212
|
+
- 默认请求上游:`https://www.uocode.com/v1`
|
|
213
|
+
- 若传入 `size="宽x高"`,服务会自动归一化到支持的 30 档常用尺寸后再请求上游
|
|
214
|
+
|
|
215
|
+
### `nano_banana_2_official`
|
|
216
|
+
|
|
217
|
+
Gemini `generateContent` 兼容工具。
|
|
218
|
+
|
|
219
|
+
- `mode=generate` 时调用文生图
|
|
220
|
+
- `mode=edit` 时调用参考图编辑 / 图生图
|
|
221
|
+
- 默认请求上游:`https://www.uocode.com`
|
|
222
|
+
|
|
223
|
+
### `gpt-image-2-url`
|
|
224
|
+
|
|
225
|
+
URL 返回型 `gpt-image-2` 独立工具。
|
|
226
|
+
|
|
227
|
+
- 调用接口:`POST /images/generations`
|
|
228
|
+
- 默认请求上游:`https://www.right.codes/draw/v1`
|
|
229
|
+
- 默认模型:`gpt-image-2-vip`
|
|
230
|
+
- 上游返回 `https` 图片地址后,服务会自动下载并保存到 `save_path`
|
|
231
|
+
- 返回结果继续复用统一 `ImageToolResult` 结构,保留耗时、token 使用量与上游响应摘要
|
|
232
|
+
- 仅接受共享的 30 档 `size="宽x高"` 预设尺寸
|
|
233
|
+
|
|
234
|
+
## 环境变量说明
|
|
235
|
+
|
|
236
|
+
### GPT Image 工具
|
|
237
|
+
|
|
238
|
+
| 变量名 | 必填 | 默认值 | 说明 |
|
|
239
|
+
| --- | --- | --- | --- |
|
|
240
|
+
| `IMG_GEN_GPT_IMAGE_2_OFFICIAL_API_KEY` | 是 | 空 | `gpt_image_2_official` 使用的 API Key |
|
|
241
|
+
| `IMG_GEN_GPT_IMAGE_2_OFFICIAL_BASE_URL` | 否 | `https://www.uocode.com/v1` | OpenAI Images 兼容网关地址 |
|
|
242
|
+
| `IMG_GEN_GPT_IMAGE_2_OFFICIAL_MODEL` | 否 | `gpt-image-2` | 默认调用模型 |
|
|
243
|
+
| `IMG_GEN_GPT_IMAGE_2_OFFICIAL_SUPPORTED_MODELS` | 否 | `gpt-image-2` | 允许调用的模型白名单,逗号分隔 |
|
|
244
|
+
|
|
245
|
+
### Nano Banana 工具
|
|
246
|
+
|
|
247
|
+
| 变量名 | 必填 | 默认值 | 说明 |
|
|
248
|
+
| --- | --- | --- | --- |
|
|
249
|
+
| `IMG_GEN_NANO_BANANA_2_OFFICIAL_API_KEY` | 是 | 空 | `nano_banana_2_official` 使用的 API Key |
|
|
250
|
+
| `IMG_GEN_NANO_BANANA_2_OFFICIAL_BASE_URL` | 否 | `https://www.uocode.com` | Gemini 原生兼容网关地址 |
|
|
251
|
+
| `IMG_GEN_NANO_BANANA_2_OFFICIAL_MODEL` | 否 | `gemini-3.1-flash-image-preview` | 默认调用模型 |
|
|
252
|
+
| `IMG_GEN_NANO_BANANA_2_OFFICIAL_SUPPORTED_MODELS` | 否 | `gemini-3.1-flash-image-preview` | 允许调用的模型白名单,逗号分隔 |
|
|
253
|
+
|
|
254
|
+
### 通用变量
|
|
255
|
+
|
|
256
|
+
| 变量名 | 必填 | 默认值 | 说明 |
|
|
257
|
+
| --- | --- | --- | --- |
|
|
258
|
+
| `IMAGE_OUTPUT_DIR` | 否 | `storage/images` | 生成图片的落盘目录 |
|
|
259
|
+
| `IMAGE_BASE_URL` | 否 | 空 | 若需要对外暴露图片 URL,可配置对应静态资源基地址 |
|
|
260
|
+
| `IMAGE_HTTP_TIMEOUT_SECONDS` | 否 | `600` | 上游图片生成请求超时时间,单位秒 |
|
|
261
|
+
| `LOG_LEVEL` | 否 | `INFO` | 日志级别 |
|
|
262
|
+
|
|
263
|
+
### GPT Image 2 URL 工具
|
|
264
|
+
|
|
265
|
+
| 变量名 | 必填 | 默认值 | 说明 |
|
|
266
|
+
| --- | --- | --- | --- |
|
|
267
|
+
| `IMG_GEN_GPT_IMAGE_2_URL_API_KEY` | 是 | 空 | `gpt-image-2-url` 使用的 API Key |
|
|
268
|
+
| `IMG_GEN_GPT_IMAGE_2_URL_BASE_URL` | 否 | `https://www.right.codes/draw/v1` | URL 返回型网关地址 |
|
|
269
|
+
| `IMG_GEN_GPT_IMAGE_2_URL_MODEL` | 否 | `gpt-image-2-vip` | 默认调用模型 |
|
|
270
|
+
| `IMG_GEN_GPT_IMAGE_2_URL_SUPPORTED_MODELS` | 否 | `gpt-image-2-vip` | 允许调用的模型白名单,逗号分隔 |
|
|
271
|
+
|
|
272
|
+
## 调试与验证
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
uv run pytest
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 发布说明
|
|
279
|
+
|
|
280
|
+
- GitHub Release:创建如 `v0.9.1` 的 release 后,会自动触发 `.github/workflows/release.yml`
|
|
281
|
+
- PyPI 发布:工作流使用 `uv build --no-sources` 与 `uv publish`
|
|
282
|
+
- Trusted Publishing:建议在 `PyPI` 中为仓库 `zztdandan/image-generate-mcp-remote` 配置 GitHub Actions trusted publisher,并将 workflow 文件名填写为 `.github/workflows/release.yml`、environment 填写 `pypi`
|
|
283
|
+
- Token 回退方案:若暂不使用 Trusted Publishing,可在 GitHub 仓库 secrets 中配置 `UV_PUBLISH_TOKEN`,同一工作流会自动读取并发布
|
|
284
|
+
|
|
285
|
+
## 许可证
|
|
286
|
+
|
|
287
|
+
本项目采用 `MIT` 许可证,完整文本见 `LICENSE`。
|