Skip to main content
Glama

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)

  1. Clone the repo:

    git clone https://github.com/ArjunCodess/storyblok-mcp.git
    cd storyblok-mcp
  2. Install dependencies:

    pnpm install
  3. Run the server:

    pnpm start

How to Use (For Users)

Clone the repo:

git clone https://github.com/ArjunCodess/storyblok-mcp.git
cd storyblok-mcp

Connect with Cursor

https://github.com/user-attachments/assets/98b77544-81c4-49b3-8dc2-14849e6ba7e5

  • Open Cursor in the same directory.

  • Right click on build/index.js file and click Copy Path.

  • Now, go to Settings → MCP Tools.

  • Click on New MCP Server

  • Inside the opened mcp.json file. 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.



Thanks

Made with ❤️ for the DEV.to Storyblok Challenge.


License

MIT

Available Tools

115 tools
add_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

    C2/5.0

    Scored across 115 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    Appeared in Searches