{"id":3679,"date":"2025-10-09T09:16:16","date_gmt":"2025-10-09T09:16:16","guid":{"rendered":"https:\/\/www.infobip.com\/developers\/?p=3679"},"modified":"2025-12-17T13:24:45","modified_gmt":"2025-12-17T13:24:45","slug":"how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code","status":"publish","type":"post","link":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code","title":{"rendered":"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0"},"content":{"rendered":"\n<p>Last week, I needed a PlantUML MCP server for my team. Instead of spending days learning TypeScript, wrestling with npm configurations, and debugging dependency issues, I treated Claude like my personal implementation partner. I focused on the <em>what<\/em> and <em>why<\/em>\u2014Claude handled the <em>how<\/em>.<\/p>\n\n\n\n<p>In this post, I&#8217;ll walk you through my exact process for building the PlantUML MCP server, sharing the specific prompts, workflows, and mindset shifts that made it possible. By the end, you&#8217;ll have a repeatable framework for building software at the speed of thought, regardless of your programming background.<\/p>\n\n\n\n<p>Let&#8217;s dive into the nitty-gritty details!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Setup: You Drive, Claude Codes&nbsp;<\/h2>\n\n\n\n<p>I think of Claude as a junior developer who types extremely fast and never seems to get tired. I&#8217;m the architect, the reviewer, and the decision-maker; meanwhile, Claude handles the implementation.&nbsp;<br>For me, this isn&#8217;t about replacing developers\u2014it&#8217;s about focusing on what matters: solving problems, not syntax.&nbsp;<\/p>\n\n\n\n<p>Here&#8217;s my personal cookbook recipe for building software with Claude, using a real project I shipped last week.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Project: PlantUML MCP Server<\/h2>\n\n\n\n<p><a href=\"https:\/\/plantuml.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">PlantUML<\/a> is a tool for creating diagrams I often use for my projects. The problem I was having with it was that every time I wanted a PlantUML diagram, I had to:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ask Claude to generate PlantUML code and copy it manually&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Paste the code piece by piece to the repository I was working in.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Generate the diagram image myself and copy its URL back to my documentation.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong>Solution:<\/strong> &nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build an MCP server so Claude can automate all this manual work.&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Phase 1: Brainstorm First, Code Later (10-15 minutes)<\/h2>\n\n\n\n<p>Start in <a href=\"http:\/\/claude.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Claude.ai<\/a> web interface. Don&#8217;t jump to code\u2014design your solution first. The more well-thought-out the scenario is, the greater the chance you have for a good working solution.&nbsp;<\/p>\n\n\n\n<p>As for the model, I used Sonnet 4 because it\u2019s typically faster than Opus and yields good enough results.&nbsp;I usually only switch to a &#8216;better yet slower&#8217; model in case I am not satisfied with the answer\/discussion and want to see if a stronger model would render better results.&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Me: &#8220;Let&#8217;s brainstorm. I want to create a PlantUML MCP server so that Claude Code can use our internal PlantUML server directly for SVG generation&#8230;&#8221;&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<p>And from there, Claude and I went back and forth:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What tools do we need?&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What&#8217;s the minimal viable version?&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What can we skip for now?&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>The core concept I was after was to <strong>start simple<\/strong>. Just wrap the internal server I was working in and skip complex features.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"754\" height=\"1024\" src=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example-754x1024.png\" alt=\"plantuml mcp server prompt example\" class=\"wp-image-3690\" srcset=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example-754x1024.png 754w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example-221x300.png 221w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example-768x1043.png 768w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example-1131x1536.png 1131w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example-1508x2048.png 1508w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-prompt-example.png 1542w\" sizes=\"auto, (max-width: 754px) 100vw, 754px\" \/><figcaption class=\"wp-element-caption\"><em>The first prompt in Claude that started the brainstorming session<\/em>&nbsp;<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Phase 2: Get Something Working (20-30 minutes)&nbsp;<\/h2>\n\n\n\n<p>Once I was satisfied with the design phase, I asked Claude (still through the web interface version) for the minimal working code.&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Me: &#8220;I would start simple to make it functional. Just use our internal &nbsp;<br>server for diagramming.&#8221;&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<p>As a result, Claude generated ~100 lines of TypeScript, which I attempted to copy to my terminal to test. Which failed after just a few lines.&nbsp;<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-ts\" data-lang=\"TypeScript\"><code>$ npm install\u00a0\n$ node index.js\u00a0\n# Error: module not found<\/code><\/pre><\/div>\n\n\n\n<p>I went back to Claude with the error to troubleshoot. Two iterations later, with the help of AI and its ability to troubleshoot, the code runs as expected.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>\ud83d\udca1 <strong>Pro tip from my experience<\/strong><br>I don&#8217;t move to Claude Code until I have working code. I find it&#8217;s faster to iterate in the web interface for initial prototypes. Lately, I\u2019ve also been experimenting with Claude Code&#8217;s &#8220;plan mode&#8221; for those initial planning sessions where I just want the AI to explain and review without touching the code.&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Phase 3: Switch to Claude Code (5 minutes)&nbsp;<\/h2>\n\n\n\n<p>Now the fun begins! In my terminal, I created a git repository and committed the initial working version I\u2019d gotten from Claude&#8217;s web interface.&nbsp;<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>$ cd plantuml-mcp-server\n$ claude\n&gt; \/init\n&gt; Create a git repository and commit this initial working version<\/code><\/pre><\/div>\n\n\n\n<p>Claude now understands the entire codebase. We&#8217;re ready to iterate fast.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Phase 4: Iterate with Plan-Review-Execute (30-45 minutes)<\/h2>\n\n\n\n<p>This is where the magic happens. Look at this actual conversation.&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Me<\/strong>: &#8220;The encoding doesn&#8217;t work correctly. Here&#8217;s the official PlantUML &nbsp;<br>encoding documentation [paste link]. We have two options: custom &nbsp;<br>implementation or use the plantuml-encoder library&#8221;&nbsp;<br><br><strong>Claude<\/strong>: &#8220;I&#8217;ll use the plantuml-encoder library. Here&#8217;s my plan:&nbsp;<br>1. Add plantuml-encoder dependency&nbsp;<br>2. Replace the custom encoding function&nbsp;<br>3. Update the generate_diagram tool&nbsp;<br>4. Add error handling.&#8221;&nbsp;<br><br><strong>Me<\/strong>: &#8220;Looks good, proceed.&#8221;&nbsp;<\/p>\n\n\n\n<p><\/p>\n<\/blockquote>\n\n\n\n<p>While Claude codes, I watch the changes it IntelliJ&#8217;s diff view. It&#8217;s like pair programming where I review in real-time.<\/p>\n\n\n\n<p>During one of the iterations, I asked Claude to create a Makefile for easy build and command run. As a response, Claude generated a complete Makefile with targets for install, build, test, and clean. &nbsp;<\/p>\n\n\n\n<p>I tested each command as it was created.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Phase 5: Ship It (15 minutes)<\/h2>\n\n\n\n<p>There\u2019s no reason why you shouldn\u2019t use Claude for the finishing yet mundane tasks, such as creating documentation, preparing the repository for public consumption, and adding compliance details.&nbsp;<\/p>\n\n\n\n<p>This is my prompt to help prepare an open-source repository:&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Me: &#8220;I created a GitHub repository and selected MIT license. Here&#8217;s &nbsp;<br>the repo: github.com\/mzagar\/plantuml-mcp-server. Prepare the code &nbsp;<br>for publishing there with proper README, examples, and npm setup.&#8221;&nbsp;<\/p>\n\n\n\n<p><\/p>\n<\/blockquote>\n\n\n\n<p>Claude updates everything for the existing repo:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Comprehensive README with installation instructions&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Package.json configured for npm publishing&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub Actions workflow&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Example usage documentation&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Architecture explanation&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"591\" src=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-repo-1024x591.png\" alt=\"plantuml mcp server repo\" class=\"wp-image-3691\" srcset=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-repo-1024x591.png 1024w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-repo-300x173.png 300w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-repo-768x443.png 768w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-repo-1536x886.png 1536w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/plantuml-mcp-server-repo-2048x1182.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Claude Code updated the <a href=\"https:\/\/github.com\/infobip\/plantuml-mcp-server\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub repository<\/a> for me with all the required details.<\/em>&nbsp;<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Quick End Result Summary&nbsp;<\/h2>\n\n\n\n<p><strong>Time invested:<\/strong> ~2 hours&nbsp;<\/p>\n\n\n\n<p><strong>Lines of code written by me:<\/strong> 0&nbsp;<\/p>\n\n\n\n<p><strong>Lines of code generated:<\/strong> ~500&nbsp;<\/p>\n\n\n\n<p><strong>Current status:<\/strong> Published on npm, used by my team daily&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>The project code is hosted on <a href=\"https:\/\/github.com\/infobip\/plantuml-mcp-server\" target=\"_blank\" rel=\"noreferrer noopener\">Infobip GitHub<\/a> and is also published on the <a href=\"https:\/\/github.com\/infobip\/plantuml-mcp-server\" target=\"_blank\" rel=\"noreferrer noopener\">NPM site<\/a>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>If you&#8217;re working with APIs that already have an OpenAPI spec, you can skip even more steps\u2014the open-source <a href=\"https:\/\/github.com\/infobip\/infobip-openapi-mcp\">Infobip OpenAPI MCP framework<\/a> generates MCP servers directly from your API definition. See it in action with <a href=\"https:\/\/github.com\/infobip\/mcp\">Infobip&#8217;s MCP servers<\/a> for communication APIs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Unexpected Freedom: Language Agnostic Development&nbsp;<\/h2>\n\n\n\n<p>Here&#8217;s something I didn&#8217;t expect to happen when working on a programming project: I&#8217;ve stopped caring about programming languages and frameworks.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">For Quick POCs&nbsp;<\/h3>\n\n\n\n<p>Claude picked TypeScript for this project. I don&#8217;t know TypeScript\u2014I mean, code is code, I can read and understand it\u2014but I know nothing about the TypeScript ecosystem, npm dependencies, build lifecycles, or how to publish to npm.&nbsp;<\/p>\n\n\n\n<p>And it doesn&#8217;t matter. <strong>Claude handled all of that.<\/strong>&nbsp;<\/p>\n\n\n\n<p>What I had to focus on was &#8220;Does this solve my problem?&#8221;, rather than &#8220;How do I configure a webpack?&#8221;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">For Existing Projects&nbsp;<\/h3>\n\n\n\n<p>I now use Claude habitually, and it becomes even more interesting for existing projects, such as our company\u2019s React apps. When I need to contribute:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I jump into the terminal, run Claude, then \/init&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If there&#8217;s no technical documentation, I ask: &#8220;Generate ADR9 minimal technical docs and C4 diagrams for this codebase.&#8221;&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Now I can ask questions and implement features&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>My React knowledge? Same as my TypeScript knowledge\u2014basically none. But when you look at my skills from a high-level perspective, I can:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Implement features&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test them&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>See if they solve my problem&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Submit PRs for review&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>And that\u2019s all I need to create compelling and working projects.&nbsp;<\/p>\n\n\n\n<p>Instead of writing JIRA tickets to explain to our already busy frontend devs what I need from them, I implement it myself and ask them to review. They focus on code quality, patterns, and security, rather than implementing from scratch.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My Cookbook Rules (What Works for Me)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>I always start with <\/strong><a href=\"http:\/\/claude.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Claude.ai<\/strong><\/a><strong> for design<\/strong> &#8211; I find it faster for brainstorming&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Get minimal code working first<\/strong> &#8211; I&#8217;ve learned not to build features on broken foundations&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>I switch to Claude Code only with working code<\/strong> &#8211; \/init needs something to understand&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Review every change in your IDE<\/strong> &#8211; I stay responsible for the code&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Provide external docs<\/strong> &#8211; Claude doesn&#8217;t know your internal APIs&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>I commit after each successful feature<\/strong> &#8211; Git is my safety net&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Test continuously<\/strong> &#8211; I run the code after every change&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What This Means for My Workflow&nbsp;<\/h2>\n\n\n\n<p>I spent two hours being an architect and reviewer instead of eight hours typing code. I focused on:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What the tool should do&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How it should work&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quality and correctness&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>User experience&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Claude handled:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Syntax and boilerplate&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Package management&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Error handling patterns&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Documentation formatting&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>This isn&#8217;t about AI replacing programmers. For me, it&#8217;s about focusing on what\u2019s important: problems instead of syntax, architecture instead of boilerplate, user value instead of configuration files.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last week, I needed a PlantUML MCP server for [&hellip;]<\/p>\n","protected":false},"author":74,"featured_media":3689,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[50,28],"tags":[146,309,311],"coauthors":[310],"class_list":["post-3679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-blog-post","tag-development","tag-mcp-servers","tag-vibe-coding"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How I built an open-source PlantUML MCP server without writing a single line of code\u00a0 - Infobip Developers Hub<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0 - Infobip Developers Hub\" \/>\n<meta property=\"og:description\" content=\"Last week, I needed a PlantUML MCP server for [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\" \/>\n<meta property=\"og:site_name\" content=\"Infobip Developers Hub\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infobip\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-09T09:16:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-17T13:24:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"896\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Mario \u017dagar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:site\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mario \u017dagar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\"},\"author\":{\"name\":\"Mario \u017dagar\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/1cc34d8cb7cd5663a2b9b8b7292bbf8e\"},\"headline\":\"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0\",\"datePublished\":\"2025-10-09T09:16:16+00:00\",\"dateModified\":\"2025-12-17T13:24:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\"},\"wordCount\":1497,\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg\",\"keywords\":[\"development\",\"MCP servers\",\"vibe coding\"],\"articleSection\":[\"AI\",\"Blog Post\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\",\"name\":\"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0 - Infobip Developers Hub\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg\",\"datePublished\":\"2025-10-09T09:16:16+00:00\",\"dateModified\":\"2025-12-17T13:24:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg\",\"width\":1600,\"height\":896,\"caption\":\"A visualization of a UML diagram\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.infobip.com\/developers\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"name\":\"Infobip Developers Hub\",\"description\":\"Build meaningful customer relationships across any channel\",\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.infobip.com\/developers\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\",\"name\":\"Infobip Developers Hub\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"width\":696,\"height\":696,\"caption\":\"Infobip Developers Hub\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infobip\/\",\"https:\/\/x.com\/InfobipDev\",\"https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ\",\"https:\/\/github.com\/infobip-community\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/1cc34d8cb7cd5663a2b9b8b7292bbf8e\",\"name\":\"Mario \u017dagar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/c11f12d80543c657c620499b2a470f76\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/68fa3df708a1425ed02a03a2bb522d22572b9960605648fd9ccf556df0b3ad71?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/68fa3df708a1425ed02a03a2bb522d22572b9960605648fd9ccf556df0b3ad71?s=96&d=mm&r=g\",\"caption\":\"Mario \u017dagar\"},\"description\":\"Mario is a Distinguished Engineer at Infobip. He's passionate about building scalable systems, driving innovation, and helping teams do their best work.\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/author\/mario-zagar\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0 - Infobip Developers Hub","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:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code","og_locale":"en_US","og_type":"article","og_title":"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0 - Infobip Developers Hub","og_description":"Last week, I needed a PlantUML MCP server for [&hellip;]","og_url":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code","og_site_name":"Infobip Developers Hub","article_publisher":"https:\/\/www.facebook.com\/infobip\/","article_published_time":"2025-10-09T09:16:16+00:00","article_modified_time":"2025-12-17T13:24:45+00:00","og_image":[{"width":1600,"height":896,"url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg","type":"image\/jpeg"}],"author":"Mario \u017dagar","twitter_card":"summary_large_image","twitter_creator":"@InfobipDev","twitter_site":"@InfobipDev","twitter_misc":{"Written by":"Mario \u017dagar","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#article","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code"},"author":{"name":"Mario \u017dagar","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/1cc34d8cb7cd5663a2b9b8b7292bbf8e"},"headline":"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0","datePublished":"2025-10-09T09:16:16+00:00","dateModified":"2025-12-17T13:24:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code"},"wordCount":1497,"publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage"},"thumbnailUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg","keywords":["development","MCP servers","vibe coding"],"articleSection":["AI","Blog Post"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code","url":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code","name":"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0 - Infobip Developers Hub","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage"},"thumbnailUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg","datePublished":"2025-10-09T09:16:16+00:00","dateModified":"2025-12-17T13:24:45+00:00","breadcrumb":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#primaryimage","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2025\/10\/a-modern-an-compelling-visualisation-of-a-UML-diagram-on-a-dark-background.jpg","width":1600,"height":896,"caption":"A visualization of a UML diagram"},{"@type":"BreadcrumbList","@id":"https:\/\/www.infobip.com\/developers\/blog\/how-i-built-an-open-source-plantuml-mcp-server-without-writing-a-single-line-of-code#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.infobip.com\/developers\/"},{"@type":"ListItem","position":2,"name":"How I built an open-source PlantUML MCP server without writing a single line of code\u00a0"}]},{"@type":"WebSite","@id":"https:\/\/www.infobip.com\/developers\/#website","url":"https:\/\/www.infobip.com\/developers\/","name":"Infobip Developers Hub","description":"Build meaningful customer relationships across any channel","publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.infobip.com\/developers\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.infobip.com\/developers\/#organization","name":"Infobip Developers Hub","url":"https:\/\/www.infobip.com\/developers\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","width":696,"height":696,"caption":"Infobip Developers Hub"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infobip\/","https:\/\/x.com\/InfobipDev","https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ","https:\/\/github.com\/infobip-community"]},{"@type":"Person","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/1cc34d8cb7cd5663a2b9b8b7292bbf8e","name":"Mario \u017dagar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/c11f12d80543c657c620499b2a470f76","url":"https:\/\/secure.gravatar.com\/avatar\/68fa3df708a1425ed02a03a2bb522d22572b9960605648fd9ccf556df0b3ad71?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/68fa3df708a1425ed02a03a2bb522d22572b9960605648fd9ccf556df0b3ad71?s=96&d=mm&r=g","caption":"Mario \u017dagar"},"description":"Mario is a Distinguished Engineer at Infobip. He's passionate about building scalable systems, driving innovation, and helping teams do their best work.","url":"https:\/\/www.infobip.com\/developers\/blog\/author\/mario-zagar"}]}},"_links":{"self":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/3679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/users\/74"}],"replies":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/comments?post=3679"}],"version-history":[{"count":13,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/3679\/revisions"}],"predecessor-version":[{"id":3734,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/3679\/revisions\/3734"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media\/3689"}],"wp:attachment":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media?parent=3679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/categories?post=3679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/tags?post=3679"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/coauthors?post=3679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}