Capability, Not Channel
Framing tension
Teams are building more interfaces than ever.
API. CLI. Web UI. SDKs. IDE extensions. MCP servers. Agent skills. Sub-agents.
Each one feels necessary.
Each one solves a real problem.
And each one quietly duplicates the same capability in a slightly different way.
Reality check
Most teams still design like this:
- Build the API
- Add a UI on top
- Wrap it with a CLI
- Expose it to AI later
This worked when interfaces were limited.
It breaks in an AI-driven world.
Because AI does not “use your API.”
It consumes capabilities through:
- tools
- skills
- goals
- delegated tasks
At the same time, humans are:
- clicking
- scripting
- browsing
- automating
The same capability now needs to exist across multiple modes of interaction.
Without structure, this leads to:
- duplicated logic
- inconsistent behavior
- fragmented metrics
- unclear ownership
The shift
Stop designing interfaces first.
Start designing capabilities.
A capability is:
- a defined outcome
- with a stable contract
- that can be expressed through many interfaces
The question is no longer:
How do we expose this?
It becomes:
What outcome exists, and how should different consumers access it?
A simple model
Think in five layers.
1. Outcome
What useful result exists?
Examples:
- deploy a service
- analyze repository risk
- recommend next action
- diagnose a failing pipeline
This is the only layer that matters to the business.
2. Intent
What is the consumer trying to do?
Examples:
- “I want to deploy my service”
- “Why is this repo risky?”
- “Fix this pipeline failure”
Intent is shared across:
- humans
- systems
- agents
3. Capability contract
What stable contract fulfills that intent?
Define:
- inputs
- outputs
- side effects
- cost signals
- observability
This layer must not depend on:
- UI
- CLI
- MCP
- transport details
It is the source of reuse.
4. Interface adapters
How is the contract expressed?
Examples:
- API endpoint
- CLI command
- SDK method
- MCP tool
- agent skill
These are thin adapters.
If they are not thin, the contract is wrong.
5. Channel experiences
Where does it show up?
Examples:
- Backstage plugin
- website
- terminal
- IDE
- chat system
- SaaS platform
This is where experience differs.
The capability should not.
Why this matters now
AI changes the dominant interface.
Before:
- humans called systems
Now:
- humans and agents both consume capabilities
Agents do not care about:
- your UI
- your CLI
- your documentation
They care about:
- clear contracts
- constrained inputs
- reliable outcomes
At the same time, leaders are learning a hard lesson:
Saving time is not the same as creating value.
Many AI initiatives show productivity gains without measurable outcomes.
The missing link is not the model.
It is the system design around it.
If your capabilities are fragmented across interfaces:
- you cannot measure outcomes consistently
- you cannot track real adoption
- you cannot understand cost vs value
Designing for reuse
To improve reuse, enforce three rules.
Rule 1: One capability, many expressions
Do not re-implement logic per interface.
Every interface calls the same core capability.
Rule 2: Contracts before channels
Do not design the UI first. Do not design the API first.
Define the contract.
Then adapt it.
Rule 3: Segment by mode, not role
The same person operates in different modes:
- exploring in a UI
- scripting in a CLI
- automating through APIs
- delegating to agents
Design for modes:
- interactive
- operational
- automated
- agent-driven
Each mode prefers a different interface.
The capability stays the same.
A practical example
Capability: Analyze repository risk
Outcome: Identify blockers to delivery and recommend actions
Contract:
- input: repository, branch
- output: risk summary, recommendations, confidence
Expressions:
-
API
POST /analyze-risk -
CLI
idp analyze risk -
MCP
tool: analyze_repository_risk -
UI
“Analyze” button with visual breakdown -
Agent
“Ensure this repo is safe to deploy”
Same capability.
Different entry points.
Where most teams go wrong
They optimize for speed of interface delivery.
Instead of:
- speed of capability reuse
This leads to:
- APIs that do one thing
- CLIs that do another
- UIs that hide logic
- agents that bypass the system entirely
It feels fast.
It does not scale.
What to do next
Start small.
Pick one capability.
Define:
- Outcome
- Intent
- Contract
Then expose it through:
- one human interface
- one system interface
- one agent interface
Measure:
- who uses it
- how often
- what outcome it produces
Only then expand.
Closing
Interfaces will continue to multiply.
That is not the problem.
The problem is treating each one as a new system.
The opportunity is this:
Design capabilities once. Express them everywhere. Measure them consistently.
In the age of AI, the advantage will not come from having more interfaces.
It will come from having fewer, stronger capabilities behind them.
