Storyblok MCP Server
The Storyblok MCP Server enables users to manage Storyblok CMS content seamlessly using natural language interactions with AI tools. Capabilities include:
Content Management: Create, read, update, and delete stories; manage publish status; access and restore versions; search with advanced filters
Tag Management: Create, list, delete tags and assign them to stories
Release Management: Create, publish, add stories to, and delete releases
Asset Handling: Upload, fetch, and delete assets; manage asset folders
Component Management: Create, update, and delete components (content types)
Data & Configuration: Manage folders, datasources, and datasource entries; access space information
AI-Powered Features: Generate alt text and meta tags; auto-tag stories; translate content
Workflow Management: Handle workflows, stages, and stage changes
Development Flow: Control pipeline branches and deployments
System Utility: Check connectivity between server and Storyblok API
Provides comprehensive tools for managing Storyblok CMS content through natural language, including story management (create, update, delete, publish), tag management, release management, asset handling, component management, and AI-powered content features like generating alt text, translations, meta tags, and content summaries.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Storyblok MCP Server fetch my recent blog posts from the last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Storyblok MCP Server
Connect AI tools to Storyblok instantly - use natural language to manage your CMS like magic.
Demo
Related MCP server: Storyblok MCP Server
Table of Contents
Why This Project?
Built for the Storyblok Headless CMS Challenge on DEV.to.
The goal: push AI and Storyblok's power together, make something fresh and useful.
What is Storyblok?
Storyblok is a powerful headless CMS. API-first. Easy for devs and content creators to work together.
It's modular, super flexible, and fits with any frontend or workflow you want.
What's an MCP Server?
MCP = a protocol that connects AI, tools, and data.
The MCP server acts as a middleman, showing AI what it can do and what data it has.
This enables AI clients, such as Cursor or Claude Desktop, to interact with Storyblok through natural language and manage content smoothly.
Challenges I Faced
Built for myself (lol): Never made or installed an MCP before. Took way longer than I thought.
API stress: Kept checking Storyblok's API docs again and again. Scared I'd miss something.
AI stuff pressure: Trying to get AI features right without breaking things was a headache.
Security: Had to make sure no sensitive info leaks while exposing Storyblok management.
Developer experience: Made the server easy to run, extend, and plug into AI tools. No shortcuts.
How to Set Up (For Contributors)
Clone the repo:
git clone https://github.com/ArjunCodess/storyblok-mcp.git cd storyblok-mcpInstall dependencies:
pnpm installRun the server:
pnpm start
How to Use (For Users)
Clone the repo:
git clone https://github.com/ArjunCodess/storyblok-mcp.git
cd storyblok-mcpConnect with Cursor
https://github.com/user-attachments/assets/98b77544-81c4-49b3-8dc2-14849e6ba7e5
Open Cursor in the same directory.
Right click on
build/index.jsfile and click Copy Path.Now, go to Settings → MCP Tools.
Click on New MCP Server
Inside the opened
mcp.jsonfile. Paste this and replace PATH_YOU_COPIED with the path copied in the second step:{ "mcpServers": { "storyblok": { "command": "node PATH_YOU_COPIED", "env": { "STORYBLOK_SPACE_ID": "your_space_id", "STORYBLOK_MANAGEMENT_TOKEN": "your_management_token", "STORYBLOK_DEFAULT_PUBLIC_TOKEN": "your_public_token", "GOOGLE_GENERATIVE_AI_API_KEY": "your_gemini_ai_api_key" } } } }
Tools
fetch_stories
Retrieve a list of stories (pages, folders, or content entries) from Storyblok. Supports filtering, pagination, and search.get_story
Fetch a single story by its ID.create_story
Create a new story (page, folder, or content entry) in Storyblok.update_story
Update an existing story's content, name, slug, or tags.delete_story
Delete a story by its ID.publish_story
Publish a story, making it live.unpublish_story
Unpublish a story, removing it from the live site.get_story_versions
Retrieve all previous versions of a story for version history and rollback.restore_story
Restore a story to a previous version.import_story
Import a story, optionally specifying language code and whether to import language settings.
fetch_tags
List all tags used in the space.create_tag
Create a new tag.create_tag_and_add_to_story
Create a tag and immediately assign it to a story.delete_tag
Delete a tag by its ID.
fetch_webhooks
List all webhooks registered in the space.get_webhook
Fetch a single webhook by its ID.create_webhook
Create a new webhook that will trigger on specified Storyblok events.update_webhook
Update an existing webhook's endpoint, events, or other properties.delete_webhook
Delete a webhook by its ID.
fetch_releases
List all releases (content batches for scheduled publishing).create_release
Create a new release.update_release
Update an existing release's properties including name, release time and notification settings.add_story_to_release
Add a story to a release.publish_release
Publish all stories in a release.delete_release
Delete a release.
fetch_presets
List all component presets in the space. Supports pagination.get_preset
Fetch a single preset by its ID.create_preset
Create a new preset with default values for a component.update_preset
Update an existing preset's content, name, or appearance settings.delete_preset
Delete a preset by its ID.
fetch_story_schedulings
Retrieve a list of story scheduling objects (scheduled publishings) for stories. Supports filtering, pagination, and search.get_story_scheduling
Fetch a single story scheduling object by its ID.create_story_scheduling
Schedule a story to be published at a specific date and time.update_story_scheduling
Update an existing story scheduling (e.g., change publish time or language).delete_story_scheduling
Delete a story scheduling by its ID.
fetch_access_tokens
Retrieve all access tokens (API keys) for the current space.get_access_token
Fetch a single access token by its ID.create_access_token
Create a new access token (API key) for the space. Supports public/private, name, min_cache, story_ids, and branch_id.update_access_token
Update an existing access token's properties (type, name, min_cache, story_ids, branch_id).delete_access_token
Delete an access token by its ID.
fetch_assets
List all assets (images, files, etc.) in the space.get_asset
Fetch a single asset by its ID.delete_asset
Delete an asset.init_asset_upload
Start uploading a new asset.complete_asset_upload
Complete the asset upload process.
fetch_asset_folders
List all asset folders.create_asset_folder
Create a new asset folder.update_asset_folder
Rename an asset folder.delete_asset_folder
Delete an asset folder.
fetch_components
List all components (content types) in the space.get_component
Fetch a single component by its ID.create_component
Create a new component.update_component
Update a component's schema or settings.delete_component
Delete a component.
search_stories
Search for stories using advanced filters (by slug, tag, etc.).get_story_by_slug
Fetch a story by its slug.
fetch_folders
List all story folders.
fetch_datasources
List all datasources (for dynamic select fields, etc.).get_datasource
Get a single datasource by its ID.create_datasource
Create a new datasource with optional dimensions.update_datasource
Update an existing datasource (name, slug, dimensions).delete_datasource
Delete a datasource by its ID.
fetch_datasource_entries
List all entries (key-value pairs) for a datasource.get_datasource_entry
Fetch a single datasource entry.create_datasource_entry
Create a new entry in a datasource with optional dimension values.update_datasource_entry
Update an existing datasource entry.delete_datasource_entry
Delete a datasource entry by its ID.
ping
Check if the server and Storyblok API are reachable.
fetch_component_folders
List all component folders in the space.get_component_folder
Fetch a single component folder by its ID.create_component_folder
Create a new component folder with optional parent ID.update_component_folder
Update an existing component folder's name or parent ID.delete_component_folder
Delete a component folder by its ID.
fetch_space_roles
List all space roles in your Storyblok space.get_space_role
Fetch a single space role by its ID.create_space_role
Create a new space role with custom permissions settings.update_space_role
Update an existing space role's permissions and settings.delete_space_role
Delete a space role by its ID.
fetch_spaces
List all spaces accessible to your account. Supports pagination.get_space
Get information about the current Storyblok space.create_space
Create a new space with optional configuration for billing, environments, and custom options.update_space
Update an existing space's settings including name, domain, hooks, and configuration options.delete_space
Delete a space by its ID.duplicate_space
Create a copy of an existing space with options to duplicate content and components.backup_space
Trigger a backup for a space.
generate_alt_text
Automatically create alt text for images based on content or context.translate_story
Translate the content of a story into different languages using AI.generate_meta_tags
Generate SEO-friendly meta titles and descriptions for any story.summarize_story
Get a brief AI-generated summary of a story's content.tag_story_with_ai
Auto-generate relevant tags for a story using natural language processing.
fetch_workflows
List all workflows in the space with optional pagination.get_workflow
Fetch a single workflow by its ID.create_workflow
Create a new workflow with name and associated content types.update_workflow
Update an existing workflow's name or content types.duplicate_workflow
Create a duplicate of an existing workflow with a new name and content types.delete_workflow
Delete a workflow by its ID.
fetch_workflow_stages
List all workflow stages defined in the space.get_workflow_stage
Fetch a single workflow stage by its ID.create_workflow_stage
Create a new workflow stage with permissions and settings.update_workflow_stage
Update an existing workflow stage's permissions, name, color, or position.delete_workflow_stage
Delete a workflow stage by its ID.
fetch_workflow_stage_changes
List all workflow stage changes with option to filter by story ID.get_workflow_stage_change
Fetch a single workflow stage change by its ID.create_workflow_stage_change
Create a new workflow stage change by assigning a story to a specific workflow stage.
fetch_branches
List all pipeline branches in the space. Supports pagination.get_branch
Fetch a single branch by its ID.create_branch
Create a new branch with options for name, source branch, URL, and position.update_branch
Update an existing branch's properties like name, source, URL, or position.delete_branch
Delete a branch by its ID.deploy_branch
Manually trigger a deployment of a branch.get_branch_stories
List all stories within a specific branch. Supports filtering and pagination.compare_branches
Compare content between two branches to see differences.copy_stories_between_branches
Copy stories from one branch to another.
fetch_branch_deployments
List all branch deployments in the space. Supports pagination.create_branch_deployment
Create a new branch deployment with required branch ID and optional release UUIDs. Requires the Pipelines application to be installed.get_branch_deployment
Fetch a single branch deployment by its ID.
How to Contribute
Fork, make changes, open PRs. Found bugs or want features? Open an issue.
Useful Links
Thanks
Made with ❤️ for the DEV.to Storyblok Challenge.
License
MIT
Available Tools
115 toolsadd_story_to_releaseD
Inputs: release_id (required), story_id (required).
auto_tag_storyD
Inputs: story_id (required).
backup_spaceD
Inputs: space_id (required).
compare_branchesD
Inputs: source_id (required), target_id (required), page, per_page.
complete_asset_uploadD
Inputs: asset_id (required).
copy_stories_between_branchesD
Inputs: source_branch_id (required), target_branch_id (required), story_ids (required).
create_access_tokenD
Inputs: access (required), name, min_cache, story_ids, +1 more.
create_asset_folderD
Inputs: name (required), parent_id.
create_branchD
Inputs: name (required), source_id, url, position.
create_branch_deploymentD
Inputs: branch_id (required), release_uuids.
create_componentD
Inputs: name (required), schema (required), display_name, is_root, +1 more.
create_component_folderD
Inputs: name (required), parent_id.
create_datasourceD
Inputs: name (required), slug (required), dimensions_attributes.
create_datasource_entryD
Inputs: datasource_id (required), name (required), value (required), dimension_values.
create_presetD
Inputs: name (required), preset (required), component_id (required), image, +3 more.
create_releaseD
Inputs: name (required), publish_at, branches_to_deploy, timezone, +1 more.
create_spaceD
Inputs: name (required), domain, owner_id, story_published_hook, +3 more.
create_space_roleD
Inputs: role (required), subtitle, permissions, field_permissions, +7 more.
create_storyD
Inputs: name (required), slug (required), content (required), parent_id, +18 more.
create_story_schedulingD
Inputs: story_id (required), publish_at (required), language.
create_tagD
Inputs: name (required).
create_tag_and_add_to_storyD
Inputs: name (required), story_id (required).
create_webhookD
Inputs: name (required), endpoint (required), actions (required), secret, +1 more.
create_workflowD
Inputs: name (required), content_types (required).
create_workflow_stageD
Inputs: name (required), color, position, is_default, +11 more.
create_workflow_stage_changeD
Inputs: workflow_stage_id (required), story_id (required).
delete_access_tokenD
Inputs: id (required).
delete_assetD
Inputs: id (required).
delete_asset_folderD
Inputs: id (required).
delete_branchD
Inputs: id (required).
delete_componentD
Inputs: id (required).
delete_component_folderD
Inputs: id (required).
delete_datasourceD
Inputs: id (required).
delete_datasource_entryD
Inputs: entry_id (required).
delete_presetD
Inputs: id (required).
delete_releaseD
Inputs: release_id (required).
delete_spaceD
Inputs: space_id (required).
delete_space_roleD
Inputs: id (required).
delete_storyD
Inputs: id (required).
delete_story_schedulingD
Inputs: id (required).
delete_tagD
Inputs: id (required).
delete_webhookD
Inputs: id (required).
delete_workflowD
Inputs: id (required).
delete_workflow_stageD
Inputs: id (required).
deploy_branchD
Inputs: id (required).
duplicate_spaceD
Inputs: space_id (required), name (required), duplicate_content, create_components.
duplicate_workflowD
Inputs: id (required), name (required), content_types (required).
fetch_access_tokensD
Inputs: no named parameters.
fetch_asset_foldersD
Inputs: no named parameters.
fetch_assetsD
Inputs: page, per_page, search, folder_id.
fetch_branch_deploymentsD
Inputs: page, per_page.
fetch_branchesD
Inputs: page, per_page.
fetch_component_foldersD
Inputs: no named parameters.
fetch_componentsD
Inputs: component_summary, include_schema_details, filter_by_name.
fetch_datasource_entriesD
Inputs: datasource_id (required), page, per_page.
fetch_datasourcesD
Inputs: page, per_page.
fetch_foldersD
Inputs: no named parameters.
fetch_presetsD
Inputs: page, per_page.
fetch_releasesD
Inputs: page, per_page.
fetch_space_rolesD
Inputs: no named parameters.
fetch_spacesD
Inputs: page, per_page.
fetch_storiesD
Inputs: page, per_page, starts_with, by_slugs, +3 more.
fetch_story_schedulingsD
Inputs: page, per_page, story_id, language, +1 more.
fetch_tagsD
Inputs: no named parameters.
fetch_webhooksD
Inputs: no named parameters.
fetch_workflowsD
Inputs: page, per_page.
fetch_workflow_stage_changesD
Inputs: with_story.
fetch_workflow_stagesD
Inputs: no named parameters.
generate_altD
Inputs: asset_id (required).
generate_metaD
Inputs: story_id (required).
get_access_tokenD
Inputs: id (required).
get_assetD
Inputs: id (required).
get_branchD
Inputs: id (required).
get_branch_deploymentD
Inputs: id (required).
get_branch_storiesD
Inputs: id (required), page, per_page, sort_by.
get_componentD
Inputs: id (required).
get_component_folderD
Inputs: id (required).
get_datasourceD
Inputs: id (required).
get_datasource_entryD
Inputs: entry_id (required).
get_presetD
Inputs: id (required).
get_spaceD
Inputs: no named parameters.
get_space_roleD
Inputs: id (required).
get_storyD
Inputs: id (required).
get_story_by_slugD
Inputs: slug (required).
get_story_schedulingD
Inputs: id (required).
get_story_versionsD
Inputs: id (required).
get_webhookD
Inputs: id (required).
get_workflowD
Inputs: id (required).
get_workflow_stageD
Inputs: id (required).
get_workflow_stage_changeD
Inputs: id (required).
import_storyD
Inputs: id (required), story (required), lang_code, import_lang.
init_asset_uploadD
Inputs: filename (required), size (required), content_type (required).
pingD
Inputs: no named parameters.
publish_releaseD
Inputs: release_id (required).
publish_storyD
Inputs: id (required).
restore_storyD
Inputs: id (required), version_id (required).
search_storiesD
Inputs: starts_with, by_uuids, by_slugs, excluding_slugs, +6 more.
translate_storyD
Inputs: story_id (required), lang (required).
unpublish_storyD
Inputs: id (required).
update_access_tokenD
Inputs: id (required), access, name, min_cache, +2 more.
update_asset_folderD
Inputs: id (required), name (required).
update_branchD
Inputs: id (required), name, source_id, url, +1 more.
update_componentD
Inputs: id (required), name, display_name, schema, +2 more.
update_component_folderD
Inputs: id (required), name (required), parent_id.
update_datasourceD
Inputs: id (required), name, slug, dimensions_attributes.
update_datasource_entryD
Inputs: entry_id (required), name, value, dimension_value, +1 more.
update_presetD
Inputs: id (required), name, preset, component_id, +4 more.
update_releaseD
Inputs: release_id (required), name, release_at, branches_to_deploy, +3 more.
update_spaceD
Inputs: space_id (required), name, domain, uniq_domain, +12 more.
update_space_roleD
Inputs: id (required), role, subtitle, permissions, +8 more.
update_storyD
Inputs: id (required), name, slug, content, +19 more.
update_story_schedulingD
Inputs: id (required), publish_at, language.
update_webhookD
Inputs: id (required), name, endpoint, actions, +2 more.
update_workflowD
Inputs: id (required), name, content_types.
update_workflow_stageD
Inputs: id (required), name, color, position, +12 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 115 tools
Every tool has a clearly distinct purpose based on its name, with no ambiguity. The tools follow a consistent pattern of resource-action pairs (e.g., create_story, fetch_stories, update_story, delete_story), making it easy to distinguish between them. Even without descriptions, the naming convention ensures each tool targets a specific operation on a specific resource.
The tool names follow a highly consistent verb_noun pattern throughout, using snake_case uniformly. Verbs like create, fetch, get, update, delete are applied predictably across resources (e.g., story, asset, component), with minor variations like 'add_story_to_release' or 'copy_stories_between_branches' still fitting the pattern. There are no deviations in naming style or convention.
With 115 tools, the count is excessive for typical MCP server purposes, making it overwhelming and difficult to manage. While the server covers a broad domain (Storyblok CMS operations), such a large number suggests poor scoping or fragmentation, as many tools could potentially be consolidated or omitted without losing functionality. This heavy toolset will likely confuse agents and increase complexity.
The tool set provides complete CRUD/lifecycle coverage for the Storyblok domain, including resources like stories, assets, components, datasources, spaces, and workflows. It supports creation, fetching, updating, and deletion for most entities, along with advanced operations like publishing, branching, and scheduling. No obvious gaps are present, ensuring agents can handle comprehensive workflows without dead ends.
Maintenance
Related MCP Connectors
Sync Lightroom, Figma, Dropbox & Canva assets to WordPress and Shopify via natural language.
Sync Lightroom, Figma, Dropbox & Canva assets to WordPress and Shopify via natural language.
Connect AI to store orders, products and inventory with scoped access and human approvals.
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive server enabling natural language interaction with Storyblok CMS for managing stories, assets, components, releases, and other content through a modular architecture.2 npm1ISC
- AlicenseCqualityDmaintenanceThe Storyblok MCP server enables your AI assistants to directly access and manage your Storyblok spaces, stories, components, assets, workflows, and more.41PythonMIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables comprehensive management of Storyblok CMS through natural language interactions. Supports story creation and publishing, asset management, component schema updates, release workflows, and content discovery across all major Storyblok APIs.2 npm-
- FlicenseCqualityNot gradedmaintenanceAn MCP server that enables AI assistants like Cursor and Claude to interact with the Storyblok Management API. It allows users to manage stories, tags, components, assets, and workflows through natural language commands.7433 npm-