Skip to main content
A bucket is the credential container an SDK, MCP server, or workspace service points at. Services declare what is enabled; buckets hold what a running app actually uses. Secrets are resolved server-side by the Engine at dispatch time. They never appear in a config file, a plan receipt, or a generated package.

Use managed auth or your own credentials

For a supported OAuth service, you can use a Managed service instead of creating and storing a provider client pair. Fused holds the application’s client secret; your selected bucket still owns the encrypted user connections. Use the steps below for your own provider application or other authentication schemes.

One app, different buckets per service

An SDK or MCP server declares one default bucket: at the top level. Any service may override it with its own bucket:, so a single app can route different services’ credentials through different buckets:
A service without its own bucket: resolves through the app’s top-level default. A local ${bucket.auth...} reference joins services in the same bucket. A managed ${fused.bucket.auth...} reference selects Fused’s broker application. Webhook signing-secret references explicitly name their bucket independently of the app.

Pick a bucket before you write to one

A listed bucket is one you can see, not necessarily one you may use. Choose a visible candidate, run the action you intended, and let the permission check decide. If it is denied, stop and report it — do not create a fallback bucket. Create one only when you actually need isolation:
A buckets: block in workspace.yaml configures an existing bucket. It cannot create one. If no bucket of that name exists, apply fails with “bucket not found” rather than creating it. bucket create is the only way.

Store a secret

In a terminal, give Fused the service and let it ask which supported authentication method you want to configure. It then prompts for that method’s fields without echoing secret values:
For automation, disable prompts and pipe the credential through the dedicated stdin channel. Credential values are rejected in argv so they cannot survive in shell history or a process listing:
Multi-field schemes are still one stdin value, joined with ;:
There is no --username, --password, --cert, or --key flag, and these are not two separate secrets set in two calls.
secret set is an upsert with no apply step. It takes effect on the next request. Re-running it with a new value is how you rotate a credential — there is no versioning and no grace period, so the old value is simply gone.

Flags

secret set

The retained --interactive flag explicitly requires the normal terminal prompts. Most people should omit it; automation should use both --no-input and --value-stdin so interaction policy and secret transport stay explicit. --expires-at is advisory only. Listings flag an expired secret; nothing auto-rotates and nothing blocks requests when it passes. In a terminal, a bare set asks you to select the supported authentication method even when only one is available. With --no-input, a sole method can be selected deterministically; multiple methods require --type, and same-family alternatives also require --auth-name.

secret list

Secret values are never read back — metadata only.

Store a non-secret value

Some providers need a non-secret piece of configuration, like a tenant ID that appears in the host name. value set takes five positional arguments, and only the third comes from a fixed set:
The env namespace here is the bucket’s own value store — it does not read an operating-system environment variable.

Inject a bucket value into a request

An SDK or MCP service can pull those values into the outgoing request at dispatch time, so a tenant ID or account prefix never has to be hardcoded per environment. Usually you will not write these by hand — fused-cli init generates them for whichever server-template variables your selected operations declare, leaving you to supply the value.
References always resolve against the bucket the referencing service uses — that service’s own bucket: override when one is set, otherwise the app’s top-level bucket:. There is no way to name an arbitrary third bucket in a reference, unlike a kind: webhook secret. An ordinary injection value may also mix a tag with surrounding text, such as "Bearer ${bucket.secrets.API_KEY}". location: server_variable is stricter than the rest. Its value must be a complete ${bucket.env.KEY} or ${bucket.values.KEY} reference — never a literal, never interpolated, never a secret — because host routing has to stay non-secret and reviewable. Plan checks name against the service and operation server templates and rejects an undeclared one.

Which value wins

An omitted mode canonicalizes to force.
A host template must keep a fixed registrable anchor such as .sendbird.com. Whole-host or public-suffix-only forms like https://{host} or https://{tenant}.com fail closed — the Engine validates the resolved value and the final HTTPS URL before dispatch.

Inspect a bucket

Permissions

Connect a user's account

Static credentials cover one identity. OAuth covers one per end user.