compositor-mcp
# compositor-mcp
An [MCP](https://modelcontextprotocol.io) server that lets Claude and other AI agents read and edit
[Compositor](https://github.com/robbietilton/Compositor) projects, the open-source Photoshop
alternative for Mac.
It works on the documented `.comp` package format (a `manifest.json` plus one PNG per layer), so it
needs no changes to Compositor itself. Edit a project with an agent, then open it in Compositor.
Or the other way round: save in Compositor and let the agent inspect, retouch or render it.
## What the agent can do
| Tool | Purpose |
| --- | --- |
| `inspect_project` | Canvas size, resolution and every layer with folder depth, opacity, blend mode, transform, mask and clipping info |
| `list_layers` | Compact top-to-bottom view like the Layers panel |
| `render_preview` | Flattened PNG preview returned as an image so the model can *see* the composition |
| `export_flattened` | Full-resolution PNG or JPEG export |
| `export_layer` | Copy a layer's source pixels or mask to a file |
| `create_project` | New document, optionally with a solid background layer |
| `add_image_layer` | Import PNG, JPEG, HEIC, TIFF, WebP… as a layer, with fit/fill/stretch placement, opacity, blend mode and folder |
| `add_folder` | Create a layer folder |
| `set_layer` | Rename, show/hide, opacity, blend mode, position, size, rotation, flips, sampling, mask on/off |
| `move_layer` | Reorder layers or move them between folders |
| `remove_layer` | Delete a layer or a whole folder |
| `replace_layer_image` | Swap a layer's pixels (round-trip through another tool or a generated image) |
| `set_layer_mask` | Attach a grayscale mask, invert it, or clear it |
| `resize_canvas` | Change the document size with an anchor, without resampling |
| `open_in_compositor` | Open the project in the Compositor app |
The server also exposes a `compositor://format` resource describing the file format.
## Related
[marcushorndt/compositor-mcp](https://github.com/marcushorndt/compositor-mcp) takes a different route: it drives
Compositor's own document model and renderer headlessly (Swift), so previews match the app exactly. This package is a
plain Node server that works on the documented file format, needs no build of the app, and runs wherever Node runs.
Pick whichever fits your setup; both open the same `.comp` files.
## Install
Requires Node.js 20 or later. Compositor itself is only needed to look at the result.
### Claude Code
```bash
claude mcp add compositor -- npx -y compositor-mcp
```
### Claude Desktop
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"compositor": {
"command": "npx",
"args": ["-y", "compositor-mcp"]
}
}
}
```
### From source
```bash
git clone https://github.com/Josusanz/compositor-mcp
cd compositor-mcp
npm install
npm run build
claude mcp add compositor -- node /path/to/compositor-mcp/dist/src/index.js
```
## Example session
> Create a 1920×1080 project at `~/Desktop/poster.comp` with a white background, add `photo.jpg`
> scaled to fill, put `logo.png` in the bottom right corner at 80 % opacity with Multiply, then show
> me a preview and open it in Compositor.
The agent calls `create_project`, `add_image_layer` twice, `set_layer`, `render_preview` and
`open_in_compositor`. Compositor opens the document with the layers ready to keep editing.
## How it maps to the Compositor format
- Layer pixels are stored untouched as 8-bit sRGB PNGs; placement, scale, rotation and flips live
in the layer transform, so edits stay non-destructive.
- Masks are written as 8-bit grayscale PNGs without alpha, as Compositor requires.
- Manifests are validated against the same rules as `ProjectStore.swift` before writing, written
with sorted keys and replaced atomically.
- Fields this tool does not understand (adjustments, effects, text, shapes, guides, anything newer)
are preserved on round trip.
- Projects are saved as format version 9 (what Compositor 1.2.6 writes); a project declaring a newer version keeps its own number and its unknown fields on round trip. Older Compositor builds reject
newer versions; update the app if a file will not open.
## Limitations
- The preview renderer covers order, folders, visibility, opacity, transforms, raster masks and
the blend modes sharp supports. Clipping masks, adjustment layers and layer effects are not
rendered yet; the tool reports what it skipped. Compositor's own export is the reference.
- Compositor does not watch files for changes. After the agent edits a project that is already
open, close and reopen the document (or call `open_in_compositor`).
- There is no live connection to the running app: selection, undo history and the viewport are
session-only in Compositor and out of reach here.
## Development
```bash
npm install
npm test # builds and runs the node:test suite
npm run dev # runs the server from TypeScript with tsx
```
## License
MIT. Compositor is © Robbie Tilton, also MIT.
TDQS
Scored across 15 tools
Each tool targets a distinct action and resource: layer image replacement, mask attachment, canvas resizing, project inspection, layer listing, preview rendering, export operations, project creation, layer/folder addition, property updates, reordering, and deletion. There is no ambiguity between tools; even set_layer and set_layer_mask are clearly separated, with set_layer handling generic properties and set_layer_mask specifically managing raster masks.
All 15 tools follow a consistent verb_noun pattern in snake_case (e.g., replace_layer_image, set_layer_mask, resize_canvas, create_project). The verb is always first, and nouns are descriptive. Even open_in_compositor follows the pattern with a prepositional modifier. No mixed conventions or vague verbs.
With 15 tools, the set is well-scoped for a compositing application. It covers project creation, layer management (add, remove, reorder, modify), rendering, export, and inspection. Each tool serves a clear purpose, and the count is within the ideal range for a domain-specific MCP server.
The tool surface covers the core lifecycle: project creation, layer addition/removal/modification, reordering, masking, image replacement, rendering, and export. Minor gaps exist, such as no explicit save operation (though create_project overwrites manifests) and lack of support for layer effects or duplicate/merge operations. However, agents can complete most workflows without dead ends.