AI interior, exterior and landscape design, photoreal rendering, image editing, video and 3D.
ai.luw/mcp Model Context Protocol (MCP) Server
The ai.luw/mcp server provides Model Context Protocol access to AI tools for interior, exterior, and landscape design, along with photoreal rendering, image editing, video, and 3D capabilities.
🛠️ Key Features
Interior design
Exterior design
Landscape design
Photoreal rendering
Image editing
Video
3D
🚀 Use Cases
Designing interior spaces
Planning exterior environments
Developing landscape concepts
Producing photoreal renderings
Editing images for design workflows
Generating or working with video content
Creating or viewing 3D assets
⚡ Developer Benefits
Supports design and media-related AI workflows via MCP
Exposes a set of capabilities centered on design, rendering, and content creation
⚠️ Limitations
Provided data includes only a high-level description; specific MCP tools, endpoints, or configuration details are not included.
Redesign an interior photo — home, office, shop, hotel — in any style while keeping the room's architecture. Restyles furniture, materials, colors and lighting. Set empty_room=true to furnish an empty room or turn it into another room type (virtual staging). Costs 1 credit per variation.
Parameters14
image
string
required
Photo of the room (https:// URL, local file path, or data: URI).
prompt
string
optional
What you want, in plain language.
styles
array
optional
Design style names, e.g. ["Japandi"]. Case-sensitive; see luw_list_options.
room_type
string
optional
Room type, e.g. "Living Room", "Kitchen", "Bedroom", "Home Office" (see luw_list_options kind="interior_types").
empty_room
boolean
optional
Furnish from scratch / convert the room to room_type (Fill Empty Room mode).
style_reference
string
optional
Style-transfer source: an image whose look to copy (https:// URL, local file path, or data: URI), or "persona" to use slot 1 of persona_id.
reference_images
array
optional
Up to 6 reference images (furniture, materials, products, mood boards) to draw from.
precision
integer
optional
How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output image format.
variations
integer
optional
Number of alternative designs (1-4, default 1); each is billed as a generation.
persona_id
integer
optional
Persona whose saved images/knowledge to use (see luw_personas).
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Photo of the room (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What you want, in plain language.",
"type": "string",
"maxLength": 4000
},
"styles": {
"description": "Design style names, e.g. [\"Japandi\"]. Case-sensitive; see luw_list_options.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string"
}
},
"room_type": {
"description": "Room type, e.g. \"Living Room\", \"Kitchen\", \"Bedroom\", \"Home Office\" (see luw_list_options kind=\"interior_types\").",
"type": "string"
},
"empty_room": {
"description": "Furnish from scratch / convert the room to room_type (Fill Empty Room mode).",
"type": "boolean"
},
"style_reference": {
"description": "Style-transfer source: an image whose look to copy (https:// URL, local file path, or data: URI), or \"persona\" to use slot 1 of persona_id.",
"type": "string"
},
"reference_images": {
"description": "Up to 6 reference images (furniture, materials, products, mood boards) to draw from.",
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "Reference image (https:// URL, local file path, or data: URI)."
}
},
"precision": {
"description": "How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
},
"variations": {
"description": "Number of alternative designs (1-4, default 1); each is billed as a generation.",
"type": "integer",
"minimum": 1,
"maximum": 4
},
"persona_id": {
"description": "Persona whose saved images/knowledge to use (see luw_personas).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_exterior_design
Redesign a building exterior or facade photo — houses, villas, apartments, commercial buildings — in a new architectural style, with new materials, colors and landscaping, keeping the structure. Costs 1 credit per variation.
Parameters13
image
string
required
Photo of the building (https:// URL, local file path, or data: URI).
prompt
string
optional
What you want, in plain language.
styles
array
optional
Design style names, e.g. ["Japandi"]. Case-sensitive; see luw_list_options.
building_type
string
optional
Building/space type, e.g. "Modern House Exterior", "Luxury Villa Exterior", "Outdoor Patio" (see luw_list_options kind="exterior_types").
style_reference
string
optional
Style-transfer source: an image whose look to copy (https:// URL, local file path, or data: URI), or "persona" to use slot 1 of persona_id.
reference_images
array
optional
Up to 6 reference images (furniture, materials, products, mood boards) to draw from.
precision
integer
optional
How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output image format.
variations
integer
optional
Number of alternative designs (1-4, default 1); each is billed as a generation.
persona_id
integer
optional
Persona whose saved images/knowledge to use (see luw_personas).
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Photo of the building (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What you want, in plain language.",
"type": "string",
"maxLength": 4000
},
"styles": {
"description": "Design style names, e.g. [\"Japandi\"]. Case-sensitive; see luw_list_options.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string"
}
},
"building_type": {
"description": "Building/space type, e.g. \"Modern House Exterior\", \"Luxury Villa Exterior\", \"Outdoor Patio\" (see luw_list_options kind=\"exterior_types\").",
"type": "string"
},
"style_reference": {
"description": "Style-transfer source: an image whose look to copy (https:// URL, local file path, or data: URI), or \"persona\" to use slot 1 of persona_id.",
"type": "string"
},
"reference_images": {
"description": "Up to 6 reference images (furniture, materials, products, mood boards) to draw from.",
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "Reference image (https:// URL, local file path, or data: URI)."
}
},
"precision": {
"description": "How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
},
"variations": {
"description": "Number of alternative designs (1-4, default 1); each is billed as a generation.",
"type": "integer",
"minimum": 1,
"maximum": 4
},
"persona_id": {
"description": "Persona whose saved images/knowledge to use (see luw_personas).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_sketch_to_render
Turn a hand sketch, line drawing, floor-plan perspective or rough draft into a photorealistic render. Costs 1 credit per variation.
Parameters12
image
string
required
The sketch or drawing (https:// URL, local file path, or data: URI).
prompt
string
optional
What you want, in plain language.
styles
array
optional
Design style names, e.g. ["Japandi"]. Case-sensitive; see luw_list_options.
space_type
string
optional
What the sketch shows, e.g. "Living Room" or "Modern House Exterior".
style_reference
string
optional
Style-transfer source: an image whose look to copy (https:// URL, local file path, or data: URI), or "persona" to use slot 1 of persona_id.
precision
integer
optional
How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output image format.
variations
integer
optional
Number of alternative designs (1-4, default 1); each is billed as a generation.
persona_id
integer
optional
Persona whose saved images/knowledge to use (see luw_personas).
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "The sketch or drawing (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What you want, in plain language.",
"type": "string",
"maxLength": 4000
},
"styles": {
"description": "Design style names, e.g. [\"Japandi\"]. Case-sensitive; see luw_list_options.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string"
}
},
"space_type": {
"description": "What the sketch shows, e.g. \"Living Room\" or \"Modern House Exterior\".",
"type": "string"
},
"style_reference": {
"description": "Style-transfer source: an image whose look to copy (https:// URL, local file path, or data: URI), or \"persona\" to use slot 1 of persona_id.",
"type": "string"
},
"precision": {
"description": "How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
},
"variations": {
"description": "Number of alternative designs (1-4, default 1); each is billed as a generation.",
"type": "integer",
"minimum": 1,
"maximum": 4
},
"persona_id": {
"description": "Persona whose saved images/knowledge to use (see luw_personas).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_render
Turn a 3D model view, CAD/BIM screenshot, clay render or basic visualization into a photorealistic architectural render. Costs 1 credit per variation.
Parameters7
image
string
required
The 3D view or base render (https:// URL, local file path, or data: URI).
prompt
string
optional
What you want, in plain language.
reference_images
array
optional
Up to 6 reference images (furniture, materials, products, mood boards) to draw from.
precision
integer
optional
How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
format
string
optional
Output image format.
variations
integer
optional
Number of alternative designs (1-4, default 1); each is billed as a generation.
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "The 3D view or base render (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What you want, in plain language.",
"type": "string",
"maxLength": 4000
},
"reference_images": {
"description": "Up to 6 reference images (furniture, materials, products, mood boards) to draw from.",
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "Reference image (https:// URL, local file path, or data: URI)."
}
},
"precision": {
"description": "How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
},
"variations": {
"description": "Number of alternative designs (1-4, default 1); each is billed as a generation.",
"type": "integer",
"minimum": 1,
"maximum": 4
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_edit_image
Edit any image with a plain-language instruction: "make the sofa green velvet", "add a pendant lamp over the table", "turn it into a night scene". Pass products, materials or a mood board as reference_images to place or apply them. For edits restricted to an exact area, use luw_magic_wand. Costs 1 credit per variation.
Parameters9
image
string
required
Image to edit (https:// URL, local file path, or data: URI).
prompt
string
required
The edit to make.
reference_images
array
optional
Up to 6 reference images (furniture, materials, products, mood boards) to draw from.
engine
string
optional
Model: aria (default), symphony (Symphony-3) or nano-banana-2.
resolution
string
optional
Output resolution (default 2k).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output image format.
variations
integer
optional
Number of alternative designs (1-4, default 1); each is billed as a generation.
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Image to edit (https:// URL, local file path, or data: URI)."
},
"prompt": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "The edit to make."
},
"reference_images": {
"description": "Up to 6 reference images (furniture, materials, products, mood boards) to draw from.",
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "Reference image (https:// URL, local file path, or data: URI)."
}
},
"engine": {
"description": "Model: aria (default), symphony (Symphony-3) or nano-banana-2.",
"type": "string",
"enum": [
"aria",
"symphony",
"nano-banana-2"
]
},
"resolution": {
"description": "Output resolution (default 2k).",
"type": "string",
"enum": [
"2k",
"4k"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
},
"variations": {
"description": "Number of alternative designs (1-4, default 1); each is billed as a generation.",
"type": "integer",
"minimum": 1,
"maximum": 4
}
},
"required": [
"image",
"prompt"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_magic_wand
Change only a masked area of an image. Give a prompt to add/replace what's there, remove=true to erase it, or material_image to re-surface it (e.g. new flooring or wall tiles). The mask is a black-and-white image the same size as the input; white marks the area to change. Get masks from luw_segment. Costs 1 credit.
Parameters10
image
string
required
Image to edit (https:// URL, local file path, or data: URI).
mask_image
string
required
Black/white mask, white = area to change (https:// URL, local file path, or data: URI).
prompt
string
optional
What to put in the masked area.
remove
boolean
optional
Remove whatever is in the masked area.
material_image
string
optional
Material/texture to apply to the masked area (https:// URL, local file path, or data: URI); luw_list_options kind="materials" has a ready-made catalog.
keep_structure
boolean
optional
Preserve the masked area's geometry/lines while changing its look (structure-guided fill).
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output image format.
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Image to edit (https:// URL, local file path, or data: URI)."
},
"mask_image": {
"type": "string",
"minLength": 1,
"description": "Black/white mask, white = area to change (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What to put in the masked area.",
"type": "string",
"maxLength": 4000
},
"remove": {
"description": "Remove whatever is in the masked area.",
"type": "boolean"
},
"material_image": {
"description": "Material/texture to apply to the masked area (https:// URL, local file path, or data: URI); luw_list_options kind=\"materials\" has a ready-made catalog.",
"type": "string"
},
"keep_structure": {
"description": "Preserve the masked area's geometry/lines while changing its look (structure-guided fill).",
"type": "boolean"
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
}
},
"required": [
"image",
"mask_image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_landscape_design
Design a garden, yard or outdoor area inside a masked region of a photo, with plants chosen for the location's climate and sun exposure. Costs 1 credit.
Parameters8
image
string
required
Photo of the outdoor area (https:// URL, local file path, or data: URI).
mask_image
string
required
Black/white mask, white = area to landscape (https:// URL, local file path, or data: URI).
prompt
string
optional
What you want, in plain language.
city
string
optional
Location, for climate-appropriate planting, e.g. "Antalya".
sun_exposure
string
optional
e.g. "Full sun (6+ hours)", "Partial sun (4 - 6 hours)", "Shade (less than 4 hours)".
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output image format.
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Photo of the outdoor area (https:// URL, local file path, or data: URI)."
},
"mask_image": {
"type": "string",
"minLength": 1,
"description": "Black/white mask, white = area to landscape (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What you want, in plain language.",
"type": "string",
"maxLength": 4000
},
"city": {
"description": "Location, for climate-appropriate planting, e.g. \"Antalya\".",
"type": "string"
},
"sun_exposure": {
"description": "e.g. \"Full sun (6+ hours)\", \"Partial sun (4 - 6 hours)\", \"Shade (less than 4 hours)\".",
"type": "string"
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
}
},
"required": [
"image",
"mask_image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_image_tools
One-step image utilities, 1 credit each:
- upscale: enhance quality and enlarge 2x/4x/8x (Photo Enhance AI)
- expand: outpaint a tightly cropped architectural photo to a wider view (Expand AI)
- remove_furniture: empty a furnished room, keeping walls, floor and windows (Remove Furniture AI)
- vectorize: convert a photo or drawing into a clean SVG vector (Vector AI)
Parameters5
operation
string
required
image
string
required
Input image (https:// URL, local file path, or data: URI).
scale
any
optional
upscale only: 2, 4 or 8 (default 2).
precision
integer
optional
How strictly to keep the input's structure: 90 = precise, 75 = balanced, 40 = creative.
Cut out a product/object from its background (transparent PNG) — or, with a prompt, place it in a new generated scene for marketing shots ("on a marble kitchen counter, morning light"). Omit prompt to just remove the background. Costs 1 credit.
Parameters5
image
string
required
Product or object photo (https:// URL, local file path, or data: URI).
prompt
string
optional
New background to generate. Leave empty to remove the background.
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
format
string
optional
Output image format.
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Product or object photo (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "New background to generate. Leave empty to remove the background.",
"type": "string",
"maxLength": 4000
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"format": {
"description": "Output image format.",
"type": "string",
"enum": [
"jpg",
"png",
"webp"
]
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_segment
Detect objects in a photo and return black-and-white masks as image URLs — every object (wall, floor, sofa, …) or only what you describe in prompt. Feed a mask URL into luw_magic_wand or luw_landscape_design to edit exactly that area. Costs 1 credit.
Parameters3
image
string
required
Photo to segment (https:// URL, local file path, or data: URI).
prompt
string
optional
What to segment, e.g. "walls", "the sofa", "lawn". Omit to segment everything.
labels
array
optional
Keep only masks whose label contains one of these words (e.g. ["floor", "wall"]).
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Photo to segment (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What to segment, e.g. \"walls\", \"the sofa\", \"lawn\". Omit to segment everything.",
"type": "string",
"maxLength": 500
},
"labels": {
"description": "Keep only masks whose label contains one of these words (e.g. [\"floor\", \"wall\"]).",
"maxItems": 20,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_generate_image
Generate a photorealistic image or illustration from a text prompt (optionally guided by an input image) — concept art, interiors, products, marketing visuals. Set format="svg" for a vector illustration (Fluw Vector AI). Costs 2 credits per image.
Parameters9
prompt
string
required
What to generate.
aspect_ratio
string
optional
styles
array
optional
Design style names, e.g. ["Japandi"]. Case-sensitive; see luw_list_options.
image
string
optional
Optional guide image (https:// URL, local file path, or data: URI).
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
format
string
optional
Output format; svg switches to Fluw Vector AI.
variations
integer
optional
Number of alternative designs (1-4, default 1); each is billed as a generation.
Animate a design image into a short cinematic video — fly-throughs, dolly moves, drone shots, reveals. Camera motions: A Forward Dolly, Flythrough Cinematic, Return to Empty Room, Lighting and Color Details, Drone flying to center, Dramatic Zoom Out, Reverse Zoom In, Slow Pull Back, Reveal Zoom, Ground to Sky Tilt, Side Tracking Zoom, Aerial Descent. Takes a few minutes — expect a processing_url to collect with luw_get_result. Costs 10 credits (aria) or 20 (symphony).
Parameters6
image
string
required
Start frame (a render or photo) (https:// URL, local file path, or data: URI).
prompt
string
optional
What should happen in the video.
camera_motion
string
optional
One of the camera motions listed above, e.g. "Flythrough Cinematic".
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
enhance_prompt
boolean
optional
Let Luw.ai's prompt enhancer expand a short prompt.
seed
integer
optional
Fix for reproducible results.
Raw schema
{
"type": "object",
"properties": {
"image": {
"type": "string",
"minLength": 1,
"description": "Start frame (a render or photo) (https:// URL, local file path, or data: URI)."
},
"prompt": {
"description": "What should happen in the video.",
"type": "string",
"maxLength": 4000
},
"camera_motion": {
"description": "One of the camera motions listed above, e.g. \"Flythrough Cinematic\".",
"type": "string"
},
"engine": {
"description": "Luw.ai model: aria (default) or symphony (Symphony-3).",
"type": "string",
"enum": [
"aria",
"symphony"
]
},
"enhance_prompt": {
"description": "Let Luw.ai's prompt enhancer expand a short prompt.",
"type": "boolean"
},
"seed": {
"description": "Fix for reproducible results.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"image"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_image_to_3d
Generate a textured 3D model (GLB) from a photo of an object — furniture, decor, products. Add up to 3 photos from other angles for better accuracy. For text-to-3D, first make an image with luw_generate_image. Costs 3 credits (aria) or 8 (symphony).
Parameters7
image
string
required
Photo of the object (https:// URL, local file path, or data: URI).
extra_angles
array
optional
engine
string
optional
Luw.ai model: aria (default) or symphony (Symphony-3).
Collect the result of a Luw.ai generation that was still processing (tools return a processing_url when a job outlasts their wait). Waits for the job to finish (up to the server's wait limit) — call again if it's still running. Free; never re-run a generation instead.
Parameters2
processing_url
string
required
The processing_url returned by a generation tool.
wait
boolean
optional
Wait for completion (default true). false = check once and return immediately.
Raw schema
{
"type": "object",
"properties": {
"processing_url": {
"type": "string",
"minLength": 1,
"description": "The processing_url returned by a generation tool."
},
"wait": {
"description": "Wait for completion (default true). false = check once and return immediately.",
"type": "boolean"
}
},
"required": [
"processing_url"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_upload_file
Upload an image, video or 3D file to Luw.ai storage and get a URL usable by every Luw.ai tool. Rarely needed: all tools already accept local paths and data: URIs and upload them automatically. Useful to get a shareable URL, to re-host an image from a site Luw.ai can't reach, or to store a file permanently.
Parameters3
source
string
required
Local file path, file:// URL, data: URI, or an https:// URL to copy into Luw.ai storage.
persistent
boolean
optional
Keep the file in your Luw.ai storage permanently. Default: temporary, auto-deleted after 12 hours.
persona_id
integer
optional
Persona to store a persistent file under (default: your first persona).
Raw schema
{
"type": "object",
"properties": {
"source": {
"type": "string",
"minLength": 1,
"description": "Local file path, file:// URL, data: URI, or an https:// URL to copy into Luw.ai storage."
},
"persistent": {
"description": "Keep the file in your Luw.ai storage permanently. Default: temporary, auto-deleted after 12 hours.",
"type": "boolean"
},
"persona_id": {
"description": "Persona to store a persistent file under (default: your first persona).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"source"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_list_options
Look up valid values for other Luw.ai tools: design_styles (styles param), interior_types (room_type), exterior_types (building_type), video_styles (camera_motion), materials (Magic Wand material_image catalog), professions (persona profession). Free.
Parameters3
kind
string
required
search
string
optional
Case-insensitive filter on names/descriptions.
details
boolean
optional
Include descriptions and preview image URLs (longer output).
Ask Luw.ai's ArchiGPT, an AI architect: design advice, feng shui, space planning, material and color suggestions, technical questions, and estimating square meters from a photo or plan. Attach an image to discuss it. Pass earlier turns in history to continue a conversation. Costs 1 credit per ~3000 words.
Parameters5
message
string
required
Your question or message.
image
string
optional
Image to discuss (https:// URL, local file path, or data: URI).
history
array
optional
Previous messages of this conversation, oldest first.
language
string
optional
Reply language, e.g. "en" or "tr". Auto-detected when omitted.
Personas hold a reusable design identity: style knowledge plus saved images (trainings). Slots 1-6 train the persona's visual style (slot 1 is the style-transfer reference used by style_reference="persona"), slot 7 is the default input image, 8+ are free-form data; add_training without a slot "likes" a design. Pass persona_id to generation tools to use one.
Actions: list, get, create, update, delete, list_trainings, add_training, update_training, delete_training, clear_slot.
Parameters14
action
string
required
persona_id
integer
optional
name
string
optional
title
string
optional
Short description of the persona.
knows
string
optional
Comma-separated style knowledge, e.g. "Modern,Minimalism" or room/building types.
profession
string
optional
Tool the persona belongs to, e.g. Interior, Exterior, MagicPrompt, MagicWand, Enhance, Video, Render, 3DGen, Fluw, Sketch, Landscape, MoodBoard, ArchiGPT. For list: only that tool's personas (fast).
search
string
optional
list: filter by name/title/knows.
page
integer
optional
list / list_trainings: page number (default 1).
limit
integer
optional
list / list_trainings: items per page (default 20).
training_id
integer
optional
image
string
optional
Training image (https:// URL, local file path, or data: URI); stored permanently.
slot
integer
optional
info
string
optional
Description of the training image.
extras
string
optional
Extra metadata, e.g. the prompt behind a liked design.
Raw schema
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"list",
"get",
"create",
"update",
"delete",
"list_trainings",
"add_training",
"update_training",
"delete_training",
"clear_slot"
]
},
"persona_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"name": {
"type": "string"
},
"title": {
"description": "Short description of the persona.",
"type": "string"
},
"knows": {
"description": "Comma-separated style knowledge, e.g. \"Modern,Minimalism\" or room/building types.",
"type": "string"
},
"profession": {
"description": "Tool the persona belongs to, e.g. Interior, Exterior, MagicPrompt, MagicWand, Enhance, Video, Render, 3DGen, Fluw, Sketch, Landscape, MoodBoard, ArchiGPT. For list: only that tool's personas (fast).",
"type": "string"
},
"search": {
"description": "list: filter by name/title/knows.",
"type": "string"
},
"page": {
"description": "list / list_trainings: page number (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"description": "list / list_trainings: items per page (default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"training_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"image": {
"description": "Training image (https:// URL, local file path, or data: URI); stored permanently.",
"type": "string"
},
"slot": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"info": {
"description": "Description of the training image.",
"type": "string"
},
"extras": {
"description": "Extra metadata, e.g. the prompt behind a liked design.",
"type": "string"
}
},
"required": [
"action"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
luw_projects
Organize work in Luw.ai projects (called boards in the API), with nested folders and media. Use add_media to save generated results into a project.
Actions: list, get, create, rename, delete, list_folders, create_folder, update_folder, delete_folder, add_media, delete_media, move_media.
Parameters9
action
string
required
project_id
integer
optional
name
string
optional
Project or folder name.
folder_id
integer
optional
Folder to act on, or target folder for add_media/move_media (omit = project root).
parent_id
integer
optional
Parent folder for nested folders.
media_id
integer
optional
url
string
optional
add_media: the media (https:// URL, local file path, or data: URI).
control_image
string
optional
add_media: optional source/reference image, e.g. the original photo of a redesign.
extras
string
optional
add_media: metadata as a JSON string, e.g. {"prompt": "…"}.
Raw schema
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"list",
"get",
"create",
"rename",
"delete",
"list_folders",
"create_folder",
"update_folder",
"delete_folder",
"add_media",
"delete_media",
"move_media"
]
},
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"name": {
"description": "Project or folder name.",
"type": "string"
},
"folder_id": {
"description": "Folder to act on, or target folder for add_media/move_media (omit = project root).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"parent_id": {
"description": "Parent folder for nested folders.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"media_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"url": {
"description": "add_media: the media (https:// URL, local file path, or data: URI).",
"type": "string"
},
"control_image": {
"description": "add_media: optional source/reference image, e.g. the original photo of a redesign.",
"type": "string"
},
"extras": {
"description": "add_media: metadata as a JSON string, e.g. {\"prompt\": \"…\"}.",
"type": "string"
}
},
"required": [
"action"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
AI interior, exterior and landscape design, photoreal rendering, image editing, video and 3D,
inside Claude, Cursor, VS Code, Windsurf, Codex and any other MCP client.
text
You: Redesign ~/Desktop/living-room.jpg in Japandi style, give me 2 options.
Claude: ⟶ luw_interior_design ✓ 2 designs in 21s [shows both images]
You: Love the first one. Make the sofa green velvet, then turn it into a fly-through video.
Claude: ⟶ luw_edit_image ⟶ luw_generate_video ✓
Click Install in VS Code above. VS Code asks for your key and keeps it in its secret storage. Or add to .vscode/mcp.json:
json
{"inputs":[{"type":"promptString","id":"luw_api_key","description":"Luw.ai API key","password":true}],"servers":{"luw":{"command":"npx","args":["-y","@luw-ai/mcp"],"env":{"LUW_API_KEY":"${input:luw_api_key}"}}}}
If your client only accepts a URL and can't send headers (for example ChatGPT connectors), use https://mcp.luw.ai/mcp?api_key=YOUR_LUW_API_KEY. Anyone who has that URL can spend your credits, so keep it private.
The hosted server is stateless and stores nothing. Your key goes straight to the Luw.ai API on each request. It can't read files from your computer, so pass image URLs, or use the local npx setup to work with local files.
Windows: if npx isn't found, use "command": "cmd", "args": ["/c", "npx", "-y", "@luw-ai/mcp"]. Requires Node.js 18 or later. The Claude Desktop extension bundles everything it needs.
What you can ask
"Redesign this bedroom (~/Downloads/bedroom.jpg) as Mid-Century Modern, 3 variations."
"This listing photo is an empty room. Stage it as a cozy Scandinavian living room."
"Render my sketch plan-sketch.png as a photoreal modern villa at golden hour."
"Change the floor in this kitchen to herringbone oak." (segments the floor, then swaps the material)
"Remove all the furniture from this room."
"Put this chair photo on a terrazzo floor in a sunlit gallery for an ad."
"Turn this render into a drone fly-through video."
"Make a 3D model of this armchair from these 3 photos."
"Seamless blue zellige tile texture, 1024px."
"Ask ArchiGPT how to improve the feng shui of this floor plan."
Built-in prompts show up as slash commands or prompt templates in your client: redesign_room, stage_empty_room, sketch_to_render, product_shot.
Tools
Tool
What it does
Credits
luw_interior_design
Redesign a room in any style; empty_room for virtual staging
1
luw_exterior_design
Redesign a facade or building exterior
1
luw_sketch_to_render
Sketch or drawing to photoreal render
1
luw_render
3D, CAD or clay view to photoreal render
1
luw_edit_image
Edit any image with a sentence (Magic Prompt); 2K/4K
1
luw_magic_wand
Masked edit: replace, remove, or apply a material
1
luw_landscape_design
Gardens and outdoor areas, matched to climate and sun
1
luw_image_tools
upscale 2/4/8×, expand, remove_furniture, vectorize to SVG
1
luw_background
Remove a background, or replace it with a generated scene
1
luw_segment
Object masks (all objects, or by prompt) as image URLs
1
luw_generate_image
Text to image (Fluw), or format: "svg" for vectors
2
luw_generate_pattern
Seamless, tileable textures and patterns
1
luw_generate_video
Image to cinematic video with 12 camera motions
10 (20 with Symphony)
luw_image_to_3d
Photos to a textured 3D model (GLB)
3 (8 with Symphony)
luw_archigpt
Chat with ArchiGPT, an AI architect (accepts images)
1 per ~3k words
luw_get_result
Collect a long-running job (free)
0
luw_list_options
Valid styles, room and building types, camera motions, materials (free)
0
luw_upload_file
Upload a file to Luw.ai storage and get a URL (free)
Every generation uses your Luw.ai credits. Variations are billed one generation each.
How it works
Local files just work. Any image argument accepts an https:// URL, a local path (~/Desktop/room.jpg), or a data: URI. Local files are uploaded to Luw.ai storage as temporary files (deleted after 12 hours) and cached for the session, so repeated edits don't upload the same file again.
You see the results. Finished images are embedded in the tool result, so Claude and other clients show them inline. Set LUW_OUTPUT_DIR to also save every result to disk.
Long jobs don't time out. A call waits up to 50 seconds and streams progress to clients that show it. If a job like a video takes longer, the tool returns a processing_url and the assistant collects it with luw_get_result, without generating (or paying) twice.
Never billed twice. Every generation request carries an Idempotency-Key, so if a network error forces a retry, Luw.ai returns the original job instead of charging again.
Masks are handled for you.luw_segment returns masks as URLs, so "change the floor" becomes segment ⟶ magic wand with no manual masking.
Fast startup. The package is one bundled file with zero dependencies, so npx downloads a single ~260 KB package and starts right away.
It's stateless and holds no secrets. Each request brings its own key in Authorization: Bearer …, X-Luw-Api-Key, or ?api_key=. It deploys to Vercel as-is (vercel.json is included), and a Procfile is included for Heroku. See docs/maintainers.md for deployment and release steps.
Development
bash
npm ci
npm test# unit and protocol tests (no network)
npm run build # bundles dist/cli.js
npm run inspector # try every tool in the MCP Inspector
LUW_API_KEY=... npm run smoke # live checks against the real API (free)
LUW_API_KEY=... npm run smoke -- --paid # plus one real generation (1 credit)
npm run mcpb # build/luw.mcpb, the Claude Desktop extension