{"slug": "when-you-don-t-need-mcp", "title": "When You Don't Need MCP", "summary": "A developer explains when Model Context Protocol (MCP) is unnecessary, comparing it with alternatives like function calling and CLI tools. The post highlights that MCP introduces context overhead and server resource consumption, and notes that models see no difference between MCP and function calling.", "body_md": "Most tutorials you'll come across explain what MCP is and why you should use it. After all that explanation, it's still hard to get an intuitive feel for the trade-offs. So today I'll flip the question around: when do you *not* need MCP? That's a better way to build intuition about it.\n\n**MCP (Model Context Protocol)** is an open protocol launched by Anthropic that lets AI applications (agents like Claude Code, Claude Desktop, OpenClaw) discover and call external tools, and read external resources, in a **unified way**.\n\nThat's the textbook definition. In practice, you can think of MCP as a kind of resource exposed to an agent. Before MCP existed, if you wanted an AI application to connect to services like Google Drive, GitHub, or Slack, **every single AI application** had to write its own integration code for every external service.\n\nMCP is essentially a \"standard socket\" defined for that connection.\n\nIf you skip MCP, you still have plenty of other options. The two most important ones:\n\n**Function calling:** OpenAI introduced function calling in 2023. It's actually simple — you pass a function signature to the LLM first.\n\n```\n{\n    \"name\": \"get_weather\",\n    \"description\": \"Get the current weather for a specified city\",\n    \"input_schema\": {\n        ...\n        \"properties\": {\"city\": {\"type\": \"string\"}},\n    }\n}\n```\n\nOnce the LLM knows a tool exists, if it decides during execution that it needs to call this external tool, the result's `content` will include an extra `tool_use` object, and `stop_reason` will also be set to `tool_use`. Like this:\n\n```\n{\n  \"content\": [\n    {\n      \"type\": \"tool_use\",\n      \"name\": \"get_weather\",\n      \"input\": {\"city\": \"new york\"}\n    }\n  ],\n  \"stop_reason\": \"tool_use\"\n}\n```\n\nThen you write the code yourself to actually implement the function call.\n\n```\nif response.stop_reason == \"tool_use\":\n    tool_use = response.content[-1]\n    // ... call the weather-lookup function\n```\n\nIn real-world work it's obviously less crude than this — you'd use a framework like LangChain.\n\n**CLI:** This is really just another form of **function calling** — except you expose exactly one tool, and you tell the LLM upfront that it's a bash shell, so it can write whatever command it wants. The advantage is you don't need to tell the LLM what bash can do or how to use it — the LLM has already read enough material to know how to write bash commands on its own.\n\nBut using a **CLI** comes with real risk, since permission control is hard to get right.\n\nFirst, you need to understand one thing: the model has no idea whether you're calling it through MCP or through function calling.\n\nFor example, when you register a weather-lookup tool, if you register it via MCP, here's what the model sees in its tools list:\n\n```\n{\n    \"name\": \"get_weather\",\n    \"description\": \"Get the current weather for a specified city\",\n    \"input_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"city\": {\"type\": \"string\"}\n        }\n    }\n}\n```\n\nIf you use function calling instead, here's what the model sees:\n\n```\n{\n    \"name\": \"get_weather\",\n    \"description\": \"Get the current weather for a specified city\",\n    \"input_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"city\": {\"type\": \"string\"}\n        }\n    }\n}\n```\n\nLet's play a little game: can you spot the difference between these two JSON blocks? The answer is there isn't one. So there's no need to agonize over whether MCP versus function calling affects the model somehow. As far as the model is concerned, there's no difference at all.\n\nIf MCP is so great, why not just use it everywhere? Because MCP does have real downsides:\n\n**Large context overhead:** Once you connect to an MCP server, the **full** schema (name, parameters, description) for *every* tool that server exposes gets stuffed into the model's context window up front — whether or not this particular conversation ever needs it.\n\n**Server resource consumption:** An MCP server is something that runs continuously and has to stay alive. The more MCP servers you spin up, the more CPU and memory they eat on your machine.\n\n**Operational burden:** Since an MCP server is a separate process, you're on the hook for restarting it when it crashes, sequencing startup order across multiple servers, and maintaining internal state over time.\n\nMCP sounds pretty rough so far. So why do so many companies keep using it anyway? Because despite its downsides, its biggest strength is unifying the integration interface across your project's resources. A unified interface brings two benefits on its own:\n\n**Cleaner calling code:** People who don't build software won't really feel this benefit, but anyone who does knows immediately how good a unified interface is. Your thousands of lines of legacy spaghetti code can suddenly collapse into a dozen lines. The more interfaces you have, the more bugs get buried, and buried deeper — maintenance becomes endless.\n\n**Easier third-party integration:** Once every third-party resource is packaged as MCP, integrating them no longer takes a lot of custom effort. There's nothing technically clever about this — it's the same idea as standardizing currency or units of measurement. What matters is that someone has to actually go do it.\n\nIf your situation matches one of the following:\n\nthen MCP is worth considering. Otherwise, a lighter-weight approach — like plain function calling — is enough.\n\nI'm CodePlato.\n\nI believe human creativity is the true tree of AI Coding. Code and models are only shadows projected onto the walls of the cave.\n\nX: @codeplato2026\n\n[https://x.com/codeplato2026](https://x.com/codeplato2026)", "url": "https://wpnews.pro/news/when-you-don-t-need-mcp", "canonical_source": "https://dev.to/codeplato/when-you-dont-need-mcp-8jc", "published_at": "2026-09-08 03:04:13+00:00", "updated_at": "2026-09-08 03:32:08.041290+00:00", "lang": "en", "topics": ["developer-tools", "artificial-intelligence", "large-language-models"], "entities": ["Anthropic", "MCP", "OpenAI", "LangChain", "Claude Code", "Claude Desktop", "OpenClaw"], "alternates": {"html": "https://wpnews.pro/news/when-you-don-t-need-mcp", "markdown": "https://wpnews.pro/news/when-you-don-t-need-mcp.md", "text": "https://wpnews.pro/news/when-you-don-t-need-mcp.txt", "jsonld": "https://wpnews.pro/news/when-you-don-t-need-mcp.jsonld"}}