Skip to main content
Glama

lamina

Server Details

On-brand product photos, model try-ons, video reels & banners from a brief + brand kit.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.

Tool Definition Quality

Score is being calculated. Check back soon.

Available Tools

22 tools
lamina_app_versionsAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe generated app to inspect or restore.
apiKeyYesLamina API key (starts with lma_)
restoreNoA version number to restore (from the list). Omit to just list versions.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that restore modifies graph and parameters, current graph is snapshotted first (undoable), and requires creator or admin privileges. No annotation contradiction: readOnlyHint=false is consistent with restoration being a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with main purpose, every sentence adds unique information. Uses dash-list format for clarity without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Coverage is comprehensive: explains both actions, return values, behavioral nuances, and authorization requirements. No output schema, but return formats are explicitly described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds value by explaining the dual-mode behavior (omit vs. pass restore) and the return format for each mode, which is beyond the schema's property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists or restores app versions, with specific verbs and resource. The unique purpose is well-defined and distinct from sibling tools which cover branding, generation, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit instructions on when to omit vs. pass the restore parameter, and context that restores are for recovering from bad edits. However, no explicit comparison with siblings, though they are mostly unrelated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamina_brand
Read-only
Inspect

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.itemCount0 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topKNoPattern count.
apiKeyYesLamina API key (starts with lma_)
modalityNoContent modality, such as image or video.
platformNoTarget platform for guidance.
objectiveNoContent objective, such as engagement or sales.
campaignIdNoCampaign to scope guidance to.
workflowIdNoWorkflow/app to scope guidance to.
brandProfileIdNoSpecific brand profile to inspect.
lamina_brand_compliance
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesRun to read brand compliance for.
apiKeyYesLamina API key (starts with lma_)
lamina_brand_feedbackAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoWhy it is off-brand — becomes a brand guardrail when verdict is reject.
runIdYesRun to give feedback on.
apiKeyYesLamina API key (starts with lma_)
verdictYesWhether the output is on-brand.
brandProfileIdNoTarget brand. Defaults to the run's app brand.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotation's readOnlyHint=false, the description discloses the side effect of rejecting with a note: it creates a brand guardrail that flows into other tools. It also specifies the required identity ('Requires an owner/admin identity') and notes the return object. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main action, followed by a bulleted list of parameters. It is concise (around 100 words) and every sentence provides useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, the description includes the return structure. All 5 parameters are explained, and the tool's side effects are clearly described. Sibling tools are numerous, but the description is self-sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds extra meaning: 'note' is recommended on reject and becomes a guardrail; 'verdict' is explained with its impact; 'brandProfileId' defaults to the run's app brand. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Give an on/off-brand verdict on a completed run, closing the loop so the next generation respects it.' It uses a specific verb ('give'), resource ('completed run'), and outcome. It also distinguishes from siblings like 'lamina_brand_compliance' and 'lamina_refine_to_brand' by focusing on feedback as a closure mechanism.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when to use the tool (after a run) and explains the effects of verdicts (reject+note creates guardrails, approve does not). It does not explicitly state when not to use it or list alternative tools, but the guidance is clear enough for an AI agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamina_brand_scoreA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesCompleted run to score.
apiKeyYesLamina API key (starts with lma_)
brandProfileIdNoBrand to score against. Defaults to the run's app brand.
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is consistent with readOnlyHint annotation, indicates no side effects, and adds detail about return format (brandFit, deviations, suggestions) and that it works even without Brand Guard enabled. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points and clear sections. It front-loads the main purpose and usage, though it could be slightly more concise without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately covers return type, usage loop, and default behavior. It provides enough for an agent to use the tool effectively, though some details about deviations/suggestions formatting are omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds value by specifying that runId must be a completed run from lamina_run/lamina_status and that brandProfileId defaults to the run's app brand. This goes beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scores a completed run's image output for brand compliance and returns deviations. It distinguishes from siblings by focusing on scoring a completed run, not general brand info or compliance checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly recommends using it in a generate → score → refine loop and says to use it before showing to user or deciding to regenerate. It provides context but does not explicitly mention when not to use or alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamina_cancel
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesRun ID returned by `lamina_run`.
apiKeyYesLamina API key (starts with lma_)
lamina_createInspect

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 buildable creative request (no catalog app matched) — a suggestion object { tool: "lamina_generate_workflow", instruction }. If suggestion is present, offer to BUILD a bespoke app: call lamina_generate_workflow with the given instruction, then lamina_run the returned appId. If there is no suggestion, the brief is outside Lamina's creative-media surface — tell the human and do not retry.

ANTI-DRIFT: After lamina_create returns "plan", NEVER re-call lamina_create to resolve askUser items — that re-rolls the LLM and may pick a different app or drop the partial plan. Resolve asks via lamina_run with the answers folded into inputs/outputs. Re-calling lamina_create is ONLY correct when the prior response was "needs_clarification", in which case fold the human's clarification answers into a REFINED BRIEF and call lamina_create again.

The user has NO form UI — they only see what you (the calling LLM) tell them in chat. Treat every askUser entry as a question to surface to the human verbatim, including the inline option lists for PRESET choices (so the human knows what they can pick) and the output labels for __outputs asks (so they know which deliverables are available). The router never silently uses demo defaults on user-owned slots — that's why those slots appear in askUser. Always collect answers first, then dispatch via lamina_run.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdNoOptional pin: skip app discovery and force the router to use this app. Useful when the user already chose an app earlier in the conversation.
briefYesThe user's natural-language request (e.g. "selfie with Tom Holland", "moody dawn product shot for our skincare line").
apiKeyYesLamina API key (starts with lma_)
inputsNoOptional 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.
modalityNoOptional output modality hint when known. Improves app routing precision.
platformNoOptional target platform hint (instagram, tiktok, web, etc.). Used for aspect-ratio + framing decisions.
numVariantsNoOptional variant count hint when the user asked for multiple outputs.
lamina_credits
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesLamina API key (starts with lma_)
lamina_describe
Read-only
Inspect

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 for lamina_run:

  • Use the parameter key as the input key. Example: inputs: { "your_photo_image_url": "https://..." }.

  • For type: "options", send the option label as a string (case-insensitive match).

  • For type: "url" with multiple: true, send an array of URLs. Otherwise send a single URL string. Never invent URLs.

  • Omit a parameter from inputs only when the user has explicitly authorized falling back to the workflow default.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesApp ID returned by `lamina_discover`.
apiKeyYesLamina API key (starts with lma_)
lamina_discover
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of apps to return. Default 10.
apiKeyYesLamina API key (starts with lma_)
keywordsYesKeywords 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 specific, the better the match.
lamina_generate_imageInspect

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 terminal status Lamina POSTs {runId, status, model, prompt, resolvedParams, output, errorMessage, completedAt} HMAC-signed.

RESPONSE: {runId, status: "queued"|"completed", model, mode, prompt, resolvedParams}. mode is the resolved value ("text-to-image" | "image-to-image"). The runId is the fal_request_id — pass it to lamina_status.

SYNC vs ASYNC: identical contract. Vertex-backed models (imagen-4.0-*, gemini-2.5-flash-image) complete in seconds and return status: "completed" on the first poll. fal-backed models queue and take 5–60s. lamina_status({ wait: true }) handles both transparently.

ERROR HANDLING: validation failures return code + details.errors[] with field + error + allowed/range/got. Common codes: model_not_supported, mode_not_supported, invalid_params, dispatch_failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesModel id from `lamina_models_list({modality:"image"})`.
apiKeyYesLamina API key (starts with lma_)
paramsNoModel-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_describe({modelId})` to see what's accepted.
promptNoNatural-language prompt (≤2000). Required for most models; omit only for prompt-less edits.
webhookUrlNoOptional HTTPS URL to POST the completion event to.
lamina_generate_videoInspect

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-signed completion POST.

RESPONSE: {runId, status: "queued"|"completed", model, mode, prompt, resolvedParams}. mode is the resolved operation. Pass runId to lamina_status.

SYNC vs ASYNC: identical contract. Veo3 variants (veo3-text-to-video, veo3-image-to-video, veo3-first-frame-to-video, veo3-keyframe-to-video) are Vertex-backed and complete in seconds. fal-backed models queue and take 30s–5min. lamina_status({ wait: true, timeoutSeconds: 240 }) handles either transparently.

ERROR HANDLING: same shape as lamina_generate_imagecode + details.errors[] with field + allowed/range/got.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesModel id from `lamina_models_list({modality:"video"})`.
apiKeyYesLamina API key (starts with lma_)
paramsNoModel-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, `firstFrameUrl`+`lastFrameUrl` for keyframe.
promptNoNatural-language prompt (≤2000). Required for most models; check the model's describe response for `prompt.required`.
webhookUrlNoOptional HTTPS URL to POST the completion event to.
lamina_generate_workflowInspect

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 brand's voice/visual/guardrails into the app so it's on-brand by default. Omit to use the workspace's active brand.

  • Returns { appId, name, parameters[], outputs[], runUrl }. In edit mode appId is unchanged. Feed appId + the returned parameter keys straight into lamina_run — the parameter set may have changed, so re-read parameters[].

  • On failure returns { error, details[] } where details are the validation problems the planner could not resolve.

ParametersJSON Schema
NameRequiredDescriptionDefault
opsNoEDIT MODE cheap path: explicit edit operations applied deterministically (no planner LLM). Requires baseAppId. See the tool description for op shapes.
runNoOne-shot: after generating, immediately run the app with `inputs`. Returns the started runId — check with lamina_status.
nameNoOptional preferred app name.
apiKeyYesLamina API key (starts with lma_)
inputsNoInput values keyed by the generated app parameter `key` (media as URLs). Used only when run is true.
providerNoPlanner LLM provider. Defaults to the server setting (claude).
baseAppIdNoEdit an existing generated app in place. Its appId. Omit to build a new app.
visibilityNoApp reach after creation. Defaults to private.
instructionNoPlain-language description of the app to build — or, with baseAppId, the change to apply. Optional only when `ops` is provided.
brandProfileIdNoBake 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.
lamina_models_describe
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesLamina API key (starts with lma_)
modelIdYesModel id from `lamina_models_list`, e.g. "ideogram-v3" or "kling-v25-text-to-video".
lamina_models_list
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesLamina API key (starts with lma_)
modalityNo"image" (default) or "video".image
lamina_refine_to_brandInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesCompleted run to refine toward the brand.
apiKeyYesLamina API key (starts with lma_)
minScoreNoTarget brand-fit score to stop at (default 80).
maxCreditsNoHard credit ceiling — never exceeded (default 200).
maxIterationsNoMost refine passes to try (default 3).
brandProfileIdNoBrand to score against. Defaults to the run's app brand.
lamina_runAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesApp ID returned by `lamina_discover` and confirmed via `lamina_describe`.
apiKeyYesLamina API key (starts with lma_)
inputsYesMap 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 parameters the user has explicitly authorized.
outputsNoOptional 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 declares.
applyBrandNoFold 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.
brandProfileIdNoTarget a specific brand profile when applyBrand is set. Defaults to the active brand.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false), the description discloses it returns immediately with runId/status, typical run times (1-5 minutes), polling via lamina_status, and warns about silent defaults causing wrong outputs. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections, but slightly verbose. However, every sentence adds value given the tool's complexity (optional outputs, error handling, parallel usage). Front-loaded with core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive coverage for a tool with 6 parameters, nested objects, and no output schema. Includes input specification, optional outputs, applyBrand, error handling, polling guidance, and parallel usage. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds significant context beyond the schema: explains input value shaping per type, authorization rules, outputs subset labeling (case-insensitive), and applyBrand behavior. Schema coverage is 100% but description enriches understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool dispatches a run for an authorized app. It distinguishes from siblings by emphasizing it is a pure trigger with no LLM, no analysis, and no app picking.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit instructions on when to use (after agentic or manual flow), how to pass parameters, optional outputs, error handling, and parallel calls for variants. Includes alternatives like lamina_status for polling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamina_set_brandInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesLamina API key (starts with lma_)
industryNoIndustry / vertical.
brandNameYesBrand to create, or display name when updating.
brandVoiceNoTone/voice, e.g. "warm, confident, never salesy".
guardrailsNoThings to avoid — become the brand's visual negatives.
descriptionNoShort description of the brand.
visualStyleNoVisual anchors, e.g. "clean studio lighting, muted palette".
brandProfileIdNoUpdate this existing profile. Omit to create a new one.
targetAudienceNoWho the brand speaks to.
lamina_set_visibilityInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesApp ID to update.
apiKeyYesLamina API key (starts with lma_)
visibilityYesNew reach for the app.
lamina_statusA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNoWhen 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.
runIdYesRun ID returned by `lamina_run` / `lamina_generate_image` / `lamina_generate_video` — pass it back exactly as given.
apiKeyYesLamina API key (starts with lma_)
timeoutSecondsNoMaximum 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 to surface intermediate progress to the user.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses extensive behavioral traits beyond the readOnlyHint annotation, such as server-side polling behavior with wait, response shapes for different run kinds, error handling, and progress surfacing. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (default behavior, wait mode, response shapes per run kind) and bullet points. It is comprehensive yet concise, with no wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description completely covers return values for all run types, including successful outputs, error messages, and timeout responses. It also advises on surfacing progress, making it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, providing a baseline of 3. The description adds substantial value by explaining the `wait` parameter's blocking behavior, `timeoutSeconds` rationale, and how `runId` should be used, all beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks the status of Lamina runs, and lists the polymorphic types (image-gen, video-gen, app, agentic recipe), distinguishing it from sibling tools that initiate runs. It uses a specific verb 'check' and resource 'run status'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the tool, including details on the `wait` parameter, typical run durations, and how to pick `timeoutSeconds`. However, it does not explicitly state when not to use this tool or name alternatives, slightly reducing the score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamina_topupAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesLamina API key (starts with lma_)
packageIdYesCredit package to buy (from `lamina_credits`).
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, so the description correctly implies a write operation. It adds context about the Stripe checkout flow and credits landing asynchronously, but does not disclose potential failure modes or side effects (e.g., charges, timeouts).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with action and purpose. Each sentence adds value with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description provides the return shape and flow. It covers the essential steps and differentiates from siblings. It could include retry or error handling, but is sufficient for a top-up tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters. The description reinforces that packageId comes from lamina_credits and adds the return format ({ checkoutUrl, credits, amountCents, currency }), which is valuable beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Start a credit top-up and get back a Stripe-hosted checkout link.' It specifies the verb and resource, and distinguishes from siblings by noting when to use it (balance too low) and that it avoids sending users to a dashboard.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when the balance is too low to run what they asked for' and advises not to ask for card details. It lacks direct comparison to sibling tools like lamina_credits or lamina_run, but the context is still clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lamina_upload_assetInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesLamina API key (starts with lma_)
filenameYesFilename to register, including extension (e.g. "selfie.jpg").
mediaTypeYesMedia kind. Picks the upload bucket; the actual MIME type is set on PUT.

Discussions

No comments yet. Be the first to start the discussion!

Try in Browser

Your Connectors

Sign in to create a connector for this server.

Resources