Overview
The seven surfaces of Netzo, who acts on each one, and why all of them offer the same actions with the same permissions.
A surface is a way to work with Netzo: a person in the app, an agent over MCP, a program over the API. All of them work on the same system of record, with the same actions.
The surfaces
| Surface | Who acts | Credential | Offers |
|---|---|---|---|
| App | A person | Their session | Actions, on screens |
| WebMCP | The browser agent, for the person | The session of the person | Actions, as page tools |
| MCP | An AI assistant | API key or OAuth | Actions, as MCP tools |
| API | A program | API key or OAuth | Actions, as HTTP endpoints |
| CLI | A person, an agent or a script | CLI session or API key | Actions, as commands |
| Webhooks | Your service, which receives | A signing secret | Events |
| Public links | Someone outside your organization | The link, and a code if one is required | One shared record |
Common to all
| Topic | Read |
|---|---|
| Credentials, API keys and OAuth | Authentication |
| What an error holds, retries and limits | Errors and limits |
| Test a write without saving it | Dry run, below |
| Name where an action happens | Place, below |
Parity
The five action surfaces (App, WebMCP, MCP, API and CLI) offer the same actions:
- The same actions. A new action shows on all of them in the same deployment.
- The same permissions. Each surface shows only what the credential allows. See Access.
- The same rules. The database applies them to every surface. See Rules and integrity.
- The same errors. A refusal has the same code and the same fix on all of them.
The exception is internal actions: a few actions are only in the app, because they need a screen or a person present. Each table in Domains shows where each action is.
Dry run
Every write can run as a dry run: it runs the rules and the calculations, returns what would change and the events that would be sent, and then discards everything.
| Surface | How |
|---|---|
| API | Header x-netzo-dry-run: 1 |
| MCP | Argument dryRun: true |
| CLI | Option --dry-run |
Place
Each action can name its place, the module and the row where it happens. See API.