Summary
Storyblok headless CMS through the Management API: find and read stories and folders with their full block content and version history, create, update, publish and unpublish stories, read component schemas, manage asset metadata, datasource entries, workflow stages and releases, in the EU, US, Canada, Australia or China region.
Guided setup
Connect Storyblok to Cursor in 2 minutes
Start a free trial on AnythingMCP Cloud, connect Storyblok in the guided setup, then add your MCP URL to Cursor. No code and no server to run.
No credit card · 7-day trial · Self-host alternative available
Try asking
Example prompts for Storyblok
Click any prompt to copy it. Paste into Claude, ChatGPT, Cursor, Gemini, Copilot or OpenClaw to run it against this connector.
Claude is AI and can make mistakes. Please double-check responses.
💡 No install? Use cloud.anythingmcp.com directly. Sign in, click Connectors → Storyblok, paste your credentials, mint an MCP API key and you're done. No Docker, no
git clone, no local server.
Storyblok + Cursor
Storyblok headless CMS through the Management API: find and read stories and folders with their full block content and version history, create, update, publish and unpublish stories, read component schemas, manage asset metadata, datasource entries, workflow stages and releases, in the EU, US, Canada, Australia or China region.
Prerequisites
See the full setup instructions baked into the connector (visible in the in-app store when you select the connector). The required environment variables for this connector are:
STORYBLOK_PERSONAL_ACCESS_TOKEN, STORYBLOK_SPACE_ID, STORYBLOK_API_HOST
Step 1 — Get credentials
Setting up takes about 3 minutes. You need a Storyblok space, its numeric id and the region it was created in.
- In Storyblok open My account > Account settings > Personal access tokens, generate a token and paste it into
STORYBLOK_PERSONAL_ACCESS_TOKEN. Storyblok takes it as is in theAuthorizationheader, without a Bearer prefix. The token acts with your own rights in every space you can open, so a user with a restricted role gives a narrower token. STORYBLOK_SPACE_ID: the numeric id in Settings > Space, also in the app URL after#/me/spaces/, for example288868932106293.STORYBLOK_API_HOST: the Management API host of the region where the space was created:mapi.storyblok.com(EU),api-us.storyblok.com(US),api-ca.storyblok.com(Canada),api-ap.storyblok.com(Australia) orapp.storyblokchina.cn(China). Only the host, withouthttps://.- Install the connector and run
storyblok_get_space: it shows name, plan, languages and story count of the space and confirms all three values.
Drafts included: the Management API reads drafts as well as published content, so no Content Delivery API token is needed.
What it reads:
- Stories and folders with
storyblok_list_stories, without their content: filter by folder (starts_with),by_slugs,search,text_search, tags,filter_queryon content fields, published state, workflow stage, release or trash. - One story with its full block tree (
storyblok_get_story): each block withcomponentand_uid, plus translations, tags, workflow stage and release info.storyblok_list_story_versionsshows its history with event, author and time. - The block schemas with
storyblok_list_componentsandstoryblok_get_component: every field with type, required flag, options and allowed blocks, and the component folders. - Asset metadata: filename URL, title, alt text, copyright, focus point, folder, tags, size and private flag; asset folders and internal tags.
- Datasources and their entries (the key in
name, the value invalue, optionally per dimension such as a language). - Workflows per content type, their stages and a story's stage history; releases with their schedule and state.
What it writes:
storyblok_create_storycreates a story or a folder, saved as a draft unlesspublishis true. The content root needscomponentset to a content type block; nested blocks sit in arrays and need a_uid. The AI learns the schema first withstoryblok_list_components.storyblok_update_storyreplaces the content as a whole: the AI reads the story withstoryblok_get_story, changes it and sends back the full block tree.publishtrue also publishes.storyblok_publish_storyandstoryblok_unpublish_story, optionally for some languages only. Storyblok runs them as GET requests, but they change the live site, so they count as writes.storyblok_update_assetchanges alt text, title, copyright, source, folder, tags and the private or locked flag; the file itself stays the same.storyblok_create_datasource_entryandstoryblok_update_datasource_entrymaintain key-value lists.storyblok_change_workflow_stagemoves a story to another stage, assigns users or roles and notifies them with a comment.storyblok_create_releaseandstoryblok_update_release;do_release: truepublishes every story change in the release at once. A story change goes into a release withrelease_idon create or update.
Switched off at install: storyblok_delete_story (a folder goes with all its stories, and they leave the delivery API at once) and storyblok_delete_asset (stories that still point to its URL show a broken file). They cannot be undone through this connector, so a workspace admin turns them on when the team needs them.
Data formats: ids are numbers, uuid fields are UUIDs. full_slug is the path of a story; published and unpublished_changes tell its state. The asset filename is its public URL. Times are ISO 8601 UTC; release_at takes YYYY-MM-DD HH:mm.
Paging: stories, versions, assets, datasources and datasource entries take page (from 1) and per_page (25 by default, at most 100, or 1,000 for datasource entries). The total arrives in the total header, shown as _headers.total. A page past the end returns an empty list.
Limits: 3 requests per second on the Starter plan, 6 on higher plans; 429 means slow down.
Common errors: 401 means a wrong token, or a region host that does not match the space. 404 means a wrong space id or an unknown item. 422 means an invalid story, and the message names the field.
The connector does not upload files, does not use the Content Delivery API and does not change component schemas.
Step 2 — Install the adapter
curl -fsSL https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/main/docker-compose.quickstart.yml -o docker-compose.yml
printf 'JWT_SECRET=%s\nENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env
docker compose up -d
Step 3 — Add the connector in Cursor
Your server URL: in AnythingMCP, open MCP Servers → the server this connector is on, and copy its URL (
https://cloud.anythingmcp.com/mcp/…). Use it wherever this guide showsYOUR_SERVER_ID.
Cursor reads MCP servers from ~/.cursor/mcp.json. Add this entry:
{
"mcpServers": {
"anythingmcp": {
"url": "https://cloud.anythingmcp.com/mcp/YOUR_SERVER_ID",
"headers": { "X-API-Key": "YOUR_MCP_API_KEY" }
}
}
}
- Create an MCP API key in AnythingMCP under MCP Servers → your server → API keys, and paste it in place of
YOUR_MCP_API_KEY. - Save the file and restart Cursor.
- Open Cursor → Settings → MCP and check that
anythingmcpis listed and connected. - Start chatting: the agent can now call the
Storybloktools.
Available tools
| Tool | What it does |
|---|---|
storyblok_get_space | The connected space: name, id, plan, default domain, languages, the release and workflow features in use and the story count |
storyblok_list_stories | List stories (content entries and folders) of the space without their content: id, uuid, name, slug, full_slug, content_type, published… |
storyblok_get_story | One story with its full content (the block tree under content, each block with component and _uid), slug, published state, translations… |
storyblok_list_story_versions | Version history of a story, newest first: version id, event (published, saved, ...), author and time, and whether the version is a draft |
storyblok_create_story | Create a story or a folder |
storyblok_update_story | Update a story |
storyblok_publish_story | Publish a story so the Content Delivery API serves the current version |
storyblok_unpublish_story | Unpublish a story: it disappears from the published content until it is published again |
storyblok_delete_story | Delete a story, or a folder with its stories, by id |
storyblok_list_components | The block schemas (components) of the space: name, display_name, is_root (content type) or nestable, the schema with every field and its… |
storyblok_get_component | One block schema by id with all fields (type, required, options, allowed blocks), preview field and folder |
storyblok_list_component_folders | Component folders (groups) with id, uuid, name and parent folder, used by in_group |
storyblok_list_assets | List assets (images, videos, files) with id, filename (the URL), title, alt, copyright, focus, folder, tags, size and private flag |
storyblok_get_asset | One asset's metadata by id: filename URL, title, alt, copyright, source, focus point, folder, internal tags and size |
storyblok_update_asset | Update an asset's metadata: alt text, title, copyright and source (meta_data), folder, internal tags, private or locked flag |
storyblok_delete_asset | Delete an asset by id |
storyblok_list_asset_folders | Asset folders with id, uuid, name and parent_id, for in_folder and asset_folder_id |
storyblok_list_internal_tags | Internal tags used to organise assets and components, with id, name and object type |
storyblok_list_datasources | Datasources (key-value lists used for options and translations) with id, name, slug and dimensions |
storyblok_list_datasource_entries | Entries of a datasource (name is the key, value the value), optionally with the dimension_value of one dimension (e.g. a language) |
storyblok_create_datasource_entry | Add a key-value entry (name is the key, value the value) to a datasource |
storyblok_update_datasource_entry | Change a datasource entry's key or value, or its value for one dimension (dimension_id and dimension_value) |
storyblok_list_workflows | Workflows that apply to a content type, with their stages |
storyblok_list_workflow_stages | Workflow stages with id, name, color, the next allowed stages, who may publish and the workflow they belong to |
storyblok_list_workflow_stage_changes | History of workflow stage changes of one story: stage, user and time |
storyblok_change_workflow_stage | Move a story to another workflow stage, optionally assigning users or roles and notifying them with a comment |
storyblok_list_releases | Releases (bundles of story changes published together): id, name, scheduled release_at, released flag and branches to deploy |
storyblok_get_release | One release by id: name, release_at, released state, owner and branches to deploy |
storyblok_create_release | Create a release to collect story changes, optionally scheduled for a time |
storyblok_update_release | Rename or reschedule a release, or deploy it now with do_release true, which publishes every story change it holds |
Example prompts
- "List the stories under blog/ that have unpublished changes."
- "Show me the content of the home story and which blocks it uses."
- "Fix the typo "recieve" in the FAQ story and publish it."
- "Which images in the asset library have no alt text? Suggest alt text for the first ten."
- "Move the pricing page story to the Review stage and notify the marketing role with a comment."
FAQ
Does Cursor support custom MCP servers on the free tier? Yes, MCP is available on Hobby, Pro and Business plans.
Next steps
- Connector landing page
- Connect to Claude
- Connect to ChatGPT
- Connect to Gemini
- Connect to Meta Muse
- Connect to Microsoft Copilot
Was this guide helpful?