<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>mcpdone blog</title>
    <link>https://mcpdone.com/blog</link>
    <description>Notes on building with Claude Code: MCP servers, hooks, agents, and the operational side of shipping AI-first workflows.</description>
    <language>en</language>
    <atom:link href="https://mcpdone.com/feed.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Tue, 02 Jun 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>MCP transports: when stdio wins, when HTTP wins</title>
      <link>https://mcpdone.com/blog/mcp-stdio-vs-http</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/mcp-stdio-vs-http</guid>
      <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
      <description>An MCP server can talk to its client over stdio (subprocess) or HTTP/SSE/streamable-HTTP (network). The choice changes your auth model, your attack surface, your multi-tenancy story, and the kind of bugs you ship. Most builders default without thinking — here&#x27;s the decision matrix, the operational consequences of each transport, and when &quot;start stdio, migrate later&quot; is the right move.</description>
      <category>mcp</category>
      <category>transport</category>
      <category>architecture</category>
      <category>claude-code</category>
      <category>security</category>
    </item>
    <item>
      <title>BadHost (CVE-2026-48710): is your MCP server actually affected?</title>
      <link>https://mcpdone.com/blog/badhost-mcp-servers</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/badhost-mcp-servers</guid>
      <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
      <description>BadHost (CVE-2026-48710) is a Starlette flaw where a single crafted Host header bypasses path-based authorization — and Starlette powers FastAPI, vLLM, LiteLLM, and most HTTP-transport MCP servers. Here&#x27;s the precise blast radius for MCP operators (stdio servers aren&#x27;t exposed, HTTP/SSE servers are), how to check in 30 seconds, the fix, and why credential-rich MCP servers make this worse than its CVSS 6.5 suggests.</description>
      <category>mcp</category>
      <category>security</category>
      <category>starlette</category>
      <category>fastapi</category>
      <category>vulnerability</category>
      <category>claude-code</category>
    </item>
    <item>
      <title>Testing FastMCP servers: the layer hierarchy your unit tests miss</title>
      <link>https://mcpdone.com/blog/testing-fastmcp-servers</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/testing-fastmcp-servers</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <description>A taxonomy of the layers in a FastMCP server, what your existing tests probably cover (and don&#x27;t), and the minimum test set that would have caught every wrapper-layer bug we&#x27;ve shipped. Concrete patterns for each layer — assert tool shape, exercise the protocol, lint the anti-patterns — with copy-pasteable code.</description>
      <category>mcp</category>
      <category>fastmcp</category>
      <category>python</category>
      <category>testing</category>
      <category>claude-code</category>
    </item>
    <item>
      <title>What we learned shipping our first 4 MCP servers</title>
      <link>https://mcpdone.com/blog/shipping-four-mcp-servers</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/shipping-four-mcp-servers</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <description>Concrete patterns that emerged across mcp-content-opportunity, mcp-sqlite-query, mcp-gmail-reader, and mcp-twitter — what surprised us, what we&#x27;d do differently, and the seven non-obvious lessons that should be in any FastMCP project from the first commit.</description>
      <category>mcp</category>
      <category>fastmcp</category>
      <category>claude-code</category>
      <category>lessons-learned</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How much does an MCP server actually cost to build?</title>
      <link>https://mcpdone.com/blog/mcp-server-build-cost</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/mcp-server-build-cost</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <description>A grounded breakdown of the four cost dimensions of an MCP server — API call billing, hosting, build time, ongoing maintenance — with real numbers from four shipped servers in 2026. When DIY makes sense, when hiring is cheaper, and the hidden costs most teams don&#x27;t price in.</description>
      <category>mcp</category>
      <category>claude-code</category>
      <category>pricing</category>
      <category>cost-analysis</category>
      <category>build-vs-buy</category>
    </item>
    <item>
      <title>The FastMCP wrapper-layer bug your unit tests won&#x27;t catch</title>
      <link>https://mcpdone.com/blog/fastmcp-wrapper-layer-bug</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/fastmcp-wrapper-layer-bug</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <description>A FastMCP @mcp.tool() with sync def + asyncio.run() inside passes every unit test, then breaks at the first protocol call with &quot;asyncio.run() cannot be called from a running event loop.&quot; Here&#x27;s why, the fix, the AST lint that catches it across any FastMCP project, and the broader principle — test the wrapper layer, not just the inner functions.</description>
      <category>mcp</category>
      <category>fastmcp</category>
      <category>python</category>
      <category>testing</category>
      <category>bugs</category>
      <category>asyncio</category>
    </item>
    <item>
      <title>Skills, subagents, slash commands — a decision tree for Claude Code</title>
      <link>https://mcpdone.com/blog/skills-agents-slash-commands</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/skills-agents-slash-commands</guid>
      <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
      <description>Three customisation mechanisms in Claude Code that people conflate constantly. When to reach for each, what they cost, and the one anti-pattern that ruins all three.</description>
      <category>claude-code</category>
      <category>skills</category>
      <category>agents</category>
      <category>slash-commands</category>
    </item>
    <item>
      <title>Production-grade MCP servers: the three things every open-source one gets subtly wrong</title>
      <link>https://mcpdone.com/blog/production-mcp-servers</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/production-mcp-servers</guid>
      <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
      <description>A field guide to building MCP servers you&#x27;d actually put in a team&#x27;s shared config. Error handling, testing strategy, deployment patterns — and the failure modes I see in almost every MCP server on GitHub right now.</description>
      <category>mcp</category>
      <category>claude-code</category>
      <category>python</category>
      <category>testing</category>
      <category>production</category>
    </item>
    <item>
      <title>I built an MCP server to triage my sales inbox. It can read and draft — but it literally cannot send.</title>
      <link>https://mcpdone.com/blog/mcp-server-to-triage-my-sales-inbox</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/mcp-server-to-triage-my-sales-inbox</guid>
      <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
      <description>A case study in deliberate constraint. Building a Claude Code MCP server for Gmail that reads one label, drafts replies to the Drafts folder, and has no capability to send or delete — three independent safety layers, 55 tests, and a design I&#x27;d trust on a shared account.</description>
      <category>mcp</category>
      <category>claude-code</category>
      <category>gmail</category>
      <category>imap</category>
      <category>python</category>
      <category>security</category>
    </item>
    <item>
      <title>Claude Code hooks that don&#x27;t break your workflow</title>
      <link>https://mcpdone.com/blog/claude-code-hooks-that-dont-break-your-workflow</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/claude-code-hooks-that-dont-break-your-workflow</guid>
      <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
      <description>Four rules for writing Claude Code hooks that catch real problems without annoying you into disabling them. With two working hook scripts (secret-blocking + bash logging) you can drop in today.</description>
      <category>claude-code</category>
      <category>hooks</category>
      <category>python</category>
      <category>workflow</category>
    </item>
    <item>
      <title>The Claude Code deny-list most teams skip (and how it eliminates a class of disasters)</title>
      <link>https://mcpdone.com/blog/the-claude-code-deny-list-most-teams-skip</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/the-claude-code-deny-list-most-teams-skip</guid>
      <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
      <description>Why a five-line deny list in your .claude/settings.json is the cheapest foot-gun protection in Claude Code, what to put in it, and how it interacts with hooks.</description>
      <category>claude-code</category>
      <category>security</category>
      <category>settings</category>
      <category>hooks</category>
    </item>
    <item>
      <title>I built an MCP server to plan this blog. Here&#x27;s the code, the ranking logic, and the first 10 ideas it surfaced.</title>
      <link>https://mcpdone.com/blog/i-built-an-mcp-server-to-plan-this-blog</link>
      <guid isPermaLink="true">https://mcpdone.com/blog/i-built-an-mcp-server-to-plan-this-blog</guid>
      <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
      <description>A walkthrough of building a Model Context Protocol server that mines Hacker News and Reddit for content opportunities, ranks them with a simple 5-signal heuristic, and surfaces ten unanswered questions developers are asking about Claude Code and MCP.</description>
      <category>mcp</category>
      <category>claude-code</category>
      <category>python</category>
      <category>indie-building</category>
    </item>
  </channel>
</rss>
