When does MCP make sense vs CLI?

(ejholmes.github.io)

191 points | by ejholmes 6 hours ago

64 comments

  • umairnadeem123
    2 hours ago
    > I tried to avoid writing this for a long time, but I'm convinced MCP provides no real-world benefit

    IMO this is 100% correct and I'm glad someone finally said it. I run AI agents that control my entire dev workflow through shell commands and they are shockingly good at it. the agent figures out CLI flags it has never seen before just from --help output. meanwhile every MCP server i've used has been a flaky process that needs babysitting.

    the composability argument is the one that should end this debate tbh. you can pipe CLI output through jq, grep it, redirect to files - try doing that with MCP. you can't. you're stuck with whatever the MCP server decided to return and if it's too verbose you're burning tokens for nothing.

    > companies scrambled to ship MCP servers as proof they were "AI first"

    FWIW this is the real story. MCP adoption is a marketing signal not a technical one. 242% growth in MCP servers means nothing if most of them are worse than the CLI that already existed

    • kaydub
      1 hour ago
      I avoid most MCPs. They tend to take more context than getting the LLM to script and ingest ouputs. Trying to use JIRA MCP was a mess, way better to have the LLM hit the API, figure out our custom schemas, then write a couple scripts to do exactly what I need to do. Now those scripts are reusable, way less context used.

      I don't know, to me it seems like the LLM cli tools are the current pinnacle. All the LLM companies are throwing a ton of shit at the wall to see what else they can get to stick.

      • icanintospace
        17 minutes ago
        I have had some positive experiences using the Jira and Confluence MCPs. However, I use a third-party MCP because my company has a data centre deployment of Jira and Confluence, which the official Atlassian MCP does not support.

        My use case was for using it as an advanced search tool rather than for creating tickets or documentation. Considering how poor the Confluence search function is, the results from Confluence via an MCP-powered search are remarkably good. I was able to solve one or two obscure, company-specific issues purely by using the MCP search, and I'm convinced that finding these pages would have been almost impossible without it.

    • fny
      20 minutes ago
      I hate MCP servers

      That said the core argument for MCP servers is providing an LLM a guard-railed API around some enterprise service. A gmail integration is a great example. Without MCP, you need a VM as scratch space, some way to refresh OAuth, and some way to prevent your LLM from doing insane things like deleting half of your emails. An MCP server built by trusted providers solves all of these problems.

      But that's not what happened.

      Developers and Anthropic got coked up about the whole thing and extended the concept to nuts and bolts. I always found the example servers useless and hilarious.[0] Unbelievably, they're still maintained.

      [0]: https://github.com/modelcontextprotocol/servers/tree/main/sr...

    • binsquare
      2 hours ago
      Fully agree.

      MCP servers were also created at a time where ai and llms were less developed and capable in many ways.

      It always seemed weird we'd want to post train on MCP servers when I'm sure we have a lot of data with using cli and shell commands to improve tool calling.

      • MrDarcy
        23 minutes ago
        It’s telling the best MCP implementations are those which are a CLI to handle the auth flow then allow the agent to invoke it and return results to stdout.

        But even those are not better for agent use than the human cli counterpart.

    • jrm4
      9 minutes ago
      This was my gut from the beginning. If they can't do "fully observable" or "deterministic" (for what is probably a loose definition of that word) -- then, what's the point?
    • femiagbabiaka
      1 hour ago
      How do you segregate the CLI interface the LLM sees versus a human? For example if you’d like the LLM to only have access to read but not write data. One obvious fix is to put this at the authz layer. But it can be ergonomic to use MCP in this case.
      • jyaohao
        43 minutes ago
        I’ve been testing with an ENV variable for a cli tool for LLMs that I’m making. Basically, I have a script that sets an ENV variable to launch the TUI that I want and that ENV variable changes the behavior for LLMs if they run it (changes the -h output, changes the default output format to json to make it easier to grep)
    • ejholmes
      2 hours ago
      Thanks for reading! And yes, if anyone takes anything away from this, it's around composition of tools. The other arguments in the post are debatable, but not that one.
      • p_ing
        2 hours ago
        MCP provides a real-world benefit. Namely anyone of any skill level who can create agents is able to use them. CLI? Nope.
    • juped
      1 hour ago
      Tools eat up so much context space, too. By contrast the shell tool is trained into Claude.
  • wenc
    3 hours ago
    MCPs (especially remote MCPs) are like a black box API -- you don't have to install anything, provision any resources, etc. You just call it and get an answer. There's a place for that, but an MCP is ultimately a blunt instrument.

    CLI tools on the other hand are like precision instruments. Yes, you have to install them locally once, but after that, they have access to your local environment and can discover things on their own. There are two CLIs are particularly powerful for working with large structured data: `jq` and `duckdb` cli. I tell the agent to never load large JSON, CSV or Parquet files into context -- instead, introspect them intelligently by sampling the data with said CLI tools. And Opus 4.6 is amazing at this! It figures out the shape of the data on its own within seconds by writing "probing" queries in DuckDB and jq. When it hits a bottleneck, Opus 4.6 figures out what's wrong, and tries other query strategies. It's amazing to watch it go down rabbit holes and then recovering automatically. This is especially useful for doing exploratory data analysis in ML work. The agent uses these tools to quickly check data edge cases, and does a way more thorough job than me.

    CLIs also feel "snappier" than MCPs. MCPs often have latency, whereas you can see CLIs do things in real time. There's a certain ergonomic niceness to this.

    p.s. other CLIs I use often in conjunction with agents:

    `showboat` (Simon Willison) to do linear walkthroughts of code.

    `br` (Rust port of Beads) to create epics/stories/tasks to direct Opus in implementing a plan.

    `psql` to probe Postgres databases.

    `roborev` (Wes McKinney) to do automatic code reviews and fixes.

    • itintheory
      1 hour ago
      > you have to install them locally once

      or install Docker and have the agent run CLI commands in docker containers that mount the local directory. That way you essentially never have to install anything. I imagine there's a "skill" that you could set up to describe how to use docker (or podman or whatever) for all CLI interactions, but I haven't tried yet.

    • leohart
      2 hours ago
      I have also found this as well. CLI outputs text and input text in an interactive manner, exactly the way that is most conducive to text-based-text-trained LLM.

      I do believe that as vision/multi-modal models get to a better state, we would see even crazier interaction surfaces.

      RE: duckdb. I have a wonderful time with ChatGPT talking to duckdb but I have kept it to inmemory db only. Do you set up some system prompt that tell it to keep a duckdb database locally on disk in the current folder?

      • wenc
        1 hour ago
        > RE: duckdb. I have a wonderful time with ChatGPT talking to duckdb but I have kept it to inmemory db only. Do you set up some system prompt that tell it to keep a duckdb database locally on disk in the current folder?

        No, I don't use DuckDB's database format at all. DuckDB for me is more like an engine to work with CSV/Parquet (similar to `jq` for JSON, and `grep` for strings).

        Also I don't use web-based chat (you mentioned ChatGPT) -- all these interactions are through agents like Kiro or Claude Code.

        I often have CSVs that are 100s of MBs and there's no way they fit in context, so I tell Opus to use DuckDB to sample data from the CSV. DuckDB works way better than any dedicated CSV tool because it packs a full database engine that can return aggregates, explore the limits of your data (max/min), figure out categorical data levels, etc.

        For Parquet, I just point DuckDB to the 100s of GBs of Parquet files in S3 (our data lake), and it's blazing fast at introspecting that data. DuckDB is one of the best Parquet query engines on the planet (imo better than Apache Spark) despite being just a tiny little CLI tool.

        One of the use cases is debugging results from an ML model artifact (which is more difficult that debugging code).

        For instance, let's say a customer points out a weird result in a particular model prediction. I highlight that weird result, and tell Opus to work backwards to trace how the ML model (I provide the training code and inference code) arrived at that number. Surprisingly, Opus 4.6 is does a great job using DuckDB to figure out how the input data produced that one weird output. If necessary, Opus will even write temporary Python code to call the inference part of the ML model to do inference on a sample to verify assumptions. If the assumptions turn out to be wrong, Opus will change strategies. It's like watching a really smart junior work through the problem systematically. Even if Opus doesn't end up nailing the actual cause, it gets into the proximity of the real cause and I can figure out the rest. (usually it's not the ML model itself, but some anomaly in the input). This has saved me so much time in deep-diving weird results. Not only that, I can have confidence in the deep-dive because I can just run the exact DuckDB SQL to convince myself (and others) of the source of the error, and that it's not something Opus hallucinated. CLI tools are deterministic and transparent that way. (unlike MCPs which are black boxes)

  • buremba
    1 hour ago
    There is nothing wrong with MCP, it's just that stdio MCP was overengineered.

    MCP's Streamable HTTP with OAuth discovery is the best way to ship AI integration with your product nowadays. CLIs require sandboxing, doesn't handle auth in a standard way and it doesn't integrate to ChatGPT or Claude.

    Look at Sentry, they just ship a single URL https://mcp.sentry.dev/mcp and you don't need anything else. All agents that supports MCP lets you click a link to login to Sentry and they make calls to Sentry to fetch authentificated data.

    The main problem with MCP is the implementation. Instead of using bash to call MCP, agents are designed to make single MCP tool calling which doesn't allow composability. We solve this problem with exposing MCP tools as HTTP endpoints and it works like charm.

    • CharlieDigital
      14 minutes ago
      This is my take as well.

      Way easier to set up, centralized auth and telemetry.

      Just use it for the right use cases.

  • rimeice
    2 hours ago
    Very good points, but, I think this blog is pretty focussed on the developer use case for LLMs. It makes a lot more sense in chat style interfaces for connecting to non-dev tools or services with non technical users, if anything just from a UX perspective.
    • quectophoton
      1 hour ago
      Thank you, I was going to say something like this. I've been reading all the comments here and thinking, "do ChatGPT/LeChat/etc even allow running CLIs from their web or mobile interfaces?".
      • jngiam1
        1 hour ago
        Exactly. and even if so, how are you going to safe guard tool access?

        Imagine your favorite email provider has a CLI for reading and sending email - you're cool with the agent reading, but not sending. What are you going to do? Make 2 API keys? Make N API keys for each possible tool configuration you care about?

        MCPs make this problem simple and easy to solve. CLIs don't.

        I don't think OpenClaw will last that long without security solved well - and MCPs seem to be obvious solution, but actively rejected by that community.

  • drdaeman
    3 hours ago
    This is like comparing OpenAPI and strings (that may be JSON). That is, weird, and possibly even meaningless.

    MCP is formally defined in the general sense (including transport protocols), CLI is not. I mean, only specific CLIs can be defined, but a general CLI is only `(String, List String, Map Int Stream) -> PID` with no finer semantics attached (save for what the command name may imply), and transport is “whatever you can bring to make streams and PIDs work”. One has to use `("cli-tool", ["--help"], {1: stdout})` (hoping that “--help” is recognized) to know more. Or use man/info (if the CLI ships a standardized documentation), or some other document.

    But in the they’re both just APIs. If the sufficient semantics is provided they both do the trick.

    If immediate (first-prompt) context size is a concern, just throw in a RAG that can answer what tools (MCPs or CLIs or whatever) exist out there that could be useful for a given task, rather than pushing all the documentation (MCP or CLI docs) proactively. Or, well, fine tune so the model “knows” the right tools and how to use them “innately”.

    Point is, what matters is not MCP or CLI but “to achieve X must use F [more details follow]”. MCP is just a way to write this in a structured way, CLIs don’t magically avoid this.

    • fasbiner
      2 hours ago
      I would spend less time with theory and more time with practice to understand what people are getting at. MCP and CLI could, in theory, be the same. But in practice as it stands today, they are not.

      > MCP is just a way to write this in a structured way,

      Nope! You are not understanding or are actively ignoring the difference which has been explained by 20+ comments just here. It's not a controversial claim, it's a mutually agreed upon matter of fact by the relevant community of users.

      The claim you're making right now is believed to be false, and if you know something everyone else doesn't, then you should create an example repo that shows the playwright CLI and playwright MCP add the same number of tokens to context and that both are equally configurable in this respect.

      If you can get that right where so many others have failed, that would be a a really big contribution. And if you can't, then you'll understand something first-hand that you weren't able to get while you were thinking about theoretically.

      • FINDarkside
        1 hour ago
        > then you should create an example repo that shows the playwright CLI and playwright MCP add the same number of tokens to context and that both are equally configurable in this respect

        That's just implementation detail of how your agent harness decides to use MCP. CLI and MCP are on different abstraction layers. You can have your MCP available through CLI if you wish so.

    • drecked
      2 hours ago
      CLI tools are designed to provide complete documentation using —help. Given LLMs are capable of fully understanding the output then how is the MCP standardization any better than the CLI —help standardization?
  • Robdel12
    36 minutes ago
    YES, I have been thinking the same and wrote a bit about it: https://vizzly.dev/blog/cli-json-output-llm-friendly/

    Thank you so much to the GH CLI for making me realize this, really. The only MCPs I use still are ones that don’t have CLIs. Hell, I even just wrote a CLI for Bear Notes, for LLMs. It’s just better.

    Seems like the last MCP use case is model to model communication but I’m sure others have approach’s for that?

    • ejholmes
      7 minutes ago
      Great read. Thanks for sharing. 100% agree, `—json | jq` is where it’s at.
  • goranmoomin
    4 hours ago
    I can't believe everyone is talking about MCP vs CLI and which is superior; both are a method of tool calling, it does not matter which format the LLM uses for tool calling as long as it provides the same capabilities. CLIs might be marginably better (LLMs might have been trained on common CLIs), but MCPs have their uses (complex auth, connecting users to data sources) and in my experience if you're using any of the frontier models, it doesn't really matter which tool calling format you're using; a bespoke format also works.

    The difference that should be talked about, should be how skills allow much more efficient context management. Skills are frequently connected to CLI usage, but I don't see any reason why. For example, Amp allows skills to attach MCP servers to them – the MCP server is automatically launched when the Agent loads that skill[0]. I belive that both for MCP servers and CLIs, having them in skills is the way for efficent context, and hoping that other agents also adopt this same feature.

    [0]: https://ampcode.com/manual#mcp-servers-in-skills

    • goodmythical
      4 hours ago
      >as long as it provides the same capabilities.

      That's fine if you definition of capabilities is wide enough to include model understanding of the provided tool and token waste in the model trying to understand the tool and token waste in the model doing things ass backwards and inflating the context because it can't see the vastly shorter path to the solution provided by the tool and...

      There is plenty of evidence to suggest that performance, success rates, and efficiency, are all impacted quite drastically by the particular combination of tool and model.

      This is evidenced by the end of your paragraph in which you admit that you are focused only on a couple (or perhaps a few) models. But even then, throw them a tool they don't understand that has the same capabilities as a tool they do understand and you're going to burn a bunch of tokens watching it try to figure the tool out.

      Tooling absolutely matters.

      • goranmoomin
        3 hours ago
        > model understanding of the provided tool and token waste in the model trying to understand the tool and token waste in the model doing things ass backwards and inflating the context because it can't see the vastly shorter path to the solution provided by the tool and...

        > But even then, throw them a tool they don't understand that has the same capabilities as a tool they do understand and you're going to burn a bunch of tokens watching it try to figure the tool out.

        What I was trying to say was that this applies to both MCPs and CLIs – obviously, if you have a certain CLI tool that's represented thoroughly through the model's training dataset (i.e. grep, gh, sed, and so on), it's definitely beneficial to use CLIs (since it means less context spending, less trial-and-error to get the expected results, and so on).

        However if you have a novel thing that you want to connect to LLM-based Agents, i.e. a reverse enginnering tool, or a browser debugging protocol adapter, or your next big thing(tm), it might not really matter if you have a CLI or a MCP since LLMs are both post-trained (hence proficent) for both, and you'll have to do the trial-and-error thing anyway (since neither would represented in the training dataset).

        I would say that the MCP hype is dying out so I personally won't build a new product with MCP right now, but no need to ditch MCPs for any reason, nor do I see anything inherently deficient in the MCP protocol itself. It's just another tool-calling solution.

    • ejholmes
      2 hours ago
      > both are a method of tool calling, it does not matter which format the LLM uses for tool calling as long as it provides the same capabilities.

      MCP tool calls aren't composable. Not the same capabilities. Big difference.

    • kaydub
      1 hour ago
      Yeah, I've gotta use skills more. I didn't quite get it until this last week when I used a skill that I made. I didn't know the skill got pulled into context ONLY for the single command being ran with the skill, I thought the skill got pulled into context and stayed there once it was called.

      That does seem very powerful now that I've had some time to think about it.

      • user3939382
        40 minutes ago
        Or you could argue that if the assistant needs so much modular context your tools are defective.
    • jeremyjh
      4 hours ago
      No, it really matters because of the impact it has on context tokens. Reading on GH issue with MCP burns 54k tokens just to load the spec. If you use several MCPs it adds up really fast.
      • goranmoomin
        3 hours ago
        The impact on context tokens would be more of a 'you're holding it wrong' problem, no? The GH MCP burning tokens is an issue on the GH MCP server, not the protocol itself. (I would say that since the gh CLI would be strongly represented in the training dataset, it would be more beneficial to just use the CLI in this case though.)

        I do think that we should adopt Amp's MCPs-on-skills model that I've mentioned in my original comment more (hence allowing on-demand context management).

      • nextaccountic
        3 hours ago
        In the front page there's a project that attempts to reduce tje boilerplate of mcp output in claude code

        Eventually I hope that models themselves become smarter and don't save the whole 54k tokens in their context window

      • ashdksnndck
        4 hours ago
        Verbosity of the output seems orthogonal to the cli vs mcp distinction? When I made mcp tools and noticed a lot of tokens being used, I changed the default to output less and added options to expose different kinds of detailed info depending what the model wants. CLI can support similar behavior.
    • sophiabits
      3 hours ago
      > the MCP server is automatically launched when the Agent loads that skill

      The main problem with this approach at the moment is it busts your prompt cache, because LLMs expect all tool definitions to be defined at the beginning of the context window. Input tokens are the main driver of inference costs and a lot of use cases aren't economical without prompt caching.

      Hopefully in future LLMs are trained so you can add tool definitions anywhere in the context window. Lots of use cases benefit from this, e.g. in ecommerce there's really no point providing a "clear cart" tool to the LLM upfront, it'd be nice if you could dynamically provide it after item(s) are first added.

      • goranmoomin
        3 hours ago
        > The main problem with this approach at the moment is it busts your prompt cache, because LLMs expect all tool definitions to be defined at the beginning of the context window.

        TBH I'm not really sure how it works in Amp (I never actually inspected how it alters the prompts that are sent to Anthropic), but does it really matter for the LLMs to have the tool definitions at the beginning of the context window in contrast to the bottom before my next new prompt?

        I mean, skills also work the same way, right? (it gets appended at the bottom, when the LLM triggers the skill) Why not MCP tooling definitions? (They're basically the same thing, no?)

    • vojtapol
      4 hours ago
      MCP needs to be supported during the training and trained into the LLM whereas using CLI is very common in the training set already. Since MCP does not really provide any significant benefits I think good CLI tools and its use by LLMs should be the way forward.
      • FINDarkside
        1 hour ago
        This is very developer centric. While Github might have good CLI, there's absolutely no point in having most services develop CLIs and have their non-technical users install those. Not only is it bad UX, but it's bad from security perspective as well. This is like arguing that Github shouldn't have GraphQL/Rest api since everyone should use the CLI.
    • avaer
      4 hours ago
      MCP vs CLI is the modern version of people discussing the merits of curly braces vs significant whitespace.

      That is, I don't think we're gonna be arguing about it for very long.

  • jackfranklyn
    3 hours ago
    The token budget angle is what makes this a real architectural decision rather than a philosophical one.

    I've been using both approaches in projects and the pattern I've landed on: MCP for anything stateful (db connections, authenticated sessions, browser automation) and CLI for stateless operations where the output is predictable. The reason is simple - MCP tool definitions sit in context permanently, so you're paying tokens whether you use them or not. A CLI you can invoke on demand and forget.

    The discovery aspect is underrated though. With MCP the model knows what tools exist and what arguments they take without you writing elaborate system prompts. With CLI the model either needs to already know the tool (grep, git, curl) or you end up describing it anyway, which is basically reinventing tool definitions.

    Honestly the whole debate feels like REST vs GraphQL circa 2017. Both work, the answer depends on your constraints, and in two years we'll probably have something that obsoletes both.

    • bartek_gdn
      2 hours ago
      What about --help? Isn't that a perfect parallel to discovery of available tools in an MCP server?
      • superturkey650
        2 hours ago
        Yup. I’ve been using CLIs with skills that define some common workflows I use and then just tell Claude to use —help for understanding how to use it. Works perfectly and I end up writing the documentation in a way that I would for any other developer.
  • CuriouslyC
    5 hours ago
    There's been an anti-MCP pro-CLI train going for a while since ~May of last year (I've been personally beating this drum since then) but I think MCP has a very real use case.

    Specifically, MCP is a great unit of encapsulation. I have a secure agent framework (https://github.com/sibyllinesoft/smith-core) where I convert MCPs to microservices via sidecar and plug them into a service mesh, it makes securing agent capabilities really easy by leveraging existing policy and management tools. Then agents can just curl everything in bash rather than needing CLIs for everything. CLIs are still slightly more token efficient but overall the simplicity and the power of the scheme is a huge win.

  • rcarmo
    1 hour ago
    This feels misguided. MCP is still one of the best ways to execute deterministic sub-flows (i.e., stepwise processes) and secure tooling that an LLM would either lose itself while executing or should never access directly.
    • plufz
      1 hour ago
      Im still struggling with understanding when MCP works better. I move everything to cli after a while. Can you give me more concrete examples? Because I don’t doubt you, I just don’t understand.
      • fastball
        1 hour ago
        Most APIs and CLIs are not setup with clear separation of permissions, and when they have those permissions are mostly designed around human access patterns and risks, not LLM ones. The primary example of course being read-only vs write access.

        MCPs have provided any easy way to side-step that baggage.

        e.g. in an MCP, you have tools, those tools are usually binned into "read" vs "write". Given that, I can easily configure my tooling to give an LLM (e.g. Claude Code) unlimited read access to some system (by allowing all read-only tools) without likewise giving the LLM write/destructive access.

        Obviously you can design APIs/CLIs with this in mind, but up until now that has not been a primary concern so they haven't.

  • phpnode
    5 hours ago
    I don't doubt that CLIs + skills are a good alternative to MCP in some contexts, but if you're building an app for non-developers and you need to let users connect it to arbitrary data sources there's really no sensible, safe path to using CLIs instead. MCP is going to be around for a long time, and we can expect it to get much better than it is today.
    • sigmoid10
      5 hours ago
      >we can expect it to get much better than it is today

      Which is not a high bar to clear. It literally only got where it is now because execs and product people love themselves another standard, because if they get their products to support it they can write that on some excel sheet as shipped feature and pin it on their chest. Even if the standard sucks on a technical level and the spec changes all the time.

      • phpnode
        4 hours ago
        This is excessively cynical, it's a useful tool despite its shortcomings.
    • simianwords
      5 hours ago
      Why? The llm can install cli through apt-get or equivalent and non developers wouldn’t need to know
      • phpnode
        5 hours ago
        well I'm sure you can understand the dangers of that, and why that won't work if your app is hosted and doesn't run on users' local machines
      • oldestofsports
        4 hours ago
        What non developer would have apt installed on their device though
  • goodmodule
    2 hours ago
    I somehow agree with this but want to add my two cents here. Cloudflare's Codemode[0] is a great "replacement" for MCP because AI is trained for writing code and handling errors. But it also doesn't fix security and sandboxing. For CLI and file operations we have Vercel's just-bash[1] but for everything else there is no safe solution. Therefore MCP still makes sense until somebody sandboxes this part as well without needing to use Cloudflare or something.

    [0]: https://developers.cloudflare.com/agents/api-reference/codem... [1]: https://github.com/vercel-labs/just-bash

  • deadf00d
    27 minutes ago
    IMO the biggest issue with CLIs for agents is to know when the agent is allowed to type. When is the command fully proceed, and next tokens can now be generated.
  • juanre
    4 hours ago
    Reports of MCP's demise have been greatly exaggerated, but a CLI is indeed the right choice when the interface to the LLM is not a chat in a browser window.

    For example, I built https://claweb.ai to enable agents to communicate with other agents. They run aw [1], an OSS Go CLI that manages all the details. This means they can have sync chats (not impossible with MCP, but very difficult). It also enables signing messages and (coming soon) e2ee. This would be, as far as I can tell, impossible using MCP.

    [1] https://github.com/awebai/aw

  • sebast_bake
    3 hours ago
    The opposite is true. CLI based integration does not exist in a single consumer grade ai agent product that I’m aware of. CLI is only used in products like Claude Claude and OpenClaw that are targeting technically competent users.

    For the other 99% of the population, MCP offers security guardrails and simple consistent auth. Much better than CLI for the vast majority of use cases involving non-technical people.

  • hkbuilds
    1 hour ago
    I've been building tools that use both approaches and the answer really depends on the context.

    MCP shines when you need stateful, multi-step interactions - things like browsing a codebase, running tests iteratively, or managing deployment pipelines where each step depends on the last.

    CLI wins when the task is well-defined and atomic. "Run this audit", "deploy this thing", "format this file." No ambiguity, no state to maintain.

    The trap I see people falling into: using MCP for everything because it's new and shiny, when a simple CLI wrapper would be faster, more reliable, and easier to debug. The best tools I've built combine both - CLI for the happy path, MCP for the exploratory/interactive path.

  • xenodium
    2 hours ago
    I've yet to play with Emacs MCPs thoroughly. Having said that, after initial exposure to agent skills directing agents to just use CLI/emacsclient, I no longer think I need to go deeper into MCP. emacsclient via CLI has been working remarkably well. Did a little video on that https://www.youtube.com/watch?v=ymMlftdGx4I
  • aaurelions
    1 hour ago
    When we give LLM access to the terminal, LLM doesn't need anything else. LLM already knows all the commands, and there's no need to waste context on MCP. When we tell it to use a new command, it can get `--help` as needed.
  • iamspoilt
    4 hours ago
    As a counter argument to the kubectl example made in the article, I found the k8s MCP (https://github.com/containers/kubernetes-mcp-server) to be particularly usefuly in trying to restrict LLM access to certain tools such as exec and delete tools, something which is not doable out of box if you use the kubectl CLI (unless you use the --as or --as-group flags and don't tell the LLM what user/usergroup those are).

    I have used the kk8s MCP directly inside Github Copilot Chat in VSCode and restricted the write tools in the Configure Tools prompt. With a pseudo protocol established via this MCP and the IDE integration, I find it much safer to prompt the LLM into debugging a live K8s cluster vs. without having any such primitives.

    So I don't see why MCPs are or should be dead.

  • stldev
    1 hour ago
    I've found MCP is great for stacking claude code instances- https://github.com/cduerr/stewardmcp has legit been a useful tool for me, and more reliable than handing a single instance 100k lines of code over a dozen repos.
  • simonw
    4 hours ago
    MCP makes sense when you're not running a full container-based Unix environment for your agent to run Bash commands inside of.
  • bloppe
    1 hour ago
    I've been thinking about this a lot lately in terms of my personal clauding, and it's hard for me to think of a scenario where an mcp server makes more sense than CLI tools and AGENTS.md. But if you're deploying an agentic product, it's probably different. Seems like you could just deploy little Bash sandboxes for each customer. Or you could deploy mcp servers. The latter feels much easier to reason about in terms of attack surface and potential side effects.
  • g947o
    2 hours ago
    If the author is just using Claude Code on their own personal computer, they can do whatever they want.

    As soon as there is a need to interact with the outside world in a safe, controlled manner at enterprise scale, the limitations of CLI quickly become obvious.

    I wish people get more informed about a subject before they write a long blog post about it.

    • ejholmes
      2 hours ago
      You're right, but it still doesn't mean MCP was a good design even in that space. We could've done better.
    • Mapsmithy
      2 hours ago
      Here’s your chance to educate us. It’s not at all obvious what sorts of limitations you’re talking about.
  • cjonas
    1 hour ago
    MCPs are useful to deploy internally as an agent tool gateway for your organization or customers. That's a totally different use case than how most of us interact with agents (claude code / cursor). That said, there's only limited benefit over just using OpenAPI.
  • mikkelam
    2 hours ago
    For me, GitHub CLI is the prime example of this. This CLI is so incredibly powerful when combined with regular command line tools. Agents know how to use head, tail, jq and so on to only extract the parts it needs.

    The best selling point of CLIs is the ability to chain, transform and combine. MCP cannot do this.

  • nemo1618
    1 hour ago
    This will happen with GUIs as well, once computer-use agents start getting good. Why bother providing an API, when people can just direct their agent to click around inside the app? Trillions of matmuls to accomplish the same result as one HTTP request. It will be glorious. (I am only half joking...)
    • CloakHQ
      1 hour ago
      Half joking, sure, but the "click around the app" problem is already real for teams running browser automation at scale. The issue isn't the clicks themselves - it's that every Chrome instance looks identical to a bot detector the moment you spin up ten of them from the same machine. The fingerprint (canvas, WebGL, navigator properties, etc.) is basically screaming "I'm automated". Dealing with this from the ops side: the headache isn't writing the automation, it's keeping each browser session isolated enough that sites don't treat them as the same entity. MCP or CLI doesn't really change that underlying problem.
  • medi8r
    59 minutes ago
    To be fair to MCP it came out 150 years ago, in November 2024. Agents were running on steam and coal then with Sam Altman shovelling the furnace.
  • jngiam1
    1 hour ago
    I think if you want background agents with sandboxes and well scoped permissions, you want MCP to be your data protocol and security layer.

    If you’re vibing and doing the open claw thing without any security concerns; then you’re absolutely right.

  • entrustai
    1 hour ago
    The CLI vs MCP debate is about input ergonomics — how the agent invokes tools. Both sides are arguing about the left side of the pipeline.

    The harder unsolved problem is the right side: what happens to the output before it becomes consequential action. Neither a CLI nor an MCP server tells you whether the text the agent just generated is compliant, scoped, or admissible. That enforcement problem exists regardless of which invocation pattern you prefer.

    The best CLI in the world doesn't help you when the agent produces a clinical summary that omits a contraindication or a financial disclosure that drifts outside regulatory bounds. That's a different layer entirely — and it's mostly being ignored while everyone argues about transport protocols.

  • baq
    3 hours ago
    Remote MCP solve the distribution problem just like everyone uses web apps for everything nowadays instead of desktop apps. Local MCP servers make as much sense as local web apps.
  • recursivedoubts
    5 hours ago
    MCP has one thing going for it as an agentic API standard: token efficiency

    The single-request-for-all-abilities model + JSON RPC is more token efficient than most alternatives. Less flexible in many ways, but given the current ReAct, etc. model of agentic AI, in which conversations grow geometrically with API responses, token efficiency is very important.

    • ejholmes
      2 hours ago
      But they're not token efficient. Take the terraform example from the post. Plan JSON is massive. You're not saving tokens by using a Terraform MCP and shoving an entire plan into context. Composition allows for efficient token use.
    • SOLAR_FIELDS
      4 hours ago
      But the flip side of this is that the tools themselves take up a ton of token context. So if you have one mcp it’s great but there is an upper bound that you hit pretty quick of how many tools you can realistically expose to an agent without adding some intermediary lookup layer. It’s not compact enough of a spec and doesn’t have lazy loading built into it
      • harrall
        4 hours ago
        Yes but I consider that just a bug in the agents that use MCP servers.

        It could just be fixed to compress the context or the protocol could be tweaked.

        Switching to CLIs is like buying a new car because you need an oil change. Sure, in this case, the user doesn’t get to control if the oil change can be done, but the issue is not the car — it’s that no one will do the relatively trivial fix.

        • dnautics
          4 hours ago
          you know what you could do? You could write a skill that turns mcps on or off!
    • ako
      4 hours ago
      I've been creating a cli tool with a focus on token efficiency. Dont see why cli could not be as token efficient as mcp. The cli has the option to output ascii, markdown and json.
      • recursivedoubts
        4 hours ago
        I'm working on a paper on this, if you are using a hypermedia-like system for progressive revelation of functionality you are likely to find that this chatty style of API is inefficient compared with an RPC-like system. The problem is architectural rather than representational.

        I say this as a hypermedia enthusiast who was hoping to show otherwise.

      • bear3r
        3 hours ago
        the output format (ascii/json/markdown) is one piece, but the other side is input schema. mcp declares what args are valid and their types upfront, so the model can't hallucinate a flag that doesn't exist. cli tools don't expose that contract unless you parse --help output, which is fragile.
        • ako
          3 hours ago
          So far, cli --help seems to work quite well. I'm optimizing the cli to interact with the agent, e.g., commands that describe exactly what output is expected for the cli DSL, error messages that contain DSL examples that exactly describe the agent how to fix bugs, etc. Overall i think the DSL is more token efficient that a similar JSON, and easier to review for humans.
          • bear3r
            1 hour ago
            fair point on token efficiency -- dsls are usually tighter than json. where i see mcp still winning is tool discovery: the client learns what tools exist and what args they take without having to try calling them first or knowing the commands upfront. with cli you have to already know the tool exists.
  • bartek_gdn
    2 hours ago
    I've come to the same conclusion as op, created a CLI tool to work with Chrome sessions. It works well, and I'm planning to do some token comparison on this vs an MCP approach. https://news.ycombinator.com/item?id=47207790
  • mrshu
    1 hour ago
    It really seems the primary benefit of MCP servers was to force companies to establish some externally exposed APIs if/when they did not have them.
  • bikeshaving
    4 hours ago
    I keep asking why the default Claude tools like Read(), Write(), Edit(), MultiEdit(), Replace() tools aren’t just Bash() with some combination of cat, sed, grep, find. Isn’t it just easier to pipe everything through the shell? We just need to figure out the permissions for it.
    • fcarraldo
      4 hours ago
      Because the Tools model allows for finer grained security controls than just bash and pipe. Do you really want Claude doing `find | exec` instead of calling an API that’s designed to prevent damage?
      • arbll
        4 hours ago
        It might be the wrong place to do security anyway since `bash` and other hard-to-control tools will be needed. Sandboxing is likely the only way out
        • jitl
          1 hour ago
          not for every user or use case. when developing of course i run claude —-do-whatever-u-want; but in a production system or a shared agent use case, im giving the agent least privilege necessary. being able to spawn POSIX processes is not necessary to analyze OpenTelemetry metric anomalies.
      • webstrand
        4 hours ago
        yeah, I would rather it did that. You run Claude in a sandbox that restricts visibility to only the files it should know about in the first place. Currently I use a mix of bwrap and syd for filtering.
    • rfw300
      4 hours ago
      Making those tools first-class primitives is good for (human) UX: you see the diffs inline, you can add custom rules and hooks that trigger on certain files being edited, etc.
      • bikeshaving
        2 hours ago
        I’ve found that humans are pretty good at reading through the output of bash commands. And Claude Code keeps insisting on truncating the output for some reason.
  • nicoritschel
    1 hour ago
    MCPs were always for chat apps, not coding agents. Benefit is auth for normies + can serve UI through ChatGPT + Claude.
  • mavam
    3 hours ago
    Why choose if you can have both? You can turn any MCP into an CLI with Pete's MCPorter: https://mcporter.dev.

    Since I've just switched from buggy Claude Code to pi, I created an extension for it: https://github.com/mavam/pi-mcporter.

    There are still a few OAuth quirks, but it works well.

  • morissette
    1 hour ago
    I’ve been using the command line tools except for teams integration which I use MCP for
  • appsoftware
    4 hours ago
    ?? I'm using my own remote MCP server with openclaw now. I do understand the use case for CLI. In his Lex Friedman interview the creator highlights some of the advantages of CLI, such as being able to grep over responses. But there are situations where remote MCP works really well, such as where OAuth is used for authentication - you can hit an endpoint on the MCP server, get redirected to authenticate and authorise scopes etc and the auth server then responds to the MCP server.
  • novaleaf
    1 hour ago
    genuine question: how would you turn a debugger-mcp into a CLI? do CLI tools used in agents have the concept of persistence?
  • _pdp_
    2 hours ago
    https://github.com/mcpshim/mcpshim - converts MCPs to CLI - best of both worlds
  • jitl
    1 hour ago
    on the other hand, MCP/tools style lets me run specialized agents without needing to give them a bash-like unix environment. Vercel makes a fake bash simulator but if i’m trying to run an agent that analyzes production telemetry, it’s a hell of a lot easier to do that safely with just MCP
  • p_ing
    4 hours ago
    Tell my business users to use CLI when they create their agents. It's just not happening. MCP is point-and-click for them.

    MCP is far from dead, at least outside of tech circles.

  • brumar
    3 hours ago
    For personnal agents like claude code, clis are awesome.

    In web/cloud based environment, giving a cli to the agent is not easy. Codemode comes to mind but often the tool is externalized anyway so mcp comes handy. Standardisation of auth makes sense in these environments too.

  • AznHisoka
    4 hours ago
    In terms of what companies are actually implementing, MCP isnt dead by a long time. Number of companies with a MCP server grew 242% in the last 6 months and is actually accelerating (according to Bloomberry) [1]

    https://bloomberry.com/blog/we-analyzed-1400-mcp-servers-her...

    • lakrici88284
      4 hours ago
      Companies are usually chasing last year's trend, and MCP makes for an easy "look, were adopting AI!" bullet point.
      • AznHisoka
        4 hours ago
        Right, but even if this is just a matter of "chasing a trend", it does have a network effect and makes the entire MCP ecosystem much more useful to consumers, which begets more MCP servers.
  • 827a
    2 hours ago
    Advancing capability in the models themselves should be expected to eat alive every helpful harness you create to improve its capabilities.
  • wrs
    2 hours ago
    And for anything at all complicated, what’s even better than a CLI is a JS or Python library so the thing can just write code.
  • the_mitsuhiko
    4 hours ago
    > OpenClaw doesn’t support it. Pi doesn’t support it.

    It's maybe not optimal to conclude anything from these two. The Vienna school of AI agents focuses on self extending agents and that's not really compatible with MCP. There are lots of other approaches where MCP is very entrenched and probably will stick around.

  • ejholmes
    3 hours ago
    Hi friends! Author here. This blew up a bit, so some words.

    The article title and content is intentionally provocative. It’s just to get people thinking. My real views are probably a lot more balanced. I totally get there’s a space where MCP probably does actually make sense. Particularly in areas where CLI invocation would be challenging. I think we probably could have come up with something better than MCP to fill that space, but it’s still better than nothing.

    Really all I want folks to take away from this is to think “hmm, maybe a CLI would actually be better for this particular use case”. If I were to point a finger at anything in particular, it would be Datadog and Slack who have chosen to build MCP’s instead of official CLI’s that agents can use. A CLI would be infinitely better (for me).

    • g947o
      2 hours ago
      "intentionally provocative"

      I would almost use the words "intentionally uninformed" instead.

      There are huge holes in the article (as pointed out by many comments here), and I have to wonder if you genuinely don't have enough experience with MCP to bring them up, or you intentionally omitted them to make the arguments for CLI.

      • ejholmes
        2 hours ago
        I get it. This is coming from a place where I see MCP's being adopted, where CLI is (in my opinion) better. Particularly where you're already in a CLI environment, and tool composition is necessary. I'm sure there's plenty of folks that aren't operating in that environment.
    • csheaff
      3 hours ago
      Thank you for writing this. I've had similar thoughts myself and have been teetering back and forth between MCP and skills that invoke CLI. I'm hoping this creates a discussion that points to the right pattern.
  • orange_joe
    5 hours ago
    This doesn't really pay attention to token costs. If I'm making a series of statically dependent calls I want to avoid blowing up the context with information on the intermediary states. Also, I don't really want to send my users skill.md files on how to do X,Y & Z.
    • krzyk
      5 hours ago
      Why? MCP and CLI is similar here.

      You need agent to find MCP and what it can be used for (context), similarly you can write what CLI use for e.g. jira.

      Rest is up to agent, it needs to list what it can do in MCP, similarly CLI with proper help text will list that.

      Regarding context those tools are exactly the same.

      • lmeyerov
        4 hours ago
        This feels right in theory and wrong in practice

        When measuring speed running blue team CTFs ("Breaking BOTS" talk at Chaos Congress), I saw about a ~2x difference in speed (~= tokens) for a database usage between curl (~skills) vs mcp (~python). In theory you can rewrite the mcp into the skill as .md/.py, but at that point ... .

        Also I think some people are talking past one another in these discussions. The skill format is a folder that supports dropping in code files, so much of what MCP does can be copy-pasted into that. However, many people discussing skills mean markdown-only and letting the LLM do the rest, which would require a fancy bootstrapping period to make as smooth as the code version. I'd agree that skills, when a folder coming with code, does feel like largely obviating MCPs for solo use cases, until you consider remote MCPs & OAuth, which seem unaddressed and core in practice for wider use.

    • phpnode
      5 hours ago
      the article only makes sense if you think that only developers use AI tools, and that the discovery / setup problem doesn't matter
      • trollbridge
        5 hours ago
        But that's the current primary use case for AI. We aren't anywhere close to being able to sanitise input from hostile third parties enough to just let people start inputting prompts to my own system.
        • phpnode
          4 hours ago
          there's a whole world of AI tools out there that don't focus on developers. These tools often need to interact with external services in one way or another, and MCP gives those less technical users an easy way to connect e.g. Notion or Linear in a couple of clicks, with auth taken care of automatically. CLIs are never replacing that use case.
  • Nevin1901
    4 hours ago
    This is actually the first use case where I agree with the poster. really interesting, especially for technical people using ai. why would you spend time setting up and installing an mcp server when u can give it one man page
  • ddp26
    4 hours ago
    I don't understand the CLI vs MCP. In cli's like Claude Code, MCPs give a lot of additional functionality, such as status polling that is hard to get right with raw documentation on what APIs to call.
  • ako
    4 hours ago
    Biggest downside of CLI for me is that it needs to run in a container. You're allowing the agent to run CLI tools, so you need to limit what it can do.
    • wolttam
      4 hours ago
      It gets significantly harder to isolate the authentication details when the model has access to a shell, even in a container. The CLI tool that the model is running may need to access the environment or some credentials file, and what's to stop the model from accessing those credentials directly?

      It breaks most assumptions we have about the shell's security model.

    • tuwtuwtuwtuw
      4 hours ago
      Couldn't that be solved by whitelisting specific commands?
      • g947o
        2 hours ago
        Give it a try, and challenge yourself (or ChatGPT) to break it.

        You'll quickly realize that this is not feasible.

      • wolttam
        4 hours ago
        Such a mechanism would need to be implemented at `execve`, because it would be too easy for the model to stuff the command inside a script or other executable.
  • vladdoster
    2 hours ago
    Thoughts on Agent Context Protocol (ACP)?
  • lukol
    5 hours ago
    Couldn't agree more. Simple REST APIs often do the job as well. MCP felt like a vibe-coded fever dream from the start.
  • lasgawe
    4 hours ago
    I don't know about this. I use AI, but I've never used or tried MCP. I've never had any problems with the current tools.
    • I_am_tiberius
      4 hours ago
      That's the way my 80 year old grandpa talks.
  • rvz
    4 hours ago
    MCPs were dead in the water and were completely a bad standard to begin with. The hype around never made sense.

    Not only it had lots of issues and security problems all over the place and it was designed to be complicated.

    For example, Why does your password manager need an MCP server? [0]

    But it still does not mean a CLI is any better for everything.

    [0] https://news.ycombinator.com/item?id=44528411

  • dnautics
    4 hours ago
    what honestly is the difference between an mcp and a skill + instructions + curl.

    Really it seems to me the difference is that an mcp could be more token-efficient, but it isn't, because you dump every mcp's instructions all the time into your context.

    Of course then again skills frequently doesn't get triggered.

    just seems like coding agent bugs/choices and protocol design?

    • ejholmes
      2 hours ago
      Author here! Biggest difference is composition. MCP tools don't chain (there's people trying to fix that, but it's still true right now).
  • whatever1
    4 hours ago
    First they came for our RAGs, now for our MCPs. What’s next ?
  • SignalStackDev
    4 hours ago
    [dead]
  • aplomb1026
    4 hours ago
    [dead]
  • nimbus-hn-test
    5 hours ago
    [dead]
  • mudkipdev
    4 hours ago
    This got renamed right in front of my eyes
  • mt42or
    5 hours ago
    I remember this kind of people against Kubernetes the same exact way. Very funny.
    • tedk-42
      4 hours ago
      Same clowns complaining that `npm install` downloads the entire internet.

      Now it's completely fine for an AI agent to do the same and blow up their context window.