One hub for AI providers, email, hosting panels, VPS clouds, chat, GitHub, and server operations — 24 providers, 301 operations, behind one type-safe interface with a hash-chained audit ledger.
| Provider | Operations | Destructive | Auth | Spec source |
|---|---|---|---|---|
claude |
2 | 0 | ANTHROPIC_API_KEY |
hand-written |
cloudflare |
2 | 0 | CLOUDFLARE_ACCOUNT_ID + CLOUDFLARE_API_TOKEN |
hand-written |
contabo |
8 | 0 | OAuth client + user creds | hand-written |
cpanel |
11 | 0 | CPANEL_HOST + user:token |
hand-written |
email |
4 | 0 | EMAIL_ACCOUNTS (JSON) |
built-in (IMAP/SMTP) |
github |
25 | 2 | GITHUB_TOKEN |
hand-written |
gmail |
79 | 15 | GOOGLE_CLIENT_ID/SECRET + refresh tokens |
Google Discovery |
hetzner |
72 | 11 | HETZNER_API_TOKEN |
OpenAPI 3.0.3 |
iherb_apify |
7 | 0 | IHERB_APIFY_TOKEN |
hand-written |
iherb_impact |
8 | 0 | IHERB_IMPACT_ACCOUNT_SID + IHERB_IMPACT_AUTH_TOKEN |
hand-written |
iherb_partnerize |
8 | 0 | IHERB_PARTNERIZE_APP_KEY + IHERB_PARTNERIZE_USER_KEY |
hand-written |
kimi |
2 | 0 | MOONSHOT_API_KEY |
hand-written |
linode |
9 | 1 | LINODE_API_TOKEN |
hand-written |
oneprovider |
6 | 0 | ONEPROVIDER_API_KEY |
hand-written |
openai |
3 | 0 | OPENAI_API_KEY |
hand-written |
ops_browser |
3 | 0 | none | built-in (local) |
ops_network |
5 | 0 | HUB_SECURITY_POLICY |
built-in (local) |
ops_security |
5 | 0 | HUB_SECURITY_POLICY |
built-in (local) |
ops_ssh |
3 | 2 | HUB_SECURITY_POLICY |
built-in (local) |
ovh |
7 | 0 | OVH app key/secret/consumer key | hand-written |
tawk |
8 | 0 | TAWK_API_KEY + property ID |
hand-written |
ultrahost |
6 | 0 | ULTRAHOST_* |
hand-written |
whm |
9 | 1 | WHM_HOST + root token |
hand-written |
whmcs |
9 | 0 | WHMCS_URL + API identifier/secret |
hand-written |
Total: 301 operations (32 destructive)
# Build from source
cd crates
cargo build --release
# List all providers
connector-hub list
# Search for operations
connector-hub search "delete server"
# Describe a specific operation
connector-hub describe hetzner.servers.delete
# Start the MCP stdio server
connector-hub mcp
# Validate the installation
connector-hub validateProvider specs are located in this order:
CONNECTOR_HUB_SPECS_DIR— explicit override../specsrelative to the working directory.specs/found by walking up from the executable.
Rule 3 lets an installed binary find its specs without the caller setting a working directory — MCP hosts launch servers with an arbitrary cwd, so a hub installed globally would otherwise start with an empty catalogue.
Connectors are data, not code. Provider specs (OpenAPI 3.x or Google Discovery JSON) are compiled into an operation catalogue at startup. The MCP surface is small and fixed while the reachable surface is complete:
provider spec (OpenAPI / Google Discovery / hand-written JSON)
│ loaded at startup
▼
operation catalogue (every endpoint, typed, classified)
│
├── search_operations(query, provider?) → find any endpoint
├── describe_operation(id) → exact JSON Schema
├── call_operation(id, args, account, …) → validated execution
└── list_providers() → provider summary
crates/
connector-hub/ CLI binary + rmcp MCP stdio server
hub-core/ Operation catalogue, dispatch, execution-state envelope
hub-spec/ Spec ingestion: OpenAPI 3.x + Google Discovery → operations
hub-auth/ Credential store, OAuth, token refresh
hub-policy/ Permission model, capability grants, hash-chained audit ledger
hub-net/ HTTP execution: SSRF validation, IP pinning, retries, redaction
specs/ Provider spec files (JSON)
Every operation result is a typed enum — non-execution states cannot carry
executed: true:
Succeeded { executed: true, data }— the only state with real outputDryRun { would_execute, mutation_class }— what would happenConfirmationRequired { provider, operation, token_format }— destructive ops need confirmationConfigurationRequired { provider, missing }— credentials or runtime not availablePermissionDenied— policy refused the operation
Destructive operations require an explicit confirmation token or a standing policy grant. There is no env-var-presence shortcut to liveness.
Every policy decision (granted or refused) is appended to a BLAKE3 hash-chained JSONL audit ledger. Verify integrity with:
connector-hub audit-verify audit.jsonlSee docs/adr/0004-audit-ledger-format.md for the format specification.
Connectors read credentials from the environment. MCP hosts launch stdio
servers with a bare environment, so bin/connector-hub-mcp sources
~/.config/connector-hub/env (override with CONNECTOR_HUB_ENV) before exec.
One file, shared by every agent on the machine:
mkdir -p ~/.config/connector-hub
cat > ~/.config/connector-hub/env <<'EOF'
GITHUB_TOKEN="ghp_..."
HETZNER_API_TOKEN="..."
EOF
chmod 600 ~/.config/connector-hub/envLeave unused variables commented out rather than set to "" — an empty string
reads as configured, which turns a clean ConfigurationRequired into a 401
from the provider.
- Credentials live in environment variables or an encrypted store. Never in action parameters, never in tool output.
- All HTTP goes through one
NetClientwith SSRF validation, IP pinning, redirect control, and bounded retries. - Ops connectors (
ops_ssh,ops_network) requireHUB_SECURITY_POLICYcapability grants. - OAuth refresh tokens are never serialised into MCP tool results.
- Create
specs/<provider>.jsonin OpenAPI 3.0.3 or Google Discovery format. - Add auth entry in
crates/hub-auth/src/store.rsfrom_env(). - Run
connector-hub listto verify operations load. - Run
connector-hub validateto confirm no duplicate IDs.
cd crates
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test --workspace
cargo run -- validate- CodeWithJuber/forgekit — delivery and substrate (memory, foresight, guardrail hooks)
- CodeWithJuber/hikmah-stack — judgment (deterministic cognitive kernel, decision scoring, audit ledger)
Every pull request runs: Rust formatting, clippy with deny warnings, workspace
tests, installation validation, and secret scanning. Real-provider integration
tests are opt-in behind the protected protected-integration environment.
MIT