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.
Validate before you apply
app_version_immutable — publish a new version.
Call a unified operation
Targets, selectors, and reading the results envelope.