Carousels MCP from Houtini

Carousels MCP from Houtini

MCP server that turns articles, transcripts, and markdown into LinkedIn carousel PDFs, Instagram PNGs, and Threads PNGs. Content in, slides out. No web UI, no cloud service.

Category
访问服务器

README

carousels-mcp

npm version MCP Registry Known Vulnerabilities

MCP server that turns articles, transcripts, and markdown into LinkedIn carousel PDFs, Instagram PNGs, and Threads PNGs. Content in, slides out. No web UI, no cloud service.

<p align="center"> <a href="https://glama.ai/mcp/servers/@houtini-ai/carousels-mcp"> <img width="380" height="200" src="https://glama.ai/mcp/servers/@houtini-ai/carousels-mcp/badge" alt="carousels-mcp MCP server" /> </a> </p>

Where this came from

I'd been building LinkedIn carousels manually -- Gemini for the content distillation, SVG generation for the slides, Puppeteer for the PDF conversion, then merging everything together. The whole process is documented in this article. It worked well but it was a lot of steps. So I packaged the pipeline into an MCP server. Now Claude handles the orchestration and I just tell it what I want.

What it does

You've got an article or a YouTube transcript or some markdown notes and you want a carousel. This server handles everything: content extraction, slide planning, SVG generation, PDF/PNG output. Give it a URL and it scrapes the content. Give it just a topic and it tells Claude how to research first using other MCP tools, then call back with the results.

The content extractor is actually quite good at picking the right slide type automatically. Numbers and percentages become stat slides. Ordered lists become step-by-step slides. Strong emphasis becomes takeaway callouts. "Before/after" language triggers comparison slides. The usual content, list, and quote types are there obviously, plus code slides for technical content and a CTA slide at the end.

The five tools

Tool What it does
list_templates Shows available templates, including any custom brand kits you've made
preview_slides Converts content into a structured slide plan you can review and edit before committing
render_slides Takes a slide plan and produces SVGs + PDF/PNG output
create_carousel Full pipeline in one call -- content in, carousel out
create_template Creates a custom brand kit by overriding colours and fonts from a base template

Eleven slide types

cover · content · code · quote · list · cta · stat · comparison · steps · takeaway · dataviz

Multi-platform output

Each platform gets the right dimensions and format. No fiddling with resize tools.

  • LinkedIn -- 1080x1350, merged into a single PDF carousel
  • Instagram -- 1080x1080, individual PNG slides at 2x resolution
  • Threads -- 1080x1350, individual PNGs

Getting started

Claude Desktop config

{
  "mcpServers": {
    "carousels": {
      "command": "npx",
      "args": ["-y", "@houtini/carousels-mcp"],
      "env": {
        "CAROUSEL_TEMPLATES_DIR": "/path/to/your/brand-kits"
      }
    }
  }
}

CAROUSEL_TEMPLATES_DIR is optional. Skip it if you're fine with the built-in templates.

Or install globally:

npm install -g @houtini/carousels-mcp

PDF and PNG output

SVG generation works out of the box. For the actual PDF and PNG files you need Puppeteer:

npm install -g puppeteer

Without it everything still works -- you just get SVG files. The server tells you this in its response, so you'll know. For most workflows you want Puppeteer installed. The SVG-only path is there as a fallback.

Gemini MCP integration

This is where it gets interesting. If you've got Gemini MCP installed alongside carousels-mcp, the two servers work together through Claude's orchestration. The carousel server can't see Gemini's tools directly -- MCP servers are isolated from each other -- but the tool descriptions teach Claude how to compose them.

What that means in practice:

  • Research-first carousels. Give create_carousel just a topic and it returns orchestration instructions. Claude picks up the workflow, calls gemini_deep_research for the content, then calls back with the results. You get a carousel about a topic you haven't written about yet.
  • Custom charts. Use preview_slides to get a slide plan, then ask Gemini's generate_svg to create charts or diagrams for specific slides. Inject the SVGs into the plan's customSvg fields and call render_slides. The chart ends up embedded directly in the slide.
  • Quality review. After rendering, Gemini's analyze_image can review the output PNGs and suggest improvements. Useful for catching text overflow or layout issues before you upload.

You don't need Gemini MCP for the core pipeline to work. Content in, carousel out -- that works standalone. But the research and visual enhancement workflows are quite good when both servers are available.

Workflow examples

URL to carousel -- the most common one. Give it an article URL, get a carousel back.

"Turn this into a LinkedIn carousel: https://example.com/my-post"

Topic to carousel -- when you haven't written the content yet. Claude researches via Gemini, then builds the slides.

"Make me a carousel about breeding pigs for LinkedIn"

YouTube to carousel -- works with Supadata MCP for transcript extraction.

"Turn this YouTube video into a carousel: https://youtube.com/watch?v=..."

Data-driven with charts -- research, analyse, then generate chart SVGs to embed in the slides.

"Research renewable energy trends, analyse the data, and make a carousel with charts"

Preview, tweak, render -- when you want to review the slide plan before committing.

"I want to review the slides before generating"
→ preview_slides returns editable JSON
→ You adjust slides, swap types, reorder
→ render_slides produces the final output

Templates

Six built-in templates. I spent a fair amount of time on these -- proper font pairings, warm backgrounds, committed colour palettes. No cold whites, no Inter, no generic SaaS aesthetic.

Template Description
professional Navy/parchment, Plus Jakarta Sans + Frank Ruhl Libre. The safe default.
bold-dark Dark navy, cyan-to-indigo gradients. Space Grotesk.
minimal-light Lots of whitespace, single teal accent, system fonts.
warm-friendly Cream background, amber-to-red warmth. Nunito + Source Serif 4.
neon-dark Deep charcoal with electric lime accents. The trending LinkedIn aesthetic right now, actually.
data-storyteller Built for stat and dataviz slides. Generous whitespace around the numbers so they breathe.

Custom brand kits

Use create_template to build your own. Pick a base template, override the colours and fonts you care about, and it saves a JSON file to your templates directory. Next time you run list_templates, your brand kit shows up alongside the built-ins.

The server is fairly smart about brand detection. If you have custom templates but you're using the default professional, it mentions your brand kits in the response. Gentle nudge, not a nag.

Engagement patterns

There's some deliberate design baked into the SVG generation. Not decorative stuff -- actual patterns from LinkedIn carousel performance research.

Progress bar. Every slide gets a gradient bar at the bottom showing position in the deck. The Zeigarnik effect means people who see "3 of 8" feel compelled to keep swiping. It's thin and unobtrusive, but it works.

50 words per slide maximum. The content extractor enforces this. More than about three seconds of reading time per slide and people scroll past. If your content runs long, it gets split across more slides rather than cramming text in.

Slide 5 anchor. The extractor deliberately places a stat or quote slide at position 5. Mid-carousel drop-off is a real thing and an attention-grabbing slide at that position helps retention.

Output structure

Carousels save to ~/Documents/carousels/ in date-stamped folders:

~/Documents/carousels/2026-03-14-my-article-title/
  slide-01.svg
  slide-02.svg
  ...
  slide-01.pdf       (LinkedIn)
  carousel.pdf       (merged, ready to upload)
  slide-01.png       (Instagram/Threads)
  slide-02.png

Override with outputDir parameter or the CAROUSEL_OUTPUT_DIR environment variable.

Tool reference

create_carousel

The full pipeline. Three input modes:

  • Content mode: Pass content directly -- runs the pipeline immediately.
  • URL mode: Pass sourceUrl -- the server fetches the page, extracts article content, runs the pipeline. If the page is JS-rendered and extraction fails, it returns fallback instructions to use firecrawl_scrape or web_fetch instead.
  • Topic mode: Pass topic without content or URL -- returns orchestration workflows telling Claude how to research first, then call back with content.
Parameter Type Default Description
content string -- Article text, markdown, or transcript. Optional if sourceUrl or topic is provided.
topic string -- Topic for research-first workflow. Returns orchestration instructions when no content/URL given.
templateName string "professional" Template to use
brandName string -- Brand name in slide footers
slideCount number 8 Target slides (4--12)
sourceUrl string -- URL to fetch article content from. Also used for CTA slide link.
outputDir string ~/Documents/carousels/ Output directory
platform string "linkedin" linkedin, instagram, or threads

preview_slides

Returns a JSON slide plan you can review and edit before rendering.

Parameter Type Default Description
content string required Content to convert
slideCount number 8 Target slides (4--12)
sourceUrl string -- URL for CTA slide

render_slides

Renders a slide plan (from preview_slides or hand-crafted) to SVG + PDF/PNG.

Parameter Type Default Description
slidePlan object required Structured slide plan
templateName string "professional" Template to use
brandName string -- Brand name in footers
outputDir string ~/Documents/carousels/ Output directory
platform string "linkedin" linkedin, instagram, or threads

list_templates

Lists built-in and custom templates. No parameters.

create_template

Creates a custom brand kit from a base template.

Parameter Type Default Description
name string required Template name (kebab-case)
baseTemplate string "professional" Template to extend
colors object -- Colour overrides (background, card, title, body, accent, footer)
typography object -- Font family overrides
layout object -- Layout overrides (margin, padding, radius)
googleFonts string[] -- Google Fonts to import

Environment variables

Variable Purpose Default
CAROUSEL_TEMPLATES_DIR Directory for custom brand kit JSONs none (built-in only)
CAROUSEL_OUTPUT_DIR Base output directory ~/Documents/carousels/

Requirements

  • Node.js 18+
  • Puppeteer (optional, for PDF/PNG output)
  • Gemini MCP (optional, for research workflows and custom chart generation)

Licence

MIT

推荐服务器

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 模型以安全和受控的方式获取实时的网络信息。

官方
精选