<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Severin Komander</title>
    <description>The latest articles on DEV Community by Severin Komander (@severin_komander_0b8b9737).</description>
    <link>https://dev.to/severin_komander_0b8b9737</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3910139%2F5c9e45ab-84bd-4fb5-930b-b98f11faa405.jpg</url>
      <title>DEV Community: Severin Komander</title>
      <link>https://dev.to/severin_komander_0b8b9737</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/severin_komander_0b8b9737"/>
    <language>en</language>
    <item>
      <title>I Built an MCP Server for My Flower Shop. Nobody Asked Me To.</title>
      <dc:creator>Severin Komander</dc:creator>
      <pubDate>Sun, 17 May 2026 19:51:06 +0000</pubDate>
      <link>https://dev.to/severin_komander_0b8b9737/i-built-an-mcp-server-for-my-flower-shop-nobody-asked-me-to-62f</link>
      <guid>https://dev.to/severin_komander_0b8b9737/i-built-an-mcp-server-for-my-flower-shop-nobody-asked-me-to-62f</guid>
      <description>&lt;p&gt;A story about over-engineering a 60-year-old Munich florist because we could&lt;/p&gt;

&lt;p&gt;Let me set the scene.&lt;br&gt;
It's a Tuesday evening in Munich. My family has been selling flowers from the same shop on Heßstraße 37 since 1965. We've survived recessions, two pandemics, and the brief but terrifying period when "sending flowers via the internet" was considered futuristic.&lt;br&gt;
And here I am, at 11pm, publishing an MCP server to the official Model Context Protocol Registry.&lt;br&gt;
For a flower shop.&lt;br&gt;
In Munich.&lt;/p&gt;

&lt;p&gt;Why?&lt;br&gt;
Great question. I asked myself the same thing approximately zero times before starting.&lt;br&gt;
The honest answer: because the infrastructure existed, Claude Code was right there, and I wanted to see if I could make Mistral Le Chat order carnations.&lt;br&gt;
The business answer I tell people at networking events: "We're positioning Blumen Komander as an AI-native florist for the emerging agentic commerce era."&lt;br&gt;
Both are true.&lt;/p&gt;

&lt;p&gt;What We Built (In One Evening)&lt;br&gt;
Here's what an evening with Claude Code produced:&lt;br&gt;
A full REST API for the shop:&lt;br&gt;
GET /store/products/search?occasion=geburtstag&amp;amp;maxPrice=50&lt;br&gt;
GET /store/availability?date=2026-05-19&amp;amp;postalCode=80799&lt;br&gt;
POST /store/carts&lt;br&gt;
Complete with Bavarian holiday logic (yes, I implemented the Gaussian Easter formula in JavaScript at midnight), delivery zones for Munich's postal codes, and a 6-step Medusa.js checkout flow.&lt;br&gt;
An MCP Server with two transports:&lt;/p&gt;

&lt;p&gt;/sse for Claude Desktop and Gemini CLI&lt;br&gt;
/mcp for Mistral, ChatGPT, and Copilot Studio&lt;/p&gt;

&lt;p&gt;Five tools:&lt;/p&gt;

&lt;p&gt;search_flowers – finds bouquets by occasion, color, budget, style&lt;br&gt;
check_availability – checks if we can deliver on a given date&lt;br&gt;
create_cart – full checkout flow, returns a payment link&lt;br&gt;
get_checkout_link – retrieves an existing cart&lt;br&gt;
get_shop_info – opening hours, contact, payment methods&lt;/p&gt;

&lt;p&gt;An llms.txt on three domains, because apparently that's a thing now.&lt;br&gt;
A listing in the official MCP Registry at registry.modelcontextprotocol.io as io.github.Severin2k/blumen-komander-mcp.&lt;br&gt;
Total time: one evening.&lt;br&gt;
Total cost: my Claude Max subscription.&lt;br&gt;
Total bouquets ordered by AI agents so far: approximately 3 test orders I placed myself.&lt;/p&gt;

&lt;p&gt;The Moment It Actually Worked&lt;br&gt;
I connected Mistral Le Chat to the MCP server and typed:&lt;br&gt;
"Ich möchte Blumen zum Geburtstag bestellen, Budget 50€, Lieferung am 19. Mai nach München, Fasangartenstraße 86, PLZ 81549."&lt;br&gt;
Mistral called search_flowers. Then check_availability. Then showed me five real bouquets from our actual inventory with real prices.&lt;br&gt;
Then it said: "Welchen Strauß möchten Sie? Ich kann direkt einen Warenkorb für Sie anlegen."&lt;br&gt;
And I sat there for a moment thinking: a French AI just offered to buy flowers from my Munich flower shop, autonomously, using a protocol created by Anthropic, running on a server I built in an evening.&lt;br&gt;
My grandfather opened this shop in 1965. He took orders by phone.&lt;/p&gt;

&lt;p&gt;Is Anyone Going to Use This?&lt;br&gt;
Probably not many people. Let's be honest.&lt;br&gt;
The number of humans who currently think "I should configure an MCP server to order flowers" is somewhere between twelve and my immediate family.&lt;br&gt;
But here's the thing about being early:&lt;br&gt;
In 2024, Anthropic published the Model Context Protocol spec.&lt;br&gt;
In 2025, Stripe built an MCP server. Then Asana. Then GitHub.&lt;br&gt;
In 2026, I built one for a flower shop in Schwabing.&lt;br&gt;
In 2027-2028, AI agents will start buying things autonomously.&lt;br&gt;
When that happens, we're already in the registry. Already tested. Already the first florist in the world with a working MCP integration.&lt;br&gt;
The cost of being early is: a Tuesday evening and some mild sleep deprivation.&lt;br&gt;
The cost of being late is: watching someone else be first.&lt;/p&gt;

&lt;p&gt;The Technical Stack (For Those Who Care)&lt;/p&gt;

&lt;p&gt;Backend: Medusa.js v2 on Hetzner VPS&lt;br&gt;
Frontend: Next.js App Router&lt;br&gt;
MCP Server: @modelcontextprotocol/sdk, Node.js, Express&lt;br&gt;
Transports: SSE (/sse) + Streamable HTTP (/mcp)&lt;br&gt;
Tested with: Mistral Le Chat ✅, Claude ✅, Claude Desktop ✅&lt;br&gt;
npm package: blumen-komander-mcp&lt;br&gt;
Registry: io.github.Severin2k/blumen-komander-mcp&lt;/p&gt;

&lt;p&gt;The MCP server is open source on GitHub:&lt;br&gt;
github.com/Severin2k/blumen-komander-mcp&lt;br&gt;
You can connect right now:&lt;br&gt;
json{&lt;br&gt;
  "mcpServers": {&lt;br&gt;
    "blumen-komander": {&lt;br&gt;
      "url": "&lt;a href="https://mcp.blumen-verschicken.online/sse" rel="noopener noreferrer"&gt;https://mcp.blumen-verschicken.online/sse&lt;/a&gt;"&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
Or for Mistral Le Chat:&lt;br&gt;
URL: &lt;a href="https://mcp.blumen-verschicken.online/mcp" rel="noopener noreferrer"&gt;https://mcp.blumen-verschicken.online/mcp&lt;/a&gt;&lt;br&gt;
Authentication: None&lt;/p&gt;

&lt;p&gt;What We Also Built Because Why Not&lt;br&gt;
Since we were already there:&lt;br&gt;
A KI-Chat-Konfigurator on the shop website – a Mistral-powered chat assistant embedded directly in the store page. It knows the seasonal flower calendar (Pfingstrosen are in peak season right now, by the way), can suggest bouquets, collect delivery details, and generate a checkout link. All without the customer leaving the page.&lt;br&gt;
Floristic knowledge in the system prompt – including a full seasonal calendar of 47 flower types with availability months. Because if you're going to build an AI florist, it should know that tulips are done by April.&lt;br&gt;
A Wunschstrauß (custom bouquet) flow – if a customer asks for peonies and we don't have them in standard inventory, the AI explains they're in peak season right now, asks for color preferences and budget, and creates a custom order. The florist sees the description and makes it happen.&lt;/p&gt;

&lt;p&gt;Lessons Learned&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The MCP spec is actually well-designed.
SSE for Claude/Gemini, Streamable HTTP for Mistral/ChatGPT. Two endpoints, all clients covered. Took me longer to figure out the Body-already-read bug in Express than to understand the protocol.&lt;/li&gt;
&lt;li&gt;LLMs are surprisingly good at structured commerce flows.
With the right system prompt and tool definitions, Mistral walked through a 10-step order process, extracted 18 variables from a conversation, and called create_cart with correct arguments. The hard part isn't the AI – it's the state management.&lt;/li&gt;
&lt;li&gt;Being first in a niche is easier than it sounds.
Nobody told me "florists should have MCP servers". The category didn't exist. I just... made it exist.&lt;/li&gt;
&lt;li&gt;Claude Code is genuinely useful for this.
I described what I wanted, reviewed the code, gave feedback. The Gaussian Easter formula in TypeScript was not something I wrote myself. I'm a florist.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP Registry Entry&lt;br&gt;
If you're curious what it looks like:&lt;br&gt;
io.github.Severin2k/blumen-komander-mcp&lt;br&gt;
Title: Blumen Komander München&lt;br&gt;
Status: Active&lt;br&gt;
Remote SSE: &lt;a href="https://mcp.blumen-verschicken.online/sse" rel="noopener noreferrer"&gt;https://mcp.blumen-verschicken.online/sse&lt;/a&gt;&lt;br&gt;
Remote HTTP: &lt;a href="https://mcp.blumen-verschicken.online/mcp" rel="noopener noreferrer"&gt;https://mcp.blumen-verschicken.online/mcp&lt;/a&gt;&lt;br&gt;
npm: blumen-komander-mcp&lt;br&gt;
Deutschlands erster Florist mit MCP Server. 🌸&lt;/p&gt;

&lt;p&gt;Try It&lt;br&gt;
Connect the MCP server to your Claude Desktop, Mistral Le Chat, or any MCP-compatible client and ask it to help you order flowers for someone in Munich.&lt;br&gt;
It actually works.&lt;br&gt;
The flowers are actually real.&lt;br&gt;
We actually deliver them, by hand, in Munich, the next day.&lt;br&gt;
Sixty years of doing this. Now with JSON-RPC.&lt;/p&gt;

&lt;p&gt;Severin Komander runs Blumen Komander München, a flower shop on Heßstraße 37 in Munich since 1965. The MCP server is live at mcp.blumen-verschicken.online. The flowers are at blumen-verschicken.online. The shop is real. This is not a bit.&lt;br&gt;
npm: blumen-komander-mcp&lt;br&gt;
GitHub: Severin2k/blumen-komander-mcp&lt;br&gt;
MCP Docs: &lt;a href="https://www.blumen-komander.de/ki-florist" rel="noopener noreferrer"&gt;blumen-komander.de/ki-florist&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I built a Lexware Office integration for Medusa v2</title>
      <dc:creator>Severin Komander</dc:creator>
      <pubDate>Sun, 03 May 2026 10:05:56 +0000</pubDate>
      <link>https://dev.to/severin_komander_0b8b9737/how-i-built-a-lexware-office-integration-for-medusa-v2-1koc</link>
      <guid>https://dev.to/severin_komander_0b8b9737/how-i-built-a-lexware-office-integration-for-medusa-v2-1koc</guid>
      <description>&lt;p&gt;I run a flower shop in Munich and recently migrated my entire e-commerce setup to Medusa v2. The shop, the&lt;br&gt;
  subscription service, the dashboard - everything runs on Medusa now.&lt;/p&gt;

&lt;p&gt;One thing that was completely missing: a connection to Lexware Office, which is the most popular accounting software&lt;br&gt;
  for small businesses in Germany. Every order meant manually creating an invoice. With 5-10 orders a day, that gets old&lt;br&gt;
   fast.&lt;/p&gt;

&lt;p&gt;So I built LexBridge - an open-source Medusa v2 plugin that automates the entire invoicing workflow.&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;When a customer places an order, the plugin:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Looks up the customer in Lexware (or creates a new contact)&lt;/li&gt;
&lt;li&gt;Creates an invoice with all line items, tax rates, and payment terms&lt;/li&gt;
&lt;li&gt;Downloads the finalized PDF from Lexware&lt;/li&gt;
&lt;li&gt;Stores the invoice reference in the database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything is configurable through the Medusa Admin UI - no code changes needed after installation.&lt;/p&gt;

&lt;p&gt;The tricky parts&lt;/p&gt;

&lt;p&gt;German tax rates - Germany has 7% for food/flowers and 19% for everything else. A single order can contain items with&lt;br&gt;
  different tax rates. The plugin supports a taxRateOverride callback so you can define your own logic per line item.&lt;/p&gt;

&lt;p&gt;Payment terms per payment method - A customer paying with PayPal should get "due immediately", while a B2B customer&lt;br&gt;
  paying on invoice gets "14 days". The plugin lets you configure this per payment provider.&lt;/p&gt;

&lt;p&gt;Lexware API quirks - The API has a rate limit of 2 requests per second and returns 503 errors more often than you'd&lt;br&gt;
  like. The plugin handles this with exponential backoff and automatic retries.&lt;/p&gt;

&lt;p&gt;Idempotency - Medusa can fire order.placed events multiple times. A unique constraint on order_id ensures only one&lt;br&gt;
  invoice is created per order.&lt;/p&gt;

&lt;p&gt;Free and Pro&lt;/p&gt;

&lt;p&gt;The core features are completely free and open-source (MIT license). I added a Pro tier for advanced features like&lt;br&gt;
  credit notes, dry-run mode, webhook sync, and email notifications. It's a small way to fund ongoing development while&lt;br&gt;
  keeping the essential functionality free for everyone.&lt;/p&gt;

&lt;p&gt;Tech stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Medusa v2 module with custom service, subscribers, and admin UI&lt;/li&gt;
&lt;li&gt;TypeScript end to end&lt;/li&gt;
&lt;li&gt;AES-256-GCM encryption for API keys stored in the database&lt;/li&gt;
&lt;li&gt;Nodemailer for SMTP email delivery&lt;/li&gt;
&lt;li&gt;Admin UI built with Medusa's native UI components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;p&gt;npm install medusa-lexbridge&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Severin2k/medusa-plugin-lexware" rel="noopener noreferrer"&gt;https://github.com/Severin2k/medusa-plugin-lexware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lexbridge.shop" rel="noopener noreferrer"&gt;https://lexbridge.shop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/medusa-lexbridge" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/medusa-lexbridge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're running a Medusa shop in Germany/DACH and dealing with Lexware, this might save you a lot of manual work.&lt;br&gt;
  Feedback and contributions are welcome!&lt;/p&gt;

</description>
      <category>medusa</category>
      <category>ecommerce</category>
      <category>node</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
