Give agents CLI tools
An agent in Saggar is a program running in a shell, so it can run anything you can. When a service has a command-line tool, install and log into that tool, and tell the agent to use it. Reserve MCP servers for services that have no shell to reach, or that you can only reach remotely.
Why a CLI beats a server for most tools
A CLI is one install and one login that serves you and every agent on the Mac.
An MCP server is one more thing per agent: another install, another
authorization, and a permanent slice of the agent's context window holding
tool definitions it may never call. A CLI costs nothing until the agent runs
--help, and the details leave the context when the command finishes.
The command line is also the surface you can watch. The command, its output, and its exit code are right there in the terminal, so you can rerun what the agent ran, reproduce a failure, and put the working version in a script. Claude Code's own guidance says the same: CLI tools are the most context-efficient way to interact with external services.
The longer argument is in CLI > MCP.
Log in once, in any Saggar terminal
Authentication belongs to the tool, not to the agent. Run gh auth login,
vercel login, wrangler login, or stripe login once in a plain shell, and
every session in every project can use the result, whichever agent is running.
No separate setup for Claude Code, then again for Codex.
If a tool needs an environment variable rather than a stored login, set it in your shell profile. Every terminal Saggar starts is a normal login shell, so new sessions inherit it. Don't paste secrets into a chat: the agent doesn't need to see a key to run a command that reads it.
Tell the agent which tool to use
Name the tool in the task, and let the agent learn it from its own help text:
Use the gh CLI for everything GitHub. Read issue #412 with gh issue view, then
open a pull request with gh pr create when the change is ready.
For a tool the agent hasn't met, one line is enough:
Run 'stripe --help' to learn the Stripe CLI, then list the last ten failed
payments and summarize the decline reasons.
Put the tools a repository relies on in its agent instructions file, such as
CLAUDE.md or AGENTS.md, so you stop repeating yourself. One line per tool,
saying when to reach for it, is plenty.
Prefer a tool's structured output when it has one. gh --json, aws --output json, and --format json flags give the agent something it can parse rather
than prose it has to guess at, and they keep a long listing from flooding the
context. Ask for a bounded page, too: gh issue list --limit 20 rather than
everything.
Let Saggar keep the output in view
A long-running command is better in a monitor
than in the agent's chat. Have the agent start it with saggar monitor, and the
output stays docked and visible, turning amber when it reports errors, while the
session gets on with the work. saggar quick does the same for a one-shot
command you want to see finish.
The saggar command is itself an example of the approach. It's a CLI the
Saggar skill teaches to every provider, with no MCP
server to install or authorize. See the saggar CLI reference.
Supervision reads shell commands
Saggar's automatic approval answers routine prompts by reading the command text, so a destructive gh repo delete or wrangler delete is held for you like any other shell command. A
call through an MCP server arrives as a tool invocation Saggar can't read the
same way, and is left to the agent's own prompt. Reaching a service through its
CLI keeps it inside the safeguards you already have.
When MCP still fits
Use an MCP server when there is no local shell, when the tool lives behind a remote service with nothing to install, or when the host needs tighter control over what the agent can discover and call. A standard protocol beats every vendor inventing its own plugin system. It just shouldn't be the default wrapper around a service that already has a good command-line interface.