1Password connector setup
Operator·4 minutes to read
This page is the setup half — creating the OAuth app (or Connect/Service-Account credential) 1Password needs in its own console and getting its client id and secret into this deployment. Authorising a connection afterwards is the Authenticate control on the plugin sheet, which is what actually sends you to 1Password.
The connector is read-only, and cannot return a secret. Three tools —
onepassword.list_vaults, onepassword.list_items, onepassword.get_item — every one tagged
read, and none of their results carries a field value: only vault names, item titles, categories and
URLs, and field names and kinds. There is no tool that could hand a password back to a bot, and no write tool at all —
that absence is structural, not a missing feature (packages/connectors/src/onepassword.ts's own
header): a tool result is shown to the model by definition, and a value the model has already read
cannot be un-read.
1. Create the credential in 1Password's own console
1Password's own developer console is where you create this credential — 1Password's Connect or
Service-Account offering, under your own account, never Botseon's. The exact console steps are
not yet confirmed here (packages/connectors/src/onepassword.ts flags its base URL and credential
kind as unverified, pending the vendor research this connector still owes) — follow 1Password's own
current documentation for issuing a Connect/Service-Account credential scoped to the vaults you
want this deployment to read, rather than this page inventing console steps it cannot verify.
Whatever form the credential takes, enter it through the same command every other connector uses
(step 2): if 1Password's flow is a classic OAuth redirect, paste the redirect URL from
docs/connectors/README.md into its console the same way the
other pages describe —
http://127.0.0.1:3000/api/oauth/onepassword/callback
— and copy the client id and secret it gives you back. If it instead issues a token directly with
no redirect step, --auth-url/--token-url below still need a confirmed pair of URLs before this
connector can be wired up end to end; that confirmation is this page's own open item, not something
to guess at here.
1a. The bot's own service account (no console step)
A member who connects a bot from the desktop app does not need step 1 at all. The app runs the
vendor's signed op command-line tool on the member's own machine (ADR 0023) to create a vault
for that bot and a service account that may only read items in that vault and expires; the
service-account token is the one thing it sends to this deployment. A token that begins ops_ is
read through the vendor's JavaScript SDK (@1password/sdk, a dependency of
@botseon/connectors), because service accounts have no REST API; every other token is read from
a Connect server as below. Nothing for the operator to configure: the worker needs outbound HTTPS
to the member's 1Password sign-in domain, which the SDK reaches itself.
The nightly connector-live run reads a real test account through this exact path
(packages/connectors/src/onepassword.live.test.ts); setting that account up is
docs/operations/connector-live-setup/onepassword.md.
2. Scopes
The two checklist strings this connector's tools need, read-only (F-PLUG-1: minimum scopes per capability):
vault:read— list vaults.item:read— list and read items (names and field names only, never a field value).
3. Enter the app
One command, with the client secret on standard input — there is no flag that takes it and no
environment variable that holds it (see
docs/connectors/README.md):
printf %s "$CLIENT_SECRET" | botseon oauth-app set \
--org <organisation id> --slug onepassword \
--client-id <the client ID from step 1> \
--auth-url <1Password's confirmed authorisation URL> \
--token-url <1Password's confirmed token URL> \
--configured-by <your user id>
It stores the secret encrypted and prints the redirect URL from step 1 back, so you can check the
two match. botseon oauth-app show --org <organisation id> --slug onepassword says whether an app
is configured and under which client id; nothing prints the secret back.
Never put either value in a bot's description, a memory, or anywhere else a model reads as ordinary text.
Last verified against build 445930e.