When I built the MCP server for this project — it combines GitHub and DEV.to into a set of tools an agent can call — I had a decision to make before writing a single tool: talk to the low-level MCP protocol directly, or use FastMCP's decorator API. I've seen a few "your first MCP server" writeups lately walk through the low-level path because it's more "honest" about what MCP actually is under the hood — JSON-RPC over stdio, a capabilities handshake, typed request/response schemas. That's true, and it's a reasonable thing to want to understand. But I want to write about the other side: what it actually costs you in practice once you have more than one or two tools, because I went through both and the difference showed up fast.
what the low-level path actually asks you to write
Strip away the decorator and MCP is a JSON-RPC server. For every tool you add, you're responsible for:
Registering the tool's name, description, and a JSON Schema for its inputs in a list_tools handler
Writing a call_tool dispatcher that matches on tool name and unpacks arguments by hand






