# Gemini Media (oci · ghcr.io/mordor-forge/gemini-media-mcp)

Generate images (Nano Banana), video (Veo, Gemini Omni), speech and music (Lyria) with Google models

- Trust score: 50/100 (low)
- Change this week: +31
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- mcpb · `gemini-media-mcp-1.1.0.mcpb`: 48/100, [markdown](https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/gemini-media-mcp.md), [page](https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/gemini-media-mcp)
- oci · `ghcr.io/mordor-forge/gemini-media-mcp`: 50/100 (this document), [markdown](https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/ghcr-io-mordor-forge-gemini-media-mcp.md), [page](https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/ghcr-io-mordor-forge-gemini-media-mcp)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/mordor-forge/gemini-media-mcp`
- Version: `1.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to mordor-forge/gemini-media-mcp).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 5 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4333 tokens (~309/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 98% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Gemini Media MCP server?

Gemini Media runs locally as a container image, launched with docker run --rm -i ghcr.io/mordor-forge/gemini-media-mcp:1.1.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add mordor-forge-gemini-media-mcp -- docker run --rm -i ghcr.io/mordor-forge/gemini-media-mcp:1.1.0
```

### Cursor

```json
{
  "mcpServers": {
    "mordor-forge-gemini-media-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/mordor-forge/gemini-media-mcp:1.1.0"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "mordor-forge-gemini-media-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/mordor-forge/gemini-media-mcp:1.1.0"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add mordor-forge-gemini-media-mcp -- docker run --rm -i ghcr.io/mordor-forge/gemini-media-mcp:1.1.0
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mordor-forge-gemini-media-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/mordor-forge/gemini-media-mcp:1.1.0"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  mordor-forge-gemini-media-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/mordor-forge/gemini-media-mcp:1.1.0"]
```

### Netclaw

```json
{
  "McpServers": {
    "mordor-forge-gemini-media-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/mordor-forge/gemini-media-mcp:1.1.0"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "mordor-forge-gemini-media-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/mordor-forge/gemini-media-mcp:1.1.0"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-18 (score 50, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 49, +1)

- [functional improvement] Stability: unverified → 0.10

### 2026-10-14 (score 48, +29)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: good
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 98

### 2026-10-12 (score 19, 0)

- [functional] Package version: 1.0.0 → 1.1.0

### 2026-10-10 (score 19)

First indexed and scored.

## MCP tools (14)

### `edit_image` (~305 tokens)

Edit image

Change an existing image with an instruction (add/remove/replace elements, restyle, relight, change aspect ratio, fix text) while keeping everything else. Accepts extra reference images to insert or match. Say what must stay unchanged. Saves a new file; the original is kept.

Input parameters:

- `approvedCostUsd` (number): Only needed above the confirmation threshold: the cost in USD the user approved.
- `aspectRatio` (string): Change the aspect ratio (outpainting). Omit to keep the source ratio.
- `image` (string, required): The image to edit: file path, gemini-media:// URI from an earlier result, or data: URI.
- `imageSize` (string): Output size: 1K, 2K or 4K (512 only on the deprecated gemini-3.1-flash-image).
- `model` (string): Model ID or alias. Defaults to the model that created the source image, else nb2.
- `outputName` (string): Optional base file name for the saved file. Defaults to the source name plus -edit.
- `prompt` (string, required): The change to make, stated specifically, plus what must stay the same (e.g. 'Replace the sky with a sunset; keep the people, framing and lighting on faces unchanged').
- `referenceImages` (null|array): Optional extra images to pull elements or style from (e.g. 'put the logo from image 2 on the mug').

Output parameters:

- `cost` (object)
- `files` (null|array)
- `grounding` (null|object): Google Search queries the model ran and the pages it used (googleSearch only)
- `model` (string)
- `text` (string): Commentary the model returned alongside the image(s)
- `warnings` (null|array)

### `edit_video` (~381 tokens)

Edit video

Change an existing clip with an instruction (add, remove or replace objects, restyle, relight, change the background) with Gemini Omni Flash, keeping everything else. Pass the jobId of a finished clip (Omni clips are edited in conversation) or a video file of at most 10 s. Asynchronous like generate_video; about $0.10 per second of video at 720p.

Input parameters:

- `approvedCostUsd` (number): Only needed above the confirmation threshold: the cost in USD the user approved.
- `jobId` (string): A completed video job to edit. Omni clips are edited in conversation (Google keeps the context); other clips are sent as their saved file. Pass jobId or video.
- `model` (string): Model ID or alias; default omni (the only model that edits videos).
- `outputName` (string): Optional base file name for the saved video. Defaults to the source name plus -edit.
- `prompt` (string, required): The change, stated simply, ending with 'Keep everything else the same.' (e.g. 'Make the phone invisible. Keep everything else the same.')
- `referenceImages` (null|array): Optional images to bring into the clip; refer to them as <IMAGE_REF_0>, <IMAGE_REF_1>... in the prompt.
- `resolution` (string): 360p, 720p (default), 1080p or 4k (1080p and 4k are upscaled).
- `video` (string): Or a video file to edit: file path, gemini-media:// URI or data: URI. At most 10 seconds and 20 MB.
- `waitSeconds` (integer): Block up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout.

Output parameters:

- `cost` (object)
- `elapsedSeconds` (integer)
- `error` (string)
- `files` (null|array)
- `jobId` (string): Opaque handle; pass it to get_video, extend_video or edit_video
- `model` (string)
- `next` (string): Suggested next step
- `remoteExpiresAt` (null|string): When Google deletes the server-side copy; extend before this time
- `state` (string): working, completed, failed or filtered
- `warnings` (null|array)

### `estimate_cost` (~232 tokens)

Estimate cost

Estimate the cost of an image, video, speech or music request before running it, optionally comparing all models; also reports remaining budget and whether approval is needed.

Input parameters:

- `compare` (boolean): Also estimate the same request on every other active model of this media type
- `count` (integer): Number of images/clips/songs (default 1)
- `durationSeconds` (integer): Video: clip length (default 8)
- `generateAudio` (null|boolean): Video on Vertex AI: false for the cheaper silent rate
- `imageSize` (string): Images: 512, 1K, 2K or 4K
- `inputImages` (integer): Images: number of reference/source images
- `mediaType` (string, required): image, video, speech or music
- `model` (string): Model ID or alias (default model when omitted)
- `resolution` (string): Video: 720p, 1080p or 4k (Omni also 360p)
- `text` (string): Speech: the text to be spoken (length drives cost)

Output parameters:

- `alternatives` (null|array)
- `budgetRemaining` (object)
- `estimate` (object)
- `model` (string)
- `needsApproval` (boolean): True when the call would exceed the confirmation threshold and needs approvedCostUsd
- `note` (string)
- `warnings` (null|array): Lifecycle notices (deprecation, shutdown, replacement) and budget problems
- `wouldExceedBudget` (boolean): True when a budget would refuse this call right now (see warnings)

### `extend_video` (~198 tokens)

Extend video

Continue a completed clip from its end: omni adds up to 10 s (40 s total, keeping characters and audio coherent); Veo fast/standard add about 7 s (720p, up to 148 s, within 2 days). Asynchronous like generate_video.

Input parameters:

- `approvedCostUsd` (number): Only needed above the confirmation threshold.
- `jobId` (string, required): Job handle of a completed generate_video or extend_video call (operation names from older versions also work).
- `negativePrompt` (string)
- `outputName` (string)
- `prompt` (string, required): What happens next. Veo adds about 7 seconds (720p) from the last second; omni adds up to 10 seconds using the last 10 seconds as context.
- `seed` (null|integer): Vertex AI only.
- `waitSeconds` (integer): Block up to this many seconds for the result (default 0).

Output parameters:

- `cost` (object)
- `elapsedSeconds` (integer)
- `error` (string)
- `files` (null|array)
- `jobId` (string): Opaque handle; pass it to get_video, extend_video or edit_video
- `model` (string)
- `next` (string): Suggested next step
- `remoteExpiresAt` (null|string): When Google deletes the server-side copy; extend before this time
- `state` (string): working, completed, failed or filtered
- `warnings` (null|array)

### `generate_image` (~480 tokens)

Generate image

Create images from a text prompt, optionally guided by up to 14 reference images (subjects, products, style). Default model nb2 (Nano Banana 2.1, ~$0.04 per 1K image); pro for the densest scenes and final renders (~$0.15); nb2-lite for bulk drafts. Returns saved files with URIs you can pass to edit_image, generate_video (image) or other tools.

Input parameters:

- `approvedCostUsd` (number): Only needed when a call exceeds the configured confirmation threshold: the cost in USD the user approved.
- `aspectRatio` (string): e.g. 1:1, 3:2, 2:3, 4:3, 3:4, 4:5, 16:9, 9:16, 21:9 (nb2 also 1:4, 4:1, 1:8, 8:1). Defaults to 1:1 when there are no reference images; with them the model usually follows the first image's ratio.
- `count` (integer): Number of variations to generate in parallel (1-4, default 1). Each is billed.
- `googleSearch` (boolean): Ground the image in Google Search results (current events, real places, data for infographics).
- `imageSize` (string): Output size: 1K (default), 2K or 4K. Larger costs more. 512 only on the deprecated gemini-3.1-flash-image.
- `model` (string): Model ID or alias. nb2 (default: Nano Banana 2.1, fast and cheap), pro (Nano Banana Pro, highest fidelity for dense scenes), nb2-lite (cheapest inputs). See list_models.
- `outputName` (string): Optional base file name (without extension) for the saved file(s).
- `prompt` (string, required): What to create. Describe subject, setting, composition, lighting and style in full sentences. Put any exact text to render in quotes.
- `referenceImages` (null|array): Optional images to guide the result (subjects, products, characters, style): file paths, gemini-media:// URIs from earlier results, or data: URIs. Up to 14 for nb2/pro.

Output parameters:

- `cost` (object)
- `files` (null|array)
- `grounding` (null|object): Google Search queries the model ran and the pages it used (googleSearch only)
- `model` (string)
- `text` (string): Commentary the model returned alongside the image(s)
- `warnings` (null|array)

### `generate_music` (~305 tokens)

Generate music

Compose music with Lyria: 30-second clips (clip, $0.04) or full songs of a few minutes with vocals and lyrics (full, $0.08). Control genre, mood, instruments, tempo and structure in the prompt; returns lyrics/structure text when available.

Input parameters:

- `approvedCostUsd` (number): Only needed above the confirmation threshold.
- `bpm` (integer): Optional tempo hint in beats per minute.
- `durationSeconds` (integer): Optional target length hint for full songs (clip is always 30s).
- `format` (string): mp3 (default) or wav (full model only).
- `images` (null|array): Optional images (up to 10) whose mood or scene should inspire the music.
- `instrumental` (boolean): Ask for no vocals.
- `lyrics` (string): Optional lyrics with section tags; they are sung in the language they are written in.
- `model` (string): clip (default: 30-second MP3, cheapest) or full (complete song up to about 3 minutes, vocals, WAV option). See list_models.
- `outputName` (string): Optional base file name.
- `prompt` (string, required): Describe the music: genre, mood, instruments, tempo, key, production style and song structure. Use [Intro]/[Verse]/[Chorus]/[Bridge]/[Outro] tags or [0:00-0:15] timestamps to control sections.

Output parameters:

- `cost` (object)
- `durationSeconds` (number)
- `file` (object)
- `lyrics` (string): Lyrics or song structure returned by the model
- `model` (string)
- `warnings` (null|array)

### `generate_speech` (~354 tokens)

Generate speech

Turn text into natural speech (WAV) with one voice, or a dialogue between two speakers. Control delivery with style. About $0.01-0.02 per minute of audio. For podcasts, voiceovers, narration and dialogue.

Input parameters:

- `approvedCostUsd` (number): Only needed above the confirmation threshold.
- `dialogue` (null|array): Alternative to text: a conversation between up to 2 named speakers, one entry per line.
- `format` (string): wav (default) or pcm (raw 16-bit little-endian).
- `languageCode` (string): Optional BCP-47 code (e.g. en-US, it-IT). Usually auto-detected from the text.
- `model` (string): Model ID or alias: tts (default, Gemini 3.8 Flash TTS), tts-lite (cheaper). See list_models.
- `outputName` (string): Optional base file name.
- `speakers` (null|array): Voice per dialogue speaker; unlisted speakers get distinct defaults.
- `style` (string): How to deliver the lines, e.g. 'warm and enthusiastic', 'whispered urgently', 'slow, calm narrator'.
- `text` (string): The exact words to speak (single speaker). Newer models read it verbatim, so put delivery directions in style, not here. Inline tags like <sigh> or <short pause> are allowed.
- `voice` (string): Voice for single-speaker text, e.g. Kore (firm), Puck (upbeat), Charon (informative), Aoede (breezy, default), Zephyr (bright). list_models shows all 30.

Output parameters:

- `cost` (object)
- `durationSeconds` (number)
- `file` (object)
- `model` (string)
- `voices` (object)
- `warnings` (null|array)

### `generate_video` (~660 tokens)

Generate video

Start a video clip with native audio from a text prompt, optionally from a first frame, first+last frames, or reference images. Default omni (Gemini Omni Flash: 3-10s, cheap 360p drafts up to 4K, up to 10 references). On Vertex AI the default is Veo lite; fast/standard add Veo 4K and ingredients. Veo is leaving the Gemini API (list_models has the date). estimate_cost prices any option. Asynchronous: returns a jobId; then call get_video.

Input parameters:

- `approvedCostUsd` (number): Only needed above the confirmation threshold: the cost in USD the user approved.
- `aspectRatio` (string): 16:9 (default) or 9:16
- `durationSeconds` (integer): Clip length: Veo 4, 6 or 8 seconds; omni 3-10 seconds (default 8).
- `generateAudio` (null|boolean): Vertex AI only: set false for silent video at a lower price. The Gemini API always generates audio.
- `image` (string): Optional first frame (image-to-video): file path, gemini-media:// URI or data: URI.
- `lastFrame` (string): Optional last frame; requires image. Veo interpolates between the two.
- `model` (string): Model ID or alias: omni (default on the Gemini API: Gemini Omni Flash, best prompt adherence, editable and extendable to 40 s), lite (cheapest Veo; the default on Vertex AI), fast (Veo 4K, ingredient…
- `negativePrompt` (string): What to avoid, as plain nouns (e.g. 'text overlays, blur'). For omni it is appended to the prompt.
- `outputName` (string): Optional base file name for the saved video.
- `personGeneration` (string): allow_all, allow_adult or dont_allow. The Gemini API requires allow_all for text-to-video and allow_adult for image-based modes.
- `prompt` (string, required): What happens in the clip: subject and action, camera movement, setting, lighting, style, and sound (dialogue in quotes, sound effects, ambience, music).
- `referenceImages` (null|array): Images of characters, objects, products or styles to keep consistent: Veo fast/standard up to 3 (forces 8s, not with image/lastFrame); omni up to 10 including frames (name them <IMAGE_REF_0>... in th…
- `resolution` (string): 720p (default), 1080p or 4k (not lite); omni also 360p for fast drafts. Veo 1080p and 4k require 8-second clips.
- `seed` (null|integer): Seed for more repeatable results (Vertex AI only; ignored on the Gemini API).
- `waitSeconds` (integer): Block up to this many seconds for the result (default 0 = return a job handle immediately). Keep under your client's tool timeout.

Output parameters:

- `cost` (object)
- `elapsedSeconds` (integer)
- `error` (string)
- `files` (null|array)
- `jobId` (string): Opaque handle; pass it to get_video, extend_video or edit_video
- `model` (string)
- `next` (string): Suggested next step
- `remoteExpiresAt` (null|string): When Google deletes the server-side copy; extend before this time
- `state` (string): working, completed, failed or filtered
- `warnings` (null|array)

### `get_config` (~42 tokens)

Get configuration

Show the active backend and how it was chosen, output directory, default models, budgets, input-file policy and configuration warnings. Use it to troubleshoot credentials or missing files.

Output parameters:

- `authMode` (string)
- `backend` (string)
- `backendReason` (string)
- `budget` (object)
- `catalogFile` (string)
- `catalogVersion` (string)
- `configFile` (string)
- `defaults` (object)
- `httpAddr` (string): Address the HTTP transport listens on
- `inlinePreviews` (boolean)
- `inputPolicy` (string)
- `location` (string)
- `outputDir` (string)
- `project` (string)
- `settingSources` (object)
- `stateDir` (string)
- `transport` (string)
- `version` (string)
- `warnings` (null|array)

### `get_usage` (~83 tokens)

Get usage and spend

Report estimated spend for this session, today, this month or all time, broken down by model and tool, with budget remaining, recent calls and running video jobs.

Input parameters:

- `period` (string): session (since this server started), today (default), month or all
- `recent` (integer): How many recent entries to include (default 10, max 100)

Output parameters:

- `activeJobs` (null|array)
- `budget` (object)
- `extra` (object)
- `ledgerPath` (string)
- `note` (string)
- `period` (string)
- `summary` (object)

### `get_video` (~102 tokens)

Get video job

Check a video job and wait for it (default up to 45s). When the job completes, the video is downloaded and returned; calling again is safe and returns the same files.

Input parameters:

- `jobId` (string, required): Job handle returned by generate_video, extend_video or edit_video.
- `waitSeconds` (null|integer): Block up to this many seconds for completion (default 45, 0 = check once). The video is downloaded automatically when ready.

Output parameters:

- `cost` (object)
- `elapsedSeconds` (integer)
- `error` (string)
- `files` (null|array)
- `jobId` (string): Opaque handle; pass it to get_video, extend_video or edit_video
- `model` (string)
- `next` (string): Suggested next step
- `remoteExpiresAt` (null|string): When Google deletes the server-side copy; extend before this time
- `state` (string): working, completed, failed or filtered
- `warnings` (null|array)

### `list_models` (~142 tokens)

List models

List current models per media type with aliases, status (GA/preview/deprecated), prices and a short guide to when to use each. detail: true adds supported aspect ratios, sizes, durations and voices; live: true checks what your API key can actually call.

Input parameters:

- `detail` (boolean): Include full capabilities (aspect ratios, voices, rules).
- `includeInactive` (boolean): Also list retired models and their replacements.
- `live` (boolean): Also query the Gemini API for the models this key can use, flagging unavailable ones and media models missing from the catalog.
- `mediaType` (string): Filter: image, video, speech or music.

Output parameters:

- `backend` (string)
- `catalogVersion` (string)
- `models` (null|array)
- `uncatalogued` (null|array): Media models the API offers that the catalog does not know yet (usable by raw ID)
- `warnings` (null|array)

### `stitch_tiles` (~237 tokens)

Stitch upscaled tiles

Upscale step 3: align each edited tile from tile_image with the image, match its broad color, blend the overlaps and save one large PNG (default 8192 px long edge). Free and local. Reports tiles it rejected (their area keeps the prior pixels) and returns a preview plus 100% crops of the seams to inspect.

Input parameters:

- `colorMatch` (null|boolean): Match each tile's broad exposure and color to the image (default true). Fine texture is never transferred.
- `details` (null|array): Up to 6 points to return as 100% crops for inspection. Default: where grid tiles meet, or each region's center.
- `feather` (number): Blend width as a fraction of each tile's shorter side (default 0.2, 0.05-0.4). Between neighboring tiles it is capped at half their overlap.
- `job` (string, required): The job uri returned by tile_image.
- `outputName` (string): Optional base name for the stitched PNG.
- `tiles` (null|array, required): The edited tiles. Tiles left out keep the underlying image.

Output parameters:

- `details` (null|array): What each detail preview shows, in order
- `file` (object)
- `nativeLongEdge` (integer): About how many pixels of model-rendered detail the long edge carries, limited by the least detailed tile and at most the output's long edge; 0 when unknown or when part of the image has none
- `next` (string)
- `original` (string)
- `pass` (integer)
- `reference` (string)
- `tiles` (null|array)
- `warnings` (null|array)

### `tile_image` (~557 tokens)

Tile image for upscaling

Upscale step 1: cut an image into crops shaped to the edit model's aspect ratios. longEdge sets the target (1K-16K, default 8K); with grid and imageSize omitted it picks the cheapest plan that covers it (one tile up to about 4K, a 2x2-4x4 grid beyond). regions re-render faces or text in a later pass. Free and local; reports the edit cost. Step 2: edit_image each crop as the result says. Step 3: stitch_tiles. Detail is invented, not recovered.

Input parameters:

- `grid` (integer): Cut a grid x grid layout covering the whole image (1-4). Omit it on a first pass to let tile_image pick the cheapest grid that covers longEdge (explained in planNote); a later full-grid pass defaults…
- `image` (string, required): The image to cut: the original photo for the first pass, or the previous stitch_tiles result for a refinement pass. File path, gemini-media:// URI or data: URI.
- `imageSize` (string): Size the tiles will be edited at (1K, 2K or 4K, as the model supports). Omit it on a first pass to pick it with the grid; otherwise it defaults to the model's largest size.
- `longEdge` (integer): Long edge in pixels of the image stitch_tiles will produce (default 8192, 1024-16384, at most 70 megapixels). First pass only; later passes keep their input's size.
- `model` (string): Image model the tiles will be edited with (default: the server's default image model; a refinement pass defaults to the model of the pass before). Sets the supported aspect ratios and the cost estima…
- `original` (string): First pass only: the untouched original, sent with every tile as context (as a copy of at most 2048 px). Defaults to image. Refinement passes edit crops alone and keep the first pass's original, so i…
- `outputName` (string): Optional base name for the crops and the stitched result. Defaults to the original's name.
- `padding` (number): Context added around each cell or region, as a fraction of its size (default 0.2, 0.05-0.5). Tiles then grow to the nearest aspect ratio the model supports.
- `regions` (null|array): Refinement pass: up to 12 areas to re-render (faces, hands, text, materials), as fractions of the image. Omit for a full grid.

Output parameters:

- `cost` (object): Estimated cost of editing every tile once (tile_image itself is free)
- `grid` (integer): Grid size used (grid mode): 1 is the whole image as one tile
- `image` (object): Size of the tiled image
- `imageSize` (string)
- `job` (string): Pass it to stitch_tiles
- `mode` (string): grid or regions
- `model` (string)
- `nativeLongEdge` (integer): About how many pixels of model-rendered detail the output's long edge carries if every tile comes back at imageSize, at most the output's long edge; below it the rest is interpolated
- `next` (string)
- `output` (object): Size stitch_tiles will produce
- `pass` (integer)
- `planNote` (string): Why this grid and imageSize were chosen, when picked automatically
- `prompt` (string): Base edit_image prompt for every tile of this pass: it keeps each crop's framing. The gemini-upscale skill adds clauses for skin, eyes, hair, text and other materials.
- `reference` (null|object): First pass only: a copy of the original (at most 2048 px) to pass as edit_image referenceImages for every tile. Refinement passes edit each crop alone.
- `tiles` (null|array)
- `warnings` (null|array)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/ghcr-io-mordor-forge-gemini-media-mcp#diagnostics

## Score history

- 2026-10-18: 50
- 2026-10-17: 49
- 2026-10-16: 48
- 2026-10-15: 48
- 2026-10-14: 48
- 2026-10-13: 19
- 2026-10-12: 19
- 2026-10-10: 19

## Common questions

### What is the Gemini Media MCP server?

Gemini Media is an MCP server listed in the public MCP registry as io.github.mordor-forge/gemini-media-mcp. Generate images (Nano Banana), video (Veo, Gemini Omni), speech and music (Lyria) with Google models. This page covers its container image (ghcr.io/mordor-forge/gemini-media-mcp).

### Is the Gemini Media MCP server safe to use?

Gemini Media scores 50 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Gemini Media MCP server expose?

Gemini Media exposes 14 tools: edit_image, edit_video, estimate_cost, extend_video, generate_image, and 9 more. Their descriptions and schemas cost roughly 4,078 tokens of context every time the server is loaded.

### Is the Gemini Media MCP server still maintained?

Gemini Media is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Gemini Media MCP server under?

Gemini Media declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- GitHub Container Registry: https://ghcr.io/mordor-forge/gemini-media-mcp
- Repository: https://github.com/mordor-forge/gemini-media-mcp
- Changelog RSS feed: https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/ghcr-io-mordor-forge-gemini-media-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/ghcr-io-mordor-forge-gemini-media-mcp.json
- HTML version of this page: https://verifymcp.io/servers/mordor-forge-gemini-media-mcp/ghcr-io-mordor-forge-gemini-media-mcp
