10 min read May 2026

How agents talk to your product.

I stopped opening dashboards weeks ago. The agent next to me wasn't either. We were both using doors I never used to think of as doors.

I noticed something a few weeks back.

I wasn't opening dashboards anymore. Neither was the AI agent sitting next to me. We were both just typing commands. gh pr create. vercel deploy. supabase db push. The same operations I used to point-and-click my way through were happening in a terminal. The agent and I were using the same tools.

That sounds small. It isn't.

It reframed something for me. We treat dashboards as the main thing. The CLI as a developer convenience. The API as something other code uses. They feel like separate worlds. They aren't. They're three different doors into the same room, and one of them (the dashboard) is the only one a human ever sees.

Most software was built around the assumption that the human is the user. That assumption is starting to break.

Your dashboard is for people. Your CLI is for agents.

That line was the seed of this issue. The deeper version of the same observation: CLIs are one of the doors, not the only one. Products today have multiple ways an agent can call them, and the next few years of software gets built around all of them. This issue walks through what each one is and what changes when you build with all of them in mind.

The shift, in plain terms

If you've never thought about what a "non-human user" of software looks like, let me put it plainly.

Most software gives you a dashboard. Buttons, screens, settings tabs. You point, you click, you read.

But every product also exposes other ways to be used. None of these are new. APIs and CLIs have existed for decades. They were always how software talked to other software. AI agents are just the newest "other software" that needs them.

Think about Spotify. The app version: open the app, search for a song, tap play. The CLI version, if it existed: type spotify play "song name". The API version (this one is real): another app sending an HTTP request to Spotify's public API. The MCP version, if it existed: ask Claude "play that song you played me last week." Same outcome, different doors.

A robot can't see your screen. It can't move your mouse. It can't tell what's a button and what's a banner ad. But it can absolutely read text, call APIs, and use CLIs. Pictures are hard for software to understand. Words and protocols are not.

Here's the full ecosystem in one breath:

Most modern products end up with all three. The rest of this issue takes them one at a time.

CLIs, the easiest entry point

The pattern of any CLI is the same. You name a tool, then a verb, then options. git push origin main. vercel deploy. gh issue list. Once you've used three, you've seen the shape of all of them. They're built to be predictable, because anything reading them (human, script, or agent) needs the shape to be consistent.

If you want to feel this for yourself, the fastest path is GitHub's CLI. Five minutes from nothing to "I can talk to GitHub through words."

Install it.

brew install gh

That's macOS. On Linux, apt install gh. On Windows, winget install --id GitHub.cli.

Authenticate.

gh auth login

See your repos.

gh repo list

That's the same view as github.com, just text. Now the part that matters:

gh issue list --json number,title,state,author
Output
[
  {
    "number": 9543,
    "title": "Add idempotency to webhook delivery retries",
    "state": "OPEN",
    "author": { "login": "octocat" }
  },
  {
    "number": 9541,
    "title": "Document --json flag in quickstart",
    "state": "OPEN",
    "author": { "login": "mona" }
  },
  {
    "number": 9538,
    "title": "Fix CLI auth token refresh on macOS",
    "state": "CLOSED",
    "author": { "login": "defunkt" }
  }
]

That --json flag changes the output from human text into structured data. The kind an agent or script can read directly. Without --json, the agent would have to parse a screenshot. With --json, it just reads the data.

Vercel, Stripe, Supabase, Fly.io all ship the same flag. They figured out something simple: the people reading their CLI output aren't always people anymore. Sometimes it's a script. Increasingly it's an AI.

What does this actually look like in practice? Two real examples. I ask an agent for something. The agent picks the right CLI, reads the context, and runs the command.

Real example — agent driving the GitHub CLI
claude — bash
Create a GitHub repo called notes-2026, make it public.
I'll use gh for this. You're already authenticated as ajinkya259.
$ gh repo create notes-2026 --public --confirm
✓ Created repository ajinkya259/notes-2026 on GitHub
✓ Added remote: https://github.com/ajinkya259/notes-2026.git
✓ Initialized empty Git repository in /Users/ajinkya/notes-2026/.git/
Done. Repo's at github.com/ajinkya259/notes-2026. Want me to push an initial commit with a README?
Real example — agent deploying through the Fly.io CLI
claude — bash
Deploy this app to Fly.io.
I see a fly.toml in the project root, so the app is already configured. Running fly deploy.
$ fly deploy
==> Verifying app config
--> Verified app config
==> Building image
    Pulling base image...
    Building Dockerfile (12 layers)
--> Build complete
==> Pushing image to Fly
==> Creating release v17 in app 'notes-2026'
==> Deploying notes-2026...
--> Health checks passing on 2/2 instances
--> v17 deployed successfully
Live at notes-2026.fly.dev. Both instances are healthy. Want me to set up a custom domain next?

A good agent-friendly CLI has four traits. It prints structured data, not pretty text. It uses the same shape every time. It's predictable about success and failure (specific errors, not generic "something went wrong"). And its --help doubles as the manual.

MCP servers, the standard wire

If a CLI is "your product, but typeable," an MCP server is "your product, but plug-in-able."

Underneath, most MCP servers are just standardized wrappers around your existing REST API or CLI. The protocol's job is to give every AI client a consistent way to discover and call those operations. The work it's wrapping is the same HTTP or shell work your product already does. What MCP adds on top is a uniform shape: a way for any agent to ask "what can you do?" and get back a structured list of tool definitions, then call them without writing custom integration code.

Here's the problem MCP solves. Before it existed, every AI tool that wanted to talk to your product needed a custom integration. Claude needed one. ChatGPT needed another. Cursor needed a third. The math was brutal: every AI multiplied by every tool. The integration code never stopped multiplying.

Anthropic released the Model Context Protocol in November 2024. The idea was small: define one standard wire format. Tool vendors implement an MCP server once. AI vendors implement an MCP client once. Now any AI can talk to any tool. The math collapses from n × m to n + m.

It worked. The public registry held about 1,200 MCP servers in early 2025. By April 2026 it had crossed 9,400.

What an MCP server looks like in practice:

Supabase.

A Claude session can create database tables, run queries, deploy edge functions, manage branches. No SQL knowledge required from the human. The agent does the translation.

Real example — Claude using the Supabase MCP server
claude — bash
How many users signed up last week, broken down by country?
I'll query the database through the Supabase MCP server.
SELECT country, COUNT(*) AS signups FROM users WHERE created_at >= NOW() - INTERVAL '7 days' GROUP BY country ORDER BY signups DESC LIMIT 5;
[ { "country": "US", "signups": 47 }, { "country": "IN", "signups": 23 }, { "country": "DE", "signups": 12 }, { "country": "BR", "signups": 9 }, { "country": "GB", "signups": 7 } ]
You had 98 sign-ups last week. Top regions: US (47), India (23), Germany (12), Brazil (9), UK (7).

GitHub.

Repos, issues, PRs, reviews exposed through the same wire format. An agent reads issue context, generates a fix, opens a PR, all from inside a chat window.

Stripe.

Payment operations. An agent can list customers, refund a charge, update a subscription, all without touching a dashboard.

Filesystem.

The canonical demo. Lets an agent read and write files in a specific directory. Often the first MCP server people install when learning the protocol.

The thing that makes MCP feel different in practice: with a server in place, you don't write code to use the product. You ask Claude a question. Claude figures out the MCP call, makes it, returns the answer. The whole interaction is conversational on top, structured underneath.

If your product has a CLI or a REST API, an MCP server is often the next ten lines of work. The cost is small. The reach (every AI client at once) is large.

REST APIs, the older sibling

REST APIs have existed forever. Every modern product has one. What changes when the consumer is an agent is how they get designed.

A REST API is a way for other code to call your product over the internet. You expose URLs (/users, /orders/123, /payments/refund) and other code makes HTTP requests against them. This is what powers every mobile app, every Zapier workflow, every backend integration anyone has ever shipped.

For agents, four things matter more than they used to:

Predictable URL patterns.

If your API uses /getUserById/123 in one place and /users/123/profile in another, the agent has to learn each one separately. Consistency reduces the surface area an agent has to memorize.

A clear specification.

OpenAPI is the standard format for describing what your API does. An agent that reads an OpenAPI spec can generate correct calls without anyone hand-holding it. APIs without a spec require trial and error.

Errors that explain themselves.

"Something went wrong" is hostile to an agent. "Customer not found: cus_abc123 does not exist" gives the agent a path forward. Stripe is the reference for this discipline.

Idempotency.

Agents retry. They retry on network blips, on confusing errors, on timeouts they don't understand. An idempotent endpoint can be called the same way multiple times without doing the operation twice. Stripe's idempotency keys are the canonical example: pass the same key twice, only one charge happens.

Request — Stripe charge with idempotency key
curl https://api.stripe.com/v1/charges \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: order_1247_charge" \
  -d amount=2000 \
  -d currency=usd \
  -d source=tok_visa
Response — call it once, call it ten times, same result
{
  "id": "ch_3PmKj22eZvKYlo2C0iQB1234",
  "object": "charge",
  "amount": 2000,
  "currency": "usd",
  "status": "succeeded",
  "paid": true,
  "created": 1746460800
}

Most products built before 2022 have all four of these problems somewhere. The teams that fixed them earliest are now the easiest to integrate against, and that head start compounds every time a new agent shows up.

What you can actually build with this

Once a product exposes itself across CLI, MCP, and REST, what does that combination unlock?

A range of things, from "useful" to "this would have taken a week of clicking last year."

My day-to-day.

The agent and I share three CLIs constantly. gh for GitHub. vercel for shipping. supabase for the database. Most of the operations on those products happen at the command line. The dashboards are open maybe once a week.

A personal automation.

You can compose CLIs. A small script reads every open pull request (gh pr list --json), hands the list to Claude with "summarize and flag anything blocking," and dumps the result into a notes file every morning. Total build time: an afternoon.

Customer ops without a UI.

Imagine running a small SaaS. A customer emails asking to upgrade their plan. An agent reads the email, looks up the customer through the Stripe MCP server (or the Stripe CLI, or the Stripe REST API; same operation, three different doors), runs the upgrade, replies. No human opens a dashboard.

Plain-English data.

Your Supabase database has both an MCP server and a CLI. Hand the credentials to an agent and ask: "how many sign-ups did we get last week, broken down by country?" The agent translates that into SQL through MCP, runs it, gives you the answer. The data analyst's first hour of work, in seconds.

End-to-end deployment.

Describe a small app to the agent. The agent writes the code, runs git push, deploys via the Vercel CLI, sets up a database via the Supabase MCP server, configures the environment through Vercel's REST API. The whole loop happens without anyone opening a browser tab.

The pattern is the same in every example. A human sets the goal. The agent reads context through some combination of CLIs, MCP servers, and APIs. The agent acts through the same surfaces. The product never had to build anything new for any of this. It just had to be readable.

The market already voted

If this still reads like opinion, look at the numbers.

9,400+MCP servers in the public registry, April 2026 (up from 1,200 in Q1 2025)
78%of enterprise AI teams running an MCP-backed agent in production
97Mmonthly downloads of the MCP SDK

Three things are happening at once.

First, agents are getting plugged into real software at real companies. 78% of enterprise AI teams already had at least one production agent talking to a tool through MCP. That's "happening" not "coming."

Second, every major AI vendor (Anthropic, OpenAI, Google, Microsoft, AWS) is building on the same protocols. They aren't competing on glue. They're competing on what runs on top of the glue. The MCP server registry grew almost 8x in a year because every product that wants to be talked to by an agent now ships one.

Third, products themselves are restructuring. Salesforce announced Headless 360 in April 2026. The pitch was one line: every Salesforce capability is now a CLI command, an MCP tool, or an API call. The dashboard isn't going away. It's just no longer the only door.

The pattern across all three shifts: companies aren't deciding whether to expose their products to agents. They're racing to do it first.

What this means if you're building

Pull this thread far enough and a punch list emerges. Not all of it has to be true on day one. All of it should be true by year two.

  1. Ship a CLI alongside the dashboard. Default it to JSON output. Return clear, specific errors.
  2. Ship an MCP server, even a minimal one. It's almost always a thin wrapper over the CLI or REST API.
  3. Every action behind every button needs a code-callable equivalent. Most products have a 30-40% gap.
  4. Publish an OpenAPI specification for your REST API. Agents need it more than humans need docs.
  5. Make endpoints idempotent. Make errors specific. Add rate-limit headers.

Most teams are at 1 or 2. The teams shipping fastest are at 4 or 5. The pattern that separates them isn't more engineers. It's the recognition that the product has multiple non-human readers, and they're going to keep showing up whether you've prepared for them or not.

The good news: every item has a well-trodden path. There's a Stripe CLI to study. There's an MCP server template to fork. There's an OpenAPI spec format to follow. None of this is greenfield invention.

The line worth remembering

The dashboard isn't dying. UIs aren't going extinct. The shift is more boring and more consequential. Products designed before agents existed will keep losing to products designed for them.

Not because agents are smarter. Because the building math changed. Companies that ship CLI parity, an MCP server, and clean APIs win the next five years of integrations by default. Companies that don't will still have beautiful dashboards. They'll just have fewer buyers.

If an agent tried to use your product today, could it? Or would it get stuck looking for a button that doesn't exist?

© 2026 Ajinkya Sambare ← All writing