ai.uselamina/lamina
REMOTE · APP.USELAMINA.AI · SCANNED AUG 3
On-brand product photos, model try-ons, video reels & banners from a brief + brand kit.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security92
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism. View diagnostics → Pass
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
Schema Quality & AI Usability0
- Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
- Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
- Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified
Unverified: 5 categories
Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · app.uselamina.ai
claude mcp add --transport http ai-uselamina-lamina https://app.uselamina.ai/mcp/agent
[mcp_servers.ai-uselamina-lamina] url = "https://app.uselamina.ai/mcp/agent"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ai-uselamina-lamina": {
"type": "remote",
"url": "https://app.uselamina.ai/mcp/agent",
"enabled": true
}
}
} openclaw mcp add ai-uselamina-lamina --url https://app.uselamina.ai/mcp/agent --transport streamable-http
mcp_servers:
ai-uselamina-lamina:
url: "https://app.uselamina.ai/mcp/agent" {
"mcpServers": {
"ai-uselamina-lamina": {
"type": "http",
"url": "https://app.uselamina.ai/mcp/agent"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 31 Jul 26 +14
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 −36
- Endpoint reachability: reachable → behind authorisation ▼ security
- Stability: 0.07 → unverified ▼ security
- Transport: pass → unverified ▼ security
- Authorization: fail → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- 28 Jul 26 +2
- Schema quality: good → excellent functional
- 27 Jul 26 −1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 58
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://app.uselamina.ai/mcp/agent
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=app.uselamina.ai | CN=YR2,O=Let's Encrypt,C=US | 7 Jul 2026 | 5 Oct 2026 | RSA 2048 | SHA256-RSA | 549d7578c399134d41a9e17c23f31f34c10 |
| SANs: app.uselamina.ai | ||||||
| CN=YR2,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | 4ebd24947e24d394802d84a52fd5b319 |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
DNSSEC insecure
Validation of app.uselamina.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| uselamina.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On connection |
| HTTP status | 401 |
WWW-Authenticate challenge Bearer resource_metadata="https://app.uselamina.ai/.well-known/oauth-protected-resource/mcp/agent"
Bearer resource_metadata="https://app.uselamina.ai/.well-known/oauth-protected-resource/mcp/agent" | Header | Value |
|---|---|
| www-authenticate | Bearer resource_metadata="https://app.uselamina.ai/.well-known/oauth-protected-resource/mcp/agent" |
Protected resource metadata
| Document | https://app.uselamina.ai/.well-known/oauth-protected-resource/mcp/agent |
|---|---|
| Retrieved | Yes |
| Resource | https://app.uselamina.ai/mcp/agent |
| Authorisation server | https://app.uselamina.ai |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://app.uselamina.ai/mcp/agent | Auth required | 401 | |
| http (plaintext) | http://app.uselamina.ai/mcp/agent | HTTPS enforced | 301 | https://app.uselamina.ai/mcp/agent |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
lamina_app_versions ~240
List a generated app's saved graph versions, or restore it to one. Every `lamina_generate_workflow` edit snapshots the app's prior graph first, so a bad edit is always recoverable. - `appId` (required): the generated app. - Omit `restore` to LIST versions — returns `{ versions: [{ version, createdAt, createdBy, changeSummary }] }`, newest first. - Pass `restore: <version>` to RESTORE that version — swaps its graph + parameters back in (the current graph is snapshotted first, so restore is itself undoable). Returns `{ appId, restoredFrom, newVersion }`. Requires you to be the app creator or a workspace owner/admin.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| appId | string | yes | The generated app to inspect or restore. |
| restore | integer | — | A version number to restore (from the list). Omit to just list versions. |
No output schema declared.
No examples provided.
lamina_brand ~467
Load the brand context the user has configured for this workspace — voice, visual identity, guardrails, prompt directives, performance patterns. Call this when the user mentions branding, voice, or guardrails, or when you want to weave brand-aware language into `inputs` for `lamina_run`. Returns three independent sections (each can be `null` or empty): - `brandDna` — voice, visual identity, content pillars, audience signals, guardrails. Populated when the workspace has both a brand profile filled in AND brand-DNA synthesis has run. - `guidance` — workflow-scoped prompt directives, negative prompts, recommended moves. Populated by content scoring / recommendation jobs. - `topPatterns` — top-performing patterns aggregated from this workspace's run history. Populated by content scoring runs (look at `topPatterns.itemCount` — `0` means no scored content yet). If a section is `null` (or `topPatterns.itemCount === 0`), the user hasn't configured that piece yet. **Do not fabricate brand attributes.** Tell the user honestly: "I don't see a brand profile / content history configured for your workspace — you can add one in your Lamina workspace settings to get brand-aware suggestions. For now I'll proceed with what you've supplied directly." Then continue with the task using only the user's stated inputs. When sections are populated, fold the relevant strings into the `inputs` you build for `lamina_run` — voice cues into text fields, guardrails into negative prompts, winning patterns as suggestions you can offer the user.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | — | Specific brand profile to inspect. |
| campaignId | string | — | Campaign to scope guidance to. |
| modality | string | — | Content modality, such as image or video. |
| objective | string | — | Content objective, such as engagement or sales. |
| platform | string | — | Target platform for guidance. |
| topK | integer | — | Pattern count. |
| workflowId | string | — | Workflow/app to scope guidance to. |
No output schema declared.
No examples provided.
lamina_brand_compliance ~236
Read the Brand Guard result a run recorded — the per-node on/off-brand status and score against the workspace brand. Use it to drive the approve/reject turn: after a run, show the output alongside this compliance read, ask the user to approve or reject, and on a reject call `lamina_brand_feedback` (which turns the reason into a guardrail the next generation avoids). - `runId` (required): a run you started (from `lamina_run` / `lamina_status`). - Returns `{ enabled, brandProfileId, nodes[] }`. Each node has `{ nodeId, status, overallScore, brandDeviations, checkedAt }`. `enabled: false` means Brand Guard was off for that app — use `lamina_brand_score` to score it on demand instead.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| runId | string | yes | Run to read brand compliance for. |
No output schema declared.
No examples provided.
lamina_brand_feedback ~306
Give an on/off-brand verdict on a completed run, closing the loop so the next generation respects it. A `reject` with a `note` turns the reason into a brand guardrail — which then flows into `lamina_generate_workflow` and `applyBrand` runs as a negative, so the same off-brand result is avoided. `approve` is acknowledged without changing the brand. - `runId` (required): a run you started (from `lamina_run` / `lamina_status`). - `verdict` (required): `approve` or `reject`. - `note` (optional but recommended on reject): why it is off-brand — this becomes the guardrail. - `brandProfileId` (optional): target brand. Defaults to the run's app brand. - Returns `{ brandProfileId, verdict, applied, guardrails }`. Requires an owner/admin identity.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | — | Target brand. Defaults to the run's app brand. |
| note | string | — | Why it is off-brand — becomes a brand guardrail when verdict is reject. |
| runId | string | yes | Run to give feedback on. |
| verdict | string | yes | Whether the output is on-brand. |
No output schema declared.
No examples provided.
lamina_brand_kit ~232
Load the workspace's reusable BRAND KIT for a brand — the identity assets that get reused across reels: voices, avatars, characters, and motion graphics. Call this alongside `lamina_brand` when the user wants a specific brand voice/character/avatar applied, or to see what reusable assets exist. Returns `{ resolved, elements }`: - `resolved` — hydrated + ready to use: `voices` (with ElevenLabs ids), `avatars` (presenter images), `characters` (reference-image URLs), `motionGraphics`. Fold these into `lamina_run` / `lamina_compose_video` inputs. - `elements` — the raw registered rows (id, type, name, version). Empty sections mean the user hasn't registered that kind of asset yet — do not fabricate one.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | yes | Brand profile whose kit to load. |
No output schema declared.
No examples provided.
lamina_brand_score ~270
Score how on-brand a completed run's image output is, and get back the specific deviations — before you show it to the user or decide whether to regenerate. Works on ANY completed run, whether or not Brand Guard was enabled on the app. - `runId` (required): a completed run (from `lamina_run` / `lamina_status`). - `brandProfileId` (optional): brand to score against. Defaults to the run's app brand. - Returns `{ brandFit, dimensions, deviations, suggestions }`. `brandFit` is 0–100; `deviations` lists the specific guideline breaks; `suggestions` is how to fix them. - Use it as the check in a generate → score → refine loop: if `brandFit` is below your bar, feed `deviations`/`suggestions` back into the next generation.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | — | Brand to score against. Defaults to the run's app brand. |
| runId | string | yes | Completed run to score. |
No output schema declared.
No examples provided.
lamina_cancel ~164
Cancel a queued or running execution by `runId`. Idempotent — if the run already reached a terminal state (completed / failed / cancelled), the server returns its current status without erroring. Use this when the user changes their mind mid-flight (wrong inputs after dispatch, oversized variant set, abandoned long-running job). Stopping `lamina_status` polls does NOT cancel a run — the orchestrator keeps spending credits until the workflow terminates on its own.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| runId | string | yes | Run ID returned by `lamina_run`. |
No output schema declared.
No examples provided.
lamina_compose_formats ~246
List the video FORMATS `lamina_compose_video` can render — e.g. animated slideshow, cinematic b-roll, motion-graphics explainer, talking head, picture-in-picture. Each renders differently and internally uses different models; the user picks a FORMAT (never a model) and sees its cost. RESPONSE: `{ formats: [{ id, label, description, available, costTier, estimatedCredits, trending, tags, inputs, previewUrl, thumbnailUrl }], capabilities: { maxScriptDurationSec, aspectRatios, clipSeconds, … } }`. Pass a chosen `id` as `format` to `lamina_compose_video`; supply a format's `inputs` when it lists required ones. `available: false` entries are on the roadmap and cannot be dispatched yet. Optional `durationSeconds` scales the cost estimate.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| durationSeconds | integer | — | Target length for the cost estimate (default 60). |
No output schema declared.
No examples provided.
lamina_compose_plan ~341
PREVIEW what `lamina_compose_video` will do for a script — the format it routes to, the estimated cost, and the per-beat storyboard — WITHOUT generating anything or spending a credit. Fast (one LLM call). Call this first to show the user the plan + cost and confirm before committing. RESPONSE: `{ ready, format: { id, label, reason }, cost: { tier, estimatedCredits }, estimatedDurationSec, beatCount, beats: [{ treatment, effect, transition, imagePrompt }], missingInputs }`. `ready: false` + `missingInputs`/`blockers` tell you exactly what to supply before dispatching. Accepts the same steering inputs as `lamina_compose_video` (`script`, `format`, `direction`, `sections`, `inputs`, `aspectRatio`).
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| aspectRatio | string | — | — |
| brandProfileId | string | — | Preview on-brand — conditions the storyboard on the same brand style bible the render uses. Response includes `brand.applied`. Omit for a generic preview. |
| direction | string | — | Free-text creative direction. |
| format | string | — | Preview a specific format (else auto-routed). |
| generationBrief | string | — | — |
| inputs | object | — | A format's required inputs. |
| script | string | yes | Narration to preview a plan for. |
| sections | array | — | — |
No output schema declared.
No examples provided.
lamina_compose_video ~998
Compose a NARRATED, MULTI-SHOT video from a script — NOT a single ~5s clip. Use this when you need a coherent minute-ish demo / explainer with voiceover: it synthesizes the narration, storyboards it into beats, generates a continuity-chained shot per beat, and renders with transitions + Ken-Burns + captions via Remotion. (For a single short clip, use `lamina_generate_video`.) WORKFLOW: (1) `lamina_compose_video({ script })` → dispatch, get `runId`. (2) `lamina_compose_video({ runId, wait: true })` → block until done; or poll `{ runId }`. Composition takes minutes. INPUTS: • `script` (required to start): the narration to speak (a hook + one insight + a CTA; ≤~90s). The transcript/chapters derive from this, so the video stays coherent with its text. • `title` / `generationBrief` (optional): title + a one-paragraph visual brief for the shots. • `direction` (optional): free-text creative direction ("open on the product, fast cuts, end on the logo") — steer the render WITHOUT naming models. • `sections` (optional): structured per-span hints `[{ text?, hint, mustShow? }]` for a prescriptive storyboard. • `format` / `inputs` (optional): pick a format (else auto-routed); `inputs` supplies a format's required assets (e.g. `{ presenterImage }`). • `aspectRatio` (optional): `16:9` | `9:16` | `1:1` | `4:5` | `4:3` (default 16:9). • `voiceId` (optional): ElevenLabs voice id. Omit and the narration director picks a voice whose tone fits the script. • `expressive` (optional): true → adds v3 audio tags for stronger, more human inflection. (Prosody/pacing is always applied.) • `brandProfileId` (optional): steer the render on-brand — the brand DNA conditions the style bible, the narration voice (Brand Kit), and the caption color/font. Omit for a generic look. Fail-soft: a brand miss never blocks the render. • `idempotencyKey` (optional): dedupe retries — the same key returns the same run (no double charge). • `runId` (+ optional `wait`): pass a prior runId to poll instead of start…
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| aspectRatio | string | — | — |
| brandProfileId | string | — | Brand profile id to condition the render on-brand (style bible + narration voice + captions). Resolved via your workspace brand profiles. Omit for a generic look. |
| direction | string | — | Free-text creative direction — steer the render without naming models. |
| expressive | boolean | — | Add v3 audio tags for stronger, more human inflection (default off). |
| format | string | — | Render format id (call `lamina_compose_formats` for the menu + costs). Omit to auto-route from the script. |
| generationBrief | string | — | One-paragraph visual brief for the shots. |
| idempotencyKey | string | — | Dedupe retries — same key returns the same run. |
| inputs | object | — | A format's required inputs, e.g. { presenterImage: 'https://…' }. |
| runId | string | — | Poll an existing compose run instead of starting a new one. |
| script | string | — | Narration to speak (≤~90s). Required to start a new run. |
| sections | array | — | Structured per-span storyboard hints. |
| title | string | — | Video title. |
| voiceId | string | — | ElevenLabs voice id. Omit to let the narration director pick a voice by tone. |
| wait | boolean | — | When set, block until the run reaches a terminal state. |
No output schema declared.
No examples provided.
lamina_create ~1,024
Plan a creative run from a free-text brief. The router agent searches the catalog, picks the best-fit app by CAPABILITY ENVELOPE (an app whose `outputs[]` can deliver the brief, even when broader than asked — narrow via output selection), drafts inputs from the brief, and surfaces every choice the human still needs to make. NEVER dispatches a run — that's `lamina_run`'s job. Branch on `data.status`: • `"plan"` (mode `"app"`): the router committed to an app. Response includes `selectedApp.appId`, `draftedInputs`, optional `selectedOutputs` (output-label subset), and `askUser[]` (per-parameter questions the human must answer). The `askUser` list is the WORKHORSE — it covers everything the human needs to decide on the chosen app: USER-OWNED slots (product photo, brand logo, headshot), PRESET option picks (background style, aesthetic, mood-board references — curated option labels are listed INLINE in the question text), output subsetting (when the entry is `{ name: "__outputs", question }`, the answer is a comma-separated list of output labels), and any KNOB the user needs to choose. To dispatch: ask the human each `askUser[i].question` in chat, collect answers, then call `lamina_run` with `appId: selectedApp.appId`, `inputs: {…draftedInputs, …<answers keyed by askUser[i].name>}`, and `outputs: <selectedOutputs OR the labels parsed from the __outputs answer>`. ONE dispatch round. • `"needs_clarification"`: the router could not commit to an app because the brief is genuinely ambiguous between two or more apps (e.g. banner vs. reel vs. video, single hero vs. multi-language adapts). This is PRE-COMMIT ROUTING ambiguity only. Response includes `clarifications: [{ question }]`. Ask the human each clarification, fold the answers into a refined brief, then call `lamina_create` again. This is the ONLY status where re-calling `lamina_create` with a refined brief is correct. • `"unmatched"`: no pre-built app fits. Response includes `reason`, and — when the brief is a buildab…
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| appId | string | — | Optional pin: skip app discovery and force the router to use this app. Useful when the user already chose an app earlier in the conversation. |
| brief | string | yes | The user's natural-language request (e.g. "selfie with Tom Holland", "moody dawn product shot for our skincare line"). |
| inputs | object | — | Optional pre-supplied inputs keyed by parameter `key`. Anything the user already gave you can go here so the router doesn't ask for it again. |
| modality | string | — | Optional output modality hint when known. Improves app routing precision. |
| numVariants | integer | — | Optional variant count hint when the user asked for multiple outputs. |
| platform | string | — | Optional target platform hint (instagram, tiktok, web, etc.). Used for aspect-ratio + framing decisions. |
No output schema declared.
No examples provided.
lamina_credits ~135
Check the workspace's credit balance and the credit packages available to buy — so you can tell the user what they have and what a top-up would cost before running anything expensive. - Returns `{ balance, packages[] }`. Each package has `{ packageId, name, credits, priceCents, currency }`. - To buy one, hand the `packageId` to `lamina_topup`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
No output schema declared.
No examples provided.
lamina_describe ~651
Get the full input/output specification for a single Lamina app. Use it in the MANUAL flow (after `lamina_discover` and before `lamina_run`) when the calling LLM wants to inspect or verify an app's schema directly. The AGENTIC flow via `lamina_create` does discover + describe internally — no need to call describe before create. Returns: - `parameters[]` — every input the app accepts. Each entry has a stable `key` (used in `lamina_run.inputs`), a `type` (`text` / `options` / `url`), an optional `default`, and `accept`/`options`/`multiple` where relevant. - `outputs[]` — what the app produces. Each entry is `{ index, label, type: 'image'|'video'|'audio'|'text' }`. Labels are canonical identifiers — pass them verbatim to `lamina_run.outputs` when subsetting. - `estimatedCredits` — typical cost of one run (omitted when unknown). The user has NO form UI — they only see what you tell them in chat. Every parameter in `parameters[]` is something the workflow author wanted set; defaults shown are the AUTHOR's choices, not the user's authorization. Treat each parameter accordingly: - For USER-OWNED assets (their product, headshot, logo, brand asset, garment): never use the default. ASK the human in chat first — defaults here are demo placeholders that misrepresent the user's subject. - For PRESET / STYLE / REFERENCE groups (mood-board refs, style refs, palette refs, etc.) — often appearing as a numbered series of similar slots: ASK the human in chat ONCE per group — 'use the app's curated defaults or supply your own?' Don't silently default; the user can't see these slots exist. - For text/copy you can confidently draft from the brief (headlines, descriptions): draft. Otherwise ASK. - For dialog-derived settings (aspect ratio, variant count, output format): use the user's explicit input or hint; if absent, ASK. When in doubt about ANY parameter, ASK the human in chat before calling `lamina_run`. One extra question is cheaper than a wrong-output run. Constructing `inputs`…
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| appId | string | yes | App ID returned by `lamina_discover`. |
No output schema declared.
No examples provided.
lamina_discover ~461
Discover Lamina apps (creative workflows) that can produce what the user wants. ALWAYS start here when the user asks to create new content — discover the right app first, then describe it, then run it. How to use it: 1. Provide an array of `keywords` describing the desired creative outcome. Be concrete: combine medium (image / video / audio), form (reel, banner, hero shot, headshot, voiceover), and context (ecommerce, social, lifestyle). Examples: ["product video", "reel", "9:16"], ["hero banner", "lifestyle photo"], ["voiceover", "narration"]. 2. Read the returned apps. Each entry shows the app's name, description, outputs, and estimated credit cost when known. Choose by PURPOSE match — does the app's actual delivery match the user's intent? Keyword overlap alone is not enough. 3. If no listed app fits, call this tool again with different / broader / more specific keywords. The catalog is large; rephrasing often surfaces matches you missed. 4. If after a few sensible searches you still cannot find a suitable app, tell the user honestly that the catalog has no app for this exact need — suggest the closest related app or propose they refine their goal. 5. Once a candidate looks right, call `lamina_describe` with its `appId` for the full parameter contract. The result is ordered by relevance. Apps may be owned by your workspace or shared publicly. `estimatedCredits` is omitted when it cannot be computed quickly — treat absence as "unknown", not zero.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| keywords | array | yes | Keywords describing the creative outcome. Combine medium + form + context for best results, e.g. ["product video", "reel", "9:16"] or ["hero banner", "lifestyle photo", "ecommerce"]. The more specifi… |
| limit | integer | — | Maximum number of apps to return. Default 10. |
No output schema declared.
No examples provided.
lamina_generate_hook ~542
Generate a short (~4s) HOOK opener clip that plays BEFORE the product appears in a Meta ad. WHAT IT DOES: product category (+ optional vertical/theme) → LLM hook brief → text-to-video dispatch of a category-relevant human action (person knocking, kicking a football, applying makeup). The clip deliberately shows NO product, logo, price or text — it exists to stop the scroll; the product reveal comes after. WORKFLOW: (1) `lamina_generate_hook({ product, aspectRatio })` → dispatch, get runId. (2) `lamina_status({ runId, wait: true })` → poll; `output.url` is the clip. INPUTS: • `product` (required): `{ category (required), vertical? }`. `category` drives the action; `vertical` (e.g. "Forward", "Lux", "M Now") tunes the subject + tone. • `theme` (optional): `{ label?, cue? }` — thematic event to reflect. • `aspectRatio` (optional, default `9:16`). • `durationSeconds` (optional, default `4`; clamped to 4–12, the model floor/ceiling). • `model` (optional): video model id override. • `webhookUrl` (optional): HTTPS URL POSTed on terminal status. RESPONSE: `{ runId, status, model, aspectRatio, durationSeconds, brief, prompt, negativePrompt }`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| aspectRatio | string | — | Clip aspect ratio. Default 9:16. |
| brandProfileId | string | — | Brand profile id to steer tone toward a sub-brand (e.g. Forward / Lux / M Now). Resolved via your workspace brand profiles. |
| durationSeconds | integer | — | Target clip length; clamped to the model floor of 4s and ceiling of 12s. Default 4. |
| model | string | — | Optional video model id override from `lamina_models_list({modality:"video"})`. |
| polish | string | — | Production polish. `native` = handheld/UGC energy (often wins on Meta); `premium` = cinematic. Default balanced. |
| product | object | yes | Product context. Category-level. |
| theme | object | — | Optional thematic-event hook. |
| webhookUrl | string | — | Optional HTTPS URL to POST the completion event to. |
No output schema declared.
No examples provided.
lamina_generate_image ~942
Dispatch a single atomic image generation. Sibling of `lamina_create` (the agentic router) — use this when you already know which model fits, or when no app fits the brief. WORKFLOW: (1) `lamina_models_list({ modality: "image" })` → pick a model. (2) `lamina_models_describe({ modelId })` → read its flat `paramSchema`. (3) `lamina_generate_image({ model, prompt, params })` → dispatch, get runId. (4) `lamina_status({ runId, wait: true })` → poll until completed; the response has `output.url`. ONE TOOL, BOTH OPERATIONS: • Text-to-image — call with just `prompt` (and any text-mode params). The model id you picked is the only thing that selects the operation. • Image-to-image (edit / remix / background-swap / etc.) — call the same tool, but include a source image in `params`. Hybrid models (nano-banana-pro, gpt-image-2, gemini-2.5-flash-image, seedream-4.5, flux-2-flex, nano-banana-2, gpt-image-1, gpt-image-1.5) flip to image-to-image automatically when `params.imageUrls` is a non-empty array (or `params.imageUrl` is set for single-source models like flux-pro-kontext). Edit-only models (bria-bg-remove, ideogram-character, ideogram-v3-remix/reframe/replace-background, flux-pro-kontext, ideogram-character-remix) only have image-to-image — `params.imageUrls`/`imageUrl` is required. INPUTS: • `model` (required): a model id from `lamina_models_list`. Don't invent it. • `prompt` (required for most models; check `paramSchema.prompt.required` from `lamina_models_describe`; absent from `paramSchema` for prompt-less models like `bria-bg-remove` and `ideogram-v3-reframe`): natural-language brief; ≤2000 chars. • `params` (model-specific): every key MUST be declared in the chosen model's `paramSchema` (call `lamina_models_describe` first). Unknown keys are rejected with a structured `invalid_params` error; each error has `field` + `allowed`/`range`/`got` so you can correct on retry. Omitted optional keys fall back to schema defaults. • `webhookUrl` (optional): HTTPS URL. On termi…
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| model | string | yes | Model id from `lamina_models_list({modality:"image"})`. |
| params | object | — | Model-specific fields per the chosen (model, mode)'s `paramSchema`. Include `imageUrls` (array) or `imageUrl` (string) when you want image-to-image; omit them for text-to-image. Call `lamina_models_d… |
| prompt | string | — | Natural-language prompt (≤2000). Required for most models; omit only for prompt-less edits. |
| webhookUrl | string | — | Optional HTTPS URL to POST the completion event to. |
No output schema declared.
No examples provided.
lamina_generate_video ~1,100
Dispatch a single atomic video generation. Sibling of `lamina_generate_image` — same shape, but outputs a video URL. WORKFLOW: (1) `lamina_models_list({ modality: "video" })` → pick a model. (2) `lamina_models_describe({ modelId })` → read its flat `paramSchema` to learn required inputs. (3) `lamina_generate_video({ model, prompt, params })` → dispatch, get runId. (4) `lamina_status({ runId, wait: true })` → poll until completed; the response has `output.url`. ONE TOOL, EVERY VIDEO OPERATION. Model id selects the operation; `params` matches the model's paramSchema: • Text-to-video — Kling t2v variants, Wan-2.6-text-to-video, Wan-turbo, Minimax, Seedance t2v, Veo3-text-to-video. Just `prompt` (+ duration / aspectRatio / etc. per the model). • Image-to-video — Kling i2v variants, Wan-2.6/turbo image-to-video, Minimax i2v, Seedance i2v (uses `startImageUrl`), `happy-horse-image-to-video`, `veo3-image-to-video` (sync). `params` includes `imageUrl` (or `startImageUrl` for Seedance, `firstFrameUrl` for Veo3 first-frame). • Keyframe — `veo3-keyframe-to-video` (sync). `params` requires `firstFrameUrl` AND `lastFrameUrl` — model interpolates between them. • Motion-control — `kling-v26-motion-control`, `kling-v26-motion-control-pro`. `params` requires `imageUrl` (character) AND `videoUrl` (motion reference). • Video-to-video (edit) — `wan-video-to-video`, Kling v2v variants. `params` requires `videoUrl` (source). • Reference-to-video — Kling/Seedance/Wan reference variants. `params` uses `referenceImageUrls`. INPUTS: • `model` (required): a model id from `lamina_models_list({modality:"video"})`. • `prompt`: most models require it; some (motion-control variants) are optional. Check `paramSchema.prompt.required` from `lamina_models_describe`. Some models omit `prompt` from `paramSchema` entirely (prompt-less). • `params`: model-specific fields per the model's `paramSchema`. Required URL fields vary by operation — see list above. • `webhookUrl` (optional): HTTPS URL for HMAC…
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| includeCitationKit | boolean | — | PREVIEW: request a citation-ready kit (transcript, question-formatted chapters, 30–60w summary, VideoObject JSON-LD) so the video is answer-engine-citable wherever you host it. Preview flag — records… |
| model | string | yes | Model id from `lamina_models_list({modality:"video"})`. |
| params | object | — | Model-specific fields per the chosen model's `paramSchema`. Required URL fields depend on the operation — e.g. `imageUrl` (image-to-video), `videoUrl` (video-to-video), both for motion-control, `firs… |
| prompt | string | — | Natural-language prompt (≤2000). Required for most models; check the model's describe response for `prompt.required`. |
| webhookUrl | string | — | Optional HTTPS URL to POST the completion event to. |
No output schema declared.
No examples provided.
lamina_generate_workflow ~907
Generate a BRAND-NEW Lamina app from a plain-language instruction, OR EDIT an existing generated app in place. Use this when NO existing app fits the goal (check `lamina_discover` first) and the user wants a bespoke workflow — or when a follow-up needs the app itself changed (add a step, new output, swap a model), not just a different run. A headless Claude planner assembles a validated node graph from the Lamina node catalog and auto-publishes it as a PRIVATE, immediately-runnable app. - `instruction`: describe what the app should create (or, in edit mode, the change to make), including the inputs the user will provide and the desired output(s). - `baseAppId` (optional): EDIT MODE. The appId of a generated app to modify. The planner starts from its current graph and applies `instruction` as a targeted edit — keeping everything it does not touch — then updates that SAME app in place (same appId, run history preserved). Requires you to be the app creator or a workspace owner/admin. Omit to build a new app. - `ops` (optional, EDIT MODE — the CHEAP path): when you already know the exact change and can express it as a small op list, pass `ops` instead of `instruction` — the server applies them deterministically with NO planner LLM call and no credit charge. Each op is one of: `{op:"setNodeData",nodeId,data}`, `{op:"addNode",node:{id,type,data?}}`, `{op:"removeNode",nodeId}`, `{op:"addEdge",edge:{source,target,sourceHandle?,targetHandle?}}`, `{op:"removeEdge",source,target}`, `{op:"addParameter",parameter:{key,name,type,targetNodeId,targetField,...}}`, `{op:"removeParameter",key}`, `{op:"setParameter",key,patch}`. Requires `baseAppId`. Read the app first (`lamina_describe`/`GET /v1/apps/{id}`) to get node ids. Use `instruction` (planner) for anything you cannot express as ops. - `name` (optional): preferred app name. - `visibility` (optional): `private` (default), `shared` (whole workspace), or `public`. Ignored in edit mode. - `brandProfileId` (optional): bake a bran…
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| baseAppId | string | — | Edit an existing generated app in place. Its appId. Omit to build a new app. |
| brandProfileId | string | — | Bake a specific brand profile's voice, visual anchors, and guardrails into the generated app so it produces on-brand output. Defaults to the workspace's active brand. |
| inputs | object | — | Input values keyed by the generated app parameter `key` (media as URLs). Used only when run is true. |
| instruction | string | — | Plain-language description of the app to build — or, with baseAppId, the change to apply. Optional only when `ops` is provided. |
| name | string | — | Optional preferred app name. |
| ops | array | — | EDIT MODE cheap path: explicit edit operations applied deterministically (no planner LLM). Requires baseAppId. See the tool description for op shapes. |
| provider | string | — | Planner LLM provider. Defaults to the server setting (claude). |
| run | boolean | — | One-shot: after generating, immediately run the app with `inputs`. Returns the started runId — check with lamina_status. |
| visibility | string | — | App reach after creation. Defaults to private. |
No output schema declared.
No examples provided.
lamina_models_describe ~334
Get the input contract for one atomic-generate model (image OR video). Returns `id`, `displayName`, `modality`, and a flat `paramSchema` (every accepted field, including `prompt`, with `type`, allowed `values`, `default`, `min`/`max`/`step`, and short field-level `description` text). Hybrid models present a single merged schema where mode-specific fields are marked optional; the description on each field tells you when it applies. Models that don't accept a prompt (e.g. `bria-bg-remove`) simply omit the `prompt` field from `paramSchema`. Polymorphic — tries image registry then video registry, so any id from `lamina_models_list({modality:'image'|'video'})` is accepted. Call this BEFORE `lamina_generate_image` / `lamina_generate_video` for a model you haven't used. The response is the contract — what you pass in `params` must match these field rules, and the cross-field constraints noted in each field's `description` (e.g. gpt-image-2's custom dimensions are capped at 8.3M pixels and 3:1 aspect).
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| modelId | string | yes | Model id from `lamina_models_list`, e.g. "ideogram-v3" or "kling-v25-text-to-video". |
No output schema declared.
No examples provided.
lamina_models_list ~289
List Lamina's curated atomic generation models. Each entry has `id`, `displayName`, `modality`, and — to help you pick deliberately rather than guess — `bestFor` (what the model is good at / when to reach for it), `cost` (`low`|`medium`|`high` relative credit tier), `speed` (`fast`|`standard`|`slow`), and `provider` (the infra that serves it: `fal`|`wavespeed`|`vertex`). Pass `modality: 'image'` (default) or `modality: 'video'` to scope the response. Use `bestFor` to match the task, and `cost`/`speed` to break ties — prefer a `low`/`fast` model unless the task needs the quality of a `high` one. After picking an `id`, call `lamina_models_describe({modelId})` to get the input contract before calling `lamina_generate_image` / `lamina_generate_video`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| modality | string | — | "image" (default) or "video". |
No output schema declared.
No examples provided.
lamina_plv_background ~585
Generate a category-matched background plate for a Meta PLV (Product-Led-Video) ad. WHAT IT DOES: product attributes → LLM background brief (category-level, not SKU) → background-only image dispatch. The plate deliberately contains NO product, NO people and NO text — it leaves clean negative space so Meta can composite the product cutout on top. Colours are chosen to harmonise with the product colour (pink apparel → soft pink set; summer dress → sunlit coastal scene). WORKFLOW: (1) `lamina_plv_background({ product, aspectRatio })` → dispatch, get runId. (2) `lamina_status({ runId, wait: true })` → poll; `output.url` is the plate. INPUTS: • `product` (required): `{ category (required), color?, season?, occasion?, description? }`. `category` drives the scene; `color` drives the palette harmony; `season`/`occasion` steer the setting. • `theme` (optional): `{ label?, cue? }` — the ~monthly thematic event this creative runs in (e.g. label "Diwali", cue "festive gifting"), folded into the brief. • `aspectRatio` (optional, default `9:16`): PLV plate ratio. `4:5` maps to the nearest supported portrait preset. • `model` (optional): image model id; defaults to a photoreal 4K backdrop model. • `webhookUrl` (optional): HTTPS URL POSTed on terminal status. RESPONSE: `{ runId, status, model, aspectRatio, brief, prompt, negativePrompt }`. `brief` is the structured art-direction the plate was generated from; `prompt` is the exact background-only prompt dispatched.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| aspectRatio | string | — | PLV plate aspect ratio. Default 9:16. |
| brandProfileId | string | — | Brand profile id to steer palette/tone toward a sub-brand (e.g. Forward / Lux / M Now). Resolved via your workspace brand profiles. |
| model | string | — | Optional image model id override from `lamina_models_list`. |
| polish | string | — | Production polish. `native` = intentionally rough/UGC (often wins on Meta); `premium` = high-end editorial. Default balanced. |
| product | object | yes | Product attributes. Category-level only — never a specific SKU. |
| theme | object | — | Optional thematic-event hook (~4 events/month). |
| webhookUrl | string | — | Optional HTTPS URL to POST the completion event to. |
No output schema declared.
No examples provided.
lamina_refine_to_brand ~379
Automatically improve a completed run until it's on-brand — without letting it run away on cost. Repeats score → refine (re-rolling with the specific deviations fed back in) and stops the instant the score clears your bar, the iteration cap is hit, or the credit budget would be exceeded — whichever comes first. Returns the best result plus exactly how many iterations and credits it took. - `runId` (required): a completed run to improve. - `minScore` (optional, default 80): stop once `brandFit` reaches this (0–100). - `maxIterations` (optional, default 3): most refine passes to try (1–10). - `maxCredits` (optional, default 200): hard credit ceiling — never exceeded. - `brandProfileId` (optional): brand to score against. Defaults to the run's app brand. - Returns `{ best, iterations, creditsSpent, stoppedBecause, attempts }`. `best.imageUrl` is the highest-scoring result; `stoppedBecause` is `met_score` | `max_iterations` | `budget` | `no_output`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | — | Brand to score against. Defaults to the run's app brand. |
| maxCredits | number | — | Hard credit ceiling — never exceeded (default 200). |
| maxIterations | number | — | Most refine passes to try (default 3). |
| minScore | number | — | Target brand-fit score to stop at (default 80). |
| runId | string | yes | Completed run to refine toward the brand. |
No output schema declared.
No examples provided.
lamina_run ~732
Dispatch a run for an app the user has authorized. Pure trigger — no LLM, no brief analysis, no app picking. Takes an `appId` you already know (from `lamina_create.selectedApp.appId` after the agentic flow, or from `lamina_describe` in the manual flow) plus `inputs` keyed by parameter `key`, optionally `outputs` (label subset). How to use it: - Pass `appId` and `inputs`. `inputs` is a map keyed by parameter `key` from describe (option label for `options`, URL string for `url`, array of URLs for `url + multiple`). - Only include parameters the user has explicitly authorized — by giving the value in the brief, answering an ask in chat, or saying 'use defaults' on a surfaced preset group. Silent defaults on user-owned slots produce wrong-subject output. - `outputs` (optional): when the user asked for only a subset of the app's outputs (e.g. 'just the front view and the lifestyle shot'), pass `outputs: ['Front View', 'Lifestyle View']` with labels verbatim from `lamina_describe.outputs[].label` (case-insensitive). Omit or pass an empty array to produce every output the app declares (default). - `applyBrand` (optional): set true to make the output on-brand — Lamina folds the workspace's brand negatives + visual style onto the app's visual nodes before running. Your `inputs` still win over brand. Use it instead of hand-writing brand into every input. - Returns immediately with `{runId, workflowId, status}`. Most apps take 1–5 minutes (median ~2 min, p90 ~5 min). Poll with `lamina_status`. - On `Invalid inputs` error, the response includes `details: [{param, code, message}]`. Common causes: option label not in declared list, malformed URL, wrong type. On `outputs_resolution_failed`, the label you passed doesn't match any output on the app — re-check `lamina_describe.outputs[].label`. - For variants/series (e.g. "5 selfies with different celebrities"), call this tool once per variant in parallel. Each call returns its own `runId`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| appId | string | yes | App ID returned by `lamina_discover` and confirmed via `lamina_describe`. |
| applyBrand | boolean | — | Fold the workspace's brand (negatives + visual style) onto the app's visual generation nodes so output is on-brand — without you weaving brand into `inputs`. Anything you pass in `inputs` still wins. |
| brandProfileId | string | — | Target a specific brand profile when applyBrand is set. Defaults to the active brand. |
| inputs | object | yes | Map keyed by parameter `key` (from `lamina_describe`). Values shaped per each parameter's type: option label for `options`, URL string for `url`, array of URLs for `url + multiple`. Only include para… |
| outputs | array | — | Optional subset of the app's outputs to produce. Each entry is a `label` from `lamina_describe.outputs[].label` (case-insensitive). Omit or pass an empty array to produce every output the app declare… |
No output schema declared.
No examples provided.
lamina_save_to_brand_kit ~338
Save a GENERATED output into the brand kit as a reusable asset — the "I like this, keep it" loop. Pass a completed run (`runId`) or an `outputUrl`; the output is persisted to a durable CDN URL first, then registered. - `elementType` (required): `voice` | `avatar` | `character` | `motion_graphic`. (Images → avatar/character, video → motion_graphic, audio → voice.) - For `voice`, the audio clip is cloned into ElevenLabs to become a reusable voice — pass an `outputUrl` (+ `mediaType: audio`). - `name` (required): stable handle for the new element. - `runId` OR `outputUrl` (one required). With `outputUrl`, also pass `mediaType` (`image`|`video`|`audio`). - Requires an owner/admin identity.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | yes | Brand to save into. |
| elementType | string | yes | voice | avatar | character | motion_graphic. |
| mediaType | string | — | Required when passing outputUrl. |
| name | string | yes | Stable reference handle for the saved asset. |
| outputUrl | string | — | Or the output URL directly. |
| runId | string | — | Completed run whose output to save. |
| spec | object | — | Extra type-specific spec. |
No output schema declared.
No examples provided.
lamina_set_brand ~382
Create or update this workspace's brand and ground it with a starter Brand DNA, so generated apps and `applyBrand` runs produce on-brand output. Use it to make a fresh workspace on-brand before generating. - `brandName` (required): the brand to create, or the display name when updating. - `brandProfileId` (optional): update an existing profile instead of creating one. Omit to create. - `guardrails` (optional): things to avoid — these become the brand's negatives on visual generation. - `brandVoice` / `visualStyle` / `targetAudience` / `description` / `industry` (optional): shape the brand. - Returns `{ brandProfileId, reused }`. Pass that `brandProfileId` to `lamina_generate_workflow` or `lamina_run` (with `applyBrand`). - Requires an owner/admin identity. Read the current brand with `lamina_brand`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandName | string | yes | Brand to create, or display name when updating. |
| brandProfileId | string | — | Update this existing profile. Omit to create a new one. |
| brandVoice | string | — | Tone/voice, e.g. "warm, confident, never salesy". |
| description | string | — | Short description of the brand. |
| guardrails | array | — | Things to avoid — become the brand's visual negatives. |
| industry | string | — | Industry / vertical. |
| targetAudience | string | — | Who the brand speaks to. |
| visualStyle | string | — | Visual anchors, e.g. "clean studio lighting, muted palette". |
No output schema declared.
No examples provided.
lamina_set_brand_kit_element ~348
Register (or supersede, by name) one reusable brand asset in the brand kit — a voice, avatar, character, or motion graphic that points at an existing primitive. - `elementType` (required): `voice` | `avatar` | `character` | `motion_graphic`. - `name` (required): a stable handle, unique per brand + type (e.g. "spokesperson"). Registering the same name again supersedes it (version bump) — downstream reels keep resolving the handle. - `refKind` / `refId` (optional): the primitive it points at — `cloned_voice` (a cloned_voices id), `persona` (an influencer_personas id), or `asset`. - `spec` (optional): type-specific detail (voice tone/pace, avatar presenter_image_url, character canonical_reference_urls[], motion_graphic template). - Requires an owner/admin identity. To save a GENERATED output instead, use `lamina_save_to_brand_kit`.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| brandProfileId | string | yes | Brand this element belongs to. |
| elementType | string | yes | voice | avatar | character | motion_graphic. |
| name | string | yes | Stable reference handle, unique per brand + type. |
| refId | string | — | Id of the referenced primitive. |
| refKind | string | — | Which primitive refId points at. |
| spec | object | — | Type-specific detail. |
No output schema declared.
No examples provided.
lamina_set_visibility ~146
Change an app's reach: `private` (creator/workspace-owner only), `shared` (any workspace member — discoverable via `lamina_discover`), or `public`. Only the app creator or a workspace owner may change visibility. Useful right after `lamina_generate_workflow` to share a freshly generated app.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| appId | string | yes | App ID to update. |
| visibility | string | yes | New reach for the app. |
No output schema declared.
No examples provided.
lamina_status ~602
Check the status of any Lamina run — polymorphic across atomic image-gen (`lamina_generate_image`), atomic video-gen (`lamina_generate_video`), app workflow runs (`lamina_run`), and agentic recipe runs. - Default: returns the current snapshot (`queued` / `running` / `completed` / `failed` / `cancelled`) and the result. The agent decides when to call again. - With `wait: true`: blocks server-side, polling every 2 seconds, until the run reaches a terminal state OR `timeoutSeconds` elapses (default 240, max 600). Atomic image runs typically finish in 5–30s; atomic video runs take 30s–5 min; app workflows 1–5 min (median ~2 min, p90 ~5 min). Pick `timeoutSeconds` accordingly. If the timeout fires, the response includes `"timeout": true` plus the current status; call again to keep waiting. Response shape depends on the run kind: - **Atomic image-gen runs**: when `completed`, the response has `output: { type: "image", url: "..." }` (singular). Pass the `url` to the user. - **Atomic video-gen runs**: when `completed`, the response has `output: { type: "video", url: "..." }` (singular). Pass the `url` to the user. - **App + freestyle runs**: when `completed`, every entry in `outputs[]` has a `url`. The `label` matches what you saw in `lamina_describe`. Pass URLs back to the user, or feed them into a follow-up `lamina_run` as reference assets. - When `failed`, `errorMessage` carries the top-level reason. Per-output failures (app runs) are in `outputs[i].error`. - While the run is `running`, surface progress to the user instead of making them wait silently.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| runId | string | yes | Run ID returned by `lamina_run` / `lamina_generate_image` / `lamina_generate_video` — pass it back exactly as given. |
| timeoutSeconds | integer | — | Maximum server-side wait time when `wait: true`. Default 240, max 600. Real run durations: median ~2 min, p90 ~5 min — set higher for confidence the call returns the final result, lower if you want t… |
| wait | boolean | — | When true, the server polls internally and returns only when the run reaches a terminal state (or `timeoutSeconds` elapses). When false, returns the current snapshot immediately. |
No output schema declared.
No examples provided.
lamina_topup ~195
Start a credit top-up and get back a Stripe-hosted checkout link to give the user. Use this when the balance is too low to run what they asked for — no need to send them to a dashboard. - `packageId` (required): from `lamina_credits`. - Returns `{ checkoutUrl, credits, amountCents, currency }`. Give the user the `checkoutUrl` to pay; once they do, the credits land on the workspace and you can retry the run. - Never ask the user for card details — they pay on the Stripe page the link opens.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| packageId | string | yes | Credit package to buy (from `lamina_credits`). |
No output schema declared.
No examples provided.
lamina_upload_asset ~515
Get a pre-signed upload URL for one user-supplied asset (image, video, or audio). Use this when the user provides a local file you need to feed into `lamina_run` (or `lamina_create.inputs`) as a URL parameter (e.g. `your_photo_image_url`, `product_image_url`, `brand_logo_url`). How to use: - Pass `filename` (the name to register, e.g. "selfie.jpg") and `mediaType` ("image" | "video" | "audio"). - This tool returns `{ uploadUrl, assetUrl, contentTypeHint }`. The `uploadUrl` is a pre-signed PUT URL; the `assetUrl` is what you eventually pass to `lamina_run` (or pre-supply in `lamina_create.inputs`). - THE BYTES DO NOT GO THROUGH THIS TOOL CALL. After this returns, perform an HTTP PUT of the file bytes directly to `uploadUrl` with the `Content-Type` header set to `contentTypeHint` (or override). When the PUT completes (200), the asset is live at `assetUrl`. If your host has shell access (Claude Code, Cursor): execute `curl -X PUT --data-binary @<local-path> -H 'Content-Type: <contentTypeHint>' '<uploadUrl>'` to upload, then call `lamina_run` with `assetUrl` in the relevant input (or pre-supply it to `lamina_create.inputs` so the router doesn't re-ask). If your host doesn't have shell access (Claude Desktop, Claude.ai, ChatGPT): tell the user honestly that you cannot move the bytes from your context to Lamina's storage, and ask them to provide a publicly-reachable URL of the asset (or upload via the Lamina CLI / SDK from a shell), then continue with that URL. Asset URLs returned here are stable and can be reused across multiple runs. There is no need to re-upload between dispatches of related runs.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | — | Workspace API key (starts with "lma_"). Only needed when the MCP is NOT OAuth-authorized; when you connect via OAuth the workspace comes from your login and this is ignored. |
| filename | string | yes | Filename to register, including extension (e.g. "selfie.jpg"). |
| mediaType | string | yes | Media kind. Picks the upload bucket; the actual MIME type is set on PUT. |
No output schema declared.
No examples provided.