Unified operations work in TypeScript or Python
kind: sdk configs and in kind: mcp configs. Go SDK generation does not support them. MCP exposes each token-authorized authored name through search_docs and executes it through the existing execute tool.services. They grant no new scope and carry no credentials.
The shape
unified_operations sits at the top level, beside services:
kind: mcp, omit language, and keep the same unified_operations block.
In an SDK, dot-separated names become the generated namespace: issues.create produces sdk.unified.issues.create. MCP preserves issues.create as the exact operation name returned by search_docs and accepted by execute.
Operation properties
An SDK or MCP app version may declare at most 64 unified operations.
Binding properties
A binding is either a bare operation ID or an expanded object.
Each binding key is a unique step name used by
depends_on, response references, caller targets, and the returned result.target. It does not have to match a service key — several steps may use one service, and they stay separate steps with separate results.
Quote a provider-qualified service that starts with @, like "@acme/github".
How execution runs
Steps run as their dependencies settle, several at a time. Once every forward call has finished, rollback runs in reverse dependency order. A failed step compensates only its successful direct dependencies that declare rollback.depends_on values must be exact binding keys — self-dependencies, duplicates, unknown targets and cycles are all rejected. There is no on_failure; application code owns fallback.
Mapping values
Values inbindings.<step>.input, rollback.input, and output projections can reference the operation’s input and earlier responses. Operation-level input is plain JSON Schema.
A complete reference keeps its JSON type — `${response.drive.files}` stays an array — while a reference mixed into a string interpolates. Two operators are available: ?? takes the first non-null value, and a trailing ? omits a missing one.
What each location may read:
Shaping the return value
Withoutoutput, the call returns the all-settled {results, rollbacks} envelope. With it, your constructed object is the return value — no data wrapper, no envelope.
{type, value}. Arrays take one value plus optional schema-only items.
The {schema, mapping} form is invalid — use only the recursive output tree.
Plan before you apply
Plan validates the local config before its first Engine request, so one command covers both the recursive output contract and the remote change preview:validate commands only for offline checks that must not contact an Engine.
Unified operations live inside an immutable SDK or MCP app version like everything else. Changing one under an existing version returns app_version_immutable — publish a new version.
Call a unified operation
Targets, selectors, and reading the results envelope.