Create Image Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Create Image Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server that generates and edits images using OpenAI's GPT Image 2.5 models (gpt-image-2.5-sunburst and gpt-image-2.5-flare). This server enables Claude Desktop, Claude Code, and other MCP clients to create images from text descriptions and edit existing images.
sunburst or fast flare model)npm install -g @gpriday/create-image-mcpThe create-image-mcp command will be available globally.
git clone https://github.com/gregpriday/create-image-mcp.git
cd create-image-mcp
npm installCreate a .env file in your project root or home directory (~/.env):
OPENAI_API_KEY=your_api_key_hereYou can get an OpenAI API key from OpenAI Platform.
For local development, validate your configuration with:
npm run check-envThe server resolves settings in this order:
env block of your MCP client config).env in the server's working directory~/.envOnly OPENAI_API_KEY and OPENAI_IMAGE_MODEL are read from .env files. Other variables such as OPENAI_BASE_URL are ignored there, so a project's .env can't redirect your key to another server.
Optionally set OPENAI_IMAGE_MODEL to change the default model (defaults to gpt-image-2.5-sunburst), for example to pin a dated snapshot such as gpt-image-2.5-sunburst-2026-09-08.
If installed globally:
create-image-mcpIf running locally:
node src/index.jsThe server runs on stdio and communicates via JSON-RPC 2.0. In MCP client configs, launch create-image-mcp or node /path/to/src/index.js directly rather than npm start, since npm prints its own output to stdout.
npm test # Unit tests
npm run test:integration # MCP protocol test over stdio (no API calls)
CREATE_IMAGE_LIVE_TEST=1 npm run test:integration # Also generates one real image (costs a few cents)
npm run test:all # All tests#### create_image
Generate or edit images using OpenAI GPT Image.
Use when: user says "create an image", "generate a picture", "draw", "make an illustration", "edit an image", "transform a photo", or any visual content creation request.
Parameters:
| Parameter | Required | Type | Default | Description |
|---|---|---|---|---|
prompt | Yes | string | - | Image description or editing instructions (1-32,000 chars) |
output_file | Yes | string | - | File path to save the generated image (absolute recommended; ~/ is expanded) |
model | No | enum | gpt-image-2.5-sunburst | gpt-image-2.5-sunburst (precision) or gpt-image-2.5-flare (faster, for drafts) |
style | No | enum | - | Style preset (built-in: ui-mockup; add your own in create-image-styles/) |
input_images | No | array | - | File paths to input images for editing (PNG/JPEG/WebP, up to 16 images, max 20MB each) |
size | No | string | 1024x1024 | auto or WIDTHxHEIGHT, e.g. 1536x1024, 2048x1152, 3840x2160 (see size rules below) |
quality | No | enum | auto | low, medium, high, auto |
background | No | enum | auto | transparent, opaque, auto |
number_of_images | No | integer | 1 | Number of variations (1-4) |
output_mime_type | No | enum | from extension, else image/png | image/png, image/jpeg, image/webp |
output_compression | No | integer | - | 0-100 compression for JPEG/WebP output |
moderation | No | enum | auto | auto or low (less restrictive filtering) |
system_message_file | No | string | - | Text file prepended to the prompt (max 4,000 chars), for brand or style rules |
mask | No | string | - | PNG with alpha channel marking the area to edit (requires input_images) |
input_fidelity | No | enum | - | high or low: how closely edits preserve the input (requires input_images) |
Size rules: both edges must be multiples of 16, the longest edge at most 3840px, the aspect ratio at most 3:1, and the total between 655,360 and 8,294,400 pixels (1024x640 up to 3840x2160). Larger sizes cost more and take longer.
Paths and formats: relative paths resolve against the server's working directory, which for Claude Desktop is usually not your project, so prefer absolute paths. The output format follows the output_file extension (.png, .jpg/.jpeg, .webp). If you set output_mime_type explicitly, the extension is corrected to match, and the response always reports the absolute path that was written.
Examples:
Generate a simple image:
{
"name": "create_image",
"arguments": {
"prompt": "A serene mountain landscape at sunset with golden light",
"output_file": "./landscape.png"
}
}Generate with specific settings:
{
"name": "create_image",
"arguments": {
"prompt": "A futuristic city skyline with flying cars, cyberpunk style",
"output_file": "./cyberpunk-city.png",
"size": "1536x1024",
"quality": "high",
"number_of_images": 2
}
}Generate with transparent background:
{
"name": "create_image",
"arguments": {
"prompt": "A minimalist flat vector logo of an owl",
"output_file": "./logo.png",
"background": "transparent"
}
}Edit an existing image:
{
"name": "create_image",
"arguments": {
"prompt": "Change the background to a beach scene",
"input_images": ["./photo.jpg"],
"output_file": "./edited-photo.png"
}
}Style transfer:
{
"name": "create_image",
"arguments": {
"prompt": "Make this image look like a watercolor painting",
"input_images": ["./source.png"],
"output_file": "./watercolor.png"
}
}Response Format:
The tool saves images to disk and returns a text-only response:
Image saved to: /Users/you/project/landscape.png (245.3 KB, image/png)For multiple images, files are numbered:
Image saved to: /Users/you/project/cyberpunk-city_1.png (312.1 KB, image/png)
Image saved to: /Users/you/project/cyberpunk-city_2.png (298.7 KB, image/png)Add this server to your Claude Desktop configuration.
#### macOS Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"create-image": {
"command": "create-image-mcp",
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}#### Windows Edit %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"create-image": {
"command": "create-image-mcp",
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}#### Linux Edit ~/.config/Claude/claude_desktop_config.json:
{
"mcpServers": {
"create-image": {
"command": "create-image-mcp",
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}#### macOS Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"create-image": {
"command": "node",
"args": ["/path/to/create-image-mcp/src/index.js"],
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}#### Windows Edit %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"create-image": {
"command": "node",
"args": ["C:\\path\\to\\create-image-mcp\\src\\index.js"],
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}#### Linux Edit ~/.config/Claude/claude_desktop_config.json:
{
"mcpServers": {
"create-image": {
"command": "node",
"args": ["/path/to/create-image-mcp/src/index.js"],
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}After updating the configuration, restart Claude Desktop.
.mcp.json (Recommended)Add a .mcp.json file to your project root. This is the simplest approach and works automatically when Claude Code opens the project.
Note: IfOPENAI_API_KEYis already set in your shell environment (e.g. in~/.zshrc,~/.bashrc, or~/.env), omit theenvfield entirely. That's the safer choice for a checked-in.mcp.json: never commit a real API key. Claude Code also expands${OPENAI_API_KEY}in theenvblock.
If installed globally:
{
"mcpServers": {
"create-image": {
"command": "create-image-mcp",
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}If running locally:
{
"mcpServers": {
"create-image": {
"command": "node",
"args": ["/path/to/create-image-mcp/src/index.js"],
"env": {
"OPENAI_API_KEY": "your_api_key_here"
}
}
}
}For current project only:
claude mcp add --scope project create-image -e OPENAI_API_KEY=your_api_key_here -- create-image-mcpFor your user (available in all projects):
claude mcp add --scope user create-image -e OPENAI_API_KEY=your_api_key_here -- create-image-mcpVerify the server is running:
claude mcp listAdd the MCP server using the codex mcp add command or by editing ~/.codex/config.toml.
If installed globally:
codex mcp add create-image --env OPENAI_API_KEY=your_api_key_here -- create-image-mcpIf running locally:
codex mcp add create-image --env OPENAI_API_KEY=your_api_key_here -- node /path/to/create-image-mcp/src/index.jsEdit ~/.codex/config.toml:
[mcp_servers.create-image]
command = "create-image-mcp"
env = { OPENAI_API_KEY = "your_api_key_here" }^) ranges for automatic patch/minor security updatespackage-lock.json is committed for reproducible buildsnpm ci (not npm install) to enforce lockfile versionsnpm run security:audit regularlycreate-image-mcp/
├── src/
│ ├── index.js # Main MCP server
│ └── styles.js # Built-in and user style presets
├── scripts/
│ └── check-env.js # Environment validation
├── test/
│ ├── unit/
│ │ ├── tool-handler.test.js # Unit tests
│ │ └── tool-description.test.js # Schema tests
│ └── test-create-image-mcp.js # Integration tests
├── package.json
├── package-lock.json # Committed for reproducibility
├── .env # API key (git-ignored)
├── .env.example # API key template
├── .gitignore
├── LICENSE
└── README.mdDevelopment:
npm start - Start the MCP server (auto-runs environment validation)npm test - Run unit testsnpm run test:integration - Run the MCP protocol test (set CREATE_IMAGE_LIVE_TEST=1 for a live generation)npm run test:all - Run all testsnpm run dev - Run server with auto-reloadEnvironment & Security:
npm run check-env - Validate environment configurationnpm run security:audit - Check for security vulnerabilitiesnpm run security:fix - Auto-fix security issuesnpm run security:update - Update dependencies and auditThe server provides categorized error handling:
Retry-After. Auth, validation, safety, exhausted-quota, and timeout errors are not retried. Each attempt times out after 5 minutes.MIT
Contributions welcome! Please open an issue or PR.
For issues or questions:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.