MCP is the right answer when tools are reused across applications or model providers, when third parties supply integrations, or when you want a clean boundary between the agent and the systems it touches. That covers a lot of real cases.
It is the wrong answer more often than the enthusiasm suggests. For a single application calling three internal APIs it owns, MCP adds a protocol, a process boundary and a serialisation hop in exchange for reuse you will never claim — a direct function call is simpler, faster and easier to reason about.
It is also a poor fit for high-throughput deterministic work. If a step runs a million times a day and does not need a model to decide anything, it should be a pipeline, not a tool call. And where latency budgets are tight, the extra hop is a real cost against a benefit you may not need.
The useful test: would a second consumer of this tool ever exist? If yes, MCP earns its keep. If no, you are paying protocol overhead for architectural fashion.