Lorenzo Dal Col
← Blog

Why I am not a fan of MCPs

An MCP server gives a coding agent a fixed set of tools that someone else chose to wrap. For most of what I do I'd rather give the agent a shell, the CLI and the REST API, and let it work out the calls. That costs more tokens. It also lets the agent ask questions the server's author never thought of, which tend to be the ones I have.

The short version:

  • An MCP server only lets the agent ask what its author wrapped. With the CLI and REST it can reach the whole API, undocumented endpoints included.
  • Its tool definitions take up the model's context in every session, used or not. A CLI costs nothing until the agent runs it.
  • An MCP server clearly wins where there is no usable CLI or API: desktop apps, and web apps that are only a UI. Driving those through screenshots or page HTML costs more tokens than a few tools that expose the app's actions.
  • It can also keep an agent read-only, which a CLI login token can't, and it's the only way in where there's no shell.

Example: counting deploys

My sites run on Netlify, where every production deploy costs credits from a monthly allowance, and I wanted the agent to tell me before each push how many were left. Netlify's CLI was already installed. netlify api wraps their REST API, so one call gave the plan's credits and the billing period and another listed every deploy with its state and build time. There is no usage command, so the agent took the login token from the CLI's config file (I hadn't asked it to) and guessed at about twenty REST endpoints. Most came back 404; one of the few that answered had the bandwidth for the period. The balance itself is in no API at all, only in the dashboard, so the agent rebuilt it from deploys and bandwidth in a short Python script that now runs before every push.

Then I had the agent try Netlify's official MCP server on the same question. It has nine tools. The two for deploys both need a deploy ID you already have, so it can't list them, and there is nothing for usage. I assumed get-team would at least return the plan's credits, since it reads the same account. I was wrong. It returns eight fields, none of them the credits or the billing period.

Three nested boxes. The Netlify dashboard, reached with a browser, holds the credit balance. Inside it the REST API, reached with the CLI and REST, holds the deploy list and bandwidth. Inside that the MCP server, with 9 tools and 20 operations, holds neither.

Where the CLI and REST are better

The first case is the one above: any question the server's author didn't think to wrap. With a shell the agent reaches the whole API, endpoints the CLI doesn't list included, and when the answer isn't anywhere it can rebuild it from what is, as it did with the balance.

The second is what the tools cost before you use them. An MCP server's tool definitions go to the model at the start of every session, whether or not the session touches Netlify. Theirs come to about 13,000 characters. Some clients defer loading them until they're used; not all do. A CLI costs nothing until the agent runs --help.

Where an MCP is better

The main case is software with no API, only a GUI or a web page. The credit balance is like that: it's only in Netlify's dashboard. An agent can get there with a browser, but every step costs a page of HTML or a screenshot, and a dashboard takes a lot of steps. Here the token argument flips, and a server with a few tools for the app's actions is much cheaper. Netlify's doesn't expose the balance either, but that's what an MCP server is for.

The other case is limits. The token the agent used for the REST calls is my CLI login, and it can do anything my account can: netlify api lists 180 methods, deleteSite and cancelAccount among them. Netlify's MCP server splits its tools into readers and updaters and can't delete a site at all. For an agent working unwatched I'd allow the reader tools only. Permission rules on CLI commands don't do the same job, since the agent can call the REST API directly, as it did here.

I expected a third case and didn't get one. Netlify's server ships coding guidance, and its notes on forms cover the file whose deletion once broke a build of a site I look after. The same facts are in the public docs and in the build error, which is where the agent found the fix.

Side by side

MCP server CLI and REST
What the agent can ask What the author wrapped The whole API, undocumented endpoints included
Cost before it's used Tool definitions in every session Nothing until --help
Apps with only a GUI or web UI A few tools for the app's actions Screenshots or HTML at every step
Can be made read-only Yes, by allowing only reader tools Not really; the token can do anything

All of this assumes an agent with a shell, good enough to read --help and guess at a REST API. In a chat app with no shell the MCP server is the only way in, and a smaller model will probably do better with nine fixed tools than with 180 methods.

I help teams set up AI-assisted engineering workflows, MCP tooling included. See services.