Connection Hub CLI
connection-hub-cli starts or selects a KDCube-hosted Connection Hub,
authorizes exact management operations, and connects desktop MCP clients to a
governed MCP endpoint. The installed command is connection-hub.
uv tool install connection-hub-cli
connection-hub setup
setup creates a dedicated local KDCube runtime by default. It can also select
an existing local workdir or an HTTPS KDCube endpoint. New local setup uses
Google login by default and accepts --auth simple for an explicit development
environment.
Connect An MCP Client
Two connection modes cover different credential owners:
| Mode | Remote transport | Credential custody |
|---|---|---|
oauth |
Client connects directly by Streamable HTTP | The MCP client's OAuth store |
bridge |
Client starts connection-hub mcp serve over stdio |
The current user's native operating-system store |
auto |
Selects a verified native OAuth path, or a supplied local profile | The selected mode's owner |
For Claude Code, Codex, Hermes, or OpenClaw with native remote OAuth:
connection-hub client install claude-code \
--mode auto \
--endpoint https://runtime.example/mcp
The JSON result includes the non-secret interactive authorization command. Run it in the client's normal terminal. Claude Desktop remote connectors are created in its Settings interface; the CLI manages its local stdio entry. Direct OAuth does not construct or probe the Connection Hub native store, so it remains available on headless Linux and WSL installations where the MCP client has its own secure OAuth custody.
For a local bridge, first create a profile through browser OAuth and PKCE:
connection-hub profile authorize coding-agent \
--endpoint https://runtime.example/mcp
connection-hub client install claude-code \
--mode bridge \
--profile coding-agent
For a headless host with a supported native credential store, use device authorization. Open the printed verification URL on any browser-capable device; the headless host opens no callback listener:
connection-hub profile authorize coding-agent \
--endpoint https://runtime.example/mcp \
--device
The bridge retrieves and refreshes the OAuth token set internally. The client configuration contains only this command shape:
connection-hub mcp serve --profile coding-agent
The default profile is an agent/automation profile. It stores the server-issued
Card kind and OAuth server identity, but no MCP entry resource; one credential
can therefore use every surface granted on that Card. Use --resource-bound
when creating a connector profile for one fixed MCP endpoint. Reconnect follows
the persisted server-issued Card kind and does not reclassify a profile.
An application embedding the profile-session API can identify one concrete client instance during dynamic registration:
await oauth_profile_sessions.authorize(
name=profile_name,
endpoint=endpoint,
client_name="Connection Hub CLI · codex:session-1",
client_metadata={
"kdcube_agent_id": "codex:session-1",
"kdcube_machine_id": "machine-1",
},
)
These fields are sent only for dynamic client registration. Connection Hub bounds and stores accepted values for Card display and search; neither the CLI nor Connection Hub treats them as identity or access authority. Provisioned and metadata-document clients already own their registration metadata and therefore cannot be overlaid with a second client-supplied block here.
A manually issued short-lived delegated bearer can initialize a static bridge profile through hidden input:
connection-hub profile add coding-agent \
--endpoint https://runtime.example/mcp \
--access-id access_example
Use --credential-stdin only when standard input already comes from a
controlled secret store. The profile metadata files contain an opaque
credential reference and optional access_id; bearer and OAuth token values
remain in native custody.
The accepted native backends are:
| Platform | Store | Exact backend |
|---|---|---|
| macOS | login Keychain | keyring.backends.macOS.Keyring |
| Windows | Credential Manager | keyring.backends.Windows.WinVaultKeyring |
| Linux desktop | Secret Service | keyring.backends.SecretService.Keyring |
Windows values use a bounded, versioned chunk representation with digest verification and transactional generation replacement. Its 288 KiB UTF-8 bound covers every token record accepted by this CLI, including worst-case JSON escaping. Linux bridge mode requires a graphical session D-Bus, an available Secret Service provider, and an unlocked default collection. Backend selection fails closed and has no plaintext fallback.
Command-backed adapters verify add, login, logout, inspection, and removal
capabilities relevant to the selected mode before writing an entry. A client
version with an incomplete OAuth lifecycle is rejected; auto can use an
explicitly supplied bridge profile instead.
Operate The Selected KDCube Host
Authorize the CLI through the identity provider configured by the selected KDCube deployment:
connection-hub host authorize
connection-hub host inspect
connection-hub host surfaces connection-hub@1-0
connection-hub host reload connection-hub@1-0
host authorize performs native-store readiness first, then OAuth discovery,
Authorization Code with PKCE, browser login, token exchange, and card-bound
session storage. Reload permission is demand-driven and request-bound. The
runtime resolves the live delegated card immediately before the operation.
connection-hub host disconnect
Disconnect revokes the OAuth grant and its delegated card before removing local custody.
Manage And Export Secrets
KDCube owns the backend-neutral management protocol and the canonical
kdcube secrets metadata|get|set|delete|export commands. Connection Hub's
secrets host commands wrap the same KDCube library, select the configured
host, and supply the OAuth session held in the native credential store.
An authorized operator or automation can manage exact secrets through its live Connection Hub Card:
connection-hub secrets host metadata platform.services.brave.api_key --scope platform
connection-hub secrets host set platform.services.brave.api_key --scope platform
connection-hub secrets host get platform.services.brave.api_key --scope platform \
--output ./brave-api-key
connection-hub secrets host delete platform.services.brave.api_key --scope platform
set uses a hidden prompt by default. get writes a 0600 local file on
POSIX, uses the selected parent directory's ACL on Windows, and reports
disclosure metadata without printing the value. Connection Hub checks the
exact target and operation on every call. The CLI's Card gains each exact
key through its consent, or in advance in the Card editor (Once or Every
time; see the step-by-step below). Before requesting disclosure, get rejects a
missing parent, an existing destination without --replace, or a non-file
replacement target. The atomic writer repeats these checks when publishing so
a filesystem race cannot silently clobber another path.
Set a secret on a KDCube deployment, step by step
This is the whole path for a person with no delegated bearer, on a fresh machine.
Before you start. The deployment's Connection Hub must register the
management secret resources for admission: the kdcube-management service
under connections.delegated_credentials.admission.services lists
urn:kdcube:management:secret:*:*:*:*:*. That is the default in the Connection
Hub descriptor template. Your platform account must be allowed to approve
management grants; a deployment administrator is.
-
Run the CLI. Once the release is published, install it from PyPI:
uv tool install connection-hub-cli connection-hub --version
This flow uses
connection-hub-cli2026.10.25.0200 or later, which installskdcube-cli2026.10.25.0130 or later and the App Ecosystem packages at 2026.10.25.0100 or later. The deployment must also run the Connection Hub app source from that App Ecosystem release: the hosted app supplies the authorization-code exchange fix. Check the CLI version before continuing. To use an unpublished revision, run both CLIs from source at the revisions your deployment runs:CH() { uvx \ --from "git+https://github.com/elenaviter/app-ecosystem@<app-ecosystem commit>#subdirectory=products/connection-hub/packages/connection-hub-cli" \ --with "git+https://github.com/kdcube/kdcube@<kdcube commit>#subdirectory=app/ai-app/src/kdcube-ai-app/kdcube_cli" \ connection-hub "$@"; } CH --version
Take both packages from source, at the App Ecosystem and KDCube revisions your deployment runs: the secret consent is handled in
kdcube-cli, whose source version must satisfy the Connection Hub CLI's dependency floor. Fromconnection-hub-cli2026.10.25.0200 on, that means a KDCube revision carryingkdcube-cli2026.10.25.0130 or later. Every command below works the same withconnection-huborCH. -
Select the deployment by its public address. Use the address the deployment's OAuth issuer is configured for. A local workdir or
localhostURL is refused at authorization withoauth_issuer_mismatchwhen the deployment publishes a public issuer.connection-hub setup --endpoint https://<public address>
-
Authorize. Your browser opens the deployment's login; sign in and approve.
connection-hub host authorize
This gives the CLI a Card for the deployment resource only. Exact secrets are added to that Card one at a time, when you first use them.
-
Set the secret. Pass the value on standard input so it never appears on the command line or in your history:
openssl rand -base64 48 | tr -d '\n' | connection-hub secrets host set <key> \ --scope bundle --bundle-id <application id> --value-stdin
The first request for a key the Card does not hold yet answers with a consent. The CLI opens Connection Hub's grant page for that exact secret and operation, and asks you, on your terminal, to press Enter once you have approved it. On the page choose Once (this request only) or Every time (this operation on this secret from now on), then press the button that reads Allow
<operation>once (or Allow<operation>always after choosing Every time). Nothing else on the page needs to change. The CLI then retries the identical request and prints a receipt with no value. With--no-open --no-wait, it prints the consent instead (recovery.authorization_url); open it, approve, and rerun the same command with the same--invocation-id.Agents and automation always pass
--no-open --no-wait: in a pseudo-terminal with no person at it, the CLI would otherwise wait at its prompt. They relayrecovery.authorization_urlto the person and rerun with the same--invocation-id. -
Check it. Metadata is a separate operation, so it asks once more in the same way:
connection-hub secrets host metadata <key> --scope bundle --bundle-id <application id>
It reports that the secret exists and which provider holds it, never the value.
Secret operations use the Card's Once / Every time policy. A platform
administrator can also add an exact secret to the CLI's Card in advance, in the
Card editor (Connection Hub, Delegated by KDCube, the Connection Hub CLI Card):
add the secret with its operations and Once or Every time, then save.
This works for a Card entered through the deployment door, which is what
host authorize creates, and for a Card entered through one exact secret. The
editor adds exact secrets only on such a Card. A secret selector (a * scope or
key) is refused with oauth_client_resource_unreachable, and so is a secret on a
Card entered through any other door. The Card is the live authority, so a grant
applies to the next request without authorizing again. The full admin path,
with troubleshooting, is KDCube's
KDCube Admin: Manage A Secret With The Connection Hub CLI.
Descriptor export is an administrator-performed path with independent authority:
connection-hub secrets host export \
--platform-key platform.services.brave.api_key \
--bundle-key connection-hub@1-0=connections.oauth_state_secret \
--user-key USER_ID~connection-hub@1-0=provider.refresh_token \
--output-directory ./kdcube-secret-export
Export the complete provider inventory, including every user value:
connection-hub secrets host export \
--all \
--output-directory ./kdcube-secret-export-all
The command starts a PKCE-bound loopback callback and opens the KDCube approval
page. When no platform browser session exists, KDCube redirects through the
identity provider configured by that deployment. The signed-in platform
administrator sees the exact deployment, callback, digest, and frozen key
counts or selected key list, then chooses Export once. A whole-export start
response exposes only the count and digest; provider key names reach the CLI
only in the approved one-use exchange, where their frozen digest is verified
again. One authorization code permits one exchange for that manifest. The
flow leaves delegated Cards unchanged and stores no reusable export
credential.
The destination must be a new directory. The CLI validates a bounded response,
stages and flushes canonical secrets.yaml and bundles.secrets.yaml, then
atomically reserves the destination without replacing any existing path. It
moves only complete files into that owned directory and returns success after
both are durable; a handled failure removes its partial destination. POSIX
permissions are 0700 for the directory and 0600 for each file. Windows
inherits the ACL of the selected parent directory, so that parent must already
be private to the intended Windows user. The CLI prints only paths, counts,
request digest, and assurance evidence.
Repeat --platform-key, --bundle-key BUNDLE_ID=KEY, and
--user-key USER_ID[~BUNDLE_ID]=KEY for a selected manifest, or use --all
by itself. KDCube freezes whole provider inventory before approval. The same
command works with local and remote KDCube hosts and with file, Host Vault, and
cloud secret backends.
Restore or synchronize the literal pair through the selected host without extracting its stored OAuth bearer:
connection-hub secrets host import \
--input-directory ./kdcube-secret-export-all \
--dry-run
connection-hub secrets host import \
--input-directory ./kdcube-secret-export-all \
--yes
Import is an upsert of every present platform, bundle, and user value. Omitted
keys remain unchanged; deletion is always an explicit secrets host delete.
The CLI stops on the first denied target and reports how many prior idempotent
upserts completed. Grant the denied exact key (Once or Every time) on
the same live CLI Card, through its consent or the Card editor, before
retrying. Secret
values remain absent from command arguments, output, state metadata, and logs.
The built-in session_confirmation assurance proves a current KDCube admin
browser session plus the exact click. Deployments configured for
fresh_authentication or user_verification fail closed until their
configured identity authority installs a verifier that can redirect through a
fresh IdP or WebAuthn/passkey challenge and return evidence bound to the exact
request digest and verification time. The transaction and CLI protocol remain
the same for those stronger verifiers.
Diagnose And Recover
connection-hub status
connection-hub doctor --probe --json
connection-hub profile status coding-agent --probe
connection-hub client list --json
Diagnostics report the platform, exact backend, profile type, expiry state, refresh readiness, client mode, and owned-entry state. Credential values are excluded from command arguments, environment variables, client configuration, state files, output, and ordinary logs.
Profile probes preserve mcp_authorization_rejected when the exact governed
endpoint returns HTTP 401 or 403, even when the MCP transport wraps that
response. Upstream response text is not returned. Connection and timeout errors
remain separate, allowing a caller to request new consent only after an actual
authorization rejection instead of rotating a healthy Card during an outage.
OAuth browser reconnect preserves the profile's caller Card:
connection-hub profile reconnect coding-agent
The command reuses the recorded OAuth client. It stores the new token only
after the endpoint proves that token and its access_id matches the recorded
Card. A different-Card grant is revoked while local profile and credential
state remain unchanged.
Use connection-hub profile reconnect coding-agent --device to preserve the
same Card without a browser or callback listener on the client host. Device
mode prints only the public verification URL and user code; tokens remain in
the native credential store.
Static credential replacement validates the candidate before switching:
connection-hub profile credential replace coding-agent
OAuth profile disconnection revokes server authority before local retirement:
connection-hub profile disconnect coding-agent
If local OAuth custody is missing, revoke the recorded access_id through the
Connection Hub owner interface before using the explicit local-abandonment
flags on profile remove.
Set CONNECTION_HUB_STATE_DIR when non-secret CLI metadata needs an isolated
root. Keep the real desktop user's HOME so its native store remains
discoverable.
Python Composition
Domain host processes can use the same profile boundary directly. It lives in
the connection-hub package (connection-hub[client]), so a host does not
need this command line to use it:
from connection_hub.caller.profile_connection import connect_profile_tools
async with connect_profile_tools(
profile_name="coding-agent",
profiles=profiles,
credentials=credentials,
oauth_sessions=oauth_sessions,
) as (remote_tools, _mcp_client):
tools = await remote_tools.list_tools()
connect_profile_tools() uses the same protected OAuth profile session as the
stdio relay. The domain caller receives connected tools while refresh
credentials remain inside the profile service.
The complete command, security, client, recovery, and acceptance contracts are documented in Connect Desktop MCP Clients To Connection Hub. Real Windows Credential Manager, Linux Secret Service, Hermes, and OpenClaw acceptance is recorded separately from mocked portable tests.
License: MIT. Source: https://github.com/elenaviter/app-ecosystem
Metadata
Release files for connection-hub-cli 2026.10.25.200
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| connection_hub_cli-2026.10.25.200.tar.gz | 127.8 kB | With provenance | Details for connection_hub_cli-2026.10.25.200.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| connection_hub_cli-2026.10.25.200-py3-none-any.whl | Python 3 | none | any | Details for connection_hub_cli-2026.10.25.200-py3-none-any.whl |
Total release size: 194.7 kB
Release files / connection_hub_cli-2026.10.25.200.tar.gz
| Download URL | connection_hub_cli-2026.10.25.200.tar.gz |
|---|---|
| Size | 127.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
346c72700498ee6de7df1cbd880b1ef100d2d5fa881d2357da06fbbeaa449852
|
|
BLAKE2b-256 checksum How to use checksums |
fc12fd57c2287a6701723db187d447284894a03d515445c29ecd7bcf31e655ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / connection_hub_cli-2026.10.25.200-py3-none-any.whl
| Download URL | connection_hub_cli-2026.10.25.200-py3-none-any.whl |
|---|---|
| Size | 66.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ecb2c07125bec33bc81c2a9c92c24f74877c4b2f7110d8699ea04f28b1d4db19
|
|
BLAKE2b-256 checksum How to use checksums |
fa6ecd03c7a1b0dee057f6d462ea2c902942026a9406106989b0dd9ccbbbfbd0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logSecurity for connection-hub-cli 2026.10.25.200
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for connection_hub_cli-2026.10.25.200.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.