---
title: Image Studio MCP (image generation for Claude CLI sessions)
---

# Image Studio MCP (image generation for Claude CLI sessions)

## What it is

A built-in MCP server that gives any Claude CLI session 12 tools for generating, browsing, and sharing images through the Image Studio API. Agents can generate images from a text prompt, compare outputs across multiple models, browse the user's generation history, save reusable prompt templates, and publish images via a shareable link — all without leaving the session.

This server replaced the earlier Nano-Banana MCP. The same `generate_image` tool name is exposed, so any prompt that referred to that tool still works. The server is composed into the session alongside MemPalace, KMS, Google Workspace, and Zapier; it is never active for KMS sessions.

Available models: `gemini-2.5-flash-image`, `gemini-3.1-flash-image-preview`, `gemini-3-pro-image-preview`, `seedream-4`, `seedream-4.5`, `ideogram-v3`, `gpt-image-2`.

## Where to find it

### How to enable it

1. **Open Settings** via the gear icon in the toolbar, or via the Settings virtual project in the sidebar.
2. Navigate to **Accounts & Providers → Image Studio**.
3. Toggle **Image Studio** on.
4. Paste your API key in the field that appears. Keys start with `jls_ak_`. The key is encrypted at rest and never crosses IPC in plaintext.
5. Every new Claude CLI session spawned after this point will have all 12 tools available automatically. Running sessions do not pick it up until they are restarted.

### What the user sees

Once enabled, the tools are invisible until an agent calls them. When you (or an agent) ask something like "generate a landscape photo of a foggy mountain valley in the style of a watercolor painting," the agent:

1. Calls `generate_image` with a prompt, model, aspect ratio, and count.
2. The tool returns image URLs, which the agent presents inline in the chat.
3. If you ask to compare models, the agent calls `compare_models` and shows a side-by-side set of results.

MCP tool invocations appear as collapsible activity blocks in the session transcript, the same as any other Claude Code tool call (Read, Grep, Bash). The user does not see raw API payloads — just the formatted results the agent chooses to surface.

Annotation is a special case: `open_for_annotation` returns a URL to the JLS web app where you can mark up an image. The agent cannot draw annotations itself; it hands you the URL to do it in a browser. This is a placeholder pending a future API enrichment that would allow programmatic annotation delivery.

## How it behaves

### Available tools (12)

| Category | Tool | Description |
|----------|------|-------------|
| **Generate** | `generate_image` | Generate images from a text prompt — specify subject, style, model, aspect ratio, and count |
| | `compare_models` | Run the same prompt across multiple models simultaneously so outputs can be compared side by side |
| | `enhance_image` | AI analyzes an existing image and suggests improved prompts to get a better result |
| | `estimate_cost` | Preview pricing for a generation request before it runs |
| **Browse** | `list_images` | List the user's recent generations with optional model filter and text search |
| | `download_image` | Retrieve a download URL for a specific image from the library |
| **Templates** | `list_templates` | List the user's saved prompt templates |
| | `create_template` | Save a prompt (with model, style, and parameter defaults) as a reusable template |
| **Sharing** | `create_share` | Create a shareable public link for an image, with an optional expiry time |
| | `list_shares` | List all currently active share links and their expiry status |
| | `revoke_share` | Revoke an active share link, making it inaccessible immediately |
| **Annotate** | `open_for_annotation` | Return a URL to the JLS web app to annotate an image manually (placeholder — programmatic annotation pending API enrichment) |

### Known limitations

- **`open_for_annotation` is a placeholder.** The tool returns a URL to the JLS web app for manual annotation. Programmatic in-session annotation delivery is pending a future JLS API enrichment. The tool is still callable and useful for getting a direct browser link; the agent simply cannot read back what you draw.
- **Running sessions do not pick up a newly enabled key.** Toggle the feature and paste a key, then restart any session you want to use it in.
- **KMS sessions never get these tools.** KMS is isolated from all composed MCP servers by design.
- **Available models may change.** The model list (`gemini-2.5-flash-image`, `gemini-3.1-flash-image-preview`, `gemini-3-pro-image-preview`, `seedream-4`, `seedream-4.5`, `ideogram-v3`, `gpt-image-2`) reflects what the JLS API supports at the time of this writing. Use `estimate_cost` or check the JLS dashboard if you are unsure which models are currently live.

## For agents

### How it works

There is exactly one `.mcp.json` per session working directory, and a single owner writes it: `src/main/services/mcp/mcp-config-orchestrator.ts`. At spawn time the orchestrator composes one entry per enabled MCP server into that file. Image Studio contributes its entry through a builder in the orchestrator. When the feature toggle is on and a valid API key is present, the `jls-image-studio` server entry is included; when the toggle is off or the key is missing, the entry is omitted. If no server is enabled at all, the orchestrator removes any stale `.mcp.json`.

The entry tells Claude CLI to launch the MCP server as a subprocess using `ELECTRON_RUN_AS_NODE=1` + `process.execPath` (the Electron binary running as plain Node). The server entry point is `src/mcp/jls-image-studio-server.ts`, which shells out to a bundled CLI at `src/mcp/jls-studio.mjs`. The API key is passed to the server via environment variable — it never touches disk in plaintext.

The API key is stored via `createApiKeyStore`, which encrypts it using Electron's `safeStorage` module (the OS keychain on Windows) with an `enc:` prefix in `config.json`. The key is decrypted in Main only; it is never forwarded to the renderer.

The server is force-disabled for KMS sessions. KMS uses a separate isolated context where external MCP integrations are not composed in.

Path resolution to the bundled `jls-studio.mjs` uses the same `app.isPackaged ? resolve(app.getAppPath(), …) : resolve(__dirname, …)` pattern as the other composed MCP servers, so it works correctly in dev, sandbox, and packaged builds.

## Related

- [mempalace-memory.md](mempalace-memory.md) — another MCP server composed into the same `.mcp.json` by the shared orchestrator
- [google-workspace-mcp.md](google-workspace-mcp.md) — Google Workspace tools composed by the same orchestrator
- [zapier-integration.md](zapier-integration.md) — Zapier MCP also composed per session
- [mcp-servers.md](mcp-servers.md) — the MCP server manager, including per-session/per-project control for custom servers
