AI interior, exterior and landscape design, photoreal rendering, image editing, video and 3D.
One address for any MCP client. No sign-in needed on this server.
2 read3 act16 other
Grouped by tool name. At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
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.
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 ✓
Add https://mcp.luw.ai/mcp to your client and sign in to Luw.ai. Nothing to install, no key to copy: signing in creates one for you. New accounts get free credits. To disconnect, delete that key on the API page.
Settings → Connectors → Add custom connector, paste https://mcp.luw.ai/mcp, then Connect and sign in to Luw.ai.
claude mcp add --transport http luw https://mcp.luw.ai/mcp --scope user
Then type /mcp, pick luw and sign in.
Settings → Apps & Connectors → Advanced settings, turn on Developer mode, then Create: URL https://mcp.luw.ai/mcp, authentication OAuth, and sign in.
Click Add to Cursor above, or add to ~/.cursor/mcp.json:
{
"mcpServers": {
"luw": { "url": "https://mcp.luw.ai/mcp" }
}
}
Cursor shows Needs login next to luw; click it to sign in.
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"luw": { "type": "http", "url": "https://mcp.luw.ai/mcp" }
}
}
VS Code asks you to sign in the first time a tool runs.
| URL | https://mcp.luw.ai/mcp |
| Transport | Streamable HTTP |
| Auth | Sign in (MCP OAuth), or header Authorization: Bearer YOUR_LUW_API_KEY |
For a client that can't sign in, create a key at app.luw.ai/dashboard/api and send it as a header:
{
"mcpServers": {
"luw": {
"url": "https://mcp.luw.ai/mcp",
"headers": { "Authorization": "Bearer YOUR_LUW_API_KEY" }
}
}
}
If it can neither sign in nor send headers, 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 give it image URLs, or use the local setup below.
The local server runs on your machine with npx, so it can read paths like ~/Desktop/room.jpg. It needs Node.js 18+ and an API key from app.luw.ai/dashboard/api.
claude mcp add luw --scope user --env LUW_API_KEY=YOUR_LUW_API_KEY -- npx -y @luw-ai/mcp
Or install it as a plugin. Claude Code asks for your key and keeps it in secure storage:
claude plugin marketplace add Luvi-io/luw-mcp
claude plugin install luw@luw-ai
One click: download luw.mcpb, double-click it, paste your API key. No Node.js needed.
Or add this to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"luw": {
"command": "npx",
"args": ["-y", "@luw-ai/mcp"],
"env": { "LUW_API_KEY": "YOUR_LUW_API_KEY" }
}
}
}
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"luw": {
"command": "npx",
"args": ["-y", "@luw-ai/mcp"],
"env": { "LUW_API_KEY": "YOUR_LUW_API_KEY" }
}
}
}
Add to .vscode/mcp.json. VS Code asks for your key and keeps it in its secret storage:
{
"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}" }
}
}
}
Add to ~/.config/devin/mcp_config.json (Windows: %APPDATA%\devin\mcp_config.json). Older Windsurf versions use ~/.codeium/windsurf/mcp_config.json.
{
"mcpServers": {
"luw": {
"command": "npx",
"args": ["-y", "@luw-ai/mcp"],
"env": { "LUW_API_KEY": "YOUR_LUW_API_KEY" }
}
}
}
codex mcp add luw --env LUW_API_KEY=YOUR_LUW_API_KEY -- npx -y @luw-ai/mcp
Or in ~/.codex/config.toml:
[mcp_servers.luw]
command = "npx"
args = ["-y", "@luw-ai/mcp"]
env = { LUW_API_KEY = "YOUR_LUW_API_KEY" }
gemini extensions install https://github.com/Luvi-io/luw-mcp
Gemini CLI asks for your key and keeps it in the system keychain. Or add to ~/.gemini/settings.json:
{
"mcpServers": {
"luw": {
"command": "npx",
"args": ["-y", "@luw-ai/mcp"],
"env": { "LUW_API_KEY": "YOUR_LUW_API_KEY" }
}
}
}
Click Add to Kiro above, confirm, then replace YOUR_LUW_API_KEY in Kiro's MCP config.
Windows: if npx isn't found, use "command": "cmd", "args": ["/c", "npx", "-y", "@luw-ai/mcp"].
~/Downloads/bedroom.jpg) as Mid-Century Modern, 3 variations."plan-sketch.png as a photoreal modern villa at golden hour."Built-in prompts show up as slash commands or prompt templates in your client: redesign_room, stage_empty_room, sketch_to_render, product_shot.
| 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_upscale_image | Enhance and enlarge 2/4/8× | 1 |
luw_expand_image | Outpaint a cropped photo to a wider view | 1 |
luw_remove_furniture | Empty a furnished room | 1 |
luw_vectorize_image | Photo or drawing 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 | Ask ArchiGPT, an AI architect, a standalone question (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) | 0 |
luw_run_model | Call any Luw.ai model with raw API parameters (local server only) | varies |
luw_personas | Personas: reusable style identity, training images and slots (local server only) | 0 |
luw_projects | Projects (boards), folders and media (local server only; hosted: luw://projects resources) | 0 |
luw_team | Enterprise: credits, usage, members, invitations (opt-in) | 0 |
Every generation uses your Luw.ai credits. Variations are billed one generation each.
Read-only context you can attach to a conversation. In Claude Code, type @luw: to pick one; other clients that support resources offer them as attachments.
| Resource | What it holds |
|---|---|
luw://account | Your credit balance |
luw://history/{app} | Your 10 most recently updated projects in one Luw.ai app (Interior, Exterior, Video, …) with their latest results: file links, prompts and source images |
luw://projects/{id} | One project: its folders and the file link of every item in it |
luw://catalog/{kind} | Design styles, room and building types, video camera motions, materials and persona professions, with previews |
luw://guide | Every tool and what it costs |
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.LUW_OUTPUT_DIR to also save every result to disk.processing_url and the assistant collects it with luw_get_result, without generating (or paying) twice.Idempotency-Key, so if a network error forces a retry, Luw.ai returns the original job instead of charging again.luw_segment returns masks as URLs, so "change the floor" becomes segment ⟶ magic wand with no manual masking.npx downloads a single ~260 KB package and starts right away.| Variable | Default | |
|---|---|---|
LUW_API_KEY | (required) | Your API key (get one). LUW_API_TOKEN also works. |
LUW_OUTPUT_DIR | (off) | Also download results (images, videos, GLB, SVG) into this folder |
LUW_TOOLSETS | all except team | Comma-separated list from generate, archigpt, personas, projects, team, or all |
LUW_WAIT_TIMEOUT_SECONDS | 50 | How long a call waits before returning a processing_url. Raise it for clients with long tool timeouts, such as Claude Code. |
LUW_INLINE_IMAGES | true | Embed result images in tool output |
LUW_API_BASE_URL | https://api.luw.ai/v2 | API endpoint override |
The same package serves the hosted Streamable HTTP endpoint:
npx -y @luw-ai/mcp --http --port 8080 --host 0.0.0.0 # MCP at /mcp, health at /health
docker build -t luw-mcp . && docker run -p 8080:8080 luw-mcp
It's stateless. Each request brings its own key in Authorization: Bearer …, X-Luw-Api-Key, or ?api_key=. Set LUW_MCP_OAUTH_SECRET to also let clients sign in to Luw.ai instead (OAuth); the sign-in hands the client an ordinary 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.
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
MIT © Luvi Technologies, Inc.