Skip to main content
Glama
aleslanger

OpenAI Image MCP Server

by aleslanger
README.md
# OpenAI image mcp

MCP server for OpenAI **gpt-image** models — generate, edit, and multi-turn edit
images straight from Claude (or any MCP client).

## Tools

- `generate_image` — text → image(s)
- `edit_image` — edit / extend / compose with an optional mask
- `edit_image_conversation` — multi-turn iterative edit (Responses API)
- `image_capabilities` — discover models, params, pricing as-of date

---

## Quick start

### 1. Get the code & build

```bash
git clone <repo-url> openai-image-mcp
cd openai-image-mcp
npm install
npm run build
```

`npm run build` produces `dist/index.js` — the entrypoint you point Claude at.

### 2. Register with Claude Code (one command)

```bash
claude mcp add openai-image --scope user \
  --env OPENAI_API_KEY=sk-your-openai-api-key \
  --env IMAGE_OUTPUT_DIR=/absolute/path/to/images \
  -- node /absolute/path/to/openai-image-mcp/dist/index.js
```

- Use an **absolute** path to `dist/index.js` (output of step 1).
- `IMAGE_OUTPUT_DIR` is where generated images are written. Optional — defaults to
  `~/Pictures/openai-image-mcp`.
- `--scope user` makes it available in every project. Use `--scope project` to limit
  it to the current repo.

Verify it registered:

```bash
claude mcp list
```

### 3. Use it

In Claude, just ask — e.g. *"generate an image of a red bicycle on the beach"*.
The server writes the file under `IMAGE_OUTPUT_DIR` and returns the path.

---

## Configuration (env vars)

| Var | Required | Default | Purpose |
|-----|----------|---------|---------|
| `OPENAI_API_KEY` | **yes**¹ | — | OpenAI API key |
| `OPENAI_API_KEY_FILE` | **yes**¹ | — | path to a file containing the API key (trailing whitespace trimmed); used when `OPENAI_API_KEY` is unset |
| `IMAGE_OUTPUT_DIR` | no | `~/Pictures/openai-image-mcp` | where images are saved |
| `DEFAULT_MODEL` | no | `gpt-image-2` | gpt-image-1 / gpt-image-1-mini / gpt-image-2 |
| `DEFAULT_OUTPUT_MODE` | no | `path` | `path` \| `base64` \| `both` |
| `MAX_COST_PER_CALL_USD` | no | — | reject a call whose estimate exceeds this |
| `CONFIRM_ABOVE_N` | no | — | require `confirm:true` when generating more than N images |
| `ALLOW_URL_INPUT` | no | `false` | allow image inputs given as URLs (see Security) |

¹ Exactly one of `OPENAI_API_KEY` or `OPENAI_API_KEY_FILE` is required. Prefer `OPENAI_API_KEY_FILE` pointing to a `chmod 600` file so the key does not live in client config files.
| `SPEND_LOG_PATH` | no | — | append per-call cost records as JSONL |
| `PROMPT_ENHANCE` | no | `false` | locally augment short prompts (no extra LLM call) |
| `OPENAI_BASE_URL` | no | — | override API base URL |
| `LOG_LEVEL` | no | `info` | `debug` \| `info` \| `warn` \| `error` |

Add any of these as extra `--env KEY=value` flags on the `claude mcp add` command.

---

## Manual MCP config (other clients)

If your client uses a JSON config (Claude Desktop, Cursor, VSCode), add:

```json
{
  "mcpServers": {
    "openai-image": {
      "command": "node",
      "args": ["/absolute/path/to/openai-image-mcp/dist/index.js"],
      "env": {
        "OPENAI_API_KEY": "sk-your-openai-api-key",
        "IMAGE_OUTPUT_DIR": "/absolute/path/to/images"
      }
    }
  }
}
```

---

## Security notes

- URL image input is **off by default**. Set `ALLOW_URL_INPUT=true` to enable. When on,
  fetches resolve all DNS addresses and reject any private / loopback / link-local /
  CGNAT / IPv4-mapped target, re-validating on every redirect hop (SSRF guard).
- Output paths are confined to `IMAGE_OUTPUT_DIR`; existing files are never overwritten
  (a numeric suffix is added on collision).
- Logs go to **stderr** only; stdout is reserved for the MCP protocol.

---

## Development

```bash
npm test          # run the vitest suite
npm run typecheck # tsc --noEmit
npm run build     # compile to dist/
```

## Notes

- Models: gpt-image-1 (deprecating 2026-10-23), gpt-image-1-mini, gpt-image-2 (default).
- DALL-E was removed from the OpenAI API (2026-05-12) — not supported.
- Pricing data is as of 2026-06; query the `image_capabilities` tool for details.

TDQS

B3.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct image operation: single edit, multi-turn edit, generation from text, and capability discovery. There is no overlap in purpose.

Naming Consistency3/5

Tool names mix verb_noun (edit_image, generate_image) with noun_noun (image_capabilities) and a longer compound (edit_image_conversation). While all use snake_case, the pattern is inconsistent.

Tool Count5/5

Four tools cover essential image operations without excess. The scope is well-defined for a focused MCP server.

Completeness4/5

Core image generation and editing workflows are covered, including multi-turn. Missing a dedicated variation tool is a minor gap, but the set is largely complete.

Maintenance

ActivityStale
ResponsivenessNo issues