Install

keyline is a free, source-available MCP server that lets AI agents (Claude Code, Cursor, Codex, VS Code) design social posts, display ads, banners, flyers and video at every size from one JSON scene. It measures text fit and overflow before rendering, and renders with Skia instead of a headless browser.

Claude Code and Claude Desktop

Nothing else to install.

Claude Code: install the plugin. It uses keyline-mcp from your PATH if it's there, and otherwise downloads the matching release once and checks it against the release's SHA256SUMS.

/plugin marketplace add keyline-dev/keyline
/plugin install keyline@keyline

Claude Desktop (Mac with Apple silicon, or Windows): download keyline-mcp-<version>.mcpb from the latest release and double-click it. Its settings pick the folders keyline may read and whether to leave motion out.

Other clients: install, then add

macOS (Apple silicon):

brew install keyline-dev/tap/keyline-mcp

Or download keyline-mcp-<version>-macos-arm64.tar.gz from the latest release and put the binary on your PATH. It isn't signed by Apple, so if you downloaded it in a browser, clear the quarantine flag once:

tar xzf keyline-mcp-<version>-macos-arm64.tar.gz
sudo mv keyline-mcp-<version>-macos-arm64/keyline-mcp /usr/local/bin/
xattr -d com.apple.quarantine /usr/local/bin/keyline-mcp 2>/dev/null || true

Linux (amd64 or arm64): the .deb from the latest release puts keyline-mcp in /usr/bin; a plain tarball is there too.

sudo apt install ./keyline-mcp_<version>-1_amd64.deb

Windows (x64; Arm runs it emulated): download keyline-mcp-<version>-windows-amd64.zip from the latest release, unpack it, and put the folder holding keyline-mcp.exe on your PATH, or give clients its full path. The Claude Code plugin doesn't run on Windows yet; add the server with claude mcp add keyline -- keyline-mcp instead.

Docker (Linux, nothing else to install): use this as the command in your client. :latest includes ffmpeg for video; :stills leaves it out and is about a third the size.

docker run -i --rm -v keyline:/data ghcr.io/keyline-dev/keyline-mcp

From source (any OS; Rust stable; Skia comes precompiled; on Linux also libfontconfig1-dev libfreetype6-dev): cargo build --release.

To check a download, compare it with the release's SHA256SUMS, or check where it was built with the GitHub CLI; then check it runs with keyline-mcp --help:

sha256sum --check --ignore-missing SHA256SUMS      # macOS: shasum -a 256 --check --ignore-missing SHA256SUMS
gh attestation verify keyline-mcp_<version>-1_amd64.deb --repo keyline-dev/keyline

Then add it to your client. Each block names the server keyline; clients prefix its tools with that name, so a short one costs fewer tokens. If a client can't find the program, give its full path (which keyline-mcp).

Claude Code, without the plugin
claude mcp add keyline -- keyline-mcp

Add --scope user to use it in every project. (guide)

Claude Desktop, without the extension

Settings → Developer → Edit Config opens claude_desktop_config.json. Claude Desktop doesn't search your shell's PATH, so give the full path, then restart it. (guide)

{ "mcpServers": { "keyline": { "command": "/opt/homebrew/bin/keyline-mcp" } } }
Cursor

Add to Cursor, or add to ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project). (guide)

{ "mcpServers": { "keyline": { "command": "keyline-mcp" } } }
VS Code
code --add-mcp '{"name":"keyline","command":"keyline-mcp"}'

Or add to .vscode/mcp.json, or your profile's (MCP: Open User Configuration). The key is servers, not mcpServers. (guide)

{ "servers": { "keyline": { "type": "stdio", "command": "keyline-mcp" } } }
Windsurf

Add to ~/.codeium/windsurf/mcp_config.json. (guide)

{ "mcpServers": { "keyline": { "command": "keyline-mcp" } } }
Cline

In Cline's MCP Servers panel, open the installed servers' settings (cline_mcp_settings.json) and add: (guide)

{ "mcpServers": { "keyline": { "command": "keyline-mcp" } } }
Codex (OpenAI)
codex mcp add keyline -- keyline-mcp

Or add to ~/.codex/config.toml: (guide)

[mcp_servers.keyline]
command = "keyline-mcp"

The ChatGPT app itself connects only to remote MCP servers over HTTP, so it can't start keyline, which runs on your machine; use Codex.

Any other client

Any MCP client that starts stdio servers works: the command is keyline-mcp. It runs where the client runs; to render on another machine, make the command ssh that-machine keyline-mcp.

Then

Ask your agent for a design: "Make a vote-by-mail flyer with this photo, in 1080×1350, 1200×1000 and a 300×600 skyscraper."

Local files: to let the agent add images and templates by path (their bytes never pass through the model, far cheaper than base64), allow their folders: --allow-read ~/brand ~/projects/ads. With claude mcp add, flags go after the command (claude mcp add keyline -- keyline-mcp --allow-read ~/brand); in a JSON config, in args. Paths are resolved through every symlink before the check. In Docker, mount the folder and allow the mount: -v ~/brand:/brand … --allow-read /brand.

Video needs ffmpeg (brew install ffmpeg, apt install ffmpeg), looked up when a call needs it. It's optional: without it, everything else works, animated PNG and GIF included.

Options: every setting is a flag (--allow-read, --no-motion, --data, --fonts, --renderer, --ffmpeg, --encoder), listed in Tools and replies and by keyline-mcp --help.

Without an agent: keyline-mcp render scene.json --out renders/ renders a scene file at every size, and exits 1 on a ! defect, for scripts and CI (--check checks without drawing); in GitHub Actions, uses: keyline-dev/keyline@v0 does it for every scene in a repo (Tools and replies).

GPU on a Linux server: it needs a GPU with Vulkan drivers (NVIDIA's, or Mesa for AMD and Intel); no display is needed. In Docker, pass the GPU through (for NVIDIA: the Container Toolkit, --gpus all, with graphics capability). Software Vulkan drivers are skipped, since the CPU renderer is faster; without a GPU, renders use the CPU.

This page is built from README.md; also as Markdown.