Skip to content

Extensions

Extensions are signed runtime bundles the operator provisions server-wide. Each extension declares a manifest (name, routeNamespace, migrations, and a tenancy block) that the host verifies, migrates, and activates at startup. Once active, an extension can contribute HTTP routes (mounted at /api/v1/ext/<name>/…, with a legacy alias at /api/v1/<routeNamespace>/…), AI tools exposed over the MCP server, and background jobs — all running in-process against the same request-scoped, RLS-bounded database handle core routes use.


By default an extension serves every organization on the server (installScope: "server"). An extension may opt in to per-tenant activation by declaring, in its manifest tenancy block:

"tenancy": { "installScope": "org" }

The operator still provisions one bundle server-wide; activation is an authorization record per organization. Partner admins manage activations (bounded by their accessible organizations):

  • PUT /api/v1/extensions/:name/orgs/:orgId — activate
  • DELETE /api/v1/extensions/:name/orgs/:orgId — deactivate
  • GET /api/v1/extensions/:name/orgs — list activations the caller may see

A non-activated organization receives 404 on both /api/v1/ext/<name>/… and the legacy /api/v1/<routeNamespace>/… request dispatch, and the same non-disclosure treatment on extension-contributed AI tools — a non-activated org’s callers never see the tool in an MCP tools/list, and a direct tools/call against it fails the same non-disclosure way as an HTTP 404, without revealing whether the tool or the org is the reason.

Background jobs are not host-enforced to the install set — the host does not intercept or filter job execution. An extension’s own job handler is responsible for reading context.tenancy.installedOrgs() and scoping its own work to that set; a job that ignores it will run against every organization on the server regardless of activation.

This is install scoping (authorization), not sandboxing: it decides which tenants an extension serves, not what its code can access.