RSS Amplifier

Alex Fadeev · Aug 5, 2026

Choosing Between Agent Tooling Layers in 2026

0
Sign in to vote or save

Alex Fadeev · Alex Fadeev

AI agent teams keep arguing about the wrong boundary. One group treats command-line tooling as the only serious option because it is fast, composable, and already deeply familiar to language models. Another group insists schema-driven integrations are the real path forward because they handle permissions, SaaS access, and enterprise workflows far better. 📌 Both camps are identifying real problems. Both are also overextending their conclusions.

The useful answer is not “pick one.” In practice, solid agent systems choose the transport per integration, not once for the entire product. A local debugging workflow and a multi-user SaaS workflow do not have the same constraints, so forcing them through one mechanism is usually a mistake.

There is a second point that matters even more: the interface quality presented to the model matters more than the wire protocol underneath it. Teams often stop after choosing a transport and never design the model-facing layer carefully. That is where reliability, token efficiency, and business usefulness are won or lost. 🚀

Production systems have already moved in this direction. Developer-facing tools and non-technical business agents alike are increasingly built with both command execution and schema-based integrations underneath, hidden behind a higher-level abstraction such as Skills. The model calls the Skill. The Skill picks the right transport. The user gets the outcome without needing to care how the plumbing worked.

There are really two decisions here.

Your agent will probably need both approaches.

Use CLI when the tool runs locally, or when a mature vendor CLI already exists, authentication can be prepared in advance, and the workflow benefits from piping or shell composition. This works especially well with ecosystems like AWS, GitHub, and GCP.

Use MCP-style integrations when the service has no usable CLI, needs OAuth or dynamic auth across many users, or the workflow is stateful and spans multiple structured steps. That is where standardized schemas, RBAC, and auditability become valuable.

No matter which transport you pick, the model should see:

  • Small initial context, not giant schema payloads

  • Lazy discovery, where details load only when needed

  • Compact structured output, often better as concise text than giant JSON blobs

  • Business-aware defaults, not raw APIs with every option exposed

That second layer is what Skills provide. They hide the transport, reduce cognitive noise, and shape the work in a way the model can actually use.

Humans see a difference in syntax. Models see a difference in where knowledge comes from.

To a model, CLI often looks like one general-purpose execution function such as execute_bash_command or subprocess.run. The model writes a command, runs it, and reads stdout or stderr.

The important part is that the model already carries prior knowledge about tools like grep, awk, git, jq, and duckdb from training. It usually does not need the whole interface injected in advance. If it needs more detail, it can request it at runtime with --help. That makes startup effectively free from a context perspective.

This fits model behavior unusually well. Shell tools emit short, line-oriented, text-friendly output. One practitioner reported reducing token usage to about 60% of the previous amount by changing verbose JSON into plain text. 🛠️ Text streams are not just cheaper; they are often easier for the model to reason through.

With MCP, the model is given tool definitions, resources, and prompts through structured schemas. Instead of guessing flags or arguments, it gets an explicit contract: which function exists, what parameters it needs, and which types are valid.

That improves correctness for unfamiliar APIs. The tradeoff is that this knowledge is injected into context rather than already living in the model’s weights. The more you inject, the more expensive the session becomes.

That distinction, pretrained knowledge versus runtime schema injection, drives most of the tradeoffs around latency, cost, and architecture.

The complaint that schema-based integrations are bloated is not invented. It is measurable. But the story needs nuance.

A typical MCP server may expose 90+ tools with full schemas on connect. For a GitHub-style integration, that can mean about 55,000 tokens before the agent does useful work.

At roughly $3.00 per 1M input tokens on Claude 3.5 Sonnet, that works out to about $0.16 per session. At 10,000 sessions per day, that becomes roughly $1,600 daily just to load tool definitions. ⚠️

Now compare that with a CLI workflow using gh.

The agent can start from zero context, ask for only what it needs:

gh issue create --help

That help output might cost about 200 tokens. Then it runs:

gh issue create --title "Fix bug" --body "..."

Total cost: under 500 tokens.

The savings come from using model prior knowledge and asking for specifics only at the moment of action.

CLI advocates often push the point too far. A 55,000-token startup is usually a sign of a poorly designed server, not an unavoidable property of the protocol.

Teams running servers with 120+ tools have shown that a hierarchical design can expose only a small introduction at startup and load detailed schemas only on request. In other words, the same lazy-loading pattern that makes CLI efficient can also be applied here.

Most implementations do not do this, because dumping everything up front is easier to build. That is a design failure, not a protocol inevitability. ✅ A better model will not fix a bad interface.

For a one-off action, 50–100ms of serialization overhead is barely noticeable. But once the agent enters a tight loop, the cost compounds.

If the task involves scanning 50 files, iterating through logs, or repeatedly querying a dataset, CLI has a physics advantage. Shell pipelines can chain multiple steps into one execution. A model can search, transform, filter, and aggregate in one call.

A concrete illustration came from an example involving 150 order IDs with an API that accepts only one ID per request. Through MCP, the agent would make 150 tool calls, expanding both latency and context. With CLI, the model can write a loop, parse the responses, and compute the total in one shot. Roughly 500 tokens total, or about 1% of the heavier approach. 📌

The takeaway is simple:

  • For high-frequency local loops or data processing, CLI usually wins.

  • For complex but infrequent structured API calls, the schema cost may be worth paying.

The most common architectural mistake is choosing at the system level: “we are a CLI shop” or “we are an MCP shop.” That is the wrong abstraction boundary.

The stronger pattern is to evaluate each tool in your catalog against three factors.

This shapes the product experience, not the transport for every tool underneath.

A developer working inside a terminal values visibility, speed, and easy verification. Someone tracing predictions in a local DuckDB database can read stack traces and wants direct control.

A business user in chat needs explicit confirmations like “Ticket #111 created,” sensible permission prompts, and no raw shell output.

But do not collapse that into “developers get CLI, business users get MCP.” That framing is too shallow. A business-facing product may still rely on CLI heavily behind the scenes. If the user asks for spreadsheet generation, CSV processing, or document formatting, the system may run Python, bash, and file-processing utilities without ever showing the terminal. The Skill hides it. 🛠️

User type affects the product surface. It does not dictate the transport for every tool.

This is the main driver of transport selection.

Searching logs, reading files, querying a local database, scanning a repo. No extra auth layer, no remote hop, fast file access.

CLI is the obvious fit.

This category is often misclassified. Remote does not automatically mean schema-based integration.

Tools like aws, gcloud, az, gh, Stripe CLI, Vercel, and Fly.io already provide mature interfaces. If the user is a developer, credentials are pre-configured, and the environment is sandboxed properly, an agent can run commands like aws s3 ls, pipe the result through jq, and continue naturally.

In that scenario, CLI still wins. It is remote, but it remains composable and operationally efficient.

This is where MCP earns its place.

Business-critical systems like Salesforce, HubSpot, Notion, and Asana often either lack a CLI or make multi-user setup painful. Once you scale across 50 users and 20 services, CLI auth becomes fragmented fast. Different config files, different login patterns, different token locations, different browser flows.

A schema-driven layer with OAuth discovery and dynamic client registration gives you one standardized integration path.

In that setting, MCP is the better fit, especially when delegated access and many users are involved. 🔐

Think: “Find timeout errors from the last hour and count unique IP addresses.”

This is the shell’s natural habitat. grep, awk, sort, uniq, and jq form a mature composability grammar. The convenience is nice, but the bigger point is reliability. These interfaces have been hardened across decades and millions of real users.

That matters even more for models. They have seen huge volumes of shell pipelines during training. They do not just know the tools. They know the patterns. They can often compose new chains because the grammar already exists in their weights. 🚀

Schema-based tool chaining does not have that advantage. MCP has no built-in equivalent to pipes, and newer composability layers are still early. You are betting on brand-new orchestration patterns instead of a workflow model refined over roughly 50 years.

For composable, text-transform-heavy workflows, CLI wins on speed, reliability, and model familiarity.

Now consider: create a Jira ticket, verify it exists, post the link to Slack, then update a project board.

That is not a good fit for unstructured text streams alone. The task depends on structured outputs, explicit state, and reliable step-to-step handoff.

This is where MCP wins. It is better suited for workflows that are transactional, stateful, and cross-service. ✅

After transport decisions are made, the harder problem remains: what should the model actually see?

A smart schema-based wrapper can outperform a bad shell wrapper. A well-guided CLI Skill can outperform a bloated server that dumps 54,000+ tokens into context immediately. Protocol matters, but design quality matters more.

Connect a large Jira-style server and the model may see 400+ endpoints. That burns tokens and creates confusion. The model does not need the full surface just to open a ticket.

Give the model generic shell access and it still does not know your team’s defaults, naming conventions, required fields, or project-specific rules. It may guess, ask too many questions, or misuse authentication.

A Skill wraps the underlying transport with business context and a limited task-specific interface. The model sees only what matters: the relevant fields, sensible defaults, and a constrained path to completion.

Here is the Finance ticket example:

skill:
name: create_finance_ticket
description: "Creates a ticket in the Finance board. Use for expense/invoice issues."
# Business context (injected automatically)
context:
project_key: "FIN"
priority: "High"
reporter: "{{user.email}}"
# Transport layer (abstracted from the LLM)
implementation:
type: mcp # Could be CLI, the agent doesn't know or care
endpoint: jira-mcp-server
tool_name: create_issue
# Only these fields are exposed to the LLM
exposed_parameters:
- summary
- description

Instead of loading an entire server, the model gets a narrow task wrapper. Token load can drop from roughly 55,000 to around 300, while preserving reliability from the structured backend. 📌

This asymmetry matters.

When a Skill wraps a CLI tool, it can describe a goal and let the model improvise the pipeline using patterns it already understands from training.

For example, it can derive a shell flow like:

aws cloudwatch ... | jq '.[] | select(.status == "FAILED")' | sort | uniq -c

The Skill supplies context and constraints. The model handles composition.

When a Skill wraps MCP, it usually needs to be more explicit. There is no built-in pipe grammar and little training support for chaining such tools. If the Skill does not define the sequence clearly, the agent may fall back to multiple round-trips: call one tool, inspect output, call the next.

That is not inherently wrong. In fact, it is often the right tradeoff for stateful workflows. But for data transformation or iterative analysis, CLI-backed Skills often perform better because they exploit a composability system the model already knows.

1. Keep startup context minimal. Do not load complete tool catalogs upfront. 2. Support on-demand discovery. Let the model ask which tools exist before loading details. 3. Prefer concise outputs. JSON is often more verbose than helpful. 4. Inject business context. Defaults, scopes, naming rules, and constraints should be built in. 5. Make the interface stable even if the transport changes. If you replace an MCP backend with an optimized CLI implementation later, the model-facing Skill should stay the same.

That last point is strategically important. It prevents transport changes from forcing prompt rewrites or behavioral retraining.

The security argument is often framed badly. It is not accurate to say CLI is insecure and MCP is secure.

CLI has strong, mature primitives: OS permissions, filesystem ACLs, AppArmor, SELinux, restricted accounts, and robust credential handling in tools like aws, gh, and gcloud.

MCP also requires real setup: OAuth scopes, token refresh, RBAC, and careful policy definitions. A sloppy MCP configuration can be just as dangerous as a sloppy CLI environment. ⚠️

What actually matters is where and how the agent runs.

This is where CLI security works well. OS-level permissions and pre-configured credentials are often enough. Adding MCP on top does not automatically create more safety.

Now you need per-user permissions and delegated auth across many services. That is difficult to manage with many unrelated CLI auth systems. MCP’s auth model is much more helpful here.

For SOC2, ISO 27001, or HIPAA-style requirements, you need queryable logs showing what happened, for whom, and when. MCP’s structured request-response format gives you that more naturally:

{"tool": "create_user", "params": {"email": "..."}}

{"status": "success", "id": "111"}}

CLI can be wrapped to produce equivalent audit trails, but you must build that instrumentation yourself.

This is the biggest modern risk regardless of transport. The dangerous combination is the agent having access to secrets, the ability to run code, and the ability to send data over the network. That risk does not care whether the action went through CLI or MCP. The answer is environment isolation: sandboxing, secret separation, network egress controls, and never exposing raw credentials directly to the model. 🔐

A strong Skill layer can help here too. A Skill can define not only what the agent may do, but also who can invoke it, which scopes apply, and what must be logged.

Some practitioners see MCP as a bridge rather than the final form. That framing is useful.

As context windows get larger and cheaper, the startup tax from loading schemas will matter less. A 55,000-token load that costs $0.16 now may be closer to $0.01 in about 18 months.

But the need for business-aware interfaces, auditability, and secure capability boundaries will only grow. That means the compounding value is not in one protocol winning. It is in building a good interface layer above the transport. ✅

The broader trend supports this. Conversion tools are emerging that turn MCP servers into CLI-friendly execution paths. The pattern is revealing: use MCP for discovery and auth, use CLI for efficient execution, and wrap the whole thing in Skills.

That is not rejection of MCP. It is recognition that registry and execution are different concerns.

Separate them into categories:

  • Local: git, grep, ls, Python scripts, DuckDB, jq

  • Remote/SaaS: GitHub, Slack, Linear, Jira, Salesforce

For each one, ask:

  • Where does it run?

  • How is auth handled?

  • Is the workflow composable or stateful?

Do not force a single answer across the whole system. A mixed catalog is normal.

For every tool, whether CLI or MCP:

  • expose only the needed parameters

  • inject business defaults

  • keep output compact

  • avoid showing raw transport details to the main agent prompt

For CLI, pre-authenticate the environment and keep secrets out of plain model-readable environment variables.

For MCP, route token acquisition through a centralized auth layer so the model receives capability, not raw credentials.

If compliance may matter later, start now.

MCP gives you much of the structure by default. CLI needs wrapper tooling that logs command, timestamp, user context, and an output hash.

The fight between CLI and MCP focuses on plumbing when the real architecture question lives higher up.

In effective agent systems, CLI handles local processing and remote services with excellent vendor CLIs. MCP handles SaaS integrations without strong CLIs, delegated auth, and structured multi-step workflows. That part is usually straightforward once you judge each tool by environment and workflow.

The harder and more consequential decision is the model-facing interface. Minimal context, lazy loading, concise output, built-in business rules, and stable abstractions are what make the system work well. Skills are the pattern that ties those pieces together.

So stop trying to crown one transport for the entire stack. Choose at the integration level. Hide the implementation behind Skills. Build for the workflow, not for ideology. 🚀

Use CLI when the tool is local or when a mature vendor CLI exists, auth is already configured, and the workflow benefits from composition or looping. Use MCP when you need multi-user OAuth, the service has no strong CLI, or the workflow is stateful and structured.

Yes, and strong systems usually do. The better pattern is to hide both behind a Skill layer so the model interacts with one stable interface.

They expose only what is needed for the task. A Jira-style Skill may expose just 2–3 fields, roughly 300 tokens, instead of loading an entire API surface of around 55,000 tokens.

The most dangerous setup is when the agent can access secrets, execute code, and make network requests at the same time. That risk is about deployment design, not about whether you chose CLI or MCP.

No. CLI has mature OS-level controls and solid credential tooling. MCP has advantages for delegated auth and auditability, especially in multi-user or compliance-heavy environments. Which one is safer depends on where the agent is deployed.

Not for one-off calls. But in repeated loops, iterative queries, and file-heavy processing, CLI usually has a meaningful speed advantage because the overhead compounds less.

Partly both, but mostly implementation quality matters. Hierarchical and lazy-loaded servers can narrow the gap substantially. Skills make that discipline the default.

🔍 TL;DR Summary

  • ✅ Do not choose CLI or MCP once for the whole system; decide per integration.

  • 🛠️ CLI is strongest for local work, mature cloud CLIs, tight loops, and composable data processing.

  • 🔐 MCP is strongest for multi-user auth, SaaS tools without CLIs, and stateful multi-step workflows.

  • 📌 The biggest lever is not protocol choice but interface design for the model.

  • 🚀 Skills solve the real problem by hiding transport details, reducing token waste, and injecting business context.

  • ⚠️ Security depends more on deployment context and secret isolation than on transport alone.

No posts

Read the original on afadeev.substack.com

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.