# ai.switchapp/switch (remote · mcp.switchapp.ai)

Generate, manage and explore your Switch AI image and video library, scoped to your account.

- Trust score: 81/100 (high trust)
- Change this week: +8
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.switchapp.ai`: 81/100 (this document), [markdown](https://verifymcp.io/servers/ai-switchapp-switch/mcp.md), [page](https://verifymcp.io/servers/ai-switchapp-switch/mcp)

## Channel facts

- Endpoint: `https://mcp.switchapp.ai/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, 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-08-03.

- **Endpoint Security**: 94/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 8175 tokens (~199/item across 41 items; 40 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/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 (5% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### Claude

```bash
claude mcp add --transport http ai-switchapp-switch https://mcp.switchapp.ai/mcp
```

### Codex

```toml
[mcp_servers.ai-switchapp-switch]
url = "https://mcp.switchapp.ai/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-switchapp-switch": {
      "type": "remote",
      "url": "https://mcp.switchapp.ai/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-switchapp-switch --url https://mcp.switchapp.ai/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ai-switchapp-switch:
    url: "https://mcp.switchapp.ai/mcp"
```

### Other

```json
{
  "mcpServers": {
    "ai-switchapp-switch": {
      "type": "http",
      "url": "https://mcp.switchapp.ai/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## 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-08-03 (score 81, +1)

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

### 2026-07-31 (score 80, +6)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 74, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 74, +1)

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

### 2026-07-27 (score 73, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 72)

First indexed and scored.

## MCP tools (40)

### `explore_models` (~42 tokens)

Explore Models

Browse the image-generation models available to your Switch account. Returns model id, display name, brand, and credits-per-image so you can pick one before calling generate_image.

### `check_balance` (~66 tokens)

Check Balance

Check your daily Switch spending — what you have spent today, your daily limit, and what is remaining. Optionally pass an `estimatedCost` (USD) to also get whether you can afford it.

Input parameters:

- `estimatedCost` (number): Optional dollar amount to test against your daily limit.

### `list_generations` (~92 tokens)

List Generations

List your recent and active generation tasks. Returns counts per status (pending / running / completed / failed) plus an array of your tasks with id, status, prompts, model, ref counts, scheduledAt, finishedAt.

Input parameters:

- `limit` (integer): Default 10. Max 50.
- `status`: "all" for everything, or array like ["pending","running"]. Default: active + recent.

### `show_generation` (~56 tokens)

Show Generation

Get the full detail of one of your generations by task id — prompts, model, ref counts, saved/failed counts, ETA hint, asset ids.

Input parameters:

- `taskId` (string, required): Task id from generate_image or list_generations.

### `check_job_status` (~60 tokens)

Check Job Status

Polling-friendly status check for one of your tasks. Returns a slim shape with `status`, `progressPct`, and `eta` so you can poll without refetching the full payload.

Input parameters:

- `taskId` (string, required): Task id to check.

### `show_media` (~224 tokens)

Show Media

Display the user's images inline — one or many. Users speak plainly and will NOT know asset ids; never ask for one, resolve it yourself. For "show me" or "show me my last image" call with NO arguments (shows the most recent image). For "show me my last 4 images / my last 10 pictures" pass count=N (returns a clean grid, up to 12). For a specific known image pass assetId. Renders a branded SwitchApp media card with a Download action per result; do not just print URLs. (Videos are not shown here — use list_my_videos and return the newest finished video's view_url, which plays.)

Input parameters:

- `assetId` (string): Optional. A specific image id (from list_my_assets, search_my_library, or show_generation). Omit to show the most recent image(s).
- `count` (integer): Optional. How many of the most recent images to show as a grid (default 1, max 12). Use when the user says "my last N images/pictures".

Output parameters:

- `_widget` (object)
- `asset` (object)
- `images` (array)

### `list_my_folders` (~38 tokens)

List Folders

List the folders in your Switch library (id, name, parent). Use this to find an existing folder before move_asset or create_folder.

### `list_my_assets` (~112 tokens)

List Assets

Return asset METADATA only (id, truncated prompt, model, created date), newest first. This does NOT display images and must NOT be used to show pictures — if the user says "show me / display my last image(s)", call show_media instead (it renders them; pass count=N for several). Use list_my_assets only when you need ids/metadata for another tool (e.g. move_asset) or a plain text list.

Input parameters:

- `count` (integer): Default 20. Max 50.

### `search_my_library` (~86 tokens)

Search Library

Search your library by prompt substring (metadata only — id, prompt, date). Optional folderId scopes to one folder. Only your own assets are returned. This does NOT display images; to show/display results to the user, pass their ids to show_media.

Input parameters:

- `folderId` (string)
- `limit` (integer): Default 20.
- `query` (string, required)

### `get_my_active_references` (~211 tokens)

Get Active References

Read the user's staged references in Switch Studio. Returns TWO groups: (1) the image-generation reference strip (typed face/body/outfit/scenery/product slots) under `refs`, and (2) the VIDEO-tab references the user staged in the Omni/Image video tabs (the @Image1/@Image2 strip) under `videoReferences`, with usable signed URLs. Call this before generate_image or generate_video whenever the user says "use my refs" or refers to images they staged in Studio (including "the images in my video tab"). To make a video from the video-tab refs, pass videoReferences.imageUrls into generate_video reference_image_urls (and videoUrls into reference_video_urls) in reference-to-video / omni mode. Refs marked alive:false are dead (stored file gone) and are already excluded from the usable url lists. NOTE: a photo the user just attached in THIS chat is in neither group — for that, call upload_media and use its returned url/asset id directly.

### `apply_iphone_realism` (~162 tokens)

Apply Iphone Realism

Phone-shot amateur look — looks like a real person snapped it on their phone. Casual, candid, pore-level real, no professional gloss. Three flavors: digital phone, 35mm film point-and-shoot, or off-duty intimate. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): digital_phone = Sony A7IV + 50mm f/1.4 GM phone-style realism. film_pointshoot = Contax T2 35mm Portra 400. off_duty_intimate = Cass Bird natural-window editorial.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_movie_scene` (~165 tokens)

Apply Movie Scene

Put me in a movie — full cinematic film look matching specific film genres. Choose: neon-noir action thriller, 80s finance excess, comic-book superhero blockbuster, video-game key art, or generic action thriller. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): neon_noir_action = wet streets + neon + anamorphic. glamour_finance_excess = 1980s Wall Street mahogany / gold. superhero_blockbuster = comic-book key art. video_game_character = Unreal-Engine charac…
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_high_fashion_editorial` (~137 tokens)

Apply High Fashion Editorial

High-fashion magazine cover/editorial energy. Choose a photographer mood: Mario Testino glossy, Steven Klein dark cinematic, Inez & Vinoodh hard-flash, Annie Leibovitz painterly, Tim Walker dreamlike, Peter Lindbergh black-and-white natural, or Cass Bird off-duty. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): Photographer attribution drives the lighting + camera + grade stack.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_graphic_editorial_portrait` (~107 tokens)

Apply Graphic Editorial Portrait

Sharp graphic editorial portrait — premium fashion-magazine grade, hard graphic composition. Classic studio or golden-hour outdoor. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): classic = Hasselblad H6D studio. golden_hour = Canon R5 outdoor.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_travel` (~165 tokens)

Apply Travel

Luxury travel + hotel editorial. Real architecture is preserved exactly (no inventing buildings). Choose subject: hotel hero, rural property, scenic view, drone aerial, lifestyle moment, or interior. If you attach a reference image of a real property, the architecture lock kicks in automatically. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): hotel_hero = property is the star. rural_property = country estate. scenic_view = pure landscape. drone_aerial = top-down or 45° from above. lifestyle = model + destination. interior = inside the pro…
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_wellness` (~127 tokens)

Apply Wellness

Wellness / yoga / fitness / lifestyle campaign — warm amber tropical, tropical paradise cinematic, or high-key cyan beach. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): warm_amber_tropical = warm honey grade with golden haze. hanalei_cinematic = soft golden mist + infinity pool reflection. high_key_cyan_beach = bright daylit cyan ocean.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_cinematic_anamorphic` (~120 tokens)

Apply Cinematic Anamorphic

ARRI Alexa anamorphic widescreen film look. Choose grade: warm golden, cool noir, or moody desaturated. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): warm_golden = late-afternoon honey. cool_noir = neon-fill desaturated. moody_desaturated = soft window low-contrast.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_magic_hour_portrait` (~121 tokens)

Apply Magic Hour Portrait

Golden-hour rim-light editorial portrait. Choose camera: Canon R5 + 85mm f/1.2 or Hasselblad H6D + 80mm. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): canon_85mm = Canon R5 portrait standard. hasselblad_80mm = medium-format luxury.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_product` (~116 tokens)

Apply Product

Product photography. Choose: clean studio hero shot, real-world lifestyle, extreme macro detail, or top-down flat lay. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): clean_studio = seamless backdrop hero. lifestyle = product in use. macro_detail = extreme close-up texture. flat_lay = top-down catalog.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `apply_ugc` (~132 tokens)

Apply Ugc

User-generated content — looks like a real person captured it casually. Choose: phone shot, film point-and-shoot, mirror selfie, or car selfie. Returns the styled prompt stack for your shot — pair it with generate_image.

Input parameters:

- `style` (string, required): phone_shot = iPhone-style snap. film_pointshoot = Contax T2 grain. mirror_selfie = bathroom/bedroom mirror. car_selfie = inside-the-car phone.
- `subject` (string): What you want to shoot. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony".

### `generate_image` (~518 tokens)

Generate Image

Generate one or more Switch images. Auto-routes to the right model based on subject (Nano Banana 2 default, GPT Image 2 for swimwear/beach, Switch Model/Ultra/Pro for sexier content, Nano Banana Pro for typography-heavy). Counts <= 8 render inline in chat; counts > 8 queue to your Switch Studio with progress polling. All images persist to your Studio library and folder. Pass an optional `style` (e.g. "wellness/warm_amber_tropical", "high_fashion_editorial/testino_glossy", "movie_scene/neon_noir_action") to apply a curated photographic stack from the apply_* skill tools.

Input parameters:

- `aspect_ratio` (string): Image aspect ratio. Default 9:16 (vertical, social-friendly).
- `count` (integer): How many images to generate. Default 4. <= 8 returns inline, > 8 queues to Studio. Beta limit: max 50 per request — larger asks are capped at 50 and the response says so.
- `face_reference_ids` (array): Face reference asset ids from upload_reference_asset (frame_type "face"). The ONLY way to use a face/likeness reference. Each id is verified server-side (your own untouched original + identity verifi…
- `folder_name` (string): Optional Switch Studio folder name. Auto-created if missing. Defaults to the chat-derived title.
- `model` (string): Optional explicit model. If omitted, auto-routed based on subject content (see tool description).
- `real_photo_look` (boolean): Optional. Adds the casual real-photo texture (film grain, amateur iPhone feel). OFF by default — only set true when the user asks for the realistic, unpolished look.
- `reference_image_urls` (array): Optional public image URLs used as GENERIC references (products, scenery, outfits, style). These are never treated as face references — for a person's face/likeness use face_reference_ids.
- `style` (string): Optional curated style stack from the apply_* skill tools. Format "<skill>/<style_key>", e.g. "wellness/warm_amber_tropical" or "high_fashion_editorial/leibovitz_painterly".
- `subject` (string, required): Plain-English description of what to generate. E.g. "a woman walking through a hotel lobby" or "morning coffee on the balcony, model wearing a robe".

Output parameters:

- `_widget` (object)
- `asset` (object)
- `images` (array)

### `cancel_my_task` (~71 tokens)

Cancel Task

Stop one of your generation tasks by task id — works on queued AND running tasks. Already-saved images stay in your library; nothing is deleted or refunded. Returns how many images were saved out of how many you requested.

Input parameters:

- `taskId` (string, required): Task id from generate_image or list_my_tasks.

### `generate_video` (~1011 tokens)

Generate Video

Generate Switch video across the real provider lineup (Kling, Seedance, Switch Video/WAN 2.7, Switch Video Edit, Topaz upscale) and modes (text-to-video, image-to-video, frame-to-frame, motion, omni, reference-to-video, video-edit, upscale). ALWAYS call list_video_models first to pick the right model + mode and see its required inputs. Pass one shot, or shots:[...] for a storyboard (max 4 by default, hard max 10) where EACH shot is DIFFERENT — never repeat one prompt to get copies. Renders async (~30-90s); a background job delivers each clip to your library. Returns a task_id per shot — poll get_video_status or list_my_videos.

Input parameters:

- `aspect_ratio` (string): e.g. 9:16, 16:9, 1:1. Must be allowed for the model (see list_video_models).
- `audio` (boolean): Omni / Seedance refs: generate audio. Omni is ON by default; set false for a silent clip. Other models ignore this. See list_video_models for which models generate audio and the max seconds with vs w…
- `character_orientation` (string): Motion mode only: follow the character image (default) or the reference video.
- `duration` (string): Clip length in seconds. Default 5. Seedance does 4-15s; Switch Video (WAN) does 5/10/15; Kling/Switch Video Edit cap at 10 — see each model's durations in list_video_models.
- `end_image_url` (string): End frame for frame-to-frame mode.
- `face_reference_ids` (array): Face reference asset ids from upload_reference_asset (frame_type "face") — the ONLY way to use a face/likeness reference in video. Each id is verified server-side (your own untouched original + ident…
- `image_url` (string): Required for image-to-video / frame-to-frame / motion. Accepts EITHER a Switch asset id (from show_media / list_my_assets / upload_media) OR a public https url. An asset id is resolved server-side, s…
- `mode` (string): Video mode. Must be supported by the chosen model (see list_video_models).
- `model` (string): Model id from list_video_models (e.g. kling-v3, seedance-2.0-t2v, wan-2.7-t2v, topaz). Or prefer option_id from list_video_models.
- `option_id` (string): Optional catalog id from list_video_models (e.g. "kling-image"); use instead of model+mode.
- `reference_audio_urls` (array): Seedance reference/omni only: up to 3 reference audio files to drive synthesized audio. Requires at least one reference image or video.
- `reference_image_urls` (array): GENERIC reference images (products, scenery, outfits, style). Each entry accepts EITHER a Switch asset id (from show_media / list_my_assets / upload_media / get_my_active_references) OR a public http…
- `reference_video_urls` (array): Seedance reference/omni only: up to 3 reference video clips for motion/style guidance. A Seedance video ref can satisfy the required visual anchor. NOTE: the AUDIO track of these clips is IGNORED — n…
- `resolution` (string): Output resolution. Defaults to 1080p where the model supports it. 720p is cheaper and faster. 480p is the cheapest, only on Seedance 2.0 Mini (budget tier). 4K is only on Kling v3 text/image and Klin…
- `shots` (array): A storyboard of 1-10 DISTINCT shots. Each item takes the same fields as a single shot (subject, model, mode, image_url, etc.).
- `subject` (string): The shot: subject + motion + scene (video needs motion language, e.g. "slow push-in").
- `video_url` (string): Required for video-edit and upscale (the source clip). Accepts one of YOUR Switch videos — a job id from list_my_videos / get_video_status, or its download_url / view_url — or any publicly downloadab…

### `list_video_models` (~63 tokens)

List Video Models

List the video providers, models, and modes available to your Switch account, with each model's required inputs, allowed aspect ratios and durations, and a rough per-second cost. Call this before generate_video so you pick a real model + mode and supply the right inputs.

### `get_video_status` (~87 tokens)

Get Video Status

Check the status of one of your video jobs by task_id (from generate_video) or job_id. Returns status, a viewable view_url when finished, or the error if it failed. Poll this every ~20s — do not loop rapidly.

Input parameters:

- `job_id` (string): Alternatively, the job_id.
- `task_id` (string): Task id returned by generate_video.

### `list_my_videos` (~94 tokens)

List Videos

List your recent Switch videos, newest first — id, status, prompt, model, and a viewable view_url for finished clips. Use this to check whether videos finished and to let the user choose which one they want.

Input parameters:

- `count` (integer): How many to return. Default 10. Max 50.
- `status` (string): Optional filter: submitted, processing, succeed, failed, or all.

### `lip_sync_video` (~489 tokens)

Lip Sync Video

Lip-sync audio onto one of your videos. RECOMMENDED: action="create" with engine="best" + video_url + sound_file (base64 data URI) — syncs the whole clip on the highest-quality engine, no face step needed. Kling flow (manual timing control): (1) action="identify-face" with video_url (MP4/MOV, 2-60s, <=100MB, 720p/1080p); (2) action="create" with session_id + face_id + audio + timing IN MILLISECONDS (sound_start_time, sound_end_time, sound_insert_time) + optional speech_volume/original_audio_volume (0-100); (3) action="status" with the task_id to poll — returns a branded SwitchApp view_url when done. Charges credits on create; failed jobs are refunded.

Input parameters:

- `action` (string, required): Which step to run.
- `audio_id` (string): create: alternative to sound_file — an existing audio id.
- `engine` (string): create: "best" = highest-quality whole-clip sync (needs only video_url + sound_file). Default "kling" (timeline flow).
- `face_id` (string): create: a face_id from identify-face (one face supported).
- `original_audio_volume` (number): create: how loud the clip's own sound stays, as a percent 0-100 (default 0).
- `session_id` (string): create: from identify-face.
- `sound_end_time` (integer): create: audio end, in MILLISECONDS.
- `sound_file` (string): create: base64 data URI of the audio (e.g. data:audio/mpeg;base64,...).
- `sound_insert_time` (integer): create: where in the video to place the audio, in MILLISECONDS.
- `sound_start_time` (integer): create: audio start, in MILLISECONDS.
- `speech_volume` (number): create: how loud the new speech is, as a percent 0-100 (default 100).
- `task_id` (string): status: the task_id from create.
- `video_url` (string): identify-face: the source video (MP4/MOV, 2-60s, <=100MB, 720p/1080p). Use a SwitchApp/public URL.

### `talking_avatar_video` (~218 tokens)

Talking Avatar Video

Turn a face photo into a lip-synced talking-head video that speaks your text (or your audio). Provide image_url (a clear face photo) and either script (text to speak, max 2500 characters) or audio_url. Optional voice_id / language / voice_settings. Renders in ~1-5 minutes (single call, returns the finished branded video) and is saved to your library. Charged per video.

Input parameters:

- `audio_url` (string): Pre-recorded audio URL to lip-sync instead of generating speech from script.
- `image_url` (string, required): A clear face photo (Switch/public URL). Required.
- `language` (string): Optional language code (default en).
- `script` (string): Text the avatar speaks. Max 2500 characters. Required unless audio_url is given.
- `voice_id` (string): Optional voice id (from clone_voice / your library).
- `voice_settings` (object): Optional: { stability, similarityBoost, style, useSpeakerBoost } 0-1.

### `voice` (~389 tokens)

Manage Voices

Your saved voices — one tool for the whole voice library. Users speak plain language and never know ids: resolve every voice by NAME yourself (call action "list" first if unsure) and never ask the user for an id. action="list" returns every saved voice with voice_id, name, kind and ready — kind "reference" is an instant voice match saved from a clip and kind "clone" is a trained voice (both speak through generate_audio: pass the NAME as its voice param); kind "avatar" voices drive talking_avatar_video. action="create" saves a NEW reference voice from a clip: voice_name plus audio_url (e.g. the url upload_media returned) or audio_base64 (+ format) — free, ready instantly. action="rename" renames a saved voice (voice_id takes the id OR the current name, new_name is the new name). action="clone" registers a voice for talking_avatar_video from audio_sample_url + voice_name (charged 2 credits). action="delete" removes a voice by voice_id or name.

Input parameters:

- `action` (string, required): Which operation to run.
- `audio_base64` (string): create: the clip as base64 when there is no URL.
- `audio_sample_url` (string): clone: a 10-30 second voice sample URL (reachable).
- `audio_url` (string): create: URL of a 10-30 second clip of the voice — e.g. the url returned by upload_media.
- `format` (string): create: clip format when sending audio_base64. Default wav.
- `new_name` (string): rename: the new name for the voice.
- `voice_id` (string): delete/rename: the voice id OR its name — names are resolved for you.
- `voice_name` (string): create/clone: what to call the voice (unique per account).

### `generate_audio` (~464 tokens)

Generate Audio

Generate spoken audio from text: narration, a voiceover, a read-aloud script, or a multi-voice dialogue. Pass text (up to 2048 chars) — the words to be spoken. To speak in one of YOUR saved voices, pass voice with the voice NAME (or id): users speak plain language and never know ids, so resolve the name yourself (the voice tool, action "list", shows every saved voice) and never ask the user for an id. Reference voices, trained clones and preset voices are all routed correctly by kind. To match a voice instantly from a clip instead, pass reference_audio_url (a short clip) or up to 3 reference_audio_urls and address them as @Audio1, @Audio2, @Audio3 in the text for dialogue. Alternatively pass image_url to voice a scene from a picture (cannot combine with reference audio). Optional speech_rate (-50..100), pitch (-12..12), loudness (-50..100). Returns a playable audio_url, duration_seconds, and generation_id (also saved to your library).

Input parameters:

- `format` (string): Optional output format. Default mp3.
- `image_url` (string): Optional. Voice a scene from a picture. Cannot be combined with reference audio.
- `loudness` (number): Optional. Loudness, -50 (quieter) to 100 (louder). 0 is normal.
- `pitch` (number): Optional. Pitch, -12 to 12. 0 is normal.
- `reference_audio_url` (string): Optional. A short clip URL to instantly match that voice.
- `reference_audio_urls` (array): Optional. Up to 3 reference clip URLs for multi-voice dialogue.
- `speech_rate` (number): Optional. Speaking speed, -50 (slower) to 100 (faster). 0 is normal.
- `text` (string, required): The words to speak / narrate / perform. Max 2048 chars. For dialogue, address voices as @Audio1, @Audio2, @Audio3.
- `voice` (string): Optional. A saved voice — pass its NAME (or id); it is resolved and routed by kind automatically. Omit for a natural default voice.

### `upload_reference_asset` (~417 tokens)

Upload Reference

Upload an image, video, or audio reference into Switch cloud and get a ready-to-use reference URL. Pass kind=image|video|audio. Returns reference_image_urls / reference_video_urls / reference_audio_urls for generate_image and generate_video. Image and video references are also added to your active Studio reference strip (the same one your desktop uses) unless activate=false. PREFERRED for real files: call with presign=true to get an upload_url, PUT the bytes straight to it (no base64 through the model), then call again with confirm_path to verify and add it — works for image, video, and audio. base64/url is only for tiny inline files.

Input parameters:

- `activate` (boolean): Image/video: add to the active Studio reference strip. Default true. Audio never touches the strip.
- `base64` (string): Base64 bytes (optionally a data: URL). Best for small files; large video should use presign.
- `confirm_path` (string): The storage_path from a presign call, after you PUT the file — verifies the object, records it, and adds it to your strip.
- `filename` (string): Optional source filename for extension/display.
- `frame_type` (string): Image strip label: ref (default), face, body, clothes, scenery, product, typography. Use "face" for a person's face/likeness — face uploads are stored as untouched originals in the private reference…
- `kind` (string, required): Reference type to upload.
- `mime` (string): MIME for base64. Images: jpg/png/webp/gif. Videos: mp4/mov. Audio: mp3/wav/m4a/aac.
- `presign` (boolean): Return an upload_url to PUT the file bytes directly to (no base64). Video always; image/audio when enabled.
- `url` (string): Public https URL to fetch server-side.

### `stitch_videos` (~228 tokens)

Stitch Videos

Stitch several of your Switch videos together into ONE video, played back-to-back in the order you give. Pass clip_asset_ids: an ORDERED list of your video ids (get them from list_my_videos) — the first id plays first. Optional orientation (landscape|portrait|square), fps, quality. Renders the combined video with ffmpeg and returns the finished, downloadable video url right away (also saved to list_my_videos). Use this whenever the user wants to combine, join, merge, or concatenate multiple clips into one.

Input parameters:

- `clip_asset_ids` (array, required): Ordered list of your video ids (from list_my_videos). At least 2. Output order = this order.
- `fps` (integer): Frames per second. Default 30.
- `orientation` (string): landscape (1920x1080, default), portrait (1080x1920), or square (1080x1080).
- `project_name` (string): Optional name for the output video.
- `quality` (string): draft, standard (default), or high.

### `analyze_video` (~236 tokens)

Analyze Video

Switch Vision — watch and understand a video (or image) like a human and answer a question about it: scenes, subjects, actions, on-screen text, pacing, mood and sentiment. Pass video_url (a public https video URL, including YouTube) OR one of your own Switch videos (a video/asset id from list_my_videos / list_my_assets / upload_media). Add an optional question to focus the analysis (e.g. "what is the tone and energy?", "list the cuts and what each shot shows"). Use this whenever the user gives you a reference video and wants its style, energy, structure or content understood — for example before making a new video that matches it.

Input parameters:

- `question` (string): Optional. What to find out about the video — tone, structure, on-screen text, sentiment, etc.
- `video_url` (string, required): A public https video URL (YouTube ok), OR one of your own Switch videos — a video/asset id, or the download_url / view_url from list_my_videos or get_video_status. Switch resolves its own links to th…

### `create_depth_map` (~186 tokens)

Create Depth Map

Turn a video into a DEPTH MAP: a grayscale video where brightness encodes distance, used as a motion reference so a new generated subject moves exactly like your source clip. Pass video_url (a public https video URL) OR one of your own Switch video ids (from list_my_videos or list_my_assets). For an external URL also pass duration_seconds (the clip length; your own Switch videos carry it automatically) because the render is billed per second of video. Returns a task_id right away; poll get_depth_map_status until the download URL is ready (usually a few minutes). If the render fails, your tokens are returned automatically.

Input parameters:

- `duration_seconds` (number): Clip length in seconds. Required for external URLs; your own Switch videos are measured automatically.
- `video_url` (string, required): A public https video URL, OR one of your own Switch video ids.

### `get_depth_map_status` (~85 tokens)

Get Depth Map Status

Check one of your depth map renders started with create_depth_map. Pass the task_id it returned. While rendering it reports processing; when finished it returns depth_video_url, a download link for the grayscale motion reference video. If the render failed, it says so and confirms your tokens were returned.

Input parameters:

- `task_id` (string, required): The task_id returned by create_depth_map.

### `analyze_video_report` (~256 tokens)

Full Video Analysis

Run the FULL Switch Vision analysis on a video, the same premium report the Video Analysis page produces: it watches AND listens in three forensic passes and returns a structured report with every category: overview (scores and takeaways), a second by second timeline, audio, visual craft, story and retention, speech transcript, ready to run recreation prompts, and metadata. Pass video_url (a public https video URL, YouTube included) OR one of your own Switch video ids. For an external file also pass duration_seconds (YouTube and your own videos are measured automatically) because the analysis is billed per second. Optional question focuses the analysis. Returns a report_id right away; poll get_vision_report until status is succeeded (a few minutes). If it cannot finish, your tokens are returned automatically. For one quick question about a video use analyze_video instead; this tool is the full paid report.

Input parameters:

- `duration_seconds` (number): Length in seconds. Required for external files; YouTube and your own Switch videos are measured automatically.
- `question` (string): Optional. Something to pay special attention to.
- `video_url` (string, required): A public https video URL (YouTube ok), OR one of your own Switch video ids.

### `get_vision_report` (~116 tokens)

Get Analysis Report

Fetch one of your finished Video Analysis reports by report_id (from analyze_video_report or list_vision_reports). Returns the complete structured report: overview scores and takeaways, the timeline of scenes, audio, visual, story, speech, the recreation section with every master prompt, and metadata, plus recreation_prompt (the ready to run prompt) at the top level. While an analysis is still running this reports processing; poll it every 20 to 30 seconds.

Input parameters:

- `report_id` (string, required): The report id to fetch.

### `list_vision_reports` (~74 tokens)

List Analysis Reports

List your Video Analysis history, newest first: report_id, date, status, source kind, duration, engine, tokens charged, and each report's headline. Use it to find a past analysis, then pass its report_id to get_vision_report (full report) or video_to_prompt (just the recreation prompt).

### `video_to_prompt` (~261 tokens)

Video To Prompt

Turn one of your finished Video Analysis reports into ONE reusable generation prompt that recreates the source video's look, energy, pacing and mood, with a {your photo} placeholder where your own subject goes. Pass report_id (from analyze_video_report or list_vision_reports) or video_url (the exact source URL you already analyzed). Free: it rewrites the analysis you already paid for and never charges. If the video has not been analyzed yet, run analyze_video_report first. Optional focus: pass mode to control what the prompt describes, and engine to pick the model format — also free.

Input parameters:

- `engine` (string): Which model format to return: seedance (default, control-format), kling (cinematic prose), or gemini (plain paragraph for Omni).
- `mode` (string): What the prompt focuses on. action = motion/gestures only, no appearance or scene. scene = setting/camera/lighting only, no subject. action_scene = both, no appearance. description_scene (default) =…
- `report_id` (string): A finished report id from analyze_video_report or list_vision_reports.
- `video_url` (string): Alternative: the exact public https URL you already analyzed.

### `upload_media` (~221 tokens)

Upload Media

Upload one image into your Switch library in a single call. Pass `url` (any public https) OR `base64` + `mime`. Switch fetches/decodes it server-side, stores it, and returns a clean public URL plus the new asset id. This is THE way to use a photo the user attached in chat as a reference: pass the returned `url` directly into generate_image's reference_image_urls, OR into generate_video's image_url (image-to-video) or reference_image_urls (reference / omni video). The returned URL is provider-fetchable as-is — no presigned PUT, no curl, no confirm-upload step. Do NOT call get_my_active_references for a chat-attached photo; that strip only holds Studio-managed refs.

Input parameters:

- `base64` (string): Base64-encoded image bytes (use this when there is no public URL).
- `mime` (string): MIME type when sending base64. Default image/png.
- `url` (string): Any public https URL — Switch fetches it server-side.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ai-switchapp-switch/mcp#diagnostics

## Score history

- 2026-08-03: 81
- 2026-08-02: 80
- 2026-08-01: 80
- 2026-07-31: 80
- 2026-07-30: 74
- 2026-07-29: 74
- 2026-07-28: 74
- 2026-07-27: 73
- 2026-07-26: 72

## Links

- Remote endpoint: https://mcp.switchapp.ai/mcp
- Website: https://www.switchapp.ai/
- Changelog RSS feed: https://verifymcp.io/servers/ai-switchapp-switch/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-switchapp-switch/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/ai-switchapp-switch/mcp
