This article does a great job highlighting the importance of security, standards, and thoughtful design when building MCP servers — those aspects are easy to overlook but really matter in real deployments. While I’ve been exploring how MCP server implementation and deployment work in actual use cases, I came across this resource here: https://mobisoftinfotech.com/services/mcp-server-development-consultation which offered some additional perspective on structured development and consultation. Really appreciate the depth of information here!
I just released my first MCP server: mcp-cloudflare-crunchtools. It lets Claude Code (and other MCP-compatible AI assistants) manage Cloudflare DNS records, Transform Rules, Page Rules, and cache. But this post isn’t really about Cloudflare—it’s about how I built this server and why I think it matters for the emerging MCP ecosystem. As I’ve gotten deeper into this MCP world, I’ve realized there’s a lot of low quality MCP servers, designed and developed in strange ways. Some appear to be learning projects, others give me the sense that they’re almost AI slop/spam trying to drive crypto donations.
I kept thinking to myself, I think I’d trust a generic MCP server built by Claude more than these ones I could download from some rando on the Internet. And so, I decided to build a small portfolio of MCP servers and publish them. I’m doing this for the benefit of open source and learning. This is the first MCP server from Crunchtools, but it won’t be the last. Expect more, for things like WordPress, Mediawiki, Request Tracker, Pagure, and other open source projects I use.
The architectural decisions I’m laying out here will carry forward to every MCP server we publish. If you’re building MCP servers yourself, maybe this thinking will be useful.
Table of Contents
The Model Context Protocol (MCP) is an open standard for connecting AI applications to external systems. Think of it like USB-C for AI—a standardized way to plug tools, data sources, and APIs into assistants like Claude. Instead of every AI app building custom integrations, MCP provides a common interface that works everywhere.
This is a big deal. It means we can build one MCP server for Cloudflare and it works with Claude Code, Cursor, Gemini CLI or any other MCP-compatible client that comes along.
Why We Built ThisI’ve been using Claude Code for development work, and I kept finding myself needing to manage DNS records and cache settings. The workflow was: leave Claude, open the Cloudflare dashboard, make changes, come back. It broke my flow. MCP solves this. Now I can say “purge the cache for crunchtools.com” and it just happens. Create DNS records, set up URL rewrites, manage page rules—all without leaving my terminal. I can create a ticket for a new site, and let Claude finish the entire workflow, from creating DNS, to making sure the site works when its done. But here’s the thing: MCP servers handle sensitive credentials. My Cloudflare API token has access to every domain I manage. I couldn’t just throw something together and hope for the best. This needed to be built right. Other MCP servers I found didn’t make me feel confident in their designs.
Built With Claude Code, Designed By HumansYes, I used Claude Code to write this MCP server. There’s a certain recursion to using an AI assistant to build tools for AI assistants. But let me be clear about what that means—and what it doesn’t. Claude Code is fast. It can scaffold a project, implement API integrations, write tests, and handle the mechanical parts of coding at a pace I can’t match. That’s valuable. But speed without direction is just fast chaos. The brain power still has to come from somewhere (I’m not convinced jobs are going away, I think it’s going to be more like Jevons Paradox):
Before writing any code, I spent time thinking through the foundational choices that would shape not just this project, but every MCP server we publish going forward. These decisions matter because they compound—get them right once and every future project benefits.
Why Python (and Not Rust or TypeScript)This wasn’t obvious. MCP has SDKs for multiple languages, and each has real advantages:
Rust would give us memory safety, small binaries, and excellent performance. For a network-heavy MCP server making API calls, the performance argument is less compelling—we’re waiting on HTTP responses, not crunching numbers. TypeScript has a strong MCP SDK and a lot of popularity, but I’m just less comfortable with Node.js in general. I’ve programmed off and on in Python for many years and have a feel fro the ecosystem. This may be my own bias.
Python won for several reasons:
uvx make zero-install execution possible.Container security is something I think about a lot. Most developers pull python:3.12 and move on. That image works, but it carries baggage—literally hundreds of CVEs in a typical scan. Here’s what I see regularly:
| Base Image | Typical CVE Count |
|---|---|
| python:3.12 (Debian) | 100-200+ |
| python:3.12-slim | 50-100 |
| python:3.12-alpine | 10-30 |
| Hummingbird Python | <10 |
Hummingbird is Red Hat’s effort to solve this problem in the container-native world: near-zero CVEs. The philosophy is simple—include only what’s necessary to run Python applications. No compilers, no extra shells, no accumulated cruft from general-purpose distributions.
Why this matters for MCP servers:
uv package manager, which is significantly faster than pip for dependency resolution and installation. This speeds up container builds and reduces CI time.I could have used Alpine for small image sizes, but Alpine uses musl libc instead of glibc, which causes subtle compatibility issues with some Python packages. Hummingbird gives me the small footprint without the compatibility headaches. This choice will carry forward to every Crunchtools MCP server. We’ll always build on Hummingbird.
Why stdio TransportMCP supports multiple transport mechanisms. The two main options are:
We use stdio exclusively. Here’s why:
HTTP transport makes sense for MCP servers that need to be shared across multiple clients or run as persistent services. For developer tools running locally, stdio is simpler and more secure.
Security FirstMost MCP servers I’ve seen treat security as an afterthought. That’s a mistake. These servers sit between AI assistants and production infrastructure. A compromised MCP server could mean:
Claude was actually very helpful in designing this defense in depth model:
Layer 1: Token Protection
SecretStr (never accidentally logged)Layer 2: Input Validation
Layer 3: API Hardening
Layer 4: No Dangerous Operations
eval() or exec()Layer 5: Supply Chain Security
I documented all of this in SECURITY.md. If you’re building MCP servers, steal my threat model.
Cross-Platform by DesignMCP servers should work everywhere. Not just on my Linux workstation, but on macOS, Windows, in containers, in CI/CD pipelines. That drove several decisions:
Multiple installation methods:
uvx mcp-cloudflare-crunchtools (zero install, just run)pip install mcp-cloudflare-crunchtools (traditional)podman run quay.io/crunchtools/mcp-cloudflare (containerized)Python 3.10+ because it’s widely available and provides the type hinting features we wanted.
stdio transport because it’s universal—no ports, no firewalls, no networking complexity.
Container image built on Hummingbird—minimal footprint with low CVE exposure.
The First of ManyThis Cloudflare server establishes the template. Every Crunchtools MCP server going forward will share:
I’m already planning additional MCP servers for other services I use regularly. The goal is a library of MCP servers I can trust with production credentials—servers that work everywhere, follow security best practices, and are built on a foundation I’ve thought through carefully.
The code is written with Claude Code. The architecture is designed by humans. That combination moves fast without cutting corners.
Try The Containerclaude mcp add mcp-cloudflare-crunchtools \
--env CLOUDFLARE_API_TOKEN=your_token_here \
-- podman run -i --rm -e CLOUDFLARE_API_TOKEN quay.io/crunchtools/mcp-cloudflare
Try The Native Pythonclaude mcp add mcp-cloudflare-crunchtools \
--env CLOUDFLARE_API_TOKEN=your_token \
-- uvx mcp-cloudflare-crunchtoolsThen ask Claude to list your zones, create a DNS record, or purge your cache. If you have thoughts on security with MCP servers, please share them because I want to learn and improve these. I’m still learning in this space, and do not claim to be an expert. But, I do know that my intentions are better than many people creating and publishing MCP servers today! Now, I have Claude working on my next MCP server for WordPress, because I hate all of those that I’ve found as well!
Since publishing this article, we’ve released additional MCP servers following the same security-first architecture. Each one is built with the same principles: defense-in-depth security, cross-platform support, and Hummingbird container images.
View all available MCP servers →
You’ll find servers for Cloudflare, WordPress, Request Tracker, and more—all available via PyPI, container images, and GitHub.
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Доверить сервер ИИ-агенту и не пожалеть: как спать спокойно без SSH | 0 | 12.58 | 26-09-2026 |
| 2 | Turn 3CX Call Transcripts into AI Agent Knowledge | 0 | 4.7 | 15-09-2026 |
| 3 | ИИ-агенты в инвестициях: собираем Telegram-ассистента и торгового робота на MCP Т-Инвестиций | 0 | 14.39 | 26-09-2026 |
| 4 | Облачные провайдеры берут плату не за железо, а за лень ... | 0 | 11.1 | 27-09-2026 |
| 5 | RE: Creating a windows installer file like .msi to install DisplayFusion with Custom settings | 0 | 10 | 25-09-2026 |
| 6 | Sicherheitslücken: GitLab-Server sind für Schadcode-Attacken anfällig | 0 | 28.75 | 25-09-2026 |
| 7 | Designing an energy-efficient commercial greenhouse | 0 | 8.51 | 25-09-2026 |
| 8 | 3CX Licensing: Size the System, Not the User Count | 0 | 4.98 | 25-09-2026 |
| 9 | The Data Center Will Not Hold | 0 | 8.71 | 22-09-2026 |