# Musavir MCP guide

Connect your Musavir Pro account to an AI app supporting remote MCP over Streamable HTTP and OAuth.

Endpoint: https://api.musavir.ai/mcp

## Connect

1. Subscribe to Musavir Pro and verify your email. Free accounts and trials do not qualify.
2. Add the endpoint above as a remote MCP server in your AI app.
3. Start OAuth login. Your browser opens Musavir; sign in with Google or email and password.
4. Review the app name, callback address and permissions. Enable only the capabilities you want to grant.
5. Choose Allow access and return to the AI app. Ask it to list your projects or characters.

No API key or password belongs in a prompt. The AI app stores and refreshes connection credentials.
Pro is checked on every request, including reads. Generation spends existing Musavir credits.

### Codex

Add to your Codex config.toml:

```toml
[mcp_servers.musavir]
url = "https://api.musavir.ai/mcp"
tool_timeout_sec = 300
```

Then run `codex mcp login musavir`. Use `/mcp` to inspect the connection.
Official setup: https://developers.openai.com/codex/mcp

### Claude Code

```sh
claude mcp add --transport http musavir https://api.musavir.ai/mcp
```

Open `/mcp` in Claude Code, select Musavir and authenticate.
Official setup: https://code.claude.com/docs/en/mcp

### Other AI apps

Choose remote HTTP / Streamable HTTP, paste the endpoint and select OAuth.
Support for custom servers, uploads and media previews depends on the client and its plan.
A hosted client must be able to reach the public HTTPS endpoint; localhost will not work for hosted clients.

## Permissions

- studio:read: Read your characters, creations, projects and templates
- studio:write: Create and delete studio content; generate using your credits
- account:read: Read your profile, credit balance and billing history
- account:write: Update your profile and notification preferences
- developer:read: Read API key metadata, usage and request logs
- developer:write: Update, pause and revoke API keys

The default connection requests studio read/write and account read. To use developer or profile operations,
request those scopes in your client's OAuth settings and reconnect; check the corresponding boxes on the consent page.
MCP is for your own studio work. Administration and anything that moves money are not available over MCP at all:
there is no permission a client can request for them, and a connection owned by an administrator has no admin power.

## Tool calls

Every tool accepts an optional input object containing its operation arguments.
Object results support a selection string containing result fields (no aliases, fragments, directives or arguments).
Use tools/list for the current typed input schemas. Tools are named musavir_<operation_in_snake_case>.

Example image request to musavir_start_generation:

```json
{"input":{"kind":"photo","prompt":"A ceramic vase in soft morning light"},"requestId":"create-vase-001","selection":"id status"}
```

Each mutation requires a unique requestId (8–128 printable characters). Reuse the identical requestId AND arguments
when retrying a lost response. A duplicate returns the original result. Changed arguments return idempotency_conflict.
request_pending means the outcome is not yet known; inspect the resource or contact support. Do not retry under a new ID.
An operation_failed result can also have an uncertain outcome. Check the resource before starting another action.

## Your AI is the director

Over MCP your own AI directs the shoot. Musavir gives it the generation tools and its craft guides as MCP
resources: start with musavir://guide, which indexes the image, video-and-film, realism, review, campaign and
platform guides. Musavir's built-in Agentic campaigns are a website feature and are not exposed over MCP.

People are cast by character id and never uploaded as reference images: the providers refuse any reference that
shows a real person. Create a character from the person's photos, then pass characterIds. Things that must stay
exact (products, vehicles, animals, wardrobe, locations) are cast as items with itemIds. Loose reference images
are for style, mood and one-off objects.

A film is several short clips, never one long clip: shoot one shot at a time, chain continuous action with
firstFrameGenerationId (the previous clip's last frame becomes the next clip's first), join the clips with
musavir_edit_video (free), and review any video with musavir_generation_frames.

## Image and video workflow

1. Inspect templates/characters and call musavir_generation_estimate with matching settings.
2. Ask the user to authorize the intended generation and its credit cost.
3. Call musavir_start_generation (kind: photo or video). Save its job id.
4. Poll musavir_generation with the id, starting at two seconds and backing off toward ten seconds.
5. If character-sheet approval is required, show the prepared result and obtain approval before musavir_approve_video_character_sheets.
6. Look at the result before reporting it: open the image, or call musavir_generation_frames for a video.
7. Return completed result URLs. A failed job is not a successful render; report its error.

For large library reads use a small limit and select the fields needed. Collection limits are capped at 100 when exposed.
Results wrap operation data under result. Tool failures set isError and include an error code/message.
Image/video output is delivered through signed media URLs; inline rendering depends on the AI app.

## Characters and uploads

Create a draft with musavir_create_character, obtain musavir_character_selfie_upload_urls,
PUT each file to its signed upload URL using the required Content-Type, then call musavir_start_character_training.
Poll musavir_character until ready. Creating/training and regenerating can use credits.
Generation reference tools also return upload URLs and object keys. Upload bytes before passing keys to generation.
The MCP server does not fetch arbitrary external URLs. A client needs a file-upload/HTTP capability to transfer bytes;
otherwise upload references in the studio first. Never pass a local filesystem path as if it were a uploaded object key.
Use only the connected user's assets. Read result resources again when signed URLs expire.

## Account security and billing

Manage passwords, account deletion, new API secrets and raw payment details in the browser.
Subscriptions, credit purchases, cards and automatic reload are managed only in Billing on the website. MCP can read
the credit balance and billing history so a client can plan a job, but it can never start a charge.

## Disconnect

Open Musavir → Developer → Connected apps → Disconnect. Revocation applies to existing access and refresh tokens.
Removing local client configuration alone may not revoke a server-side grant. Jobs already admitted continue after disconnect.
Access tokens last up to 15 minutes. Refresh tokens rotate, expire after 30 days of inactivity, and grants last 90 days.
Reconnect when the grant expires, permissions change, or refresh-token reuse revokes the connection.

## Troubleshooting

- 401 invalid_token: let the client refresh, or reconnect if revoked/expired. REST API keys and website tokens are not MCP tokens.
- 403 subscription_required: upgrade/restore Pro. Account connection management remains available without Pro.
- insufficient_scope: reconnect requesting the needed permission. Administration and billing tools do not exist over MCP.
- forbidden_origin: the deployment must allow the browser client's exact origin. Server-side clients normally omit Origin.
- 429 rate_limit_exceeded: honor Retry-After. Each connection permits 120 requests/minute, with additional IP limits.
- Invalid or expired connection request: start OAuth again from the AI app (requests expire after ten minutes).
- Callback mismatch: use the registered HTTPS callback or matching HTTP loopback host/path; loopback ports may vary.
- MCP not enabled: the deployment must enable MCP and apply its database migration first.
- No media preview: open the returned result URL or use the studio; preview support is client-specific.

## Tool reference (123 operations)

### musavir_api_keys

Api keys. Uses the signed-in user’s existing permissions and product rules. Permission: developer:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_api_key_limits

Api key limits. Uses the signed-in user’s existing permissions and product rules. Permission: developer:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_api_access

Api access. Uses the signed-in user’s existing permissions and product rules. Permission: developer:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_api_request_log

Api request log. Uses the signed-in user’s existing permissions and product rules. Permission: developer:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "cursor": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "keyId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "limit": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_api_usage

Api usage. Uses the signed-in user’s existing permissions and product rules. Permission: developer:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "days": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        },
        "keyId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_update_api_key

Update api key. Uses the signed-in user’s existing permissions and product rules. Permission: developer:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expiresAt": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "monthlyCreditCap": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "scopes": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_set_api_key_paused

Set api key paused. Uses the signed-in user’s existing permissions and product rules. Permission: developer:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "paused": {
          "type": "boolean"
        }
      },
      "required": [
        "id",
        "paused"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_revoke_api_key

Revoke api key. Uses the signed-in user’s existing permissions and product rules. Permission: developer:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "reason": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_complete_onboarding

Complete onboarding. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_resend_verification_email

Resend verification email. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_update_profile

Update profile. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "fullName": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_me

Me. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_submit_contact

Send a message to Musavir support on the user’s behalf. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "budget": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "company": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "email": {
          "type": "string",
          "maxLength": 32000
        },
        "message": {
          "type": "string",
          "maxLength": 32000
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "website": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "email",
        "message",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_g42_experience

G42 experience. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "runId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_g42_photoshoot_quote

Review the selected corporate photoshoot cost and shared account allowances before admission. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "templateIds": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "characterId",
        "templateIds"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_g42_photoshoot_retry_quote

Review the cost of retrying failed corporate photoshoot items before admission. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "itemIds": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "itemIds"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_g42_character_training_quote

Review corporate identity training cost and the ordinary account allowance before admission. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "selfieKeys": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "characterId",
        "selfieKeys"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_g42_gallery

G42 gallery. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "cursor": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "limit": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_create_g42_character

Create g42 character. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "consentConfirmed": {
          "type": "boolean"
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "selfieKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "consentConfirmed",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_g42_character_selfie_upload_urls

G42 character selfie upload urls. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "characterId",
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_start_g42_character_training

Start g42 character training. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "quoteId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "selfieKeys": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "characterId",
        "selfieKeys"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_g42_character

Delete g42 character. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "characterId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_start_g42_photoshoot

Start g42 photoshoot. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "quoteId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "templateIds": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "characterId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_retry_g42_photoshoot_item

Retry g42 photoshoot item. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "itemId": {
          "type": "string",
          "maxLength": 32000
        },
        "quoteId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "itemId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_g42_photoshoot_item

Delete g42 photoshoot item. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "itemId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "itemId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_retry_failed_g42_photoshoot_items

Retry failed g42 photoshoot items. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "quoteId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "runId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "runId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_app_config

App config. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_generation_estimate

Price a generation in credits before starting it. Use matching settings (kind, duration, resolution, cast), refKeys and firstFrameGenerationId. Include designId for work on an editable Layers design so the Layers multiplier matches startGeneration. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "castCount": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        },
        "designId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Editable Layers design receiving this media. Uses Layers pricing, matching startGeneration."
        },
        "durationSeconds": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        },
        "firstFrameGenerationId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Owned completed generation used as the first frame, matching startGeneration."
        },
        "firstFrameKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Owned first-frame image key for a video estimate."
        },
        "inputVideoDurationSeconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "kind": {
          "type": "string",
          "maxLength": 32000
        },
        "ratio": {
          "type": "string",
          "maxLength": 32000
        },
        "refKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "The same owned image reference keys passed to startGeneration, so Layers source pricing matches."
        },
        "referenceCount": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        },
        "resolution": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "kind",
        "ratio",
        "resolution"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_account

Account. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_subscription_offer

Subscription offer. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_pack_offer

Pack offer. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_credit_packs

Credit packs. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_billing_history

Billing history. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_notifications

Notifications. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "limit": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_notifications_page

Notifications page. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "cursor": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "limit": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_mark_notifications_read

Mark notifications read. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_mark_notification_read

Mark notification read. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_clear_notifications

Clear notifications. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_notification_preferences

Notification preferences. Uses the signed-in user’s existing permissions and product rules. Permission: account:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_update_notification_preferences

Update notification preferences. Uses the signed-in user’s existing permissions and product rules. Permission: account:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "preferences": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "preferences"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_projects

Projects. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_create_project

Create project. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_rename_project

Rename project. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_reorder_projects

Reorder projects. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "ids"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_project

Delete project. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_assign_generations_to_project

Assign generations to project. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "generationIds": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "projectId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "generationIds"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_characters

Characters. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_character_statuses

Character statuses. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_video_reference_asset

One video reference asset: poll it until status is "active" (about a minute) before using its id in startGeneration.videoReferenceAssetIds; "failed" means the provider rejected the image. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_character

Character. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_templates

Templates. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_creations

Browse existing studio creations, including content created on the website. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "first": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_creations_page

Browse a bounded page of owned creations with server-side search, filters and cursor pagination. Use endCursor to load the next page. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "after": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "first": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        },
        "kind": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "projectId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "search": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "sort": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_creations_by_ids

Read up to 256 explicitly selected owned creations by ID, including selections outside the current Library page. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "ids"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_creation

Creation. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_generation_draft

Generation draft. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_generation

Poll one generation job: status, progress, error and, when finished, signed result URLs. For a video, follow with musavir_generation_frames to actually look at it. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_active_generations

Active generations. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_failed_generations

Failed generations. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_daily_inspiration

Daily inspiration. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_reference_suggestions

Reference suggestions. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_create_character

Create a character draft. Then obtain selfie upload URLs, upload files and start character training. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "name": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "selfieKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        },
        "sourcePhotos": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_character_selfie_upload_urls

Obtain signed upload URLs for character source photos. Upload bytes with HTTP PUT to each returned URL before training. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "characterId",
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_generation_reference_upload_urls

Obtain signed upload URLs for image references. Upload bytes with HTTP PUT, then pass returned object keys to start_generation. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_generation_video_reference_upload_urls

Obtain signed upload URLs for video references. Upload bytes with HTTP PUT before normalization or generation. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_normalize_generation_video_reference

Normalize generation video reference: returns the prepared key (use it from then on), duration, width and height, waiting up to 25 seconds. If preparation is still running it fails with MEDIA_PREPARATION_PENDING and a preparationId: call again with the same key and allowTrim (it returns the same job) or poll musavir_media_preparation. An overlong clip returns VIDEO_TRIM_CONSENT_REQUIRED with measured durationSeconds/maxDurationSeconds and remains untouched. Obtain permission to keep only the first supported seconds, then retry the same key with allowTrim=true and a new requestId. For an immediate receipt use musavir_start_media_preparation. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "allowTrim": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Explicitly permit shortening this uploaded clip to the supported duration after VIDEO_TRIM_CONSENT_REQUIRED. Omit or false to preserve an overlong original."
        },
        "key": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "key"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_complete_static_image_upload

Verify a still-image upload and return its immutable browser-safe PNG/JPEG key before attaching it to a character, item, design or generation. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "key": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "key"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_start_media_preparation

Queue image verification or video normalization without holding an HTTP request open. Repeat the same owned upload key to recover its original receipt. Poll media_preparation by returned ID. Overlong video requires explicit allowTrim after VIDEO_TRIM_CONSENT_REQUIRED. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "allowTrim": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        },
        "key": {
          "type": "string",
          "maxLength": 32000
        },
        "kind": {
          "type": "string",
          "enum": [
            "image",
            "video"
          ]
        }
      },
      "required": [
        "key",
        "kind"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_media_preparation

Read an owned upload preparation. Queued and running work survives restarts; succeeded contains the immutable prepared media key. Failed includes a safe error code and any required trim consent details. Permission: studio:read or studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_start_design_assist_job

Queue Layers assistance outside the HTTP request. Retain the same requestId across retries and poll design_assist_job. Assistance can spend credits: charge on a durably published, owned, recoverable result even if never applied. Queued work has no funding reservation; balance and applicable design-version checks run again at execution. Plan and picture operations remain browser-only. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "input": {},
        "operation": {
          "type": "string",
          "maxLength": 32000
        },
        "requestId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id",
        "input",
        "operation",
        "requestId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_design_assist_job

Read an owned Layers assistant job. Queued work waits for capacity; accepted model output is recovered under its original request identity. Succeeded contains the usable response, and failed contains a safe error. Permission: studio:read or studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_generation_audio_reference_upload_urls

Obtain signed upload URLs for MP3/WAV audio. Upload bytes with HTTP PUT. The default generation_reference purpose keeps the configured video model limits; local_edit accepts one prepared soundtrack up to 15 MiB for free video editing and does not generate speech or music. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "purpose": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "generation_reference",
                "local_edit"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "generation_reference keeps configured Seedance limits. local_edit accepts one prepared MP3/WAV up to 15 MiB for free soundtrack replacement, independent of provider audio access. Neither option purchases a generation."
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_create_video_reference_asset

Register an uploaded image as a video reference asset. With isCharacter: true this is how a PERSON from the user's photos gets into a video without a saved character: poll videoReferenceAsset until "active", then pass the id in startGeneration.videoReferenceAssetIds. With isCharacter: false it is an object, place or style reference for video. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "isCharacter": {
          "type": "boolean"
        },
        "sourceImageKey": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "isCharacter",
        "sourceImageKey"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_start_character_training

Start paid character preparation after every source photo is uploaded. Poll character for status. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "characterId": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "instructions": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "selfieKeys": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "characterId",
        "selfieKeys"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_save_generation_draft

Save generation draft. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "state": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "state"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_character

Delete character. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_regenerate_character

Retrain a character's identity sheet (paid). instructions: what to correct. fresh: true rebuilds from the source photos alone; false refines the current sheet, which tends to stay close to it. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expectedSelfieKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        },
        "fresh": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "instructions": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_set_character_photos

Replace a character's source photos with this ordered list of object keys: reorder, remove, or add keys uploaded through characterSelfieUploadUrls. The first photo weighs most. Free; updates the originals immediately. Rebuilding the identity sheet requires a separate regenerateCharacter call. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "keys": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "id",
        "keys"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_start_generation

Start one image or one video clip. People are cast with characterIds and things that must stay exact with itemIds; never upload a photo of a person as a reference. For a film, chain shots with firstFrameGenerationId and join them with musavir_edit_video. Returns a job to poll with musavir_generation. For work on a Layers design, pass its designId (edit access required); all paid Layers steps use the admin-configured Layers multiplier, default 3.5×. Spends the user's credits. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "audio": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        },
        "audioRefKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        },
        "characterId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Legacy single character. Prefer characterIds."
        },
        "characterIds": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "The PEOPLE in the shot, by character id (up to 3). The strongest way to put a real or recurring person in a render: each character carries a trained identity and, for video, a provider-registered portrait. Without a character: for stills pass their photos in refKeys; for video register one photo with createVideoReferenceAsset(isCharacter: true) and pass it in videoReferenceAssetIds. Never pass a photo of a person as a video refKey or first frame — the provider refuses it."
        },
        "designId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Editable Layers design receiving this picture. Uses Layers pricing."
        },
        "durationSeconds": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "Video length in seconds, 4-30. One clip is one action (usually 4-12 s); a film is several clips chained and joined, never one long clip."
        },
        "firstFrameGenerationId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Video only. Start this clip from a finished generation of yours: a video gives its LAST frame (so the next shot of a film begins exactly where the previous one ended), a still without people gives itself. Send it ALONE — no characterIds, itemIds or reference images, because the frame already carries the person, the product and the place — and describe the action from where that clip ended. A chained shot keeps the previous camera; for a new angle, shoot a fresh clip from characters and items instead."
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "itemIds": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "The THINGS that must stay exact, by item id (up to 3): products, vehicles, animals, creatures, objects, wardrobe pieces and locations. Each item carries a reference sheet and its source photos, attached automatically. Lock every noun that must not drift across a set or a film as an item before shooting."
        },
        "kind": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "\"photo\" or \"video\". Required when no templateId is given."
        },
        "omniReferenceTaskType": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Video reference operation: edit, extend, or auto. An edit requires exactly one source video and inherits its duration and aspect ratio."
        },
        "projectId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "prompt": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "The full prompt. Required without a template. Read the musavir://guides resources first: they hold the prompting rules for the image and video models, the film rules and the review standard."
        },
        "ratio": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Aspect ratio, e.g. 16:9, 9:16, 1:1, 3:4. A chained shot must use the ratio of the clip it starts from."
        },
        "refKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "Ordered keys of uploaded reference IMAGES (from generationReferenceUploadUrls) for style, mood, a place or an object. Refer to them in the prompt as Image 1, Image 2, … in this order. Not for people (use characterIds), and better as items when the thing must stay exact."
        },
        "refLocation": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "refObject": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "refStyle": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "refs": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "resolution": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Video: 480p | 720p | 1080p. Photo: 1K | 1.5K | 2K. Trial a shot at 480p, shoot the chain at 720p, 1080p only when asked."
        },
        "templateId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "videoRefKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        },
        "videoReferenceAssetIds": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "Video only: ids of ACTIVE video reference assets (createVideoReferenceAsset). One made with isCharacter: true from a photo of a person is a valid identity for the video — no saved character needed. Referred to in the prompt as @image1, @image2… in this order."
        },
        "watermark": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "requestId"
  ]
}
```

### musavir_approve_video_character_sheets

Approve prepared character sheets and proceed with the paid video stage. For an older paused image or video job marked INPUT_CONFIRMATION_REQUIRED, first query generation.inputReview, show its current ordered references and pricing to the user, then pass that review’s inputFingerprint. Reuses the existing job and reservation; obtain the user’s approval first. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "inputFingerprint": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_dismiss_generation

Dismiss generation. Uses the signed-in user’s existing permissions and product rules. Returns false when the job was kept instead: work the provider is already rendering is never removed by a dismiss (use musavir_cancel_generation). Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_creations

Delete creations. Uses the signed-in user’s existing permissions and product rules. Returns how many were removed. Finished and failed items are removed (delivered work is not refunded). Unsent work, or a video BytePlus cancelled while still queued, is refunded and removed. Work the provider is already rendering cannot be cancelled: without acceptCharge it is kept, not removed (it finishes, is charged like any render, and appears in the library); with acceptCharge=true it is removed and charged exactly what the provider bills. Ask the user before accepting a charge. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "acceptCharge": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        },
        "ids": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        }
      },
      "required": [
        "ids"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_cancel_generation

Cancel one render that has not finished. CANCELLED: it was never sent, or BytePlus still had the video queued — refunded and removed. RENDERING: the provider is already rendering it, so it cannot be cancelled and nothing changed — tell the user they will be charged if they delete it, and only with their agreement call again with acceptCharge=true (DELETED: removed, charged exactly what the provider bills). Without it, it finishes and appears in the library. FINISHED: nothing was left to cancel. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "acceptCharge": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ]
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_template_request_for_generation

Template request for generation. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "generationId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "generationId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_my_template_requests

My template requests. Uses the signed-in user’s existing permissions and product rules. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_submit_generation_as_template

Submit generation as template. Uses the signed-in user’s existing permissions and product rules. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "generationId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "generationId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_items

List the account's items: products, animals, creatures, objects, wardrobe and locations with their reference sheets. Requires the Agentic mode tool to be switched on for the account. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_item

Read one item with its reference sheet, source photos and fidelity notes. Requires the Agentic mode tool to be switched on for the account. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_item_source_upload_urls

Get signed upload URLs for an item's source photographs. Requires the Agentic mode tool to be switched on for the account. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_create_item

Create an item from uploaded photos or a description and build its reference sheet (a billed image render). Requires the Agentic mode tool to be switched on for the account. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "description": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "kind": {
          "type": "string",
          "maxLength": 32000
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "sourceKeys": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "kind",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_update_item

Update an item's name, description or fidelity notes. Requires the Agentic mode tool to be switched on for the account. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "description": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "name": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_regenerate_item_sheet

Rebuild an item's reference sheet with an optional correction (a billed image render). Requires the Agentic mode tool to be switched on for the account. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "instructions": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_item

Delete an item. Requires the Agentic mode tool to be switched on for the account. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_generation_frames

Still frames spread across one of the user's finished videos, with timestamps and signed URLs. This is how an agent watches a clip: review motion, continuity, wardrobe, identity and artefacts second by second before keeping or chaining it. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "count": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "How many frames, 1-30 (default 6). Two per second gives a careful review of a short clip."
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_edit_video

The editor queues a free durable job: retain its idempotency key, poll musavir_generation by the returned ID and wait for success before reading URLs, reviewing frames or chaining. Turn 1-60 finished-video segments, in playback order, into ONE NEW clip. A segment can reuse an earlier source clip with a different trim. Keep selected output to 120 seconds and unique source media to 180 seconds. One clip in = trim it (startSeconds/endSeconds), re-time it (speed, 0.5 = slow motion) or reframe it; several = a cut. Reframe with ratio (e.g. 9:16), mute, add supplied timed captions, or replace the original audio with one prepared MP3/WAV soundtrack (audioKey). Captions are up to 24 ordered `{ startSeconds, endSeconds, text }` literal cues on the final output timeline after trim/speed; end is exclusive. They are not transcription, speech synthesis, or generated text. Upload audio with musavir_generation_audio_reference_upload_urls and purpose local_edit: one track up to 15 MiB, independent of provider audio access. Short tracks pad with silence without looping or shortening the video; long tracks trim to output duration, with an end fade. This does not generate voice or music; the edit itself is local and free. Hard cuts, originals untouched. Returns the new clip's id and label: an ordinary video generation you can review, file, chain from and edit again. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "audioKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "One prepared MP3/WAV soundtrack uploaded with generationAudioReferenceUploadUrls(purpose: local_edit). It replaces the clips' original audio and fades out at the end. Short tracks are padded with silence, not looped, and never shorten the video; long tracks are trimmed to the output duration. This does not generate voice or music. Local editing is free and does not require a provider audio-reference route."
        },
        "captions": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "endSeconds": {
                    "type": "number",
                    "description": "End time on the finished cut, exclusive."
                  },
                  "startSeconds": {
                    "type": "number",
                    "description": "Start time on the finished cut, inclusive."
                  },
                  "text": {
                    "type": "string",
                    "maxLength": 32000,
                    "description": "Literal supplied caption text. It is not transcribed or generated."
                  }
                },
                "required": [
                  "endSeconds",
                  "startSeconds",
                  "text"
                ]
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "Up to 24 ordered, non-overlapping literal captions. `{ startSeconds, endSeconds, text }` is on the final output timeline after every slice and speed change. The end is exclusive, so touching cues do not overlap. No transcription or speech is generated."
        },
        "clips": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "endSeconds": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Where the slice ends (default: the end of the clip). A slice is at least 0.5 s."
              },
              "id": {
                "type": "string",
                "maxLength": 32000,
                "description": "A finished video generation of yours."
              },
              "speed": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Re-time this clip, 0.25-4 (default 1). 0.5 is half-speed slow motion and doubles the time it takes in the cut; 2 is double speed."
              },
              "startSeconds": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Where the slice starts (default 0). Cut in on motion, after any idle opening."
              }
            },
            "required": [
              "id"
            ]
          },
          "maxItems": 100,
          "description": "Ordered edit segments (1-60; a source may repeat)."
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Stable key for this exact edit. A replay returns the same child, including an interrupted or still-running edit, without encoding another copy."
        },
        "label": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "The name of the new clip; returned as `label` so you can refer to it later."
        },
        "mute": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Drop the clips' own sound. Use it for fast montages: each clip has its own ambience, and cutting that every two seconds is noise."
        },
        "projectId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "ratio": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Reframe the film to another aspect ratio by centre-cropping to cover, e.g. \"9:16\" for a vertical cutdown of a 16:9 shoot. Default: the first clip's frame."
        }
      },
      "required": [
        "clips"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_designs

List the account's Layers designs: layered, animated designs that lay themselves out on every ad size. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_design_summaries

List lightweight design cards without loading complete documents. Read a selected design separately to edit it. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_design

Read one design: the JSON document (artboards, layers bottom first, per-size overrides, motion), signed URLs for its assets, and the automatic check results. Read musavir://guides/layers first. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_design_revisions

The history of a design, newest first: who changed it (user, assistant, agent) and what. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_design_revision_doc

The document as it was at one revision, to compare before restoring. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "version": {
          "type": "integer",
          "minimum": -2147483648,
          "maximum": 2147483647
        }
      },
      "required": [
        "id",
        "version"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_design_capabilities

Whether flat-image decomposition and the built-in assistant are available on this deployment. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_create_design

Start a design with a blank master artboard of a given size, or import a whole document. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "doc": {
          "anyOf": [
            {},
            {
              "type": "null"
            }
          ],
          "description": "Optional complete design document to import instead of a blank one."
        },
        "height": {
          "type": "integer",
          "minimum": -2147483648,
          "maximum": 2147483647
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "sourceFileKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "sourceFileName": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "width": {
          "type": "integer",
          "minimum": -2147483648,
          "maximum": 2147483647
        },
        "workspaceId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "height",
        "name",
        "width"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_change_design

THE way a design changes: an array of commands applied in order, all or nothing, recorded as one revision. add_layer, remove_layer, update_layer (pass artboardId to change one size only), reorder_layer, duplicate_layer, set_motion (cutId: one length only), set_cut (another length of the animation, e.g. 15 s next to 6 s), reset_override, add_artboard, update_artboard, remove_artboard, set_document, recolor. You can draw logos and shapes yourself as SVG path layers and animate them. Read musavir://guides/layers for the model. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "commands": {
          "description": "An array of command objects, e.g. [{\"type\":\"update_layer\",\"layerId\":\"l_1\",\"patch\":{\"box\":{\"x\":40}}}]."
        },
        "expectedVersion": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The version you read. A stale version is rejected without applying commands. Omission preserves legacy unconditional edits; new clients should always send it."
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Stable identity of this exact command batch. Reuse it after response loss."
        },
        "label": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "A short readable line for the history panel."
        }
      },
      "required": [
        "commands",
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_assist_design

Ask Musavir's built-in assistant to change a design in plain words; it returns the edited design once the change is applied. A retry with the same requestId returns the accepted answer instead of paying again. For long requests, musavir_start_design_assist_job queues the same work and musavir_design_assist_job polls it. BILLED: every model call it makes is charged to the user's credits at the chosen model's list price times the admin-configured Layers multiplier (default 3.5×; one request is usually one to five calls; higher thinking and GPT-6 Astra / Claude Opus 5.5 cost more). Ask the user before calling it, pass model and thinking deliberately, and read chargedCredits for what the request cost; an account with no credits is refused (GENERATION_BLOCKED). As an agent you can usually do better, and for free, by reading the design and calling musavir_change_design yourself. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "artboardId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "The size being looked at, so \"here\" means something."
        },
        "assetIds": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "Owned asset library entries selected with @ in the Layers composer."
        },
        "expectedVersion": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The design version shown with this request. If supplied, checked before model work. Applying assistant commands always checks the version the model actually read."
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "model": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "CLAUDE_FABLE_5_1",
                "CLAUDE_OPUS_5_5",
                "DOLA",
                "GPT_6_1_SOL",
                "GPT_6_ASTRA",
                "GPT_6_LUNA",
                "GPT_6_SOL",
                "LOCAL"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "The model to run on (see designCapabilities.assistModels). The deployment's default when omitted."
        },
        "observations": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "Optional: facts measured by the client on the rendered size (e.g. \"“T&Cs Apply” reads at about 1.1:1 against what is behind it\"). Advisory context for the assistant."
        },
        "pictureHeight": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The attached picture's height in pixels."
        },
        "pictureKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Optional: a key from designAssetUploadUrls holding a picture the person attached (a logo, a product, a reference). Shown to the model; it can place it as an image layer."
        },
        "pictureWidth": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The attached picture's width in pixels, so it is placed in proportion."
        },
        "prompt": {
          "type": "string",
          "maxLength": 32000
        },
        "propose": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Return the checked commands without saving them (field `commands`), so several size reviews can run at once and be applied together with changeDesign. Each only touches its own size."
        },
        "requestId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Stable UUID for this exact assistant request. Replay retrieves its accepted response."
        },
        "selectedLayerIds": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 32000
              },
              "maxItems": 100
            },
            {
              "type": "null"
            }
          ],
          "description": "The layers currently selected, so \"this\" means something."
        },
        "step": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "ANIMATE",
                "DESIGN",
                "EDIT",
                "REFINE",
                "ROLES"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "Which step of a planned request this is (see planDesignAssist). EDIT when omitted."
        },
        "thinking": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "HIGH",
                "LOW",
                "MAX",
                "MEDIUM",
                "OFF",
                "XHIGH"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "How long the model thinks first. The model's recommended level when omitted."
        },
        "viewKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Optional: a key from designAssetUploadUrls holding a render of the active artboard, so the assistant can see the design, not only its numbers."
        }
      },
      "required": [
        "id",
        "prompt"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_restore_design

Go back to an earlier revision. It is itself a new revision, so it can be undone. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expectedVersion": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The current design version you read, not the historical version being restored. Omission preserves legacy unconditional restores; new clients should always send it."
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Stable identity of this exact restore. Reuse it after response loss."
        },
        "version": {
          "type": "integer",
          "minimum": -2147483648,
          "maximum": 2147483647
        }
      },
      "required": [
        "id",
        "version"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_rename_design

Rename a design. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_design

Delete a design. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_design_asset_upload_urls

Signed upload targets for images to place in a design (PNG, JPG, WebP, SVG). PUT the bytes, then use the key as an image layer assetKey. The user's own generated images can be used by their key as well. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "contentTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 32000
          },
          "maxItems": 100
        },
        "sizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "maxItems": 100
        }
      },
      "required": [
        "contentTypes",
        "sizes"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_set_design_thumbnail

Set the preview image of a design from an uploaded key. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expectedVersion": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The saved version: a stale version is rejected. Omission sets the thumbnail unconditionally (legacy behaviour); new clients should always send it."
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        },
        "key": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id",
        "key"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_design_svg

One size of a design as a layered SVG file (text as text, shapes as vectors, pictures linked). Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "artboardId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Defaults to the master."
        },
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_design_cutout

Remove the background of one of your pictures; returns a new asset key. Check designCapabilities first. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "imageKey": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "imageKey"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_design_vectorize

Turn a raster logo or flat artwork into a real SVG; returns a new asset key. Check designCapabilities first. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "imageKey": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "imageKey"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_design_split_image

Split one picture into transparent, trimmed pieces with the boxes they occupied. Check designCapabilities first. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "imageKey": {
          "type": "string",
          "maxLength": 32000
        },
        "layers": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "How many pieces, 2-10 (default 4)."
        }
      },
      "required": [
        "imageKey"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_design_asset_from_generation

The asset key of one of your finished image generations, to place in a design. To edit, repair or extend a design picture by prompt: startGeneration with the target designId and its assetKey in refKeys, then this. Paid Layers work uses the admin-configured Layers multiplier (default 3.5×). Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "generationId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "generationId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_brand_kits

The account's brand kits: a client's colours, typefaces and logos, with signed URLs. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {},
      "required": []
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": []
}
```

### musavir_save_brand_kit

Create or replace a brand kit. Upload fonts and logos first with designAssetUploadUrls. Font mappings used by retained design history cannot change; create a new kit for different fonts. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "expectedVersion": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "The version you read, when replacing an existing brand kit: a stale version is rejected. Omission replaces it unconditionally (legacy behaviour); new clients should always send it."
        },
        "id": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "kit": {},
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "workspaceId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "kit",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_delete_brand_kit

Remove an unused brand kit. Deletion is refused while retained designs or their history reference it, to preserve their fonts. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "id"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_create_design_from_picture

Start a design from one uploaded picture with no model involved: as "picture" the picture becomes the page, ready for text to fly in over it; as "logo" it is centred on a square page, already animated. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "as": {
          "type": "string",
          "maxLength": 32000,
          "description": "\"picture\" or \"logo\"."
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Stable key for this exact import. Replays return the same design after a lost response."
        },
        "imageKey": {
          "type": "string",
          "maxLength": 32000,
          "description": "An owned uploaded image key."
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "projectId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "workspaceId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "as",
        "imageKey",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_create_design_from_generation

Start a native design from one exact owned completed image. No generation or charge. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "generationId": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ],
          "description": "Stable key for this exact import. Replays return the same design after a lost response."
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "projectId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "generationId",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_publish_reference

Explicitly publish a chosen completed generation as a reusable image-reference character or item. Free metadata only, not training or video activation. Requires provenance and idempotency key; replacement requires the current published version. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "entityId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "entityType": {
          "type": "string",
          "maxLength": 32000
        },
        "expectedPublishedVersionId": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "idempotencyKey": {
          "type": "string",
          "maxLength": 32000
        },
        "itemKind": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        },
        "notes": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        },
        "provenance": {
          "type": "string",
          "maxLength": 32000
        },
        "sourceGenerationId": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "entityType",
        "idempotencyKey",
        "name",
        "provenance",
        "sourceGenerationId"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_reusable_reference_versions

Read immutable published image-reference versions for an owned character or item. Permission: studio:read.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "entityId": {
          "type": "string",
          "maxLength": 32000
        },
        "entityType": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "entityId",
        "entityType"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    }
  },
  "required": [
    "input"
  ]
}
```

### musavir_revise_reference_notes

Create a new metadata-only version of an owned reusable reference with expected published version and idempotency key. Does not purchase a render. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "entityId": {
          "type": "string",
          "maxLength": 32000
        },
        "entityType": {
          "type": "string",
          "maxLength": 32000
        },
        "expectedPublishedVersionId": {
          "type": "string",
          "maxLength": 32000
        },
        "idempotencyKey": {
          "type": "string",
          "maxLength": 32000
        },
        "notes": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 32000
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "entityId",
        "entityType",
        "expectedPublishedVersionId",
        "idempotencyKey"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```

### musavir_import_design_from_image

Split an uploaded flat image into transparent layers and open it as a design. Check designCapabilities first. Permission: studio:write.

```json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "input": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "imageKey": {
          "type": "string",
          "maxLength": 32000,
          "description": "A key returned by designAssetUploadUrls."
        },
        "layers": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -2147483648,
              "maximum": 2147483647
            },
            {
              "type": "null"
            }
          ],
          "description": "How many layers to split into, 2-10 (default 6)."
        },
        "name": {
          "type": "string",
          "maxLength": 32000
        }
      },
      "required": [
        "imageKey",
        "name"
      ]
    },
    "selection": {
      "type": "string",
      "maxLength": 6000,
      "description": "Optional result fields, e.g. \"id status\". Nested fields use braces. Defaults to the standard projection."
    },
    "requestId": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "description": "Unique ID for this intended action. Always reuse on retries with identical arguments. Never replace it to retry an uncertain operation."
    }
  },
  "required": [
    "input",
    "requestId"
  ]
}
```


## Browser and infrastructure operations

- directorAssetGenerationIds: Owned browser asset membership independent of loaded transcript and Library pages; does not buy provider work.
- designAssistJobs: Owned browser recovery of recent durable assistant results for an editor. Results remain readable on another device.
- cancelDesignAssistJob: Browser cancellation of an unstarted assistant job with no held, settled or saved receipt evidence; paid work follows recovery.
- directorMessagePage: Browser transcript window and older-message controls for the built-in director. MCP clients use the generation tools directly.
- directorMediaMessages: Browser campaign gallery for the built-in director. MCP clients use the generation tools directly.
- adminWorkspaceCollaborators: Workspace membership administration is available only in the admin dashboard.
- adminSetWorkspaceCollaborator: Workspace membership administration is available only in the admin dashboard.
- mySharedWorkspaces: Browser workspace switcher for corporate members.
- workspaceCollaborators: Browser workspace membership display; external agents use their own authorized resources.
- designCollaborators: Browser design-sharing controls and collaborator display.
- designSourceFiles: Browser display of source files attached to a Layers design.
- workspaceCreations: Browser library of creations explicitly shared into a workspace.
- attachDesignSourceFile: Browser source-file attachment for the Layers editor.
- publishDesignToWorkspace: Browser action to publish an owned design to a workspace.
- setDesignEditor: Browser action to grant or remove a collaborator on a design.
- shareWorkspaceResource: Browser action to share an owned asset or generation with a workspace.
- unshareWorkspaceResource: Browser action to remove a shared asset or generation from a workspace.
- characterPreviews: Browser-only derivative readiness, not a generation operation.
- creationPreviews: Browser-only derivative readiness, not a generation operation.
- g42PreviewStatuses: Browser-only derivative readiness for corporate gallery cards.
- repairThumbnail: Browser-only derivative repair; does not create or purchase media.
- assetLibrary: Browser saved-asset picker and inventory. MCP clients use their existing owned generation and upload keys directly.
- saveAsset: Browser saved-asset cataloging after an upload. MCP clients can use the owned upload or generation key directly without adding it to the picker.
- renameAsset: Browser saved-asset catalog management. Renames an entry in the saved-asset picker; MCP clients use owned asset keys directly.
- removeAsset: Browser saved-asset catalog management. Removes an entry from the picker without deleting its stored file; MCP clients use owned asset keys directly.
- ensureAssetVideoReference: Browser saved-image shortcut for video reference registration. MCP clients use createVideoReferenceAsset and poll videoReferenceAsset.
- estimateDesignDecomposition: Browser-only price review for splitting a picture into layers: the most the split can cost is shown before anyone approves it. No MCP purchasing route is enabled.
- startDesignDecomposition: Browser-only paid split of a picture into a base picture plus up to 16 movable picture pieces (words stay pixels), after the reviewed price is approved. No MCP purchasing route is enabled.
- designDecompositionResult: Read a finished split and its layered design in the browser. External agents open the resulting design with the ordinary design tools.
- estimateDesignPixel: Browser-only gated pixel estimate. Recraft purchases require the reviewed browser approval flow; no MCP purchasing route is enabled.
- startDesignPixel: Browser-only gated pixel purchase with immutable source, quote and idempotency. Key presence does not enable this capability.
- designPixelResult: Read an owned pixel result in the browser and explicitly apply it to the current design; not an MCP pixel route.
- narrationCapabilities: Browser-only narration readiness. Speech qualification is independent of credential presence.
- estimateNarration: Browser-only gated narration estimate; not a grant of MCP speech purchasing access.
- startNarration: Browser-only gated narration purchase with reviewed text, price and idempotency; no MCP speech purchase route is enabled.
- narration: Read an owned narration result and renew its private playback URL in the browser without purchasing it again.
- designAssistResponse: Owned browser recovery of an already accepted Layers assistant answer; never buys another inference or reapplies commands.
- planDesignAssist: Splits a Layers assistant request into steps for the editor, which then runs them with the renders it holds; external agents read the design and call musavir_change_design directly.
- readDesignPicture: Reads a picture attached in the Layers editor (a media plan into CSV, anything else into a description) for the person to confirm; external agents read pictures themselves and add sizes or layers with musavir_change_design.
- updateDirectorSelection: The built-in workspace selection uses explicit browser intent; external agents use owned design IDs and expected document versions directly.
- cinematicPlan: Cinematic planning and human acceptance are browser-only Director workspace operations; external agents use ordinary owned media tools.
- saveCinematicPlan: Cinematic planning and human acceptance are browser-only Director workspace operations; external agents use ordinary owned media tools.
- saveCinematicAudioDraft: Cinematic supplied-audio selection and its free inspection receipt are browser-only Director workspace operations; no MCP media-mixing route is enabled.
- saveCinematicContinuityDraft: Cinematic reviewer continuity registration is browser-only; no MCP state ledger route is enabled.
- recordCinematicObservation: Cinematic human-reviewed accepted-range observation is browser-only; no MCP continuity acceptance route is enabled.
- approveCinematicPlan: Cinematic planning and human acceptance are browser-only Director workspace operations; external agents use ordinary owned media tools.
- renderCinematicUnit: Cinematic paid render approval is browser-only and binds the reviewed plan revision; no MCP purchase route is enabled.
- queueCinematicPlanRenders: Cinematic batch cost review is browser-only and creates no provider work; final purchase remains the explicit browser approval.
- reviewCinematicTake: Cinematic human review is browser-only; sparse automated media inspection cannot certify motion or audio.
- retryCinematicTakeInspection: Cinematic local inspection recovery is browser-only and never purchases a new provider render.
- acceptCinematicRange: Cinematic kept-range acceptance is an explicit browser human action, not an MCP operation.
- acceptCinematicEdit: Accepting the proposed cinematic cut is an explicit browser human action, not an agent or MCP approval.
- reorderCinematicAcceptedRanges: Cinematic rough-cut ordering is an explicit browser review action; no MCP edit timeline route is enabled.
- removeCinematicAcceptedRange: Cinematic kept-range removal is browser-only and preserves human continuity evidence.
- exportCinematicSequence: Cinematic native conform is browser-only after human review; no MCP export route is enabled.
- directorThreads: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- directorThread: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- directorMessages: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- createDirectorThread: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- sendDirectorMessage: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- directorVideoUploadUrl: Private Agentic reference-video upload for visual inspection; browser-only, not a paid video-generation reference.
- directorModels: The configured Agentic chat-model picker is browser-only; MCP clients choose their own conversational model.
- editDirectorMessage: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- resolveDirectorApprovals: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- stopDirector: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- updateDirectorThread: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- deleteDirectorThread: Agentic campaigns are Musavir's built-in director, used on the website. Over MCP your own AI is the director and uses the generation tools directly.
- adminEmailNotification: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSendG42Email: Administration is done in the Musavir admin dashboard, never over MCP.
- adminResumeG42Email: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUsers: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCreateUser: Administration is done in the Musavir admin dashboard, never over MCP.
- adminGenerationAnalytics: Administration is done in the Musavir admin dashboard, never over MCP.
- adminMediaBillingReconciliation: Administration is done in the Musavir admin dashboard, never over MCP.
- adminStripeReconciliation: Financial reconciliation requires an authorized administrator in the browser.
- adminStripeLegacySubscriptions: Financial reconciliation requires an authorized administrator in the browser.
- adminInspectStripeSubscription: Financial reconciliation requires an authorized administrator in the browser.
- adminScheduleStripeSubscriptionTerms: Financial renewal terms require an authorized administrator in the browser.
- adminAdoptStripeSubscriptionTerms: Financial reconciliation requires an authorized administrator in the browser.
- adminReconcileStripeReceipt: Financial reconciliation requires an authorized administrator in the browser.
- adminReconcileStripeFinancialCancellation: Financial reconciliation requires an authorized administrator in the browser.
- adminRecoverStripeBilling: Financial recovery requires an authorized administrator in the browser.
- adminRetryStripeEvent: Financial recovery requires an authorized administrator in the browser.
- adminAutoReloadReconciliation: Financial reconciliation requires an authorized administrator in the browser.
- adminAdoptAutoReloadPayment: Financial reconciliation requires an authorized administrator in the browser.
- adminReconcileAutoReload: Financial recovery requires an authorized administrator in the browser.
- checkoutStatus: Checkout receipt recovery belongs to the initiating browser account.
- resumePlan: Subscription renewal intent is explicitly managed by the customer in the browser.
- adminReconcileMediaBilling: Administration is done in the Musavir admin dashboard, never over MCP.
- adminWaitlistCounts: Administration is done in the Musavir admin dashboard, never over MCP.
- adminWaitlist: Administration is done in the Musavir admin dashboard, never over MCP.
- adminPayments: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSubscriptions: Administration is done in the Musavir admin dashboard, never over MCP.
- adminStats: Administration is done in the Musavir admin dashboard, never over MCP.
- adminTemplates: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCreateTemplateUploadUrl: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCreateTemplate: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdateTemplate: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetTemplatePublished: Administration is done in the Musavir admin dashboard, never over MCP.
- adminDeleteTemplate: Administration is done in the Musavir admin dashboard, never over MCP.
- adminMonetization: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdateProPlan: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetStandingDiscount: Administration is done in the Musavir admin dashboard, never over MCP.
- adminClearStandingDiscount: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCampaigns: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCreateCampaign: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetCampaignStatus: Administration is done in the Musavir admin dashboard, never over MCP.
- adminStoreProducts: Administration is done in the Musavir admin dashboard, never over MCP.
- adminMapStoreProduct: Administration is done in the Musavir admin dashboard, never over MCP.
- adminDailyInspirations: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetDailyInspiration: Administration is done in the Musavir admin dashboard, never over MCP.
- adminDeleteDailyInspiration: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCreditPacks: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpsertCreditPack: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetCreditPackActive: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetStoreProductActive: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetUserDisabled: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetUserPlan: Administration is done in the Musavir admin dashboard, never over MCP.
- adminGrantUserCredits: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetWaitlistStatus: Administration is done in the Musavir admin dashboard, never over MCP.
- adminWaitlistEntries: Administration is done in the Musavir admin dashboard, never over MCP.
- adminDecideWaitlistEntry: Administration is done in the Musavir admin dashboard, never over MCP.
- adminProviderPricing: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdateProviderPricing: Administration is done in the Musavir admin dashboard, never over MCP.
- adminPlanAllowances: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdatePlanAllowance: Administration is done in the Musavir admin dashboard, never over MCP.
- adminG42Workspace: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdateG42Workspace: Administration is done in the Musavir admin dashboard, never over MCP.
- adminAddG42AccessRule: Administration is done in the Musavir admin dashboard, never over MCP.
- adminJazzCashWorkspace: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdateJazzCashWorkspace: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUpdateJazzCashRoutes: JazzCash section visibility is configured in the Musavir admin dashboard, never over MCP.
- adminAddJazzCashAccessRule: Administration is done in the Musavir admin dashboard, never over MCP.
- adminRemoveJazzCashAccessRule: Administration is done in the Musavir admin dashboard, never over MCP.
- adminRemoveG42AccessRule: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetG42TemplateAssignment: Administration is done in the Musavir admin dashboard, never over MCP.
- adminCreateG42Template: Administration is done in the Musavir admin dashboard, never over MCP.
- startTrial: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- subscribe: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- resumeSubscriptionCheckout: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- createCardUpdateSession: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- createBillingPortalSession: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- cancelSubscription: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- purchaseCreditPack: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- configureAutoReload: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- setDefaultCard: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- removeCard: Subscriptions, purchases and cards are managed in Billing on the website, never over MCP.
- adminTemplateRequests: Administration is done in the Musavir admin dashboard, never over MCP.
- adminTemplateRequest: Administration is done in the Musavir admin dashboard, never over MCP.
- adminApproveTemplateRequest: Administration is done in the Musavir admin dashboard, never over MCP.
- adminRejectTemplateRequest: Administration is done in the Musavir admin dashboard, never over MCP.
- adminUserTools: Administration is done in the Musavir admin dashboard, never over MCP.
- adminSetUserTool: Administration is done in the Musavir admin dashboard, never over MCP.
- signup: Create your account in the browser.
- login: Sign in through OAuth in the browser.
- oauthSignIn: Sign in through OAuth in the browser.
- refresh: MCP uses its own OAuth refresh tokens.
- logout: Disconnect in Developer or use OAuth revocation.
- requestPasswordReset: Reset your password in the browser.
- resetPassword: Reset your password in the browser.
- changePassword: Change your password in Account.
- deleteAccount: Delete your account in Account after reauthentication.
- resolveEmail: Sign in through OAuth in the browser.
- requestEmailClaim: Sign in through OAuth in the browser.
- completeEmailClaim: Sign in through OAuth in the browser.
- resolveG42Email: Sign in through OAuth in the browser.
- requestG42EmailClaim: Sign in through OAuth in the browser.
- completeG42EmailClaim: Sign in through OAuth in the browser.
- joinWaitlist: Use the browser registration flow.
- createApiKey: Create credentials in Developer; secrets must not enter model context.
- addCard: Enter payment details through the secure browser billing flow.
- health: Infrastructure health is not an account operation.
- providers: Infrastructure provider status is not an account operation.

## Protocol

Streamable HTTP, stateless JSON responses, official TypeScript SDK 1.30.0.
Clients negotiate SDK-supported protocol versions (including 2025-11-25); this integration does not claim support for every newer protocol revision.
OAuth authorization code with S256 PKCE, dynamic client registration, resource-bound tokens and revocation.
GET event streams, legacy SSE transport, local stdio and background server notifications are not exposed. Poll generation jobs for progress.
Read musavir://guide for a short in-client guide or use the create-with-musavir prompt.
