catalog: draft binky-qonto-api lane + playbook (CCR-2026-0008)
Tenant Qonto bank API front door for binky-control read-only MCP; stays draft until policy apply, founder provision, and capabilities-safe verify.
This commit is contained in:
parent
507bbef6ea
commit
5d30220cc5
3 changed files with 161 additions and 0 deletions
|
|
@ -112,6 +112,7 @@ EXPOSED taint: `wiki/playbooks/exposed-taint.md` · `warden taint <id>`.
|
|||
|
||||
| Catalog `id` | Routing focus | Playbook |
|
||||
| --- | --- | --- |
|
||||
| `binky-qonto-api` | tenant Qonto API on `tenants/binky/qonto/api` (CCR-2026-0008) | `wiki/playbooks/binky-qonto-api.md` |
|
||||
| `object-storage-sts` | NK-WP-0007 STS vending path | `wiki/playbooks/object-storage-sts.md` |
|
||||
| `database-dynamic-credentials` | OpenBao database secrets engine | `wiki/playbooks/database-dynamic-credentials.md` |
|
||||
|
||||
|
|
|
|||
131
wiki/playbooks/binky-qonto-api.md
Normal file
131
wiki/playbooks/binky-qonto-api.md
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
# Binky Qonto bank API
|
||||
|
||||
Date: 2026-07-21
|
||||
Catalog: `binky-qonto-api` (status `draft` until provision; `risk: high`)
|
||||
Owner: `railiance-platform` (CCR-2026-0008) · consumer need: `binky-control`
|
||||
Workplan: BINKY-WP-0005 · Decision: DEC-2026-004 (approved)
|
||||
|
||||
API credentials for the company Qonto account so the self-hosted
|
||||
`qonto/qonto-mcp-server` can run **read-only** balance and transaction pulls for
|
||||
control-plane finance feeds (`finance/CostRunRate.md`, Finance Steward rhythm).
|
||||
|
||||
**Payments and transfers are Red lane forever** — never allow-list write/payment
|
||||
tools in the harness. Qonto API keys are not scope-limited server-side; read-only
|
||||
is enforced at the harness tool allow-list.
|
||||
|
||||
---
|
||||
|
||||
## Provider (Qonto — non-secret)
|
||||
|
||||
| Setting | Value |
|
||||
| --- | --- |
|
||||
| Dashboard | Qonto web app → `/settings/integrations` |
|
||||
| Auth shape | API key + organization ID |
|
||||
| MCP server | `qonto/qonto-mcp-server` (self-hosted; not the hosted OAuth connector) |
|
||||
| Env names only | `QONTO_API_KEY`, `QONTO_ORGANIZATION_ID` |
|
||||
|
||||
Design (variant decision, read-only boundary, consumers):
|
||||
`binky-control/integrations/qonto-mcp.md`
|
||||
|
||||
## OpenBao pointers
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Mount | `tenants` |
|
||||
| Path | `tenants/binky/qonto/api` |
|
||||
| Fields | `QONTO_API_KEY`, `QONTO_ORGANIZATION_ID` |
|
||||
| Policy | `workload-kv-read-binky-qonto-api` |
|
||||
| OIDC role | `binky-qonto-api-workload-kv-read` (`groups=net-kingdom-admins`) |
|
||||
| Risk | `high` |
|
||||
|
||||
---
|
||||
|
||||
## Worker checklist
|
||||
|
||||
1. Login as caller (after CCR-2026-0008 policy + role applied):
|
||||
|
||||
```bash
|
||||
bao login -method=oidc -path=netkingdom role=binky-qonto-api-workload-kv-read
|
||||
```
|
||||
|
||||
2. Fetch via sanctioned transport (never paste into chat):
|
||||
|
||||
```bash
|
||||
warden access binky-qonto-api --all --no-policy --exec -- \
|
||||
qonto-mcp-server
|
||||
# or dual-field inject when wiring a harness session:
|
||||
# warden access binky-qonto-api --all --no-policy --exec -- \
|
||||
# env | grep -E '^QONTO_' | sed 's/=.*/=<set>/'
|
||||
```
|
||||
|
||||
Until catalog is `active` and resolvable, use bao as caller with files:
|
||||
|
||||
```bash
|
||||
umask 077
|
||||
bao kv get -field=QONTO_API_KEY tenants/binky/qonto/api > /tmp/qonto.key
|
||||
bao kv get -field=QONTO_ORGANIZATION_ID tenants/binky/qonto/api > /tmp/qonto.org
|
||||
chmod 600 /tmp/qonto.key /tmp/qonto.org
|
||||
export QONTO_API_KEY="$(cat /tmp/qonto.key)"
|
||||
export QONTO_ORGANIZATION_ID="$(cat /tmp/qonto.org)"
|
||||
shred -u /tmp/qonto.key /tmp/qonto.org
|
||||
```
|
||||
|
||||
3. Run **read-only** MCP tools only (organization, accounts, transactions,
|
||||
statements metadata). Do **not** invoke card, invoicing, request, or transfer
|
||||
tools.
|
||||
|
||||
4. Store **metadata-only** evidence under `binky-control/finance/` (update
|
||||
`CostRunRate.md` TBC rows; no bulk statement dumps in git).
|
||||
|
||||
Agents (`WARDEN_AGENT_ID` set): raw value stream refused (exit 7). Use `--out` /
|
||||
`--exec` / `--wrap` / `--fingerprint`.
|
||||
|
||||
---
|
||||
|
||||
## Verify (capabilities-safe)
|
||||
|
||||
```bash
|
||||
LANE=$(bao token create -policy=workload-kv-read-binky-qonto-api -ttl=2m -field=token)
|
||||
bao token capabilities "$LANE" tenants/data/binky/qonto/api # read
|
||||
bao token revoke "$LANE"
|
||||
|
||||
DEFAULT=$(bao token create -policy=default -ttl=2m -field=token) # deny of create is also pass
|
||||
bao token capabilities "$DEFAULT" tenants/data/binky/qonto/api # deny
|
||||
bao token revoke "$DEFAULT"
|
||||
```
|
||||
|
||||
Never use `bao kv get` for deny tests.
|
||||
|
||||
---
|
||||
|
||||
## Founder provision (Red lane)
|
||||
|
||||
```bash
|
||||
# In Qonto dashboard: /settings/integrations → create API key, note organization ID
|
||||
# values only in mode-0600 files, never argv/chat
|
||||
umask 077
|
||||
# key into /tmp/qonto.key, org id into /tmp/qonto.org — private terminal only
|
||||
bao kv put tenants/binky/qonto/api \
|
||||
QONTO_API_KEY=@/tmp/qonto.key \
|
||||
QONTO_ORGANIZATION_ID=@/tmp/qonto.org
|
||||
shred -u /tmp/qonto.key /tmp/qonto.org
|
||||
```
|
||||
|
||||
Also note **plan tier + monthly fee** for `binky-control/finance/CostRunRate.md`
|
||||
row 4 (and desk-rent amount for row 1 from recent debits when first pull runs).
|
||||
|
||||
Then re-verify capabilities, promote catalog to `active`, set CCR
|
||||
`access_frontdoor.resolvable: true` / `readiness: ready`.
|
||||
|
||||
## Rotation
|
||||
|
||||
```bash
|
||||
warden rotate-guide binky-qonto-api
|
||||
```
|
||||
|
||||
## See also
|
||||
|
||||
- `binky-control/integrations/qonto-mcp.md`
|
||||
- `wiki/playbooks/tenant-secret-onboarding.md`
|
||||
- CCR-2026-0008 in railiance-platform
|
||||
- DEC-2026-004 / OH-2026-003 in binky-control
|
||||
Loading…
Add table
Add a link
Reference in a new issue