Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

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

−20 this week 37 Trust /100
Trust breakdown (6 categories)

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
Transport & Reachability0
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.

Install

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

# add to Claude Code
claude mcp add --transport http ai-uselamina-lamina https://app.uselamina.ai/mcp/agent
# ~/.codex/config.toml
[mcp_servers.ai-uselamina-lamina]
url = "https://app.uselamina.ai/mcp/agent"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-uselamina-lamina": {
      "type": "remote",
      "url": "https://app.uselamina.ai/mcp/agent",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-uselamina-lamina --url https://app.uselamina.ai/mcp/agent --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  ai-uselamina-lamina:
    url: "https://app.uselamina.ai/mcp/agent"
// mcp.json
{
  "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.

Changelog

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.

Diagnostics

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
MCP tools — 30 exposed · ~14,107 tokens

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.

Tool Tokens
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.

NameTypeReqDescription
apiKeystringWorkspace 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.
appIdstringyesThe generated app to inspect or restore.
restoreintegerA 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringSpecific brand profile to inspect.
campaignIdstringCampaign to scope guidance to.
modalitystringContent modality, such as image or video.
objectivestringContent objective, such as engagement or sales.
platformstringTarget platform for guidance.
topKintegerPattern count.
workflowIdstringWorkflow/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.

NameTypeReqDescription
apiKeystringWorkspace 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.
runIdstringyesRun 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringTarget brand. Defaults to the run's app brand.
notestringWhy it is off-brand — becomes a brand guardrail when verdict is reject.
runIdstringyesRun to give feedback on.
verdictstringyesWhether 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringyesBrand 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringBrand to score against. Defaults to the run's app brand.
runIdstringyesCompleted 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
runIdstringyesRun 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
durationSecondsintegerTarget 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`).

NameTypeReqDescription
apiKeystringWorkspace 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.
aspectRatiostring
brandProfileIdstringPreview on-brand — conditions the storyboard on the same brand style bible the render uses. Response includes `brand.applied`. Omit for a generic preview.
directionstringFree-text creative direction.
formatstringPreview a specific format (else auto-routed).
generationBriefstring
inputsobjectA format's required inputs.
scriptstringyesNarration to preview a plan for.
sectionsarray

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…

NameTypeReqDescription
apiKeystringWorkspace 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.
aspectRatiostring
brandProfileIdstringBrand profile id to condition the render on-brand (style bible + narration voice + captions). Resolved via your workspace brand profiles. Omit for a generic look.
directionstringFree-text creative direction — steer the render without naming models.
expressivebooleanAdd v3 audio tags for stronger, more human inflection (default off).
formatstringRender format id (call `lamina_compose_formats` for the menu + costs). Omit to auto-route from the script.
generationBriefstringOne-paragraph visual brief for the shots.
idempotencyKeystringDedupe retries — same key returns the same run.
inputsobjectA format's required inputs, e.g. { presenterImage: 'https://…' }.
runIdstringPoll an existing compose run instead of starting a new one.
scriptstringNarration to speak (≤~90s). Required to start a new run.
sectionsarrayStructured per-span storyboard hints.
titlestringVideo title.
voiceIdstringElevenLabs voice id. Omit to let the narration director pick a voice by tone.
waitbooleanWhen 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…

NameTypeReqDescription
apiKeystringWorkspace 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.
appIdstringOptional pin: skip app discovery and force the router to use this app. Useful when the user already chose an app earlier in the conversation.
briefstringyesThe user's natural-language request (e.g. "selfie with Tom Holland", "moody dawn product shot for our skincare line").
inputsobjectOptional 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.
modalitystringOptional output modality hint when known. Improves app routing precision.
numVariantsintegerOptional variant count hint when the user asked for multiple outputs.
platformstringOptional 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`.

NameTypeReqDescription
apiKeystringWorkspace 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`…

NameTypeReqDescription
apiKeystringWorkspace 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.
appIdstringyesApp 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
keywordsarrayyesKeywords 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…
limitintegerMaximum 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 }`.

NameTypeReqDescription
apiKeystringWorkspace 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.
aspectRatiostringClip aspect ratio. Default 9:16.
brandProfileIdstringBrand profile id to steer tone toward a sub-brand (e.g. Forward / Lux / M Now). Resolved via your workspace brand profiles.
durationSecondsintegerTarget clip length; clamped to the model floor of 4s and ceiling of 12s. Default 4.
modelstringOptional video model id override from `lamina_models_list({modality:"video"})`.
polishstringProduction polish. `native` = handheld/UGC energy (often wins on Meta); `premium` = cinematic. Default balanced.
productobjectyesProduct context. Category-level.
themeobjectOptional thematic-event hook.
webhookUrlstringOptional 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…

NameTypeReqDescription
apiKeystringWorkspace 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.
modelstringyesModel id from `lamina_models_list({modality:"image"})`.
paramsobjectModel-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…
promptstringNatural-language prompt (≤2000). Required for most models; omit only for prompt-less edits.
webhookUrlstringOptional 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…

NameTypeReqDescription
apiKeystringWorkspace 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.
includeCitationKitbooleanPREVIEW: 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…
modelstringyesModel id from `lamina_models_list({modality:"video"})`.
paramsobjectModel-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…
promptstringNatural-language prompt (≤2000). Required for most models; check the model's describe response for `prompt.required`.
webhookUrlstringOptional 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…

NameTypeReqDescription
apiKeystringWorkspace 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.
baseAppIdstringEdit an existing generated app in place. Its appId. Omit to build a new app.
brandProfileIdstringBake 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.
inputsobjectInput values keyed by the generated app parameter `key` (media as URLs). Used only when run is true.
instructionstringPlain-language description of the app to build — or, with baseAppId, the change to apply. Optional only when `ops` is provided.
namestringOptional preferred app name.
opsarrayEDIT MODE cheap path: explicit edit operations applied deterministically (no planner LLM). Requires baseAppId. See the tool description for op shapes.
providerstringPlanner LLM provider. Defaults to the server setting (claude).
runbooleanOne-shot: after generating, immediately run the app with `inputs`. Returns the started runId — check with lamina_status.
visibilitystringApp 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).

NameTypeReqDescription
apiKeystringWorkspace 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.
modelIdstringyesModel 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`.

NameTypeReqDescription
apiKeystringWorkspace 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.
modalitystring"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.

NameTypeReqDescription
apiKeystringWorkspace 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.
aspectRatiostringPLV plate aspect ratio. Default 9:16.
brandProfileIdstringBrand profile id to steer palette/tone toward a sub-brand (e.g. Forward / Lux / M Now). Resolved via your workspace brand profiles.
modelstringOptional image model id override from `lamina_models_list`.
polishstringProduction polish. `native` = intentionally rough/UGC (often wins on Meta); `premium` = high-end editorial. Default balanced.
productobjectyesProduct attributes. Category-level only — never a specific SKU.
themeobjectOptional thematic-event hook (~4 events/month).
webhookUrlstringOptional 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`.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringBrand to score against. Defaults to the run's app brand.
maxCreditsnumberHard credit ceiling — never exceeded (default 200).
maxIterationsnumberMost refine passes to try (default 3).
minScorenumberTarget brand-fit score to stop at (default 80).
runIdstringyesCompleted 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`.

NameTypeReqDescription
apiKeystringWorkspace 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.
appIdstringyesApp ID returned by `lamina_discover` and confirmed via `lamina_describe`.
applyBrandbooleanFold 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.
brandProfileIdstringTarget a specific brand profile when applyBrand is set. Defaults to the active brand.
inputsobjectyesMap 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…
outputsarrayOptional 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringyesBrand to save into.
elementTypestringyesvoice | avatar | character | motion_graphic.
mediaTypestringRequired when passing outputUrl.
namestringyesStable reference handle for the saved asset.
outputUrlstringOr the output URL directly.
runIdstringCompleted run whose output to save.
specobjectExtra 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`.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandNamestringyesBrand to create, or display name when updating.
brandProfileIdstringUpdate this existing profile. Omit to create a new one.
brandVoicestringTone/voice, e.g. "warm, confident, never salesy".
descriptionstringShort description of the brand.
guardrailsarrayThings to avoid — become the brand's visual negatives.
industrystringIndustry / vertical.
targetAudiencestringWho the brand speaks to.
visualStylestringVisual 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`.

NameTypeReqDescription
apiKeystringWorkspace 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.
brandProfileIdstringyesBrand this element belongs to.
elementTypestringyesvoice | avatar | character | motion_graphic.
namestringyesStable reference handle, unique per brand + type.
refIdstringId of the referenced primitive.
refKindstringWhich primitive refId points at.
specobjectType-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.

NameTypeReqDescription
apiKeystringWorkspace 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.
appIdstringyesApp ID to update.
visibilitystringyesNew 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
runIdstringyesRun ID returned by `lamina_run` / `lamina_generate_image` / `lamina_generate_video` — pass it back exactly as given.
timeoutSecondsintegerMaximum 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…
waitbooleanWhen 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
packageIdstringyesCredit 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.

NameTypeReqDescription
apiKeystringWorkspace 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.
filenamestringyesFilename to register, including extension (e.g. "selfie.jpg").
mediaTypestringyesMedia kind. Picks the upload bucket; the actual MIME type is set on PUT.

No output schema declared.

No examples provided.