Icon Composer MCP
CLI and MCP server for creating images, icons, and logos with Liquid Glass effects (iOS 26+). Not affiliated with Apple ๏ฃฟ.
Demo
demo
Key Features
Create .icon bundles programmatically from PNG or SVG glyphs
Full Liquid Glass support: specular highlights, blur material, shadows, translucency
Dark mode + appearance variants with per-appearance fill specializations
AI-agent ready : 12 MCP tools + 3 workflow prompts with built-in instructions
Installation
ย ย ย Claude Code
ย
claude mcp add icon-composer -- npx -y icon-composer-mcp
ย ย image ย Claude Desktop
ย
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers" : {
"icon-composer" : {
"command" : "npx" ,
"args" : [ "-y" , "icon-composer-mcp" ]
}
}
}
ย ย image ย Cursor
ย
Add to .cursor/mcp.json in your project root (or ~/.cursor/mcp.json for global):
{
"mcpServers" : {
"icon-composer" : {
"command" : "npx" ,
"args" : [ "-y" , "icon-composer-mcp" ]
}
}
}
The server will appear in Cursor Settings > MCP Servers . No restart required.
ย ย ย VS Code
ย
Add to .vscode/mcp.json in your project root (or open Command Palette > MCP: Open User Configuration for global):
Note: VS Code uses "servers" (not "mcpServers") and requires a "type" field.
{
"servers" : {
"icon-composer" : {
"type" : "stdio" ,
"command" : "npx" ,
"args" : [ "-y" , "icon-composer-mcp" ]
}
}
}
You'll see Start/Stop/Restart buttons inline in the editor. First launch will prompt a trust confirmation.
ย ย image ย Windsurf
ย
First, enable MCP in Windsurf Settings > Cascade > Model Context Protocol (MCP) .
Then add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers" : {
"icon-composer" : {
"command" : "npx" ,
"args" : [ "-y" , "icon-composer-mcp" ]
}
}
}
Press the refresh button in Windsurf settings to load the server.
ย ย Other MCP clients
ย
The server uses stdio transport. Most MCP clients use this config format:
{
"mcpServers" : {
"icon-composer" : {
"command" : "npx" ,
"args" : [ "-y" , "icon-composer-mcp" ]
}
}
}
Or run the server directly:
ย ย CLI only (no MCP)
ย
npm install -g icon-composer-mcp
icon-composer --help
How It Works
Provide a glyph โ any PNG or SVG logo/image
Create a .icon bundle โ sets background fill, layer scale, and glass effects
Apple's ictool renders Liquid Glass โ specular highlights, shadows, depth, and translucency
Export โ preview PNGs, App Store marketing icon, or the .icon bundle for Xcode
Requirements
Node.js 18+
macOS with Icon Composer for Liquid Glass rendering
brew install --cask icon-composer
Flat previews, bundle creation/editing, and marketing export work on any platform without Icon Composer
Run icon-composer doctor to check your setup.
CLI Commands
Command Description createCreate a new .icon bundle from a foreground image add-layerAdd a layer to an existing bundle removeRemove a layer or group inspectRead and display bundle contents glassConfigure Liquid Glass effects on a group appearanceSet dark/tinted mode overrides fillSet background fill (solid, gradient, automatic, none) positionSet layer/group scale and offset fxToggle all glass effects on/off previewExport a preview PNG (Liquid Glass or flat) renderRender pixel-perfect Liquid Glass via ictool export-marketingExport flat 1024x1024 PNG for App Store Connect (no alpha) doctorCheck system setup and dependencies
Details
create โ Create a new .icon bundle
ย
icon-composer create <foreground_path> <output_dir> --bg-color <hex> [options]
Option Default Description --bg-color <hex>required Background color (e.g. "#0A66C2") --bundle-name <name>AppIconBundle name (without .icon extension) --dark-bg-color <hex>โ Dark mode background color --glyph-scale <n>1.0Glyph scale (1.0 = standard ~65% of icon area) --specular / --no-speculartrueSpecular highlight --shadow-kind <kind>layer-colorShadow type: neutral, layer-color, none --shadow-opacity <n>0.5Shadow opacity (0โ1) --blur-material <n>โ Blur material value (0โ1) --translucency-enabledfalseEnable translucency gradient --translucency-value <n>0.4Translucency amount (0โ1)
Output: Creates <output_dir>/<bundle_name>.icon/ containing icon.json manifest and Assets/ directory.
add-layer โ Add a layer to an existing bundle
ย
icon-composer add-layer <bundle_path> <image_path> --name <name> [options]
Option Default Description --name <name>required Layer name --group-index <n>0Target group index --create-groupfalseCreate a new group for this layer --opacity <n>1.0Layer opacity (0โ1) --scale <n>1.0Layer scale --offset-x <n>0X offset in points --offset-y <n>0Y offset in points --blend-mode <mode>normalBlend mode (e.g. multiply, screen, overlay) --glass / --no-glasstrueParticipate in Liquid Glass effects
Supported formats: .png, .jpg, .jpeg, .svg, .webp, .heic, .heif
remove โ Remove a layer or group
ย
icon-composer remove <bundle_path> --target <layer|group> --group-index <n> [--layer-index <n>]
inspect โ Read and display bundle contents
ย
icon-composer inspect <bundle_path>
Output: Prints the full manifest JSON and lists all assets with sizes.
glass โ Configure Liquid Glass effects
ย
icon-composer glass <bundle_path> [options]
Option Description --group-index <n>Target group (default: 0) --specular / --no-specularSpecular highlight --blur-material <n>Blur amount (0โ1) --shadow-kind <kind>neutral, layer-color, or none--shadow-opacity <n>Shadow opacity (0โ1) --translucency-enabled / --no-translucency-enabledTranslucency toggle --translucency-value <n>Translucency amount (0โ1) --opacity <n>Group opacity (0โ1) --blend-mode <mode>Group blend mode --lighting <type>combined or individual
appearance โ Set dark/tinted mode overrides
ย
icon-composer appearance <bundle_path> --target <fill|group|layer> --appearance <dark|tinted> [options]
Option Description --target <type>fill (background color), group (glass effects), or layer (individual layer)--appearance <mode>dark or tinted--group-index <n>Group index (for target=group or target=layer) --layer-index <n>Layer index within the group (required when target=layer) --bg-color <hex>Background color for this appearance --specular / --no-specularSpecular for this appearance --shadow-kind <kind>Shadow type for this appearance --shadow-opacity <n>Shadow opacity for this appearance --opacity <n>Opacity for this appearance --blur-material <n>Blur material value (0โ1) for this appearance --translucency-enabled / --no-translucency-enabledTranslucency toggle for this appearance --translucency-value <n>Translucency amount (0โ1) for this appearance --hidden / --no-hiddenHidden state for this appearance --blend-mode <mode>Blend mode for this appearance (target=layer) --fill-color <hex>Fill color for this appearance (target=layer) --position-scale <n>Position scale for this appearance --position-offset-x <n>Position X offset for this appearance --position-offset-y <n>Position Y offset for this appearance
fill โ Set background fill
ย
icon-composer fill <bundle_path> --type <solid|gradient|automatic|none> [options]
Option Description --type <type>solid, gradient, automatic, or none--color <hex>Primary color (for solid or gradient bottom) --color2 <hex>Secondary color (gradient top) --gradient-angle <n>Gradient angle in degrees (default: 0)
position โ Set layer/group scale and offset
ย
icon-composer position <bundle_path> [options]
Option Default Description --target <type>layerlayer or group--group-index <n>0Group index --layer-index <n>โ Layer index (required for --target layer) --scale <n>โ Scale factor (0.05โ3.0) --offset-x <n>โ X offset in points --offset-y <n>โ Y offset in points
fx โ Toggle all glass effects
ย
icon-composer fx <bundle_path> --enable |--disable
Enables or disables specular, shadow, blur, and translucency on every group at once.
preview โ Export a preview PNG
ย
icon-composer preview <bundle_path> <output_path> [options]
Option Default Description --size <n>1024Output size in pixels --appearance <mode>โ dark or tinted--flatfalseForce flat rendering (skip Liquid Glass) --canvas-bg <preset>โ light, dark, checkerboard, homescreen-light, homescreen-dark--apple-preset <name>โ Apple wallpaper: sine-purple-orange, sine-gasflame, sine-magenta, sine-green-yellow, sine-purple-orange-black, sine-gray --canvas-bg-color <hex>โ Custom background color --canvas-bg-image <path>โ Custom background image --zoom <n>1.0Zoom level (icon size relative to canvas)
Output: PNG file. Uses Liquid Glass rendering by default (falls back to flat if Icon Composer is not installed).
render โ Render Liquid Glass via ictool
ย
icon-composer render <bundle_path> <output_path> [options]
Option Default Description --platform <name>iOSiOS, macOS, or watchOS--rendition <name>DefaultDefault, Dark, TintedLight, TintedDark, ClearLight, ClearDark--width <n>1024Output width --height <n>1024Output height --scale <n>1Scale factor (1x, 2x, 3x) --light-angle <n>โ Light angle (0โ360) --tint-color <n>โ Tint hue (0โ1) --tint-strength <n>โ Tint strength (0โ1) Canvas options โ Same as preview
Requires: Icon Composer.app installed. Returns an error with install instructions if missing.
export-marketing โ Export for App Store Connect
ย
icon-composer export-marketing <bundle_path> <output_path> [--size <n>]
Output: Flat PNG with no alpha channel (avoids ITMS-90717 rejection). Default 1024x1024.
doctor โ Check system setup
ย
Output: Reports Node version, platform, ictool path and version. Prints install instructions if Icon Composer is missing.
Tool Description create_iconCreate a .icon bundle from a foreground image and background color add_layer_to_iconAdd a new layer to an existing bundle remove_layerRemove a layer or group, optionally clean up assets read_iconInspect bundle manifest and assets set_glass_effectsConfigure specular, blur, shadow, translucency set_appearancesSet dark/tinted mode overrides set_fillSet background fill set_layer_positionAdjust layer scale and offset toggle_fxEnable/disable all glass effects at once export_previewRender a preview PNG render_liquid_glassRender via Apple's ictool (requires Icon Composer) export_marketingExport flat opaque PNG for App Store Connect
All tools return { content: [{ type: "text", text: "..." }], isError?: true }.
Details
create_icon
ย
Create a .icon bundle from a foreground image.
Parameter Type Required Default Description foreground_pathstring yes โ Absolute path to PNG or SVG output_dirstring yes โ Output directory bundle_namestring no AppIconBundle name bg_colorstring yes โ Background hex color dark_bg_colorstring no โ Dark mode background color glyph_scalenumber no 1.0Glyph scale (0.1โ2.0) specularboolean no trueSpecular highlight shadow_kindenum no layer-colorneutral, layer-color, noneshadow_opacitynumber no 0.5Shadow opacity (0โ1) blur_materialnumber no โ Blur amount (0โ1) translucency_enabledboolean no falseEnable translucency translucency_valuenumber no 0.4Translucency amount (0โ1)
add_layer_to_icon
ย
add_layer_to_icon
Add a layer to an existing bundle.
Parameter Type Required Default Description bundle_pathstring yes โ Path to .icon bundle image_pathstring yes โ Path to image file layer_namestring yes โ Layer name group_indexnumber no 0Target group create_groupboolean no falseCreate new group opacitynumber no 1.0Layer opacity (0โ1) scalenumber no 1.0Layer scale (0.1โ2.0) offset_xnumber no 0X offset offset_ynumber no 0Y offset blend_modeenum no normalBlend mode glassboolean no trueGlass participation
remove_layer
ย
remove_layer
Remove a layer or group. layer_index required when target=layer.
Parameter Type Required Default bundle_pathstring yes โ targetenum yes โ group_indexnumber yes โ layer_indexnumber no โ cleanup_assetsboolean no true
read_icon
ย
read_icon
Inspect a bundle. Returns full manifest JSON and asset list with sizes.
Parameter Type Required bundle_pathstring yes
set_glass_effects
ย
set_glass_effects
Configure Liquid Glass on a group. All effect parameters are optional โ only provided values are changed.
Parameter Type Default Description bundle_pathstring โ Path to bundle group_indexnumber 0Target group specularboolean โ Specular toggle blur_materialnumber|null โ Blur (0โ1, null to disable) shadow_kindenum โ neutral, layer-color, noneshadow_opacitynumber โ Shadow opacity (0โ1) translucency_enabledboolean โ Translucency toggle translucency_valuenumber โ Translucency amount (0โ1) opacitynumber โ Group opacity (0โ1) blend_modeenum โ Blend mode lightingenum โ combined or individual
set_appearances
ย
set_appearances
Set dark/tinted overrides for background fill, group effects, or individual layer properties.
Parameter Type Required Description bundle_pathstring yes Path to bundle targetenum yes fill, group, or layerappearanceenum yes dark or tintedgroup_indexnumber no Group index (for target=group or target=layer) layer_indexnumber no Layer index within the group (required when target=layer) bg_colorstring no Background color for this appearance (target=fill) specularboolean no Specular for this appearance (target=group) shadow_kindenum no Shadow type (target=group) shadow_opacitynumber no Shadow opacity (target=group) opacitynumber no Opacity for this appearance (target=group or target=layer) blur_materialnumber|null no Blur material for this appearance (target=group) translucency_enabledboolean no Enable translucency for this appearance (target=group) translucency_valuenumber no Translucency amount for this appearance (target=group) hiddenboolean no Hidden state for this appearance (target=group or target=layer) blend_modeenum no Blend mode for this appearance (target=layer) fill_colorstring no Fill color hex for this appearance (target=layer) position_scalenumber no Position scale for this appearance (0.05โ3.0) position_offset_xnumber no Position X offset for this appearance position_offset_ynumber no Position Y offset for this appearance
set_fill
ย
set_fill
Set background fill.
Parameter Type Required Description bundle_pathstring yes Path to bundle fill_typeenum yes solid, gradient, automatic, nonecolorstring no Hex color (solid or gradient bottom) color2string no Gradient top color gradient_anglenumber no Angle in degrees (default: 0)
set_layer_position
ย
set_layer_position
Adjust layer or group scale and offset.
Parameter Type Default Description bundle_pathstring โ Path to bundle targetenum layerlayer or groupgroup_indexnumber 0Group index layer_indexnumber โ Layer index (for target=layer) scalenumber โ Scale (0.05โ3.0) offset_xnumber โ X offset offset_ynumber โ Y offset
toggle_fx
ย
toggle_fx
Enable or disable all glass effects on every group.
Parameter Type Required bundle_pathstring yes enabledboolean yes
export_preview
ย
export_preview
Render a preview PNG. Uses Liquid Glass by default, falls back to flat.
Parameter Type Default Description bundle_pathstring โ Path to bundle output_pathstring โ Output PNG path sizenumber 1024Output size (16โ2048) appearanceenum โ dark or tintedflatboolean falseForce flat rendering canvas_bgenum โ Preset background apple_presetenum โ Apple wallpaper preset canvas_bg_colorstring โ Custom background hex canvas_bg_imagestring โ Background image path zoomnumber 1.0Zoom level (0.1โ3.0) return_imageboolean trueReturn rendered image inline as base64
render_liquid_glass
ย
render_liquid_glass
Pixel-perfect Liquid Glass via Apple's ictool. Requires Icon Composer.app.
Parameter Type Default Description bundle_pathstring โ Path to bundle output_pathstring โ Output PNG path platformenum iOSiOS, macOS, watchOSrenditionenum DefaultDefault, Dark, TintedLight, TintedDark, ClearLight, ClearDarkwidthnumber 1024Output width (16โ2048) heightnumber 1024Output height (16โ2048) scalenumber 1Scale factor (1โ3) light_anglenumber โ Light angle (0โ360) tint_colornumber โ Tint hue (0โ1) tint_strengthnumber โ Tint strength (0โ1) Canvas options โ โ Same as export_preview return_imageboolean trueReturn rendered image inline as base64
export_marketing
ย
export_marketing
Flat marketing PNG for App Store Connect. No glass effects, no alpha channel.
Parameter Type Default Description bundle_pathstring โ Path to bundle output_pathstring โ Output PNG path sizenumber 1024Output size (16โ2048) return_imageboolean trueReturn rendered image inline as base64
MCP Prompts
Prompt Parameters Description create-app-iconimage_path, output_dir, brand_color, dark_color?Guided workflow: create icon from a logo, preview, iterate, export add-dark-modebundle_path, dark_colorAdd dark mode to an existing icon with before/after preview export-for-app-storebundle_path, output_dirExport marketing PNG + preview for App Store submission
Example Workflows
Create a branded icon
icon-composer create logo.svg ./out --bg-color "#0A66C2"
icon-composer appearance ./out/AppIcon.icon --target fill --appearance dark --bg-color "#0D1B2A"
icon-composer glass ./out/AppIcon.icon --specular --shadow-kind layer-color --blur-material 0.3
icon-composer preview ./out/AppIcon.icon preview.png
Export for App Store
icon-composer export-marketing ./out/AppIcon.icon marketing.png
Multi-layer icon with glass
icon-composer create background.svg ./out --bg-color "#1C1C2E"
icon-composer add-layer ./out/AppIcon.icon glyph.svg --name glyph --opacity 0.8
icon-composer add-layer ./out/AppIcon.icon badge.svg --name badge --create-group
icon-composer glass ./out/AppIcon.icon --group-index 0 --specular --blur-material 0.3
icon-composer glass ./out/AppIcon.icon --group-index 1 --specular --shadow-kind neutral
icon-composer render ./out/AppIcon.icon glass-preview.png
Limitations
Liquid Glass rendering requires macOS with Apple's Icon Composer.app installed. Flat rendering works everywhere.
ClearLight/ClearDark renditions render against gray. Apple's glass transparency requires Metal GPU, not available via CLI.
Architecture
src/lib/ Pure library (bundle, manifest, render, ictool)
src/lib/ops-*.ts Operations layer (MCP result format)
src/cli.ts CLI (Commander.js, 14 commands)
src/server.ts MCP server (thin wrapper, 12 tools + 3 prompts)
Contributing
bun install
bun test
npm run test :mcp
bun run build
bun src/cli.ts visual-test --out ./gallery