@chrischall/gemini-mcp 2.3.4 → 2.4.0

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.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "MCP server for Google Gemini image generation and editing — generate and edit images via the Gemini API",
10
- "version": "2.3.4"
10
+ "version": "2.4.0"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "Gemini Images",
16
16
  "source": "./",
17
17
  "description": "Generate and edit images with Google Gemini image models (Nano Banana / Nano Banana Pro) via natural language prompts",
18
- "version": "2.3.4",
18
+ "version": "2.4.0",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gemini-mcp",
3
3
  "displayName": "Gemini Images",
4
- "version": "2.3.4",
4
+ "version": "2.4.0",
5
5
  "description": "MCP server for Google Gemini image generation and editing — generate and edit images via the Gemini API",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/README.md CHANGED
@@ -13,7 +13,7 @@ Developed and maintained by AI (Claude Code).
13
13
  | Variable | Required | Description |
14
14
  |---|---|---|
15
15
  | `GEMINI_API_KEY` | Yes | Your Google Gemini API key ([aistudio.google.com/apikey](https://aistudio.google.com/apikey)) |
16
- | `GEMINI_IMAGE_MODEL` | No | Override the default image model (default: `gemini-3.1-flash-image`) |
16
+ | `GEMINI_IMAGE_MODEL` | No | Override the default image model (default: `gemini-nano-banana-2.1`) |
17
17
  | `GEMINI_OUTPUT_DIR` | No | Default directory for generated images (default: ~/Downloads/gemini-mcp). When set, a per-call `output_dir` must be inside it. |
18
18
  | `GEMINI_INPUT_DIR` | No | Directory to resolve bare input-image filenames against (so `images: ["foo.jpg"]` works) |
19
19
  | `GEMINI_UPLOAD_DIR` | No | Restrict local files streamed to the Gemini Files API (`gemini_upload_file` `path`, `video_path`) to these directories — one or more, separated by `:` (`;` on Windows); `~` allowed. A path outside is refused before any upload. Unset: no restriction |
package/dist/bundle.js CHANGED
@@ -23439,10 +23439,10 @@ var require_v4 = __commonJS({
23439
23439
  }
23440
23440
  });
23441
23441
 
23442
- // node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs
23442
+ // node_modules/@modelcontextprotocol/server/node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs
23443
23443
  var z, LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, RELATED_TASK_META_KEY, PROTOCOL_VERSION_META_KEY, CLIENT_INFO_META_KEY, SERVER_INFO_META_KEY, CLIENT_CAPABILITIES_META_KEY, SUBSCRIPTION_ID_META_KEY, LOG_LEVEL_META_KEY, JSONRPC_VERSION, JSONValueSchema, JSONObjectSchema, JSONArraySchema, ProgressTokenSchema, CursorSchema, TaskMetadataSchema, RelatedTaskMetadataSchema, RequestMetaSchema, BaseRequestParamsSchema, TaskAugmentedRequestParamsSchema, RequestSchema, NotificationsParamsSchema, NotificationSchema, ResultMetaObjectSchema, ResultSchema, RequestIdSchema, JSONRPCRequestSchema, JSONRPCNotificationSchema, JSONRPCResultResponseSchema, JSONRPCErrorResponseSchema, JSONRPCMessageSchema, JSONRPCResponseSchema, EmptyResultSchema, CancelledNotificationParamsSchema, CancelledNotificationSchema, IconSchema, IconsSchema, BaseMetadataSchema, ImplementationSchema, FormElicitationCapabilitySchema, ElicitationCapabilitySchema, ClientTasksCapabilitySchema, ServerTasksCapabilitySchema, ClientCapabilitiesSchema, InitializeRequestParamsSchema, InitializeRequestSchema, ServerCapabilitiesSchema, InitializeResultSchema, InitializedNotificationSchema, DiscoverRequestSchema, DiscoverResultSchema, PingRequestSchema, ProgressSchema, ProgressNotificationParamsSchema, ProgressNotificationSchema, PaginatedRequestParamsSchema, PaginatedRequestSchema, PaginatedResultSchema, ResourceContentsSchema, TextResourceContentsSchema, Base64Schema, BlobResourceContentsSchema, RoleSchema, AnnotationsSchema, ResourceSchema, ResourceTemplateSchema, ListResourcesRequestSchema, ListResourcesResultSchema, ListResourceTemplatesRequestSchema, ListResourceTemplatesResultSchema, ResourceRequestParamsSchema, ReadResourceRequestParamsSchema, ReadResourceRequestSchema, ReadResourceResultSchema, ResourceListChangedNotificationSchema, SubscribeRequestParamsSchema, SubscribeRequestSchema, UnsubscribeRequestParamsSchema, UnsubscribeRequestSchema, SubscriptionFilterSchema, SubscriptionsListenRequestParamsSchema, SubscriptionsListenRequestSchema, SubscriptionsAcknowledgedNotificationParamsSchema, SubscriptionsAcknowledgedNotificationSchema, SubscriptionsListenResultMetaSchema, SubscriptionsListenResultSchema, ResourceUpdatedNotificationParamsSchema, ResourceUpdatedNotificationSchema, PromptArgumentSchema, PromptSchema, ListPromptsRequestSchema, ListPromptsResultSchema, GetPromptRequestParamsSchema, GetPromptRequestSchema, TextContentSchema, ImageContentSchema, AudioContentSchema, ToolUseContentSchema, EmbeddedResourceSchema, ResourceLinkSchema, ContentBlockSchema, PromptMessageSchema, GetPromptResultSchema, PromptListChangedNotificationSchema, ToolAnnotationsSchema, ToolExecutionSchema, ToolSchema, ListToolsRequestSchema, ListToolsResultSchema, CallToolResultSchema, CompatibilityCallToolResultSchema, CallToolRequestParamsSchema, CallToolRequestSchema, ToolListChangedNotificationSchema, ListChangedOptionsBaseSchema, LoggingLevelSchema, SetLevelRequestParamsSchema, SetLevelRequestSchema, LoggingMessageNotificationParamsSchema, LoggingMessageNotificationSchema, ModelHintSchema, ModelPreferencesSchema, ToolChoiceSchema, ToolResultContentSchema, SamplingContentSchema, SamplingMessageContentBlockSchema, SamplingMessageSchema, CreateMessageRequestParamsSchema, CreateMessageRequestSchema, CreateMessageResultSchema, CreateMessageResultWithToolsSchema, BooleanSchemaSchema, StringSchemaSchema, NumberSchemaSchema, UntitledSingleSelectEnumSchemaSchema, TitledSingleSelectEnumSchemaSchema, LegacyTitledEnumSchemaSchema, SingleSelectEnumSchemaSchema, UntitledMultiSelectEnumSchemaSchema, TitledMultiSelectEnumSchemaSchema, MultiSelectEnumSchemaSchema, EnumSchemaSchema, PrimitiveSchemaDefinitionSchema, ElicitRequestFormParamsSchema, ElicitRequestURLParamsSchema, ElicitRequestParamsSchema, ElicitRequestSchema, ElicitationCompleteNotificationParamsSchema, ElicitationCompleteNotificationSchema, ElicitResultSchema, ResourceTemplateReferenceSchema, PromptReferenceSchema, CompleteRequestParamsSchema, CompleteRequestSchema, CompleteResultSchema, RootSchema, ListRootsRequestSchema, ListRootsResultSchema, RootsListChangedNotificationSchema, TaskCreationParamsSchema, TaskStatusSchema, TaskSchema, CreateTaskResultSchema, TaskStatusNotificationParamsSchema, TaskStatusNotificationSchema, GetTaskRequestSchema, GetTaskResultSchema, GetTaskPayloadRequestSchema, GetTaskPayloadResultSchema, ListTasksRequestSchema, ListTasksResultSchema, CancelTaskRequestSchema, CancelTaskResultSchema, ClientRequestSchema, ClientNotificationSchema, ClientResultSchema, ServerRequestSchema, ServerNotificationSchema, ServerResultSchema, SafeUrlSchema, OAuthProtectedResourceMetadataSchema, OAuthMetadataSchema, OpenIdProviderMetadataSchema, OpenIdProviderDiscoveryMetadataSchema, OAuthTokensSchema, IdJagTokenExchangeResponseSchema, OAuthErrorResponseSchema, OptionalSafeUrlSchema, OAuthClientMetadataSchema, OAuthClientInformationSchema, OAuthClientInformationFullSchema, OAuthClientRegistrationErrorSchema, OAuthTokenRevocationRequestSchema;
23444
23444
  var init_auth_BNDyLTqp = __esm({
23445
- "node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs"() {
23445
+ "node_modules/@modelcontextprotocol/server/node_modules/@modelcontextprotocol/core/dist/auth-BNDyLTqp.mjs"() {
23446
23446
  z = __toESM(require_v4(), 1);
23447
23447
  LATEST_PROTOCOL_VERSION = "2025-11-25";
23448
23448
  SUPPORTED_PROTOCOL_VERSIONS = [
@@ -24386,9 +24386,9 @@ var init_auth_BNDyLTqp = __esm({
24386
24386
  }
24387
24387
  });
24388
24388
 
24389
- // node_modules/@modelcontextprotocol/core/dist/internal.mjs
24389
+ // node_modules/@modelcontextprotocol/server/node_modules/@modelcontextprotocol/core/dist/internal.mjs
24390
24390
  var init_internal = __esm({
24391
- "node_modules/@modelcontextprotocol/core/dist/internal.mjs"() {
24391
+ "node_modules/@modelcontextprotocol/server/node_modules/@modelcontextprotocol/core/dist/internal.mjs"() {
24392
24392
  init_auth_BNDyLTqp();
24393
24393
  }
24394
24394
  });
@@ -61227,7 +61227,7 @@ async function loadStdioDotenv() {
61227
61227
  }
61228
61228
 
61229
61229
  // src/version.ts
61230
- var VERSION = "2.3.4";
61230
+ var VERSION = "2.4.0";
61231
61231
 
61232
61232
  // src/errors.ts
61233
61233
  init_dist2();
@@ -61511,14 +61511,14 @@ init_zod();
61511
61511
  init_dist2();
61512
61512
 
61513
61513
  // src/models.ts
61514
- var DEFAULT_IMAGE_MODEL = "gemini-3.1-flash-image";
61514
+ var DEFAULT_IMAGE_MODEL = "gemini-nano-banana-2.1";
61515
61515
  var DEFAULT_VIDEO_MODEL = "gemini-omni-1.1-flash";
61516
61516
  var DEFAULT_MUSIC_MODEL = "lyria-3-clip-preview";
61517
61517
  function resolveModel(perCall, envOverride) {
61518
61518
  return perCall?.trim() || envOverride?.trim() || DEFAULT_IMAGE_MODEL;
61519
61519
  }
61520
61520
  function filterImageModels(raw) {
61521
- return raw.filter((m) => /image/i.test(m.name ?? "") && !/imagen/i.test(m.name ?? "")).map((m) => ({
61521
+ return raw.filter((m) => /image|nano-banana/i.test(m.name ?? "") && !/imagen/i.test(m.name ?? "")).map((m) => ({
61522
61522
  id: (m.name ?? "").replace(/^models\//, ""),
61523
61523
  displayName: m.displayName ?? "",
61524
61524
  description: m.description ?? ""
@@ -62399,7 +62399,7 @@ function resolveAspectRatio(opts, supported) {
62399
62399
  var orientationSchema = external_exports.enum(ORIENTATIONS).optional().describe(
62400
62400
  "Output shape in plain terms: landscape (16:9), portrait (9:16) or square (1:1). For any other proportion \u2014 3:2, 4:3, 4:5, 21:9 \u2014 use aspect_ratio, which wins if both are given."
62401
62401
  );
62402
- var MODEL_CHOICE_GUIDE = "gemini-3.1-flash-image (Nano Banana 2, the default) is the generalist: fast, 4K, reliable text, strong multi-reference consistency. gemini-3-pro-image (Pro) is for the hardest work \u2014 best world knowledge, brand precision. gemini-3.1-flash-lite-image (Lite) is cheapest: 1K only, no search grounding.";
62402
+ var MODEL_CHOICE_GUIDE = "gemini-nano-banana-2.1 (Nano Banana 2.1, the default) is the generalist: fast, 4K, reliable text, strong multi-reference consistency. gemini-3-pro-image (Pro) is for the hardest work \u2014 best world knowledge, brand precision. gemini-3.1-flash-lite-image (Lite) is cheapest: 1K only, no search grounding.";
62403
62403
  var timeoutMsSchema = external_exports.number().int().positive().optional().describe(
62404
62404
  "Upstream timeout in ms for this call (default $GEMINI_TIMEOUT_MS, else 60000 \u2014 120000 at 4K, which runs past 60s)"
62405
62405
  );
@@ -62502,7 +62502,7 @@ var sharedImageSchema = {
62502
62502
  model: external_exports.string().regex(/^[\w.-]+$/, 'must be a bare model id (letters, digits, ".", "_", "-")').optional().describe(`Model id override (default: server default; see gemini_list_models). ${MODEL_CHOICE_GUIDE}`),
62503
62503
  aspect_ratio: external_exports.enum(ASPECT_RATIOS).optional().describe("Exact output aspect ratio. For a plain landscape/portrait/square request, `orientation` is the shorthand; this wins if both are given."),
62504
62504
  orientation: orientationSchema,
62505
- image_size: external_exports.enum(IMAGE_SIZES).optional().describe("Output resolution (512 = 0.5K, Flash-only)"),
62505
+ image_size: external_exports.enum(IMAGE_SIZES).optional().describe("Output resolution (512 = 0.5K, gemini-3.1-flash-image only)"),
62506
62506
  output_dir: external_exports.string().optional().describe("Directory to write images to (default: $GEMINI_OUTPUT_DIR or ~/Downloads/gemini-mcp)"),
62507
62507
  inline: external_exports.boolean().optional().describe("Return the image as an inline image block you can SEE, instead of a path (stdio) or link (hosted). The default costs nothing to carry and hands back a reference you can reuse; use this when you need to check the result yourself. On the hosted connector gemini_view_media does the same for an image you already have"),
62508
62508
  seed: external_exports.number().int().optional().describe("Seed for reproducible generation; random if omitted"),
@@ -63336,6 +63336,10 @@ var PRICED_AT = "2026-09-09";
63336
63336
  var RATE_CARD = Object.freeze({
63337
63337
  "gemini-3-pro-image": { input: 2, text_output: 12, image_output: 120 },
63338
63338
  "gemini-3.1-flash-image": { input: 0.5, text_output: 3, image_output: 60 },
63339
+ // Nano Banana 2.1 (GA 2026-10-06; rates read 2026-10-14, after PRICED_AT):
63340
+ // a pricier input and text rate than 2 but half the image rate, so a 1K
63341
+ // image is $0.0336 rather than $0.067.
63342
+ "gemini-nano-banana-2.1": { input: 1.5, text_output: 7.5, image_output: 30 },
63339
63343
  "gemini-3.1-flash-lite-image": { input: 0.25, text_output: 1.5, image_output: 30 },
63340
63344
  // Google publishes 2.5-flash-image's output as $0.039 PER IMAGE at 1290
63341
63345
  // tokens, not as a per-1M rate. 0.039 / 1290 * 1e6 = 30.23 — a back-derived
@@ -65345,7 +65349,7 @@ function registerInteractTools(server, client2) {
65345
65349
  model: external_exports.string().optional().describe(`Model id override (default: server default; see gemini_list_models). ${MODEL_CHOICE_GUIDE}`),
65346
65350
  aspect_ratio: external_exports.enum(ASPECT_RATIOS).optional().describe("Exact output aspect ratio. For a plain landscape/portrait/square request, `orientation` is the shorthand; this wins if both are given."),
65347
65351
  orientation: orientationSchema,
65348
- image_size: external_exports.enum(IMAGE_SIZES).optional().describe("Output resolution (512 = 0.5K, Flash-only)"),
65352
+ image_size: external_exports.enum(IMAGE_SIZES).optional().describe("Output resolution (512 = 0.5K, gemini-3.1-flash-image only)"),
65349
65353
  thinking_level: external_exports.enum(["minimal", "high"]).optional().describe("Reasoning depth; higher can help complex/structural edits"),
65350
65354
  filename: external_exports.string().optional().describe("Base filename for the output image (extension stripped; default: slugified input)"),
65351
65355
  output_dir: external_exports.string().optional().describe("Directory to write images to (default: $GEMINI_OUTPUT_DIR or ~/Downloads/gemini-mcp)"),
package/dist/models.js CHANGED
@@ -1,10 +1,13 @@
1
1
  /**
2
- * The generalist workhorse (Nano Banana 2) — overridable per-call and via
3
- * GEMINI_IMAGE_MODEL. The premium gemini-3-pro-image is a deliberate opt-in:
4
- * it costs more and needs a funded account, so callers reach for it via the
5
- * `model` param when the task warrants it (see MODEL_CHOICE_GUIDE).
2
+ * The generalist workhorse (Nano Banana 2.1) — overridable per-call and via
3
+ * GEMINI_IMAGE_MODEL. Replaced gemini-3.1-flash-image (Nano Banana 2), which
4
+ * Google deprecated 2026-10-06 with no shutdown date yet; 2.1 is also half the
5
+ * per-image price ($0.0336 vs $0.067 at 1K). The premium gemini-3-pro-image
6
+ * is a deliberate opt-in: it costs more and needs a funded account, so callers
7
+ * reach for it via the `model` param when the task warrants it (see
8
+ * MODEL_CHOICE_GUIDE).
6
9
  */
7
- export const DEFAULT_IMAGE_MODEL = 'gemini-3.1-flash-image';
10
+ export const DEFAULT_IMAGE_MODEL = 'gemini-nano-banana-2.1';
8
11
  /**
9
12
  * Default video model (omni, Interactions API) — overridable per-call.
10
13
  *
@@ -28,10 +31,12 @@ export function resolveModel(perCall, envOverride) {
28
31
  * Keep only Gemini image-generation models (the Nano Banana family) and strip
29
32
  * the `models/` prefix. Excludes `imagen-*` — those contain the substring
30
33
  * "image" but use a different `:predict` API this server doesn't implement.
34
+ * `nano-banana` is matched too: `gemini-nano-banana-2.1`, the default, has no
35
+ * "image" in its id and would otherwise be invisible to gemini_list_models.
31
36
  */
32
37
  export function filterImageModels(raw) {
33
38
  return raw
34
- .filter((m) => /image/i.test(m.name ?? '') && !/imagen/i.test(m.name ?? ''))
39
+ .filter((m) => /image|nano-banana/i.test(m.name ?? '') && !/imagen/i.test(m.name ?? ''))
35
40
  .map((m) => ({
36
41
  id: (m.name ?? '').replace(/^models\//, ''),
37
42
  displayName: m.displayName ?? '',
package/dist/pricing.js CHANGED
@@ -57,6 +57,10 @@ export const PRICED_AT = '2026-09-09';
57
57
  export const RATE_CARD = Object.freeze({
58
58
  'gemini-3-pro-image': { input: 2.0, text_output: 12.0, image_output: 120.0 },
59
59
  'gemini-3.1-flash-image': { input: 0.5, text_output: 3.0, image_output: 60.0 },
60
+ // Nano Banana 2.1 (GA 2026-10-06; rates read 2026-10-14, after PRICED_AT):
61
+ // a pricier input and text rate than 2 but half the image rate, so a 1K
62
+ // image is $0.0336 rather than $0.067.
63
+ 'gemini-nano-banana-2.1': { input: 1.5, text_output: 7.5, image_output: 30.0 },
60
64
  'gemini-3.1-flash-lite-image': { input: 0.25, text_output: 1.5, image_output: 30.0 },
61
65
  // Google publishes 2.5-flash-image's output as $0.039 PER IMAGE at 1290
62
66
  // tokens, not as a per-1M rate. 0.039 / 1290 * 1e6 = 30.23 — a back-derived
@@ -121,7 +121,7 @@ export function registerInteractTools(server, client) {
121
121
  image_size: z
122
122
  .enum(IMAGE_SIZES)
123
123
  .optional()
124
- .describe('Output resolution (512 = 0.5K, Flash-only)'),
124
+ .describe('Output resolution (512 = 0.5K, gemini-3.1-flash-image only)'),
125
125
  thinking_level: z
126
126
  .enum(['minimal', 'high'])
127
127
  .optional()
@@ -14,7 +14,10 @@ import { buildZip } from '../zip.js';
14
14
  const DEFAULT_SINK = createDiskSink();
15
15
  /** Supported output aspect ratios (Gemini image API). */
16
16
  export const ASPECT_RATIOS = ['1:1', '2:3', '3:2', '3:4', '4:3', '4:5', '5:4', '9:16', '16:9', '21:9', '1:4', '4:1', '1:8', '8:1'];
17
- /** Supported output resolutions. `512` is Flash-only (0.5K); `1K`/`2K`/`4K` work on all image models. */
17
+ /**
18
+ * Supported output resolutions. `512` (0.5K) is gemini-3.1-flash-image only — Nano Banana 2.1, the
19
+ * default, documents 1K/2K/4K — while `1K`/`2K`/`4K` work on all image models.
20
+ */
18
21
  export const IMAGE_SIZES = ['512', '1K', '2K', '4K'];
19
22
  /**
20
23
  * The words people actually use for shape, as a shorthand over
@@ -77,7 +80,7 @@ export const orientationSchema = z
77
80
  * When to pick which Nano Banana model — shared by every tool's `model` param
78
81
  * so the guidance can't drift between them.
79
82
  */
80
- export const MODEL_CHOICE_GUIDE = 'gemini-3.1-flash-image (Nano Banana 2, the default) is the generalist: fast, 4K, reliable text, strong ' +
83
+ export const MODEL_CHOICE_GUIDE = 'gemini-nano-banana-2.1 (Nano Banana 2.1, the default) is the generalist: fast, 4K, reliable text, strong ' +
81
84
  'multi-reference consistency. gemini-3-pro-image (Pro) is for the hardest work — best world knowledge, brand ' +
82
85
  'precision. gemini-3.1-flash-lite-image (Lite) is cheapest: 1K only, no search grounding.';
83
86
  /**
@@ -299,7 +302,7 @@ export const sharedImageSchema = {
299
302
  .optional()
300
303
  .describe('Exact output aspect ratio. For a plain landscape/portrait/square request, `orientation` is the shorthand; this wins if both are given.'),
301
304
  orientation: orientationSchema,
302
- image_size: z.enum(IMAGE_SIZES).optional().describe('Output resolution (512 = 0.5K, Flash-only)'),
305
+ image_size: z.enum(IMAGE_SIZES).optional().describe('Output resolution (512 = 0.5K, gemini-3.1-flash-image only)'),
303
306
  output_dir: z.string().optional().describe('Directory to write images to (default: $GEMINI_OUTPUT_DIR or ~/Downloads/gemini-mcp)'),
304
307
  inline: z.boolean().optional().describe('Return the image as an inline image block you can SEE, instead of a path (stdio) or link (hosted). The default costs nothing to carry and hands back a reference you can reuse; use this when you need to check the result yourself. On the hosted connector gemini_view_media does the same for an image you already have'),
305
308
  seed: z.number().int().optional().describe('Seed for reproducible generation; random if omitted'),
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Single source of the server version. release-please bumps the literal below. */
2
- export const VERSION = '2.3.4'; // x-release-please-version
2
+ export const VERSION = '2.4.0'; // x-release-please-version
package/mint.yaml CHANGED
@@ -13,7 +13,7 @@ env:
13
13
  - name: GEMINI_IMAGE_MODEL
14
14
  required: false
15
15
  help: >-
16
- Override the default image model (default: gemini-3.1-flash-image)
16
+ Override the default image model (default: gemini-nano-banana-2.1)
17
17
  - name: GEMINI_OUTPUT_DIR
18
18
  required: false
19
19
  help: >-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrischall/gemini-mcp",
3
- "version": "2.3.4",
3
+ "version": "2.4.0",
4
4
  "mcpName": "io.github.chrischall/gemini-mcp",
5
5
  "description": "Gemini image-generation MCP server for Claude — developed and maintained by AI (Claude Code)",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/gemini-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "2.3.4",
9
+ "version": "2.4.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@chrischall/gemini-mcp",
14
- "version": "2.3.4",
14
+ "version": "2.4.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -25,7 +25,7 @@
25
25
  },
26
26
  {
27
27
  "name": "GEMINI_IMAGE_MODEL",
28
- "description": "Override the default image model (default: gemini-3.1-flash-image)",
28
+ "description": "Override the default image model (default: gemini-nano-banana-2.1)",
29
29
  "isRequired": false,
30
30
  "format": "string",
31
31
  "isSecret": false
@@ -69,7 +69,7 @@ Note: Image generation requires a billing-enabled Google Cloud project.
69
69
  | Variable | Required | Description |
70
70
  |---|---|---|
71
71
  | `GEMINI_API_KEY` | Yes | Your Google Gemini API key |
72
- | `GEMINI_IMAGE_MODEL` | No | Override the default image model (default: `gemini-3.1-flash-image`) |
72
+ | `GEMINI_IMAGE_MODEL` | No | Override the default image model (default: `gemini-nano-banana-2.1`) |
73
73
  | `GEMINI_OUTPUT_DIR` | No | Default directory for saved images (default: ~/Downloads/gemini-mcp) |
74
74
  | `GEMINI_INPUT_DIR` | No | Directory to resolve bare input-image filenames against (e.g. point at Cowork's `uploads/` folder so `images: ["house.jpg"]` works) |
75
75
 
@@ -84,7 +84,8 @@ Note: Image generation requires a billing-enabled Google Cloud project.
84
84
 
85
85
  | Model | When to use | Reference-image caps (of 14 max) |
86
86
  |-------|-------------|----------------------------------|
87
- | `gemini-3.1-flash-image` (Nano Banana 2) | The versatile generalist workhorse for all tasks — balances speed with state-of-the-art 4K generation, world knowledge, and reliable text rendering; excels at multi-reference-image processing and consistency. Only model with video input + image_search grounding | 10 objects + 4 characters + 3 style refs |
87
+ | `gemini-nano-banana-2.1` (Nano Banana 2.1, **default**) | The versatile generalist workhorse for all tasks — an update to Nano Banana 2 with better visual quality, prompt adherence, character consistency and text rendering; 1K/2K/4K, $0.0336 per 1K image | up to 10 objects + 4 characters |
88
+ | `gemini-3.1-flash-image` (Nano Banana 2, **deprecated** 2026-10-06, no shutdown date yet) | The previous generalist workhorse — balances speed with state-of-the-art 4K generation, world knowledge, and reliable text rendering; excels at multi-reference-image processing and consistency. Only model with video input + image_search grounding | 10 objects + 4 characters + 3 style refs |
88
89
  | `gemini-3-pro-image` (Nano Banana Pro) | The premium choice for the most complex visual tasks — highest world knowledge, advanced localization, accurate brand consistency, precision creative control | 6 objects + 5 characters |
89
90
  | `gemini-3.1-flash-lite-image` (Nano Banana 2 Lite) | The fastest/cheapest for simple tasks — 1K output only, no Google Search grounding | 14 objects (no character consistency) |
90
91