Don't Put an LLM Behind an MCP Server

opwizardx1 pts0 comments

Don't Put an LLM Behind an MCP Server | Ryan Spletzer

Skip to content

Giovanni Domenico Tiepolo, Public domain, via Wikimedia Commons.

Hi-diddly-ho, neighborino!<br>Greetings from the AI ice cream shop,<br>where I’m sad to say they’re all out of the tokenmaxxing flavor,<br>and the new flavor of the day is tokenomics.1

But tokenomics is the subject of another blog post.

Today’s post is about some nerdy technical stuff,<br>so if that’s not your jam,2<br>feel free to bop around to another part of the internet,<br>but I promise you there is a gem here worth considering,<br>as well as several solid pop culture references, as usual.

With that, let’s dig in…

Suffice it to say,<br>I’ve had enough of some of the shenanigans<br>people have gotten up to<br>with MCP servers lately.

I recently tried a CLI tool from a vendor<br>(who shall not be named, but you have definitely heard of them),<br>which essentially wraps an MCP server<br>(so you can either use this tool via CLI or via MCP directly).<br>I called the CLI from Claude Code,<br>which is a recommended way to use this tool.<br>I asked a simple question about some simple data<br>that lives in the vendor’s system behind it all,<br>the kind of lookup that any reasonable API answers<br>in a few hundred milliseconds<br>(and the vendor’s own native APIs are exceedingly good at answering quickly).<br>Instead, the CLI’s request to its backing MCP server<br>waited on a hidden thinking loop,<br>and I sat there watching my local agent wait for another hidden remote “agent” to think,<br>for double-digit seconds,<br>long enough to ponder the entirety of the meaning of life.

The frustrating part is that I saw this coming.<br>Many months ago I was writing an engineering strategy,<br>and in it I warned our teams that putting an LLM behind an MCP server<br>was the wrong impulse,<br>because it would be hella slow.3<br>At the time I could only predict the issue on paper.<br>This vendor’s CLI confirmed my fears in practice,<br>and now I point to it as a live example of what not to do.

Putting an LLM behind a Model Context Protocol (MCP) server,<br>then calling it from an MCP client that is itself an agent with its own LLM,<br>breaks the social contract of what MCP was designed to be for users of these tools:<br>a way for agent clients to query data and provide context to the model.<br>It was never meant to facilitate communication with yet another model or agent.<br>Protocols for exactly that have since emerged—A2A<br>and ACP among them—but<br>nobody driving a Claude Code session<br>that calls out to a CLI or an MCP server<br>is expecting an LLM on the other end of that call.

Somewhere along the way, some of us in this industry lost our minds.<br>I sure hope we find them.

Don’t do this.<br>Don’t put an LLM behind an MCP server.

The anti-est of patterns

The anti-pattern looks like this:<br>an MCP server exposes a tool,<br>but the tool’s implementation is feeding a prompt to another model.<br>Your agent calls something like get_insights(question),<br>and behind the curtain a second model—one you didn’t choose,<br>running a system prompt you can’t read,<br>over context you can’t see—generates prose<br>and returns it as the tool result.<br>Sometimes it goes further,<br>and the “tool” is a whole agent with its own loop, tools, and retries.

It’s matryoshka nesting-doll architecture (and not in a good way):<br>you open the tool and there’s another model inside.

It doesn’t help that people confuse MCP servers with agents.<br>AI hype swirls,<br>and in a weird way it works itself into real architecture:<br>a leader erroneously asks for an “MCP agent,”<br>a development team living under a rock vibe codes the misinterpretation,<br>and now they have a Frankenagent on their hands.

On a slide, this looks and sounds sophisticated.<br>Why settle for a dumb pipe when the server itself can think?<br>In practice it breaks the contract that makes MCP useful in the first place.<br>Ian Malcolm had the diagnosis back in 1993:<br>your engineers<br>were so preoccupied with whether or not they could, they didn’t stop to think if they should.

MCP delivers data, not decisions

The whole point of MCP is to deliver context from external systems<br>and let the client agent drive:<br>the agent decides what it needs,<br>expresses that intent through tool parameters,<br>gets results back,<br>and does the reasoning itself.<br>Tools work best when they behave like queries and commands—parameterized,<br>predictable, and inspectable.<br>I’ve written before about<br>applying CQRS’s ask-versus-act split to agent tools,<br>and the same discipline applies here:<br>a tool should either fetch something or do something,<br>and in both cases the agent should be able to trust what came back.

An LLM behind the tool inverts that relationship.<br>The server now decides what your agent gets to know.<br>A database row is checkable.<br>A search result carries its source with it.4<br>A hidden model’s summary is an opinion wearing data’s clothes,<br>and your agent will treat it as ground truth,<br>because tool results land in the context window<br>with the authority of being a “fact.”5

Two models, compounding failure

Egon Spengler’s rule applies here:<br>don’t...

agent tool server behind model another

Related Articles