1. Select the deployed app
Addunified_apps to the config of the SDK or MCP server that will call it. Choose a name for the call, such as customer_lookup, and select the deployed app by name and version:
2. Deploy the calling app
Run plan and apply on that SDK or MCP config:unified_apps, then increment the consumer’s version. For MCP, use kind: mcp, omit SDK-only language, provide the server’s description, and run the same app plan / app apply commands with -f pointing to that MCP config. Selecting the consumer file keeps deployment scoped when the Unified App’s own config is in the same project. Physical services can remain alongside these references; they are optional for a consumer containing only hosted apps.
Use the SDK or MCP server’s execution token to call it. You do not copy the Unified App’s token into this config. The Unified App continues to use its own credential bucket.
3. Call the selected app
- TypeScript
- Python
- MCP
- REST
With your generated SDK client:Configure
FusedSDK with your Engine’s HTTP origin as engineUrl and the SDK execution token as token.status before using output. Calls wait for the hosted action and do not retry automatically.
When you deploy a new version
These selections stay on the exact version you chose. When you switch the Unified App’s traffic, update this config to select that version and publish a new SDK or MCP version. Otherwise, promote the previously selected Unified App version back.Call from another Unified App
Add the sameunified_apps entry to the calling app’s YAML. In its TypeScript, import fused from @fused/unified-app and call:
result.status before using result.output. Each app uses its own credentials and execution data. Pass any connected-user reference explicitly in the input.
Permissions and limits
Permissions and limits
- The actor and owner need
app.unified_app.useon the selected app, alongside the calling app’s normal permissions. - Restricted execution tokens must allow
unified_app:customer_lookup. - The selected version must be receiving traffic during plan, apply, and execution.
- Each config can select up to 16 hosted apps. Call names use lowercase letters, digits, and underscores, start with a letter, and cannot be reserved language names or conflict with another call’s
_syncmethod. - Execution records belong to the hosted app. Calling it does not grant access to unrelated execution history.
- Nested calls cannot recurse. A root execution permits eight app levels and 32 nested calls. Each waiting parent occupies a worker slot, so the Engine needs capacity for the whole chain; a child fails immediately when capacity is unavailable.
- Nested calls are synchronous, are not automatically retried, and remain bounded by parent cancellation and deadlines. Replay uses recorded child responses.