SmoothyStudio MCP Server
Enables AI agents to generate and compose thumbnails using tools like get_capabilities, measure, render_thumbnail, render_variants, and get_canvas, with a document model that supports layers, effects, and masking.
README
SmoothyStudio
Status: macOS only for now. Windows and Linux targets are already configured in
package.json, but nothing is built or tested against them yet.
A focused thumbnail tool: generate the imagery, compose the thumbnail, export it — plus an MCP server so an agent can do the whole loop for you.
Two surfaces in one window:
- Studio — the canvas designer. Text (single / bullets / batch / split), shapes, icons, pictures, borders, corner logos, and a reorderable per-layer effect pipeline (crop, mosaic, wave warp, mirror, colour replace, duotone, roughen, blurs, vignette, turbulent displace, echo, venetian blinds, transform, 3D tilt, and a Lumetri-style grade). Exports transparent PNGs, one at a time or a whole batch.
- AI Photos — generation for the assets a thumbnail needs: reaction faces, text-to-image, background removal, upscaling, vertical covers.
The two are wired together: Send to Studio on any generated image drops it in as a picture layer, and the picture layer has a Generate with AI button that takes you the other way.
Running it
Requires Node 20+ and macOS.
npm install
npm run dev
Signing in uses your existing SmoothyEdit account — the app opens your browser and receives the token back, so no credentials are stored in this repo or entered into the app.
Building a release
npm run dist:mac # → dist/SmoothyStudio-<version>.dmg and .zip
Builds are unsigned for now, so the first launch needs one confirmation: on macOS 15+ open it, click Done, then System Settings → Privacy & Security → Open Anyway; on macOS 13–14 right-click → Open.
Dev server runs on 127.0.0.1:5176, so it can run alongside SmoothyDesktop (5175).
npm run typecheck # node + web
npm test # vitest
npm run build
Business model
The editor is free. Image generation costs credits, metered against the same
/api/credits rail the web app already uses — inference has real marginal cost, composition
doesn't.
Background removal runs on device and costs nothing. It uses the ISNet model bundled with
@imgly/background-removal-node in a utilityProcess, so photos never leave the machine, there
is no per-image cost, and there is no upload size limit — a full-resolution PNG exceeds a hosted
function's request-body cap before it even starts.
MCP server
The app hosts an MCP server on http://127.0.0.1:3777/mcp while it's running. Rendering happens
in the app's own renderer (through window.__studioMcp), so agents get the exact code path the UI
uses — no second renderer to keep in sync.
Connect Claude Code to it:
claude mcp add --transport http smoothystudio http://127.0.0.1:3777/mcp
Then ask for thumbnails in plain language. Three tools, deliberately coarse — a tool per effect would make an agent burn turns and produce incoherent layouts:
| Tool | What it does |
|---|---|
get_capabilities |
The full design reference: canvas presets, a font guide saying which faces suit what, templates, a catalogue of every layer and every effect with what it is for, and notes on masking, canvas-level effects and gradients. Call this first. |
measure |
Where every layer actually lands — x, y, width, height, centre, plus the safe area. Optionally resolves anchors (below, left-of, right, …) into coordinates. Call this instead of guessing positions. |
render_thumbnail |
One partial document → one PNG, returned inline as an image, and opened as a canvas in the running app so you can finish it by hand. Pass openInApp: false to skip that. |
render_variants |
A shared base + a list of overrides → one PNG per variant. Does not open canvases by default — compare the images, then render your pick with render_thumbnail. |
get_canvas |
The document the user currently has open, so an agent can edit their work in place rather than only creating new canvases. |
Agent renders land in the app as new canvases; nothing you already have open is touched or overwritten.
The document model
There is no parallel "spec" format to learn. A Studio document is plain JSON, and every tool takes
a partial document that's merged one level deep over the defaults — or over a template when you
pass templateId:
{
"templateId": "bold-centered",
"doc": {
"text": "MY HOOK\nGOES HERE",
"font": { "family": "SF Pro Display", "weight": 700, "size": 180, "color": "#FFFFFF" }
}
}
Templates exist because an agent handed a blank canvas and raw coordinates produces valid but ugly
layouts. Each one fixes the composition — type scale, safe margins, contrast — leaving the words and
the imagery to the model. Current set: bold-centered, subject-right-text-left, top-banner,
vertical-short.
Rendered PNGs come back inline so a vision-capable model can look at its own output and iterate. That feedback loop is the point; a tool that only returned a file path couldn't close it.
Placement. Don't guess coordinates — measure returns real boxes, and anchors compute
positions for you:
{ "anchors": [{ "id": "sub", "width": 520, "height": 54,
"anchor": { "to": "text", "edge": "below", "gap": 40 } }] }
Masking. Any layer can be clipped to another layer's silhouette — imagery through knocked-out type, a photo inside a shape:
{ "image": { "fx": { "mask": { "enabled": true, "sourceId": "text" } } } }
The finishing pass. doc.canvasFx and doc.canvasGrade apply to the composite, not one
layer — a vignette on doc.fx darkens the title's letters, which is almost never what you want.
Effects live on a layer's fx object and the colour grade on its grade object, both optional:
{ "doc": { "text": "BOLD CLAIM",
"grade": { "enabled": true, "contrast": 130, "vibrance": 25 },
"fx": { "vignette": { "enabled": true, "amount": -45 } } } }
Where your work is stored
Canvases are written to studio-workspace.json in the app's userData directory, not
localStorage. Documents embed their images as data URLs, so a couple of generated pictures
blow past localStorage's ~5 MB quota — and it fails silently, losing work. The file-backed
path has no cap, writes atomically, and surfaces any failure in the Studio header.
Layout
src/main/ Electron main — auth, credits, AI Photos bridge, export dialogs, MCP server
src/preload/ contextBridge surface (auth, credits, aiPhotos, studioApi)
src/renderer/ React UI — Studio + AI Photos, the render library, the MCP bridge
src/shared/ Types shared across processes
The rendering core is src/renderer/src/lib/studio.ts (document model + pure renderer) and
studio-effects.ts (the effect pipeline). renderDocToPngBase64(doc) is a pure
document-to-pixels function, which is what makes the whole thing drivable by an agent.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
E2B
Using MCP to run code via e2b.