# Self-hosting status

Extrovert currently provides a hosted API, console, DNS service, and mail platform. You can run the
packaged MCP server yourself, but the repository is not a turnkey, supported distribution of the full
mail platform.
**Do not treat the MCP package as the whole platform:** `npx -y @extrovert.dev/mcp@next --http` runs the MCP adapter. It still calls an Extrovert API unless
  mock mode is enabled. It does not provide mail storage, authenticated delivery, domain provisioning,
  billing, or the console.

## Supported deployment choices

| Choice | What runs locally | What remains hosted |
|---|---|---|
| Hosted MCP OAuth | The MCP client only | MCP endpoint, API, console, DNS, mail, and storage |
| Packaged MCP over stdio | The MCP adapter process | API, console, DNS, mail, and storage |
| Packaged MCP over Streamable HTTP | The MCP adapter service | API, console, DNS, mail, and storage |
| Mock mode | MCP or SDK plus deterministic fixtures | Nothing is contacted; no real delivery occurs |

Point SDK and MCP clients at a different API with `EXTROVERT_API_BASE_URL` only when that API is a
compatible deployment you operate. Changing the URL does not create the required services.

## Full platform components

A complete deployment needs all of the following:

| Component | Responsibility |
|---|---|
| Agent and admin API | Authentication, tenancy, inbox lifecycle, mail operations, Review Loop, commerce, and jobs |
| PostgreSQL | Shared durable state, claims, leases, audit, billing, review, and DNS records |
| Zone renderer and authoritative DNS | Render database-backed zones and serve delegated domain records |
| Receiving service | Store mail and expose IMAP-backed message, thread, search, and attachment operations |
| Sending service | Deliver authenticated mail and report delivery outcomes |
| MCP server | Translate tools and hosted OAuth into API calls |
| Console | Human membership, credentials, inboxes, mail, review, domains, deliverability, and billing controls |
| Background workers | Poll inbound mail, deliver webhooks, process purchases, provision domains, and advance durable jobs |

The old live-read DNS binary is retired. Current deployments render zone files from PostgreSQL and
serve them through authoritative DNS instances. Do not design a new deployment around the retired
single-process DNS path.

## Production topology

The hosted service runs application services on every node of a three-node cluster. Shared workers use
durable claims, idempotency, and leader fencing rather than relying on a single replica. Authoritative
DNS runs once per node. A self-operated production design would need equivalent database durability,
worker safety, DNS availability, secret management, mail-state backups, and rolling-deploy behavior.

This topology is an operational description, not a supported self-hosting installer.

## Security invariants

A compatible deployment must preserve:

- organization, project, agent, and inbox ownership checks on every request;
- fixed key ceilings and explicit permissions;
- authenticated human sessions kept separate from agent credentials;
- HMAC verification over raw webhook bodies;
- encrypted inbox credentials and narrow export permission;
- bounded request bodies, lists, pagination, waits, and external fan-out;
- durable idempotency for outbound mail, review mutations, and commerce requests;
- public errors and logs that do not expose infrastructure provider names or secrets.

## Offline development

Use the SDK mock transport or set `EXTROVERT_MOCK=1` for MCP when developing without network access.
The fixtures cover identity, inboxes, message reads, review outcomes, and waits as deterministic
contract examples. They do not validate DNS propagation, delivery, receiving, OAuth, or payment.

## Next

- [MCP client configuration](https://docs.extrovert.dev/mcp/client-configuration/)
- [Package and MCP availability](https://docs.extrovert.dev/operating/distribution-status/)
- [Domains and onboarding](https://docs.extrovert.dev/concepts/domains-and-onboarding/)
- [Authentication and keys](https://docs.extrovert.dev/quickstart/authentication/)