Building with MCP, for Real

This year I built several Model Context Protocol (MCP) servers to support ongoing R&D. Here’s my report. But first, some context. What is MCP, and why am I using it? Why Am I Using MCP? MCP is an open-source standard for connecting AI applications to external systems. Here’s some detail from a recent article: “Mike Krieger, [MCP’s] chief product officer, says the idea came while linking Claude, its chatbot, to services like Gmail, an email platform, and GitHub, a repository of code. Instead of integrating each application with Claude on a case-by-case basis, the firm wanted a shared set of rules to help agents directly access a user’s emails or files.” — The Economist, “Intelligent Protocol,” Dec 13, 2025 ...

January 23, 2026

MCP Stdio and Stdout

In MCP server code using stdio, you can’t use any functions that print to stdout. In TypeScript, this means: console.log(errorMessage) // 🛑 Bad console.error(errorMessage) // 🟢 Good! The stdio transport only supports valid MCP messages. None of these stdout-conversationalists are allowed: print() statements in Python console.log() in JavaScript fmt.Println() in Go A smell that you’ve broken this rule are messages like this in your MCP server log: ==> /Claude/mcp.log <== 2025-12-30T16:31:32.702Z [error] [supercool-proj] Unexpected token 'I', "I "... is not valid JSON 2025-12-30T16:31:32.702Z [error] [supercool-proj] Unexpected token 'C', "Can't "... is not valid JSON 2025-12-30T16:31:32.702Z [error] [supercool-proj] Unexpected token 'R', "Read this"... is not valid JSON docs

December 30, 2025

Hello World from MCP!

Hello World! Today I’m posting a TIL using MCP (Model Context Protocol). I created this TIL with Claude Desktop and a local MCP server, which generated a markdown file. What did I learn? All of the steps leading up to the words you’re reading now. MCP docs

December 12, 2025