Scrollytelling / MCP server
MCP server

Use the widget library from your coding agent.

The Scrollytelling MCP server connects the widget library to Claude Code, Cursor, VS Code, Claude and any other MCP client. Your agent searches the widgets and pulls finished, paste-ready HTML — carousels, sticky splits, interactive maps, charts — without you leaving the editor. It works on every plan, including Free, and never spends credits.

Add the server, sign in, done

Pick your client. Every path ends the same way: a browser opens, you sign in with your normal Scrollytelling account (email or Google), approve the connection, and the client handles tokens and refresh from there. No keys to copy.

One command, then run /mcp, pick scrollytelling and choose Authenticate:

claude mcp add --transport http scrollytelling https://api.scrollytelling.ai/mcp

No API key needed. Your client opens a browser sign-in with your normal Scrollytelling account the first time it connects. Add --scope user to make it available in every project.

Add this to ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project), then open Cursor Settings → Tools & MCP and click Needs login next to scrollytelling:

json
{
  "mcpServers": {
    "scrollytelling": {
      "url": "https://api.scrollytelling.ai/mcp"
    }
  }
}
Install in Cursor →

Cursor opens the browser sign-in and stores the tokens itself.

Run this in a terminal (VS Code 1.101 or newer, Copilot agent mode), then pick Allow when VS Code asks to sign in:

code --add-mcp '{"name": "scrollytelling", "type": "http", "url": "https://api.scrollytelling.ai/mcp"}'
json · .vscode/mcp.json alternative
{
  "servers": {
    "scrollytelling": {
      "type": "http",
      "url": "https://api.scrollytelling.ai/mcp"
    }
  }
}
Install in VS Code →

VS Code supports the sign-in flow natively — no keys, no secrets file.

In Claude (web or desktop) open Settings → Connectors → Add custom connector. Name it Scrollytelling, paste the server URL, click Add, then Connect and sign in:

https://api.scrollytelling.ai/mcp

Custom connectors are available on Claude's paid plans (Pro, Max, Team and Enterprise) — that's Claude's rule, not ours. The connector then works in chat and in Claude's desktop app.

Any client that speaks MCP over Streamable HTTP with OAuth 2.1 (PKCE and dynamic client registration) needs the URL alone. A script or a client without OAuth can send a personal API key as the bearer token instead — create one under Settings → Integrations:

curl https://api.scrollytelling.ai/mcp \
  -H "Authorization: Bearer stl_your_personal_api_key" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Discovery lives at /.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server on the API origin. The server is stateless JSON-RPC: POST only, no server-sent streams.

Access follows your account.

The connection identifies you; what it can read is decided live, per request. Widget tools work on every plan and never spend credits. Story tools only ever see the stories of the account you signed in with. Disconnect an agent any time under Settings → Integrations — and the same connection works again the moment you approve it.

What your agent does with it

Three tools cover the whole loop; two more handle your published stories.

1 · find

search_widgets

“a map”, “sticky image”, “chart” — the agent gets slugs, summaries and what each widget is for.

2 · read

get_widget

The widget's docs, the JSON schema of its props and a complete example it can adapt.

3 · render

render_widget

Your content in, a self-contained HTML document out — or an iframe snippet for an existing page.

Try asking:

  • Add a sticky-split section to our landing page: the product photo pinned on the left, three short feature paragraphs scrolling on the right.
  • Find a widget for showing our six office locations on a map and render it with our brand colours.
  • Turn this list of quarterly numbers into an animated bar chart I can drop into the report page.
  • Give me the embed code for our published “Annual report 2026” story for the investors page.
  • Which Scrollytelling widget fits a photo essay? Render it with these five images and captions.

Code-generator MCPs vs a component MCP

Most scrollytelling, GSAP and animation MCP servers you find on registries are code generators: you describe an effect and the model writes fresh code from scratch. Useful for one-off snippets, but the output is whatever the model produces that day — untested, unstyled, and yours to debug. Ask twice and you get two different carousels.

The Scrollytelling server is the other kind: a component MCP, the same model shadcn/ui uses. Your agent searches a library of finished, production-tested widgets and gets the real thing — rendered by the exact engine that publishes every Scrollytelling story, with responsive layout, reduced-motion support, lazy-loaded media and documented props already handled. Generation gives you a starting point; a component MCP gives you the shipped thing.

Code-generator MCPScrollytelling (component MCP)
What you getFresh code the model wrote for this requestThe real source of a finished widget, rendered by the engine that publishes every Scrollytelling story
ConsistencyDifferent every time, even for the same promptByte-identical output for the same props — today, next month, in CI
Responsive, accessible, reduced motionIf the model rememberedBuilt in and tested on every widget
StylingUnstyled, or styled to whatever the model guessedDesign tokens (accent, background, text, fonts) applied the same way as in the editor
DebuggingYours — nobody else has ever run that codeOurs — the widget is the one thousands of published stories already run
UpdatesNever; the snippet is frozen the moment it is writtenRender again and you get the current widget; published-story embeds update themselves
CostModel tokens for every line of codeNo AI, no credits — a library lookup

The two are not rivals: let a generator write the glue code around a page, and let the component server hand it the sections that have to work.

What it covers

  • The full widget library — Carousel, Stacking cards, Slideshow, Split scroll, Sticky split, Interactive map, Stacking images, Bento grid, FAQ accordion, Chart, Scroll video, Video background — rendered as complete, self-contained HTML (inline CSS and JavaScript, media by URL), with your heading, subheading and design tokens applied.
  • Concepts and patterns as agent-readable markdown — which scroll pattern fits which job, pacing and asset guidance, and how to embed the output in any site or framework — served as MCP resources your agent can read before it builds.
  • Your published stories — list them, and get a story's public URL, iframe embed, oEmbed endpoint and WordPress shortcode. Read-only: the story stays hosted and updated by Scrollytelling.
  • Every plan, including Free — the server never spends credits and never calls an AI model; access follows the account you sign in with.

What it doesn't (yet)

  • The AI story generator. Creating a whole story from a brief, a URL or a file happens in the app, where credits and plan limits apply. The MCP server is deliberately a library, not a generator.
  • The Form widget. A form needs a published story to receive submissions, so it cannot be a standalone snippet — build it in the editor, publish, then use get_story_embed. (Preview it here.)
  • AI Spotlight and custom sections. These are generated per story inside the editor.
  • Shopify-only widgets (Product buy box, Product grid) — they need a connected store.
  • Editing or publishing stories. The server is read-only; the editor does the writing.
  • Scroll-video frame scrubbing from a raw clip. Splitting a video into scrub frames happens in the editor or the scroll-video playground; through MCP a videoUrl renders as an autoplay background, and a frame set you already have renders with real scrubbing.
  • Templates and whole-story kits — on the roadmap.

Tools and resources

ToolWhat it doesInputs
search_widgetsFind widgets by name, purpose or keyword; an empty query lists all 13.query (optional)
get_widgetA widget's docs, the JSON schema of its props and a complete example call.slug
render_widgetRender one widget with your content to self-contained HTML, or to an <iframe srcdoc> snippet.type, props, heading, subheading, design, format, iframeHeight
list_storiesYour stories with publish status and public URL.publishedOnly (optional)
get_story_embedA published story's URL, iframe embed, oEmbed endpoint and WordPress shortcode.storyId, height

Every tool is read-only and idempotent. render_widget accepts design tokens — accentColor, backgroundColor, textColor, headingFont, bodyFont — and format: "iframe" for an <iframe srcdoc> snippet.

ResourceContents
scrollytelling://concepts/scroll-driven-storytellingPatterns: what holds, what moves, which widget — plus pacing and asset rules.
scrollytelling://concepts/embeddingUsing the rendered HTML as a file, inside a page (iframe srcdoc), or in React/Vue/Svelte.
scrollytelling://widgets/{slug}Per-widget docs and props schema, one resource per widget.

Common errors

  • 401 — not authenticated. Re-run the client's authenticate flow (Claude Code: /mcp → scrollytelling → Authenticate), or check the API-key header if you use one. Tokens last 24 hours and refresh automatically; a disconnected agent (Settings → Integrations) gets a 401 until you approve it again.
  • 403 — signed in, but the account can't be used. The account is suspended or deleted. Sign in to the dashboard to see why, or contact support from there.
  • “Redirect not allowed” on the sign-in page. The client registered one callback address and sent another. Remove the server from your client and add it again so it registers fresh.
  • The browser never opened. Copy the sign-in URL the client printed in its terminal or logs and open it yourself. Approve the connection; the client picks it up.
  • Signed in, approved, but the client still says unauthenticated. The client lost the callback — usually a second sign-in tab or a changed port. Run the authenticate flow once more; a fresh approval replaces the old one.
  • Tools don't show up. Reconnect or restart the client so it re-reads the server's tool list. The URL must be exactly https://api.scrollytelling.ai/mcp over https.
  • Invalid props for <widget>. The tool result says which field is wrong. Images must be public https URLs (or data: URIs), coordinates decimal degrees, and item counts within the limits in get_widget.
  • The widget renders, but images are blank. The image host blocks hot-linking or isn't public. Use a URL anyone can open in a private window, or pass a data: URI.
  • 429 — too many requests. The server allows 120 calls a minute per connection and 30 sign-in operations a minute per address. Wait a moment; nothing is lost.
  • “Not published yet” from get_story_embed. Only published stories have a public URL. Publish from the editor's Publish panel, then ask again. Stories beyond the plan's live-story allowance are offline until you upgrade or take another story offline.
  • The map or scroll-video shows nothing inside an iframe. Give the iframe real height (90vh or more): scroll-driven widgets scroll inside their frame. The map also needs the page to reach public tile servers.

Frequently asked questions

Is the MCP server free?

Yes. It works on every plan, including Free, and never spends credits. It's the same widget library you can customise by hand on the widgets pages — just reachable from your coding agent.

Do I need an API key?

No. Your client opens a browser sign-in with your normal Scrollytelling account (email or Google), you approve the connection, and the client keeps its own tokens. A personal API key is only for scripts or clients that don't support OAuth.

Which clients work?

Claude Code, Cursor, VS Code (Copilot agent mode), Claude's custom connectors, and any client that speaks MCP over Streamable HTTP with OAuth 2.1. The setup block above covers each one.

Does it use AI or credits?

No. It's a component library: the server searches the catalogue and renders a finished widget with the content your agent passes in. Your agent is the only AI in the loop, and it runs on your side.

Can it create or edit a story?

No — it's read-only. It can list your stories and hand back embed codes for the published ones; creating and editing happens in the editor.

Can I use the HTML outside Scrollytelling?

Yes. The rendered widget is a complete, self-contained HTML document with no runtime dependency on us (the map loads its tiles from public servers). Save it, host it, embed it — anywhere.

Is the output responsive and accessible?

Yes. Every widget is the same one published stories ship: responsive layouts, real DOM text, lazy-loaded media, keyboard controls where there are controls, and reduced-motion support.

How do I use it in React, Vue or Svelte?

Treat the HTML as a static asset: render an iframe with srcdoc (ask for format "iframe"), or write the file to your public folder and point an iframe at it. Don't inject it with innerHTML — inline scripts won't run that way.

How do I disconnect an agent?

Settings → Integrations → Connected agents → Disconnect. The agent gets a 401 until you approve it again. Removing the server from the client also stops it using the connection.

Where do I try the widgets without an agent?

On the widgets pages: search, open any widget, drop in your own text and images, and copy the embed code — no account needed.

What are the limits?

120 calls a minute per connection, 24 items per list widget (40 pins on a map, 50 chart points), images under 1.5 MB as data: URIs, and a 4 MB request. Enough for any page; ask us if you need more.

Prefer to see the widgets first?

Search, open and customise every widget in the browser — your own text and images, no account, no AI.