Skip to content

MCP vs CLI: When Should You Use MCP Servers vs Direct Command Line Tools?

Problem

When I set up my first MCP server configuration for Claude Code, I ran into a dilemma. I added the GitHub MCP server to handle repository operations. But then I saw a Reddit comment that made me pause:

“Using gh, postgres and the file system directly for example. MCP is most useful in more complex examples where there is persistent state or a vast API surface.”

Wait, was I wasting tokens? Was I adding unnecessary complexity?

I stripped out the GitHub MCP and switched to direct gh CLI calls. Token usage dropped. But then I tried the PostgreSQL MCP for my company’s database and was shocked at how well it worked with context about our business logic.

This left me confused: When should I use MCP servers, and when should I stick with CLI tools?

The Core Question

The debate is heating up in the developer community. Should you use MCP (Model Context Protocol) servers or stick with direct CLI tools when working with AI assistants?

There’s no single answer. But there is a clear framework for deciding.

What is MCP?

MCP (Model Context Protocol) is an open protocol that standardizes how applications provide context to LLMs. Think of it as “USB-C for AI” - a universal connector.

The key components:

  • Tools: Functions the AI can call (database queries, API calls)
  • Resources: Contextual data the AI can access (files, schemas)
  • Prompts: Pre-defined templates for common tasks

MCP uses a client-server model:

+-------------+ +-------------+ +-------------+
| LLM | | Client | | Server |
| (Claude) | ------->|(Claude Code)| ------->| (GitHub) |
+-------------+ +-------------+ +-------------+

The server exposes tools through a standardized interface. The client (Claude Code, Cursor, VS Code) connects and makes those tools available to the AI.

The Case for CLI Tools

Token Efficiency

Direct CLI calls require fewer tokens. No need to load MCP server schemas and definitions.

I tested this with a simple GitHub operation:

Direct CLI - efficient
gh repo list --json name,url --limit 10

Tokens used: ~50 for invocation + result.

With MCP, I’d need to:

  1. Load the MCP server definition (~200-500 tokens)
  2. Load tool schemas (~100 tokens per tool)
  3. Then invoke (~50 tokens)

First-use cost: ~350-650 tokens. Subsequent calls drop to ~50 tokens after the server is loaded.

Simplicity and Familiarity

I already know gh, psql, docker. They have excellent documentation, autocomplete, and community resources. No additional abstraction layer to debug.

Mature Ecosystem

  • GitHub CLI: Comprehensive docs, scripting support, autocomplete
  • PostgreSQL CLI (psql): Full SQL capabilities, battle-tested
  • File system operations: Native commands work reliably

When I use gh pr create, I know exactly what happens. No MCP server behavior to understand.

When CLI Wins

  • Well-documented tools with clear command structures
  • Simple, stateless operations
  • Token-sensitive workflows
  • Operations you’d perform manually anyway

The Case for MCP Servers

Complex API Surfaces

MCP shines when dealing with APIs that have hundreds of endpoints. Instead of remembering every CLI flag, the AI gets structured tool definitions.

Chrome DevTools MCP is a perfect example. The DevTools Protocol has a massive surface area. MCP provides a clean interface to navigate this complexity.

Persistent State Management

MCP servers maintain context across operations:

  • Database connection pooling
  • Session management for authenticated services
  • Browser state (cookies, localStorage)

Here’s a PostgreSQL MCP example:

PostgreSQL MCP Server Tool Definition
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "query_database",
description: "Execute SQL query and return results",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "SQL SELECT query" },
params: { type: "array", description: "Query parameters" },
},
required: ["query"],
},
},
],
};
});

Context-Rich Integration

This is where MCP truly excels. One Reddit user shared:

“I have recently started using the postgres MCP to access my company’s database and it shocked me how well it works when it has context of our company’s logic.”

MCP provides schema information automatically. The AI understands your table structures, relationships, and constraints. This makes queries more intelligent.

When MCP Wins

  • Complex APIs with hundreds of endpoints
  • Stateful operations requiring connection management
  • Custom business logic integration
  • Non-engineer users who benefit from abstraction
  • Chrome DevTools, enterprise APIs, multi-step workflows

Decision Framework

Use this decision tree:

START
|
v
Is the tool well-documented with clear CLI interface?
|
+--YES--> Consider CLI
| |
| v
| Is token efficiency critical?
| |
| +--YES--> Use CLI
| |
| +--NO--> Continue evaluating
|
+--NO--> Consider MCP
|
v
Does the operation require persistent state?
|
+--YES--> Use MCP
|
+--NO--> Continue evaluating
Does the API have vast surface area (>20 endpoints)?
|
+--YES--> Use MCP
|
+--NO--> Continue evaluating
Are you working with non-engineers?
|
+--YES--> MCP provides better abstraction
|
+--NO--> CLI may be sufficient

Decision Matrix

CriteriaPrefer CLIPrefer MCP
Documentation QualityExcellent (GitHub CLI, psql)Limited or non-existent
API ComplexitySimple, <10 endpointsComplex, >20 endpoints
State ManagementStateless operationsRequires persistent state
Token SensitivityHigh priorityLower priority
User ExpertiseDevelopers familiar with CLINon-engineers or mixed teams
Custom Business LogicStandard operationsCompany-specific workflows
Error Handling NeedsBasicComplex recovery scenarios

Real-World Scenarios

Scenario 1: GitHub Repository Management

Choice: CLI

Why: GitHub CLI is well-documented. Operations are stateless. Token savings matter.

GitHub CLI operations
gh pr create --title "Fix bug" --body "Description"
gh repo list --limit 10
gh issue list --state open

No need for MCP abstraction here.

Scenario 2: Company Database with Custom Schema

Choice: MCP

Why: Custom business logic. Complex schema context. Persistent connections help.

The MCP server understands your tables:

Users table:
- id (UUID, PK)
- email (VARCHAR, unique)
- company_id (FK -> Companies)
- created_at (TIMESTAMP)
Companies table:
- id (UUID, PK)
- name (VARCHAR)
- subscription_tier (ENUM)

The AI can write intelligent queries without you explaining the schema each time.

Scenario 3: File System Operations

Choice: CLI (usually)

Why: The filesystem MCP adds an abstraction layer over commands that already work.

One Reddit user put it bluntly:

“The filesystem MCP just doesn’t make any sense to me, why add an extra layer when Claude can just make the actual calls?”

Exception: MCP filesystem may benefit teams with restricted access patterns or non-engineer users.

Scenario 4: Chrome DevTools Automation

Choice: MCP

Why: Complex API surface. Stateful browser sessions. Debugging context matters.

The Chrome DevTools Protocol has 100+ domains with thousands of methods. MCP provides structured access to this complexity.

Scenario 5: REST API Integration

Choice: Depends

Use CLI if:

  • API has excellent docs
  • Simple endpoints
  • You have curl/wget expertise

Use MCP if:

  • API is complex
  • Requires OAuth token management
  • Multiple endpoints with interdependencies

Token Overhead Analysis

I measured token costs across both approaches:

CLI Approach

  • Tool invocation: ~50 tokens
  • Result: Variable
  • Total: ~50 + result tokens

MCP Approach

  • Server definition loading: ~200-500 tokens (one-time)
  • Tool schema: ~100 tokens per tool
  • Invocation: ~50 tokens
  • Result: Variable
  • Total (first use): ~350-650 + result tokens
  • Subsequent uses: ~50 + result tokens

Key insight: MCP has higher initial cost but comparable per-operation cost. Break-even point: 3-5 operations per session.

If you’re doing one-off operations, CLI wins on tokens. If you’re doing multiple related operations, MCP becomes competitive.

Best Practices

For CLI Tools

Document common patterns. I keep a cheat sheet:

Common GitHub CLI patterns
# Create PR from current branch
gh pr create --base main --head $(git branch --show-current)
# List my open PRs
gh pr list --author @me --state open
# View PR in browser
gh pr view --web

Use shell aliases:

Shell aliases
alias gpc='gh pr create'
alias gpl='gh pr list'
alias gpv='gh pr view'

For MCP Servers

Robust error handling:

MCP Error Handling Pattern
server.setRequestHandler(CallToolRequestSchema, async (request) => {
try {
if (!request.params.name) {
return { content: [{ type: "text", text: "Error: Tool name required" }], isError: true };
}
// Timeout mechanism
const timeout = new Promise((_, reject) =>
setTimeout(() => reject(new Error("Timeout")), 30000)
);
const execution = executeTool(name, args);
const result = await Promise.race([execution, timeout]);
return { content: [{ type: "text", text: JSON.stringify(result) }] };
} catch (error) {
return {
content: [{ type: "text", text: `Error: ${error.message}` }],
isError: true,
};
}
});

Use FastMCP for Python:

FastMCP Example
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("MyService")
@mcp.tool()
def query_data(table: str, filters: dict) -> list:
"""Query data from table with filters"""
# Automatic schema generation from type hints
return database.query(table, filters)

Combine Both Approaches

You don’t have to choose exclusively. I use:

  • CLI for GitHub operations (well-documented, simple)
  • MCP for company database (custom logic, schema context)
  • CLI for file system operations (native commands work great)
  • MCP for browser automation (complex API, stateful sessions)

Community Insights

The Reddit r/mcp discussion revealed clear patterns:

Token efficiency matters:

“My 1st post included GH MCP, but people suggested to prefer CLIs over MCP, hence switched it. CLI saves lots of tokens.”

Standard tools don’t need MCP:

“Using gh, postgres and the file system directly for example. MCP is most useful in more complex examples.”

Context advantage:

“Postgres MCP to access company’s database… shocked me how well it works when it has context of our company’s logic.”

Chrome DevTools success:

“Chrome dev tools in particular” highlighted as excellent MCP use case.

The consensus is pragmatic: use the right tool for the job, not MCP for everything.

Summary

The MCP vs CLI debate isn’t binary. It’s about understanding when each approach shines.

Use CLI when:

  • Tools are well-documented (GitHub CLI, psql, docker)
  • Operations are simple and stateless
  • Token efficiency is critical
  • Your team has CLI expertise

Use MCP when:

  • APIs are complex with vast surfaces (Chrome DevTools, enterprise APIs)
  • Operations require persistent state or connection management
  • Custom business logic needs context (company databases)
  • Non-engineers need access to sophisticated tools

The break-even calculation:

  • 1-2 operations: CLI wins on tokens
  • 3+ operations in a session: MCP becomes competitive
  • Complex workflows: MCP often worth the overhead

Audit your current AI-assisted workflows. Are you using MCP where CLI would be more efficient? Are you struggling with complex APIs that MCP could simplify?

The best approach is pragmatic. Evaluate each use case independently. Don’t add abstraction layers where they’re not needed, but don’t shy away from MCP when complexity demands structured integration.

Final Words + More Resources

My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me

Here are also the most important links from this article along with some further resources that will help you in this scope:

Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!

Comments