This week I was in the Supabase voice channel, and while we were chatting someone asked: "What's the difference between a CLI and an MCP?"
Someone answered something super practical: "CLI is for humans. MCP is for agents." That distinction alone helped me understand so much better how it all works. So I started digging deeper, and the analogy we landed on is the simplest way I can explain it.
The barista analogy
You walk into a coffee shop. You have two ways to order:
Option A: The counter (CLI)
You tell the barista: "Can I get a medium oat milk latte with an extra shot?"
The barista interprets your words. Maybe asks "what size again?" Maybe hears "oat" as "whole." It works — humans understand humans — but there's always a layer of translation happening.
That's a CLI. You type commands in human-readable text. The system reads your words, interprets them, gives you text back. It works great for humans.
Option B: The app (MCP)
You open the coffee app. You see every drink, every size, every milk option. You tap: Latte → Medium → Oat → +1 shot. Done.
No ambiguity. The app knows exactly what's available, and the system receives a perfectly structured order.
That's MCP. The AI agent sees a structured menu of every available action — what it can do, what parameters each action needs, what it returns. No guessing.
So which is better?
Neither. They solve different problems.
- CLI is designed for humans. You read the output, you interpret, you decide what to type next.
- MCP is designed for AI agents. They get a structured menu of tools and can use them without parsing human text.
Now, an AI agent *can* use a CLI (Claude Code does this all the time — running git status, supabase db list, etc.). It's like the agent going to the counter and talking to the barista.
But with MCP, the agent doesn't have to interpret the barista's response. It gets clean, structured data back. Every time.
The practical difference
CLI (human-first):
$ supabase db list
→ "Here are your tables: users, posts, comments..."
→ Agent has to parse this text to understand it
MCP (agent-first):
list_tables({ schemas: ["public"] })
→ [{ name: "users", columns: [...] }, ...]
→ Agent gets structured data it can use directlySame information. Different format. Different audience.
When does this matter?
If you're using AI agents (Claude Code, Cursor, etc.) to build things, MCP connections give them superpowers. Instead of typing commands and reading output like a human would, they can directly interact with your database, storage, auth — all through structured tools designed for them.
It's the difference between your agent struggling to read the barista's handwriting on the cup vs. getting a perfectly formatted order receipt.
What do you think about this analogy? What other analogy would you use to explain it? I'm still learning too, and honestly these conversations in the voice channel are where the best explanations come from.
Related skill: Vibe Coding Setup — includes MCP configs for Supabase, Netlify, and more.