SmoothyStudio MCP Server

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.

Category
访问服务器

README

SmoothyStudio

macOS License: MIT

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.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选