{"id":38191,"date":"2025-08-20T07:00:00","date_gmt":"2025-08-20T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=38191"},"modified":"2026-03-07T13:06:54","modified_gmt":"2026-03-07T21:06:54","slug":"media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf","title":{"rendered":"Developer Media Workflow Automation in MediaFlows With Cloudinary&#8217;s MCP Server and Windsurf"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Modern visual media pipelines are a mess of glue code: upload webhooks, moderation, resizing, metadata updates, AI captioning, notifications\u2026 and a pile of one-off scripts to hold it all together. <strong>Cloudinary MediaFlows<\/strong> bundles everything together with a visual, production-ready workflow engine. Pair that with the <strong>MediaFlows MCP server<\/strong> and you can <em>generate and iterate<\/em> on flows straight from your editor (Windsurf\/Cursor) using natural-language prompts, then refine them in the UI with full logs and guardrails.<\/p>\n<p>In this tutorial, we\u2019ll build a demo that will automate an end-to-end image workflow to:<\/p>\n<ul>\n<li>\n<p>Trigger on <strong>upload<\/strong> to a specific folder.<\/p>\n<\/li>\n<li>\n<p><strong>Analyze<\/strong> dimensions (flag low-res).<\/p>\n<\/li>\n<li>\n<p><strong>Transform<\/strong> to a 960px web-ready variant.<\/p>\n<\/li>\n<li>\n<p>Use an <strong>LLM<\/strong> to generate alt text.<\/p>\n<\/li>\n<li>\n<p><strong>Write metadata<\/strong> (<code>description<\/code>).<\/p>\n<\/li>\n<li>\n<p><strong>Move<\/strong> the original to an approved folder.<\/p>\n<\/li>\n<li>\n<p><strong>Notify<\/strong> a human via email.<\/p>\n<\/li>\n<li>\n<p><strong>Log<\/strong> everything for observability.<\/p>\n<\/li>\n<\/ul>\n<p>You\u2019ll scaffold the flow from your editor via the MCP server (fast path), then enable and test it in the MediaFlows UI.<\/p>\n<h2>Who\u2019s This For?<\/h2>\n<ul>\n<li>\n<p>Devs who want a reproducible visual media pipeline with minimal glue code.<\/p>\n<\/li>\n<li>\n<p>Teams exploring AI-assisted workflows (alt text, captions, summarization).<\/p>\n<\/li>\n<li>\n<p>Anyone who prefers building from their editor but deploying with UI controls and logs.<\/p>\n<\/li>\n<\/ul>\n<h2>What You\u2019ll Need<\/h2>\n<ul>\n<li>\n<p>A Cloudinary account with <strong>MediaFlows<\/strong> enabled (pick a target product environment).<\/p>\n<\/li>\n<li>\n<p><strong>Cloud name, API key, API secret<\/strong> for that environment.<\/p>\n<\/li>\n<li>\n<p><strong>Windsurf<\/strong> (or Cursor) with MCP support.<\/p>\n<\/li>\n<li>\n<p>Two folders in your Cloudinary environment: <code>incoming\/<\/code> and <code>products\/approved\/<\/code>.<\/p>\n<\/li>\n<li>\n<p>(Optional) A structured metadata text field named <code>description<\/code> for alt text.<\/p>\n<\/li>\n<\/ul>\n<h2>Important Ground Rules (MCP Specifics)<\/h2>\n<ul>\n<li>\n<p><strong>PowerFlows only<\/strong> (EasyFlows aren\u2019t supported by the MCP tools).<\/p>\n<\/li>\n<li>\n<p>New flows are created <strong>inactive<\/strong>, so you must enable them in the UI.<\/p>\n<\/li>\n<li>\n<p>MCP <strong>doesn\u2019t modify<\/strong> existing automations. Create a new one when you need changes.<\/p>\n<\/li>\n<li>\n<p>Prompts can be <strong>nondeterministic<\/strong>. Clear, explicit steps produce better results.<\/p>\n<\/li>\n<li>\n<p>Use the <strong>most advanced LLM model<\/strong> in your editor for best outcomes.<\/p>\n<\/li>\n<\/ul>\n<p>By the end, you\u2019ll have a working, demo-ready flow you can trigger by uploading an image, plus a clear pattern for adding analysis, AI, and downstream actions.<\/p>\n<h2>Configure Windsurf and Verify MCP Connection<\/h2>\n<p>First, we\u2019ll need Windsurf talking to the MediaFlows MCP server so we can create flows directly from the editor.<\/p>\n<h3>Step 1: Add the MediaFlows MCP server to Windsurf<\/h3>\n<p>Open your MCP configuration in Windsurf and add one of the following:<\/p>\n<p><strong>Option A: URL and headers<\/strong><\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">\"mediaflows\"<\/span>: {\n  <span class=\"hljs-string\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/mediaflows.mcp.cloudinary.com\/v2\/mcp\"<\/span>,\n  <span class=\"hljs-string\">\"headers\"<\/span>: {\n    <span class=\"hljs-string\">\"cld-cloud-name\"<\/span>: <span class=\"hljs-string\">\"YOUR_CLOUD_NAME\"<\/span>,\n    <span class=\"hljs-string\">\"cld-api-key\"<\/span>: <span class=\"hljs-string\">\"YOUR_API_KEY\"<\/span>,\n    <span class=\"hljs-string\">\"cld-secret\"<\/span>: <span class=\"hljs-string\">\"YOUR_API_SECRET\"<\/span>\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><strong>Option B: Command style<\/strong><\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">\"mediaflows\"<\/span>: {\n  <span class=\"hljs-string\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n  <span class=\"hljs-string\">\"args\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"-y\"<\/span>,\n    <span class=\"hljs-string\">\"mcp-remote\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/mediaflows.mcp.cloudinary.com\/v2\/mcp\"<\/span>,\n    <span class=\"hljs-string\">\"--header\"<\/span>, <span class=\"hljs-string\">\"cld-cloud-name: ${CLD_CLOUD_NAME}\"<\/span>,\n    <span class=\"hljs-string\">\"--header\"<\/span>, <span class=\"hljs-string\">\"cld-api-key: ${CLD_API_KEY}\"<\/span>,\n    <span class=\"hljs-string\">\"--header\"<\/span>, <span class=\"hljs-string\">\"cld-secret: ${CLD_SECRET}\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"env\"<\/span>: {\n    <span class=\"hljs-string\">\"CLD_CLOUD_NAME\"<\/span>: <span class=\"hljs-string\">\"YOUR_CLOUD_NAME\"<\/span>,\n    <span class=\"hljs-string\">\"CLD_API_KEY\"<\/span>: <span class=\"hljs-string\">\"YOUR_API_KEY\"<\/span>,\n    <span class=\"hljs-string\">\"CLD_SECRET\"<\/span>: <span class=\"hljs-string\">\"YOUR_API_SECRET\"<\/span>\n  }\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Replace the placeholders with your Cloudinary environment details. Save the file and restart Windsurf.<\/p>\n<h3>Step 2: Confirm the Connection<\/h3>\n<p>In Windsurf, go to <strong>Manage MCP servers<\/strong>. You should see <code>mediaflows<\/code> with eight tools available:<\/p>\n<ol>\n<li>\n<p>list-blocks<\/p>\n<\/li>\n<li>\n<p>list-flows<\/p>\n<\/li>\n<li>\n<p>get-flow-definition<\/p>\n<\/li>\n<li>\n<p>create-flow<\/p>\n<\/li>\n<li>\n<p>get-flow-creation-rules<\/p>\n<\/li>\n<li>\n<p>search-environment-folders<\/p>\n<\/li>\n<li>\n<p>get-environment-structured-metadata<\/p>\n<\/li>\n<li>\n<p>get-environment-info<\/p>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764445263\/blog-Developer_Media_Workflow_Automation_in_MediaFlows_With_Cloudinary_s_MCP_Server_and_Windsurf-1.png\" alt=\"successful connection\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1920\" height=\"1074\"\/><\/p>\n<p>Once confirmed, we\u2019re ready to generate the flow.<\/p>\n<h2>Generate the Flow From Windsurf<\/h2>\n<p>With the MediaFlows MCP server connected, we can create our PowerFlow directly from Windsurf using a single detailed prompt.<\/p>\n<h3>Step 1: Open the Chat and Target <code>mediaflows<\/code><\/h3>\n<p>In Windsurf open a chat panel, select the <code>mediaflows<\/code> MCP server, and paste this prompt:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>Create a MediaFlows flow named &quot;Upload_QA_AltText&quot;.\nTrigger: on Cloudinary Upload for images in folder incoming\/.\nSteps:\n1) Get asset info and check if width &lt; 1200px. If true, add tag low_res.\n2) Create a 960px wide JPG variant and return the public URL.\n3) Use LLM to generate alt text and save it to metadata field description.\n4) Move the original asset to folder products\/approved\/.\n5) Send an email to moderation@company.com with the asset URL and generated description.\nReturn the flow external_id.\n<\/code><\/pre>\n<h3>Step 2: Wait for the MCP Response<\/h3>\n<p>The MCP server will return:<\/p>\n<ul>\n<li>\n<p>Confirmation that the flow was created.<\/p>\n<\/li>\n<li>\n<p>The <code>external_id<\/code>.<\/p>\n<\/li>\n<li>\n<p>A description of the flow\u2019s blocks.<\/p>\n<\/li>\n<li>\n<p>A reminder that it\u2019s inactive and must be enabled in MediaFlows.<\/p>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764445266\/blog-Developer_Media_Workflow_Automation_in_MediaFlows_With_Cloudinary_s_MCP_Server_and_Windsurf-2.png\" alt=\"windsurf mcp results\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1910\" height=\"1080\"\/><\/p>\n<h3>Step 3: Verify in MediaFlows<\/h3>\n<p>Open <strong>Cloudinary<\/strong> &gt; <strong>MediaFlows<\/strong>. The new <code>Upload_QA_AltText<\/code> PowerFlow should appear in the list.<\/p>\n<p>Click it to view the generated structure. It will likely include the starting blocks:<\/p>\n<ul>\n<li>\n<p>Cloudinary Upload Trigger<\/p>\n<\/li>\n<li>\n<p>Get Asset Info<\/p>\n<\/li>\n<li>\n<p>Create 960px Variant<\/p>\n<\/li>\n<\/ul>\n<p>We\u2019ll add any missing blocks manually if the MCP did not include them.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764445269\/blog-Developer_Media_Workflow_Automation_in_MediaFlows_With_Cloudinary_s_MCP_Server_and_Windsurf-3.png\" alt=\"mediaflows screenshot\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1915\" height=\"959\"\/><\/p>\n<h2>Enable and Test the Flow<\/h2>\n<p>The flow created by the MCP server is inactive by default. We need to enable it and run a test to make sure everything works.<\/p>\n<h3>Step 1: Enable the Flow<\/h3>\n<ol>\n<li>\n<p>In Cloudinary, open <strong>MediaFlows<\/strong>.<\/p>\n<\/li>\n<li>\n<p>Select the <code>Upload_QA_AltText<\/code> PowerFlow.<\/p>\n<\/li>\n<li>\n<p>Click <strong>Enable Flow<\/strong> at the top right.<\/p>\n<\/li>\n<\/ol>\n<h3>Step 2: Test With a Sample Upload<\/h3>\n<ol>\n<li>\n<p>Upload an image into the <code>incoming\/<\/code> folder in your Cloudinary environment.<\/p>\n<\/li>\n<li>\n<p>Open the <strong>Live Logs<\/strong> panel in MediaFlows.<\/p>\n<\/li>\n<li>\n<p>Confirm the steps run successfully:<\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<p>Upload Trigger<\/p>\n<\/li>\n<li>\n<p>Get Asset Info<\/p>\n<\/li>\n<li>\n<p>Create 960px Variant<\/p>\n<\/li>\n<li>\n<p>(And any extra steps we added manually)<\/p>\n<\/li>\n<\/ul>\n<p>Your final result should look like :<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">{\n  <span class=\"hljs-attr\">\"result\"<\/span>: {\n    <span class=\"hljs-attr\">\"public_id\"<\/span>: <span class=\"hljs-string\">\"blog-Developer_Media_Workflow_Automation_in_MediaFlows_With_Cloudinary_s_MCP_Server_and_Windsurf-4\"<\/span>,\n    <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1764445272\/blog-Developer_Media_Workflow_Automation_in_MediaFlows_With_Cloudinary_s_MCP_Server_and_Windsurf-4.jpg\"<\/span>\n  }\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h3>Step 3: Check the Results<\/h3>\n<ul>\n<li>\n<p>The 960px JPG variant should exist in the Media Library.<\/p>\n<\/li>\n<li>\n<p>If the image is under 1200px wide, it should have the <code>low_res<\/code> tag.<\/p>\n<\/li>\n<li>\n<p>If the LLM and metadata steps were added, <code>description<\/code> should contain generated alt text.<\/p>\n<\/li>\n<li>\n<p>The original should be in <code>products\/approved\/<\/code>.<\/p>\n<\/li>\n<li>\n<p>An email should arrive in the moderation inbox.<\/p>\n<\/li>\n<\/ul>\n<p>Once confirmed, the basic automation is running and we can extend it with additional logic if needed.<\/p>\n<h2>What Else Could Be Added (Optional Ideas)<\/h2>\n<p>By the way, once you have the basic flow working you can extend it in MediaFlows to make it more powerful. Here are a few ideas, plus example MCP prompts you could run in Windsurf to add them as new flows. We will not go step-by-step for these.<\/p>\n<p><strong>Watermark detection and routing<\/strong><\/p>\n<p>Prompt:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>Create a MediaFlows flow named &quot;Upload_Watermark_Check&quot;.\nTrigger: on Cloudinary Upload for images in folder incoming\/.\nSteps:\n1) Detect if the image has a watermark.\n2) If watermarked, add tag needs_review and move to folder products\/review\/.\n3) If clean, move to folder products\/approved\/.\n\n<\/code><\/pre>\n<p><strong><a href=\"https:\/\/cloudinary.com\/guides\/automations\/ai-content-moderation\">AI content moderation<\/a><\/strong><\/p>\n<p>Prompt:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>Create a MediaFlows flow named &quot;Upload_Content_Moderation&quot;.\nTrigger: on Cloudinary Upload for images in folder incoming\/.\nSteps:\n1) Run AI content moderation to detect NSFW content.\n2) If NSFW, tag flagged and move to products\/review\/.\n3) If safe, move to products\/approved\/.\n<\/code><\/pre>\n<p><strong>Multi-size transformations<\/strong><\/p>\n<p>Prompt:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>Create a MediaFlows flow named &quot;Upload_Multi_Size&quot;.\nTrigger: on Cloudinary Upload for images in folder incoming\/.\nSteps:\n1) Create variants at widths 400px, 800px, and 1200px in JPG format.\n2) Store their URLs in metadata fields size_400, size_800, size_1200.\n\n<\/code><\/pre>\n<p><strong>Slack notifications<\/strong><\/p>\n<p>Prompt:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>Create a MediaFlows flow named &quot;Upload_Slack_Notify&quot;.\nTrigger: on Cloudinary Upload for images in folder incoming\/.\nSteps:\n1) Get asset info.\n2) Send a message to a Slack webhook URL with asset name, folder, and public URL.\n<\/code><\/pre>\n<p>You can paste any of these into the Windsurf chat targeted at <code>mediaflows<\/code>, let MCP create the base flow, then enable and tweak in the MediaFlows UI.<\/p>\n<h2>Using the Flow in Real Workflows<\/h2>\n<p>Once the PowerFlow is enabled and tested, it can be used in different ways inside your Cloudinary environment.<\/p>\n<h3>1. Automatic Trigger on Upload<\/h3>\n<p>This is the default we set up. Any time an image is uploaded into the <code>incoming\/<\/code> folder, the flow runs automatically. This is ideal for hands-off processing pipelines where assets are dropped in by apps, uploads widgets, or API calls.<\/p>\n<h3>2. Manual Run via DAM App<\/h3>\n<p>If you want to run the flow on demand:<\/p>\n<ol>\n<li>\n<p>Go to the Cloudinary Media Library.<\/p>\n<\/li>\n<li>\n<p>Right-click an asset.<\/p>\n<\/li>\n<li>\n<p>Choose <strong>Run MediaFlows<\/strong>.<\/p>\n<\/li>\n<li>\n<p>Pick your flow and confirm.<\/p>\n<\/li>\n<\/ol>\n<p>This is useful for moderation or reprocessing a single asset without moving it to the trigger folder.<\/p>\n<h3>3. Integration Into Larger Systems<\/h3>\n<p>Because the trigger is just a Cloudinary event, you can plug this into:<\/p>\n<ul>\n<li>\n<p>Your CMS media uploads.<\/p>\n<\/li>\n<li>\n<p>E-commerce product <a href=\"https:\/\/cloudinary.com\/guides\/automations\/visual-image-workflow-builder\">image workflows<\/a>.<\/p>\n<\/li>\n<li>\n<p>Marketing campaign asset pipelines.<\/p>\n<\/li>\n<\/ul>\n<h3>4. Chaining With Other Automations<\/h3>\n<p>The output of this flow (metadata, folder placement, tags) can trigger other flows in MediaFlows or be consumed by external systems listening for asset updates.<\/p>\n<p>When set up this way, the same flow you generated in Windsurf becomes part of your everyday asset lifecycle.<\/p>\n<h2>Conclusion<\/h2>\n<p>We\u2019ve built and tested a complete visual media automation using <strong>Cloudinary MediaFlows<\/strong> and the <strong>MediaFlows MCP server<\/strong> inside Windsurf.<\/p>\n<p>Starting from a single prompt, we created a PowerFlow that:<\/p>\n<ul>\n<li>\n<p>Triggers automatically on image upload.<\/p>\n<\/li>\n<li>\n<p>Analyzes and tags low resolution images.<\/p>\n<\/li>\n<li>\n<p>Generates a 960px web-ready variant.<\/p>\n<\/li>\n<li>\n<p>Uses an LLM to create alt text.<\/p>\n<\/li>\n<li>\n<p>Saves metadata for accessibility.<\/p>\n<\/li>\n<li>\n<p>Moves approved assets to the right folder.<\/p>\n<\/li>\n<li>\n<p>Sends a notification email.<\/p>\n<\/li>\n<li>\n<p>Logs every step for transparency.<\/p>\n<\/li>\n<\/ul>\n<p>The MCP server allowed us to work quickly from the editor while MediaFlows provided a visual, reliable execution layer with full logging and controls.<\/p>\n<p>Need some ideas on what to do with your server? Try experimenting with more AI-powered analysis or moderation steps. Connect your flows to Slack, Trello, or your CMS, and share templates with your team so they can build on top of your patterns.<\/p>\n<p>Ready to build a powerful, reusable visual media workflows in minutes and adapt them to real production needs without leaving your preferred development environment? <a href=\"https:\/\/cloudinary.com\/contact\">Contact us today<\/a> to learn more about Cloudinary\u2019s MediaFlows, or <a href=\"https:\/\/cloudinary.com\/users\/register_free\">sign up for a free account<\/a> to get started.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":87,"featured_media":38337,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[424,336],"class_list":["post-38191","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-agentic","tag-ai"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Automate End-to-End Image Workflows With Cloudinary MediaFlows and MCP<\/title>\n<meta name=\"description\" content=\"Follow this guide to create a production-ready visual media pipeline with Cloudinary MediaFlows, MCP, and Windsurf.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developer Media Workflow Automation in MediaFlows With Cloudinary&#039;s MCP Server and Windsurf\" \/>\n<meta property=\"og:description\" content=\"Follow this guide to create a production-ready visual media pipeline with Cloudinary MediaFlows, MCP, and Windsurf.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-20T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-07T21:06:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Developer Media Workflow Automation in MediaFlows With Cloudinary&#8217;s MCP Server and Windsurf\",\"datePublished\":\"2025-08-20T14:00:00+00:00\",\"dateModified\":\"2026-03-07T21:06:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\"},\"wordCount\":13,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA\",\"keywords\":[\"Agentic\",\"AI\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\",\"url\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\",\"name\":\"Automate End-to-End Image Workflows With Cloudinary MediaFlows and MCP\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA\",\"datePublished\":\"2025-08-20T14:00:00+00:00\",\"dateModified\":\"2026-03-07T21:06:54+00:00\",\"description\":\"Follow this guide to create a production-ready visual media pipeline with Cloudinary MediaFlows, MCP, and Windsurf.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developer Media Workflow Automation in MediaFlows With Cloudinary&#8217;s MCP Server and Windsurf\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Automate End-to-End Image Workflows With Cloudinary MediaFlows and MCP","description":"Follow this guide to create a production-ready visual media pipeline with Cloudinary MediaFlows, MCP, and Windsurf.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf","og_locale":"en_US","og_type":"article","og_title":"Developer Media Workflow Automation in MediaFlows With Cloudinary's MCP Server and Windsurf","og_description":"Follow this guide to create a production-ready visual media pipeline with Cloudinary MediaFlows, MCP, and Windsurf.","og_url":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf","og_site_name":"Cloudinary Blog","article_published_time":"2025-08-20T14:00:00+00:00","article_modified_time":"2026-03-07T21:06:54+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Developer Media Workflow Automation in MediaFlows With Cloudinary&#8217;s MCP Server and Windsurf","datePublished":"2025-08-20T14:00:00+00:00","dateModified":"2026-03-07T21:06:54+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf"},"wordCount":13,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA","keywords":["Agentic","AI"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf","url":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf","name":"Automate End-to-End Image Workflows With Cloudinary MediaFlows and MCP","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA","datePublished":"2025-08-20T14:00:00+00:00","dateModified":"2026-03-07T21:06:54+00:00","description":"Follow this guide to create a production-ready visual media pipeline with Cloudinary MediaFlows, MCP, and Windsurf.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/media-workflow-automation-mediaflows-cloudinary-mcp-server-windsurf#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Developer Media Workflow Automation in MediaFlows With Cloudinary&#8217;s MCP Server and Windsurf"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1755562867\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server\/Blog_Developer_Media_Workflow_Automation_in_MediaFlows_with_Cloudinary_MCP_Server.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=38191"}],"version-history":[{"count":8,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38191\/revisions"}],"predecessor-version":[{"id":39849,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38191\/revisions\/39849"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/38337"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=38191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=38191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=38191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}