Executive summary of every account, credential, and integration powering the Brainzyme backend. A map, not a vault — records where credentials live, never the secrets themselves.
Last updated: 2026-05-19 (hosting + services full refresh vs the 39-service Connections Registry) · Source of truth: F:/Agentic-OS/reference/connections-registry.md + project_backend_access_registry.md + reference_hosting_infrastructure.md
F:/Agentic-OS/reference/connections-registry.md with per-service contracts at F:/Agentic-OS/reference/services/{name}.md.Resolved 2026-04-26:
[email protected] is canonical going forward. All future Google API connections target this account. [email protected] = LEGACY (gws CLI still functional, gdrive MCP token broken, no new integrations).bns-token.json minted — originally 13 scopes; now 12 (cloud-platform removed 2026-05-04 — RAPT trigger). Covers Drive / Sheets / Docs / Calendar / Gmail.modify / Search Console / Analytics×3 / OIDC. BigQuery via separate bq-token.json. Internal consent screen → no expiry.tools/bns_drive.py, bns_sheets.py, bns_docs.py, bns_gmail.py, bns_calendar.py. Argparse subcommands, --json mode. Replaces Google MCPs.mynutrition365 added as new dormant stub brand; recoverup.co.uk populated in RecoverUp's domains array.claude01-cli User Type = Internal, all 13 scopes registered on Data Access tab. Earlier "BNS Workspace onboarding" pending item closed.Resolved 2026-05-04:
cloud-platform scope removed from bns-token.json — 13→12 scopes. The cloud-platform scope triggered Google Workspace Re-Authentication Policy (RAPT) check failures after ~30 days, causing invalid_scope / invalid_rapt errors on ALL Sheets/Drive/Docs/Calendar/Gmail operations. Individual scope refresh works fine; only cloud-platform fails. Removed via tools/bns_token_diagnose.py --fix. 7 Python tools fixed to NOT pass SCOPES to from_authorized_user_file().bq-token.json minted — separate OAuth token with just bigquery scope. Avoids bundling BigQuery into the 12-scope BNS token (which would risk re-triggering RAPT). Mint via tools/bq_first_auth.py. Smoke-tested: 7,271 UK events, all 4 market datasets visible.ga4_bq.py credential chain updated — priority: bq-sa.json (SA, blocked by org) → bq-token.json (OAuth, bigquery-only) → bns-token.json (fallback). No explicit scopes passed on any path.bns_first_auth.py updated — cloud-platform removed from SCOPES list; load_existing() no longer passes SCOPES to credential loader.verified_update() partial-range support — bns_sheets.py now supports range="G19:H19" kwarg for single-cell writes with direct read-back verification.Pending:
.mcp.json — gdrive, claude_ai_Google_Drive, claude_ai_Gmail, claude_ai_Google_Calendar. Replace with Python helpers. Verify nothing depends on them first.[email protected]. Case-by-case as each service's auth pattern is reviewed.gdrive-token.json for legacy [email protected] — only if a remaining script still depends on the gdrive MCP path. Likely skip; Python helpers replace it.claude01-cli Library (Cloud Resource Manager already enabled; BigQuery / GCS / Logging / Monitoring / Dataform on demand — token + scope already cover them).| GCP Project | Owned by | Workspace org | User Type | 7-day expiry? | Credentials |
|---|---|---|---|---|---|
claude01-cli PRIMARY |
[email protected] | betternutritionalscience.co.uk parent-company Workspace, canonical from 2026-04-26 |
Internal ✅ | no | F:\Claude Root\bns-token.json (12 scopes — cloud-platform removed 2026-05-04)F:\Claude Root\bq-token.json (bigquery-only, minted 2026-05-04)F:\Claude Root\ga4-oauth-token.json (legacy GA4-only)F:\Claude Root\.env → GA4_OAUTH_* |
claude-use-calum8999 LEGACY |
[email protected] | brainzyme.co.uk previous primary Workspace, no new integrations |
Internal ✅ | no | F:\Claude Root\gdrive-credentials.json (Drive)F:\Claude Root\youtube-oauth.json (YouTube, Brand Account flow) |
youtube-audit SPECIALISED |
[email protected] (personal) | n/a (no Workspace) | External + Published | no | F:\Claude Root\youtube-token.json — YouTube channel ownership requires personal-Gmail Brand-Account-Owner path |
brainzyme.co.uk Internal project only admits @brainzyme.co.uk accounts. Same for BNS. Personal @gmail.com — locked out of both (expected). Covering both domains with one client requires External + verification, which we avoid.
| Google account | OAuth project | Token file | Consumed by | Purpose |
|---|---|---|---|---|
| [email protected] PRIMARY | claude01-cli |
F:\Claude Root\bns-token.json(12 scopes — cloud-platform removed 2026-05-04) |
7 Python helpers:tools/bns_drive.pytools/bns_sheets.pytools/bns_docs.pytools/bns_gmail.pytools/bns_calendar.pytools/build_campaign_planner_sheet.pytools/build_creative_tracker_sheet.py+ direct googleapiclient imports |
Canonical primary admin path. Drive / Sheets / Docs / Gmail (modify) / Calendar / Search Console / GA4 (read+admin). cloud-platform REMOVED (RAPT trigger). BigQuery uses separate bq-token.json. Token never expires (Internal-mode + Production OAuth screen). Do NOT pass SCOPES to from_authorized_user_file() — let token file govern refresh. |
| [email protected] LEGACY | claude-use-calum8999 |
F:\Claude Root\gdrive-token.json (broken — 7-day expiry from External-Testing era) |
gdrive MCP( @starfysh/gdrive-mcp, Drive-only) |
Historical Brainzyme Drive access. Slated for retirement. No new integrations target this path. Re-mint only if a remaining script depends on the gdrive MCP. |
| [email protected] | n/a (separate CLI auth) | stored by gws CLI |
gws CLI(Drive + Sheets + Docs + Gmail + Calendar) |
Single-auth shell tool, still functional. Don't rebuild gws functionality on BNS — Python helpers cover the same surface for new work. |
| [email protected] SPECIALISED | youtube-audit (personal Google Cloud project) |
F:\Claude Root\youtube-token.json |
YouTube Data API + YouTube Analytics — video-creative-audit skill + v4.0/video-audit/scripts/drive-channel-sync.py |
Canonical active YouTube path — verified 2026-04-26 via tokeninfo (client_id 895992706842) successfully reading channel UCjlK40vF-Jggn6eOLaioLrg. [email protected] has Owner rights on the Brand Account that owns the channel. The earlier .env commentary claiming [email protected] was the working YouTube path was aspirational — corrected. Token minted via PUBLISHED OAuth consent screen → no 7-day expiry. Stays separate; not migrated to BNS. |
| [email protected] BIGQUERY | claude01-cli |
F:\Claude Root\bq-token.json(1 scope: bigquery) |
tools/ga4_bq.py (GA4 BigQuery event-level analysis) |
BigQuery-only OAuth token. Isolated from bns-token.json to avoid RAPT re-auth failures that cloud-platform scope triggers. Mint via tools/bq_first_auth.py. Same OAuth Desktop client (claude01-cli GCP project, Internal consent screen). Smoke-tested 2026-05-04: 7,271 UK events, all 4 market datasets (analytics_408119030 UK, analytics_408049345 US, analytics_408080646 DE, analytics_408139967 FR). Credential priority chain in ga4_bq.py: bq-sa.json → bq-token.json → bns-token.json. |
Single-primary-admin model: BNS Ltd is the parent legal entity, so [email protected] is the canonical permanent business identity. Per-brand admins ([email protected]) become specialised secondaries. Banked rule: memory/feedback_bns_primary_admin_canonical.md.
claude01-cli — was created on 2026-04-25, OAuth consent screen Published to Production, full 13-scope bns-token.json minted on 2026-04-26, and 9 Google services smoke-tested (Identity, Drive, Sheets, Docs, Gmail, Calendar, Search Console, GA4 Admin, Cloud Resource Manager). No new walkthrough run is required. Steps below are kept as a reference template for any future Workspace org.
Exact steps for standing up a new Internal-mode OAuth project inside the betternutritionalscience.co.uk Workspace. Produces a credentials JSON that will issue permanent (non-expiring) refresh tokens for any @betternutritionalscience.co.uk account.
[email protected] — visit console.cloud.google.com. Top-left, verify the org name shows “betternutritionalscience.co.uk”, not “No organisation” — this is the check that unlocks Internal mode later.Brainzyme Google Access. Organisation: betternutritionalscience.co.uk. Location: betternutritionalscience.co.uk. Click Create. Wait for the notification, then select it.Brainzyme Google Access[email protected][email protected].../auth/drive.readonly and .../auth/drive.file. For full Workspace: add Sheets, Docs, Gmail, Calendar read/write scopes as needed. Save and Continue. (Internal mode doesn't need test users — skip that page.)Claude Code MCPF:\Claude Root\gdrive-credentials-bns.json. Matches the existing naming convention, keeps it alongside the brainzyme.co.uk credentials but clearly namespaced..mcp.json. Add a new gdrive-bns server entry pointing at the new credentials and a fresh token path (gdrive-token-bns.json). Pattern + examples in project_multi_account_google_mcp.md. Restart Claude Code.[email protected] → grant scopes. Refresh token written to gdrive-token-bns.json. Because the project is Internal, this token will not expire in 7 days. After completing, update the §1b table above with the new entry and add a line to the Change Log.Original side-by-side: APIs enabled on legacy claude-use-calum8999 vs the new claude01-cli. As of 2026-04-26, claude01-cli has Cloud Resource Manager + BigQuery family + Cloud Storage + Logging + Monitoring + Dataform + Service Management + Service Usage + Telemetry + Cloud Trace + Cloud SQL + Datastore + Dataplex enabled. 2026-05-04 update: cloud-platform scope removed from bns-token.json (triggers RAPT failures). BigQuery now uses dedicated bq-token.json with just the bigquery scope. BigQuery API is still enabled on claude01-cli — the token file governs access, not the scope list. Stay-on-existing-project items (Ads, Gemini) aren't per-account OAuth — they use different credential models.
| API | Service ID | On existing? | Enable on new? | Why / consumer |
|---|---|---|---|---|
| Google Drive API | drive.googleapis.com |
✓ yes | ✓ yes | gdrive MCP — Drive file access |
| Google Sheets API | sheets.googleapis.com |
✓ yes | ✓ yes | gws CLI + future Sheets MCP |
| Google Docs API | docs.googleapis.com |
✓ yes | ✓ yes | gws CLI + future Docs MCP |
| Gmail API | gmail.googleapis.com |
✓ yes | Optional | gws CLI — only if Gmail shell access needed on BNS account |
| Google Calendar API | calendar-json.googleapis.com |
✓ yes | Optional | gws CLI — only if Calendar shell access needed on BNS account |
| People API | people.googleapis.com |
✓ yes | Optional | Profile info for authenticated user (nice-to-have) |
| Google Ads API | googleads.googleapis.com |
✓ yes (developer token + MCC) | ✖ no need | Uses separate developer token pattern — MCC 269-741-1682 stays on existing project |
| Generative Language API | generativelanguage.googleapis.com |
✓ yes (AI Studio key) | ✖ no need | Gemini API — uses GOOGLE_AI_STUDIO_KEY from .env, not OAuth |
Minimum viable for new BNS project: Drive API only (matches current MCP scope). Enable Sheets + Docs if planning to wire gws CLI against the BNS account too.
| # | Scope URL | Why we need it | Target token file | Status |
|---|---|---|---|---|
| 1 |
www.googleapis.com/auth/datamanagerwww.googleapis.com/auth/datamanager.partnerlink
ADDED 2026-05-19 (re-added after save problem) |
Customer Match consent injection. Per-record adUserData + adPersonalization on the 57 bz_* lists. Calum granted BOTH the main scope AND the datamanager.partnerlink companion (bonus — adds partner-link write capability for Marketing Platform / CM360 / SA360 / DV360 / Analytics). Broader than originally planned; no risk. |
data-manager-token.json |
ADDED |
| 2 | www.googleapis.com/auth/indexing |
SEO Indexing API. Programmatic indexing requests for new pages — speeds up str-programmatic-seo + str-ai-seo publish cycles by 1-7 days. |
seo-token.json (cluster) |
ADDED 2026-05-19 |
| 3 |
www.googleapis.com/auth/pagespeedonline.readonly→ API key path instead ( PAGESPEED_API_KEY in .env)
ROUTING CHANGE 2026-05-19 |
PageSpeed Insights API. Replaces local Lighthouse in tools/lighthouse_gate.py — canonical Google Lighthouse + CrUX field data in one response. Use API key, not OAuth — PSI supports plain API-key access (free tier 25k/day, plenty for Brainzyme). Same pattern as Maps Platform. Saves a scope slot on the consent screen. Restrict the key to PageSpeed Insights API only. |
.env only (no token file) |
USE API KEY (not OAuth) |
| 4 | www.googleapis.com/auth/siteverification |
Search Console Site Verification API. Programmatically register new subdomain blogs / new TLDs without the manual HTML-file / DNS TXT trip. | seo-token.json (cluster) |
RE-ADD NEEDED |
| 5 |
www.googleapis.com/auth/tagmanager.edit.containerswww.googleapis.com/auth/tagmanager.edit.containerversionswww.googleapis.com/auth/tagmanager.publishwww.googleapis.com/auth/tagmanager.delete.containerswww.googleapis.com/auth/tagmanager.manage.accountswww.googleapis.com/auth/tagmanager.manage.users
ADDED 2026-05-19 (6 scopes — full GTM admin) |
Tag Manager API — correction 2026-05-19: the scopes are NOT consolidated as I'd claimed earlier. GTM still uses individual scopes per Google's docs. Calum granted 6 (publish + edit containers + edit container versions + delete containers + manage accounts + manage users) — more capability than the original 2-scope plan; all-in. Use case: affiliate pixel deployment (Awin / Impact / ShareASale postbacks) + future Web Pixels Part 2 + GTM admin automation. | gcp-token.json (cluster) |
ADDED 2026-05-19 |
| 6 | www.googleapis.com/auth/cloud-platform |
Full GCP — IAM, Cloud Logging, Functions, Cloud DNS, Cloud Run. Calum: read+write per 2026-05-18 (upgraded from read-only). Required for server-side ops scripts. | gcp-token.json (cluster) |
ADDED |
| 7 | www.googleapis.com/auth/cloud-billing FULL, not .readonly |
Programmatic GCP spend monitoring. Calum 2026-05-19: granted FULL cloud-billing instead of the originally-planned cloud-billing.readonly. Practical effect: can also edit billing accounts / payment methods / alerts via API. Low risk on Internal-mode app (only [email protected] can mint tokens). Swap to .readonly later if you want to tighten. |
gcp-token.json (cluster) |
ADDED 2026-05-19 |
| 8 | www.googleapis.com/auth/business.manage |
Business Profile API. Read/write Brainzyme's Google Business Profile — posts, hours, location (for future product pickup), Q&A, review replies. Calum 2026-05-19: Business Information API ALSO enabled (was only Account Management initially) — one scope, both APIs. Required for pickup-location feature. | business-profile-token.json |
ADDED 2026-05-19 |
| 9 |
www.googleapis.com/auth/postmasterwww.googleapis.com/auth/postmaster.domainwww.googleapis.com/auth/postmaster.user
ADDED 2026-05-19 |
Gmail Postmaster Tools API — 3 scopes granted (broader than originally-proposed postmaster.readonly): full read+admin + domain register/unregister + per-domain user mgmt. Sender reputation, spam rate, FBL data for brainzyme.com (and .us/.de/.fr if sending), plus programmatic domain registration. Pairs with the new mkt-email-deliverability skill + DMARC aggregator (see Deliverability Stack section below). |
postmaster-token.json |
ADDED 2026-05-19 |
[email protected] — top-left org dropdown must show betternutritionalscience.co.uk. PENDINGclaude01-cli (the canonical primary OAuth project — see §1a above). All new scopes attach to this single project so we keep one consent screen and one app to manage. PENDINGdatamanager.googleapis.com — Data Manager APIindexing.googleapis.com — Indexing APIpagespeedonline.googleapis.com — PageSpeed Insights APIsiteverification.googleapis.com — Google Site Verification APItagmanager.googleapis.com — Tag Manager APIcloudresourcemanager.googleapis.com — already enabled (verify only)cloudbilling.googleapis.com — Cloud Billing APImybusinessaccountmanagement.googleapis.com — My Business Account Management APImybusinessbusinessinformation.googleapis.com — My Business Business Information APIgmailpostmastertools.googleapis.com — Gmail Postmaster Tools APIoffline_user_data_jobs as of the audit, EEA lists succeeding). Our own dev token is NOT allowlisted for Customer Match API writes (Step 0 smoke confirmed). Skip unless / until we apply for Customer Match API allowlisting separately (weeks-long Google process). The Cloud Console may also not show this option at all without prior allowlisting — expected, not a bug. Calum 2026-05-19: was unable to find the path — correct, this is gated. DEFERRED[email protected] as a user on the existing registrations. ROUTING FIX 2026-05-19 Domains are already registered under [email protected] (personal Gmail) per Calum's existing Postmaster setup at postmaster.google.com/u/0/managedomains. Personal-Gmail can't auth with our Internal-mode claude01-cli OAuth project (same wall as YouTube channel ownership, which is why youtube-audit is separate). Clean fix: in Postmaster Tools UI, click each domain → Manage users → add [email protected] as manager/owner. DNS TXT verification carries over — the DOMAIN owns it, not the account. Fallback if no multi-user UI: register each domain a SECOND time under [email protected]; same TXT works; two registrations coexist independently. PENDING[email protected] appears as a Manager (or Owner). If not, add yourself. PENDING*.brainzyme.com/*, *.brainzyme.us/*, *.brainzyme.de/*, *.brainzyme.fr/*, localhost:*F:/Agentic-OS/.env as MAPS_API_KEY=AIza.... PENDING
python tools/data_manager_first_auth.py → data-manager-token.jsonpython tools/seo_first_auth.py → seo-token.json (indexing + pagespeedonline + siteverification)python tools/gcp_first_auth.py → gcp-token.json (cloud-platform + cloud-billing.readonly + tagmanager.*)python tools/business_profile_first_auth.py → business-profile-token.jsonpython tools/postmaster_first_auth.py → postmaster-token.json[email protected], click Allow. Token writes to disk. Scripts will be created in the same Claude session that authored this walkthrough — not yet on disk. PENDING
tmp/scope_expansion_smoke.py that loads each new token, hits a minimal-side-effect endpoint per service (e.g. OfflineUserDataJobService.list, indexing.urlNotifications.getMetadata, pagespeedonline.pagespeedapi.runpagespeed, etc.), and reports GREEN/RED per service. Run it once Calum finishes the GCP UI work. PENDINGbns-token.json, bq-token.json, ga4-oauth-token.json, drive-token.json, youtube-token.json, youtube-write-token.json, google-ads.yaml) stay valid as-is. Existing tools that use them continue working without changes.
| Cluster | Token file | first_auth script | Scopes bundled | Tools that will consume |
|---|---|---|---|---|
| Data Manager | data-manager-token.json |
tools/data_manager_first_auth.py |
datamanager |
tools/upload_customer_match_with_consent.py (task #8) |
| SEO | seo-token.json |
tools/seo_first_auth.py |
indexing, pagespeedonline.readonly, siteverification |
tools/lighthouse_gate.py (PSI upgrade), future tools/indexing_*.py, tools/sc_verify_property.py |
| GCP / Ops | gcp-token.json |
tools/gcp_first_auth.py |
cloud-platform, cloud-billing.readonly, tagmanager (consolidated 2026) |
Future GCP ops scripts, GTM audit / publish tooling, billing-monitor crons |
| Business Profile | business-profile-token.json |
tools/business_profile_first_auth.py |
business.manage |
Future tools/bp_*.py for post / review-reply / hours / pickup-location |
| Postmaster (deliverability) | postmaster-token.json |
tools/postmaster_first_auth.py |
postmaster.readonly |
Future tools/postmaster_pull.py deliverability cron; alerts on spam-rate spike |
| Maps Platform (API KEY — not OAuth) | — (.env MAPS_API_KEY) |
n/a (manual key creation) | Maps JS API, Places API (New), Geocoding API | Future product-pickup location-picker UI / geocoding |
Calum has recurring SPF / DKIM / DMARC / inbox-placement pain. Postmaster Tools API (row 9 above) gives the Gmail telemetry, but on its own it's data without an operator. This 3-piece stack closes the loop: telemetry + the operator who reads it + the missing DMARC report parser.
| # | Item | Type | What it does | Status |
|---|---|---|---|---|
| D1 | mkt-email-deliverability skill |
Local skill (no Google scope, no API key) | The operator. Diagnoses SPF / DKIM / DMARC / BIMI issues; reads Postmaster + DMARC reports; recommends DNS changes; handles ISP-specific deliverability strategy. Adapted from rshah515/claude-code-subagents (MIT) and Brainzyme-tailored for Klaviyo + GHL + Shopify Email + Cloudflare DNS. Installed at F:/Agentic-OS/.claude/skills/mkt-email-deliverability/SKILL.md. |
DONE 2026-05-19 |
| D2 | DMARC aggregator (dmarcian or EasyDMARC) |
External service (free tier) | Parses the daily DMARC aggregate XML reports that arrive at [email protected] from receiving mail servers. Without an aggregator these reports are unreadable. Sign up: dmarcian.com OR easydmarc.com — 5-min setup; both have free tiers covering Brainzyme's volume. After signup: add the aggregator-provided rua= address to your DMARC TXT record in Cloudflare DNS for brainzyme.com (and .us/.de/.fr if those send mail). |
PENDING |
| D3 | MXToolbox API key (optional) | External service (free tier) | Programmatic blacklist + SPF/DKIM lookups via API. Without it, the mkt-email-deliverability skill has to paste manual MXToolbox output. Sign up: mxtoolbox.com/user/api — free tier covers manual + light programmatic use. Add as MXTOOLBOX_API_KEY in F:/Agentic-OS/.env. |
PENDING (optional) |
claude01-cli consent screen (was 10 — Tag Manager scopes consolidated by Google 2026)..env).claude01-cli project.mkt-email-deliverability skill + DMARC aggregator + (optional) MXToolbox API key.claude01-cli.claude01-cli is Internal-mode (Workspace-restricted).All new APIs have free tiers that easily cover Brainzyme's traffic:
| Decision | Recommendation | Status |
|---|---|---|
Customer Match opt-out posture: accepts_marketing: false → ad_personalization: DENIED (lenient split) vs exclude entirely (strict) |
Lenient split — most defensible CM compliance; keeps measurement value. Build the tool with a flag, default lenient. | Calum to decide later |
| Postmaster Tools: monitor only brainzyme.com or all 4 TLDs (.com/.us/.de/.fr)? | All 4 if any of them send mail; otherwise .com only. Each one is a 1-min DNS TXT add. | PENDING |
| Business Profile: existing profile only, or add new market-specific profiles? | Start with the existing profile; add per-market profiles only if Brainzyme registers EU subsidiaries. | PENDING |
When Calum finishes the walkthrough, Claude updates each row above from PENDING → DONE and re-publishes the dashboard. Per-cluster token-file paths get cross-linked into reference/connections-registry.md + new reference/services/{data-manager,indexing,pagespeed,business-profile,postmaster}.md contracts in the same session.
Two GitHub accounts in play. Full detail — emails, repo visibility, deploy flow — in reference_hosting_infrastructure.md.
| Account | Role | Linked to | Used for |
|---|---|---|---|
Calum Edinburgh (Company)[email protected] |
Francis-managed | Main VPS | Company automation projects (Francis-managed) hosted on the Main VPS. |
HappyUser89[email protected] |
Claude-driven | Main VPS + Testing VPS + Cloudflare Pages | Claude's account. Hosts HappyUser89/brainzyme (the apps.nutritionalproducts.org dashboards) on the Main VPS, the n8n ads-agent development on the Testing VPS, and — new — the Cloudflare Pages hosting layer (§5b). Classic PAT embedded in F:\brainzyme-git\.git\config remote URL — git push works silently. Repo PRIVATE. |
The Main VPS carries both accounts — Calum Edinburgh for Francis's company projects, HappyUser89 for the apps/dashboards project (separate projects on one box). The Testing VPS and the new Cloudflare hosting are both on HappyUser89. ("Joe SEO" is a Hostinger hosting account — see §5 — not a GitHub account.)
Two Hostinger VPSes, both running Coolify v4 — plus a new Cloudflare Pages static-hosting layer (§5b). Docker cleanup runbook, troubleshooting, deploy architecture: reference_hosting_infrastructure.md. Per-VPS API + root access: Connections Registry services/hostinger.md + services/coolify.md.
| VPS | Hostinger account | Server / IP | GitHub link | Purpose | Access |
|---|---|---|---|---|---|
| Main VPS | calum842 |
srv843884168.231.115.117 |
Calum Edinburgh + HappyUser89 | apps.nutritionalproducts.org dashboards (Command Centre, UGC Explorer, Creative Review, all dashboards) + Francis's company automation projects + n8n at support.nutritionalproducts.org |
Calum + Claude + Francis |
| Testing VPS | Joe SEO |
srv1376875168.231.113.172 |
HappyUser89 | n8n at support-v2.nutritionalproducts.org — used to build & develop the v4.0 ads agent. Coolify admin at ops.nutritionalproducts.org. |
Calum + Claude |
Hostinger panel: hpanel.hostinger.com → VPS → select server → Browser terminal (runs as root on host). Programmatic VPS / firewall management via tools/hostinger_api.py (per-account tokens HOSTINGER_API_CALUM842 / HOSTINGER_API_JOESEO). The Main VPS Coolify has had recurring disk-fill incidents — runbook in memory/feedback_calum842_vps_disk_fill_post_mortem.md + feedback_coolify_prune_minus_a_required.md.
Traefik basicauth middleware applied per-app in Coolify. Currently enforced on the Command Centre application (uuid s8sk0ks4gk40kwsgco480cgg) which owns the root FQDN — so every subfolder app under apps.nutritionalproducts.org inherits the gate.
| Field | Value |
|---|---|
| URL | https://apps.nutritionalproducts.org/ |
| Username | admin |
| Password | Stored in .env → APPS_NP_BASIC_AUTH_PASSWORD — not duplicated in this dashboard. |
| Inline (curl / browser) | https://admin:[email protected]/ (expand the env var locally) |
| .env vars | APPS_NP_URL / APPS_NP_BASIC_AUTH_USER / APPS_NP_BASIC_AUTH_PASSWORD |
| Traefik middleware | http-basic-auth-s8sk0ks4gk40kwsgco480cgg |
| Known bugs avoided | memory/feedback_coolify_basic_auth_bugs.md — varchar(255) column, encrypt()/decryptString() asymmetry |
To rotate: open the Coolify app → Configuration → HTTP Basic Authentication section → change password via the Livewire UI (never direct DB write) → Force deploy (without cache). Update the .env value (APPS_NP_BASIC_AUTH_PASSWORD) and §5 of project_backend_access_registry.md. Verify: curl -sI -k -H "Host: apps.nutritionalproducts.org" https://168.231.115.117/ → expect 401; with -u admin:<pass> → 200.
Static dashboards / sites are moving to Cloudflare Pages, deployed from the HappyUser89 GitHub account. 4 CF Pages projects live: brainzyme, public, team-shared, bns-daily-intelligence — 3 of them gated by Cloudflare Zero Trust Access apps (email allowlist). CF account team divine-unit-8d4e (Free plan).
| Field | Value |
|---|---|
| Hosting | Cloudflare Pages (static) + Zero Trust Access (auth gate) |
| GitHub source | HappyUser89 — CF Pages auto-deploys on push (one-time GitHub App install per CF account) |
| Auth token | CLOUDFLARE_API (cfat_* Account API Token) + CLOUDFLARE_ACCOUNT_ID in .env |
| Access gate | CF Zero Trust, team divine-unit-8d4e; email allowlist [email protected], [email protected] |
| Contract / SOP | services/cloudflare.md · reference/it-sops/cloudflare-pages-static-hosting.md |
.mcp.json Who auths as what Hardened 2026-05-08| MCP server | Auth source | Account / identity |
|---|---|---|
google-ads | F:\Claude Root\google-ads.yaml (path in GOOGLE_ADS_CREDENTIALS) | Google Ads MCC 269-741-1682 |
browserbase | ${BROWSERBASE_API_KEY} + ${BROWSERBASE_PROJECT_ID} + ${GOOGLE_API_KEY} from .env | Browserbase project ccb152d1-... |
dataforseo | ${DATAFORSEO_USERNAME} / ${DATAFORSEO_PASSWORD} from .env | [email protected] |
pinecone | ${PINECONE_API_KEY} from .env | primary Pinecone project |
ga4 | service account JSON at F:\Claude Root\ga4-adc.json + GA4_PROPERTY_ID=408119030 | GA4 property 408119030 |
shopify-dev-mcp | none (stateless dev tool) | n/a |
n8n-mcp | ${N8N_API_KEY} + ${N8N_BASE_URL} from .env (npx -y n8n-mcp) | n8n workflow builder — Main VPS n8n (support.nutritionalproducts.org) |
.mcp.json; all secret values now flow via ${VAR} interpolation from .env. Browserbase, DataForSEO, Pinecone, and GOOGLE_API_KEY were inline pre-2026-05-08. Rotate any secret → edit .env, restart Claude Code (no .mcp.json edit needed).
F:/Agentic-OS/reference/services/*.md. The Browserbase MCP "deferred-tool" pattern (must run ToolSearch select:mcp__browserbase__* before tool calls) is documented at services/browserbase-mcp.md. Same pattern applies to google-ads, ga4, pinecone, dataforseo.
.env API Keys Names only Refreshed 2026-05-08Two .env files exist: F:\Agentic-OS\.env (canonical for active sessions) and F:\Claude Root\.env (legacy parallel). Per Connections Registry policy, Agentic-OS wins. Never committed.
Full per-service auth recipes + failure modes live at F:\Agentic-OS\reference\services\*.md. This table is the executive summary.
| Env var | Provider | Consumer / contract |
|---|---|---|
Shopify — modern client_credentials flow (mint via tools/shopify_get_token.py) | ||
{UK,US,DE,FR}_SHOPIFY_CLIENT_ID / _CLIENT_SECRET | Shopify Custom App (per market) | Used by shopify_get_token.py to mint admin tokens. services/shopify.md |
{UK,US,DE,FR}_SHOPIFY_SHOP_DOMAIN | Shopify (per market) | Short form (e.g. brainzyme); script appends .myshopify.com |
{UK,US,DE,FR}_SHOPIFY_ADMIN_TOKEN | Shopify (per market) | Minted on demand. Stale on every Custom App reinstall — re-mint is the fix to any 401. |
| Cloudflare (Workers + Tunnel + REST API + Pages + Zero Trust Access) | ||
CLOUDFLARE_REVIEWS_WORKER_URL / CLOUDFLARE_REVIEWS_WORKER_TOKEN | CF Workers | Bearer for /api/test-stores, /api/submissions. Auth for Wrangler CLI is npx wrangler@4 login OAuth (NOT cfat_ tokens). services/cloudflare.md |
CLOUDFLARE_API / CLOUDFLARE_ACCOUNT_ID | Cloudflare Account API | cfat_* Account API Token — Tunnel, REST API, CF Pages, Zero Trust Access. 4 CF Pages projects live (see §5b). services/cloudflare.md |
| Hosting infrastructure — VPSes / Coolify / n8n | ||
COOLIFY_API_TOKEN / COOLIFY_JOESEO_API_TOKEN (+ per-VPS COOLIFY_*_URL / _ADMIN_EMAIL / _ADMIN_PASSWORD) | Coolify (dual VPS) | API tokens for the Main VPS (calum842) + Testing VPS (joeseo) Coolify instances. services/coolify.md |
VPS_ROOT_PASSWORD / VPS_ROOT_PASSWORD_CALUM842 / VPS_ROOT_PASSWORD_JOESEO | Hostinger VPS root | Root console / SSH passwords for srv843884 + srv1376875. |
HOSTINGER_API_CALUM842 / HOSTINGER_API_JOESEO | Hostinger Developer API | Per-account VPS-management + firewall tokens. tools/hostinger_api.py. services/hostinger.md |
N8N_API_KEY / N8N_BASE_URL / N8N_BASIC_AUTH_USER / _PASS (Main VPS)N8N_API_KEY_JOESEO / N8N_BASE_URL_JOESEO (Testing VPS) | n8n (dual host) | Main VPS n8n = support.nutritionalproducts.org; Testing VPS n8n = support-v2.nutritionalproducts.org (ads-agent dev). services/n8n.md |
APPS_NP_URL / APPS_NP_BASIC_AUTH_USER / APPS_NP_BASIC_AUTH_PASSWORD | Coolify Traefik basic-auth | Edge gate on apps.nutritionalproducts.org (see §5a). |
| Google Workspace (single bns-token covers Sheets/Docs/Drive/Gmail/Calendar/SC) | ||
BNS_TOKEN_PATH | Google Workspace | Path to bns-token.json OAuth refresh token. services/google-workspace.md |
GOOGLE_WORKSPACE_CLI_CLIENT_ID / _CLIENT_SECRET | Google Desktop OAuth client | Used for gws auth login |
| Google Ads / GA4 / BigQuery (separate auth paths) | ||
GOOGLE_ADS_CREDENTIALS | Google Ads | Path to google-ads.yaml with refresh token + developer token. services/google-ads.md |
GA4_PROPERTY_ID + GA4_PROPERTY_{UK,US,DE,FR} | GA4 Data API | Property 408119030 (canonical) plus per-market split. services/google-analytics.md |
GA4_OAUTH_CLIENT_ID / _CLIENT_SECRET / _TOKEN_PATH | GA4 OAuth desktop client | Minted via tools/ga4_first_auth.py |
GOOGLE_APPLICATION_CREDENTIALS | BigQuery (service account) | Separate from GA4 OAuth. services/bigquery.md |
BQ_TOKEN_PATH | BigQuery (scope-isolated OAuth) | Alternative path via tools/bq_first_auth.py |
| MCPs (now ${VAR} interpolated — see Section 6) | ||
BROWSERBASE_API_KEY / BROWSERBASE_PROJECT_ID | Browserbase | MCP server (browserbase). services/browserbase-mcp.md |
GOOGLE_API_KEY | Google API (multi-purpose) | Used by Browserbase MCP for image-ref/Maps lookups |
DATAFORSEO_USERNAME / DATAFORSEO_PASSWORD | DataForSEO | MCP + direct scripts. services/dataforseo.md |
PINECONE_API_KEY | Pinecone | MCP + tools/pinecone_sync_gemini.py |
| Image / video pipeline | ||
FAL_KEY + FAL_AI_KEY alias | fal.ai | Flux 2 Pro + GPT-Image-2 endpoints. services/fal-ai.md |
OPENROUTER_API_KEY | OpenRouter | Vision QC during image-pipeline runs. services/openrouter.md |
TEMPLATED_API_KEY | Templated.io | Carousel ad templating (paired with fal.ai). services/templated.md |
HEYGEN_API_KEY planned | HeyGen | Avatar video generation. Key not yet acquired. services/heygen.md |
| LLMs / search | ||
OPENAI_API_KEY | OpenAI | Reddit search via Responses API; image gen fallback. services/openai.md |
GEMINI_API_KEY + GOOGLE_AI_STUDIO_KEY | Google Gemini | CLI + direct API. services/gemini.md |
XAI_API_KEY | xAI | X/Twitter search via Responses API. services/xai.md |
ANTHROPIC_API_KEY not needed | Anthropic | Use Claude CLI / Claude Code instead. services/anthropic.md |
| Other | ||
YOUTUBE_API_KEY | YouTube Data API v3 | Channel listing, transcript fetch. OAuth via [email protected] is the active path. services/youtube.md |
FIRECRAWL_API_KEY planned | Firecrawl | Web scraping fallback. Key not yet acquired. services/firecrawl.md |
HYROS_API_KEY | HYROS | Independent ad attribution. services/hyros.md |
XERO_CLIENT_ID / XERO_CLIENT_SECRET | Xero | OAuth 2.0 + PKCE; auto-rotating xero-token.json. services/xero.md |
GRAPHITI_API_KEY | Graphiti | Knowledge graph (Claude Root tools only). services/graphiti.md |
TELEGRAM_BOT_TOKEN / TELEGRAM_ALLOWED_USERS | Telegram | Claude Code Channels plugin. services/telegram.md |
CREATIVEOS_REFRESH_TOKEN + CREATIVEOS_FIREBASE_API_KEY | CreativeOS / Firebase | Competitor ad library scraper. Firebase API key was hardcoded pre-2026-05-08; now env-driven with fallback. services/creativeos.md |
CLICKUP_API_TOKEN / CLICKUP_TEAM_ID | ClickUp | Personal API token (header Authorization: <token> — NO Bearer prefix). Task / project management. services/clickup.md |
REAMAZE_USER_ID / REAMAZE_API | Reamaze | Customer service + help-centre API (HTTP Basic). Brand subdomain brainzyme.reamaze.com. services/reamaze.md |
GOOGLE_CHAT_WEBHOOK_URL | Google Chat | One-way Claude→Calum notifications via tools/notify_chat.py. services/google-chat.md |
GHL_PIT_TOKEN / GHL_LOCATION_ID | Go High Level planned | Brainzyme's marketing email + automation platform. Private Integration Token. services/go-high-level.md |
FOREPLAY_API_KEY | Foreplay | Competitor ad intel (legacy — not yet in Connections Registry) |
For changes to this table, edit F:\Agentic-OS\.env.example + add a service contract under reference/services/ + run python tools/check-connections-registry.py. The validator catches drift between this list and the actual tooling.
Integrations not covered by the service sections above. Full per-service auth in the Connections Registry (services/*.md).
| Integration | Account / identity | Credential location | Notes |
|---|---|---|---|
| Coolify (dual VPS) | Main VPS (calum842) + Testing VPS (joeseo) | COOLIFY_API_TOKEN / COOLIFY_JOESEO_API_TOKEN in .env | Self-hosted PaaS on both VPSes. Admin UIs: coolify.nutritionalproducts.org (Main) + ops.nutritionalproducts.org (Testing). tools/coolify_api.py --vps {calum842|joeseo}. services/coolify.md |
| Tailscale | Google SSO — [email protected] | per-device tailscale up (no env var) | Private mesh VPN + Funnel. ~4 machines on the tailnet (Coolify VPS + workstation + contractor PCs). services/tailscale.md |
| ClickUp | BNS workspace | CLICKUP_API_TOKEN in .env | REST API via Personal API token (NOT connector-only). Task / project management. services/clickup.md |
| Reamaze | brainzyme.reamaze.com | REAMAZE_USER_ID / REAMAZE_API in .env | Customer service + help-centre. Article edits route via ClickUp → Santiago → Lew. services/reamaze.md |
| Google Chat | BNS Workspace space | GOOGLE_CHAT_WEBHOOK_URL in .env | One-way Claude→Calum notifications (tools/notify_chat.py). services/google-chat.md |
| Go High Level (GHL) | BNS LeadConnector planned | GHL_PIT_TOKEN / GHL_LOCATION_ID | Brainzyme's marketing email + automation platform (NOT Klaviyo). services/go-high-level.md |
| Claude.ai Connectors | Claude.ai sign-in | Claude.ai account settings (OAuth, per-session) | Bridge MCPs — Gmail / Calendar / Drive / ClickUp. Re-auth from the Claude desktop client when a connector shows needs-auth. Status: verify per session. |
| HYROS | BNS HYROS account | HYROS_API_KEY in .env | Independent ad attribution — cross-reference vs platform metrics. services/hyros.md |
| HideMyAcc | TBC | TBC | Per-brand anti-detect profiles — Multi-Brand Social Presence (BNS brands' own official accounts). |
| Foreplay | TBC | FOREPLAY_API_KEY in .env | Competitor ad intel (legacy — not yet in Connections Registry). |
Single-page directory of every active tool in the Claude Code stack — so a fresh session can find the right tool first time. Built after the 2026-05-12 incident exposed both the user-scope backup gap AND the cost of misfiring on tool calls.
Canonical: F:/Agentic-OS/reference/tool-map.md (13 sections, full detail) · Smoke test: python tools/preflight_smoke.py or /preflight slash command (covers all 13 areas in ~10s) · SOP: apps.nutritionalproducts.org/it-sop/system-state-mirror/
Sheet view (queryable mirror): Master Sheet → Tool Map tab (97 rows, sheetId 1038784443; new 2026-05-13). The markdown is canonical — the Sheet is a derived mirror, auto-refreshed by python tools/sync_registries_to_master_sheet.py. Sibling tabs: Connections Registry (40 rows) · Page Build Registry (5 rows). Drift validator: python tools/check-tool-map.py (exit 0 = clean; runs as preflight Stage 9).
| § | Area | What's in it |
|---|---|---|
| 1 | GSD task bridge + statusline | PostToolUse hook + statusline patch — surfaces in-memory TaskCreate/TaskUpdate state. Active-task file, cache, log. Verification: PINEAPPLE-RESTART-43. |
| 2 | MCP servers (file-based) | 7 registered in .mcp.json: google-ads, ga4, pinecone, dataforseo, shopify-dev-mcp, browserbase, n8n-mcp. Plus 4 OAuth bridges (Gmail/Drive/Calendar/ClickUp). |
| 3 | Google services (non-MCP) | bns_docs.py, bns_drive.py, bns_sheets.py, bns_gmail.py, bns_calendar.py — OAuth-based, BNS as primary. Plus gws CLI on %APPDATA%\npm. |
| 4 | Shopify | 4 complementary layers: shopify-dev-mcp MCP server (validate_theme + docs) + shopify-ai-toolkit plugin (19 skills) + liquid-skills plugin (3 skills) + @shopify/cli CLI fallback. |
| 5 | Browser tools | Browserbase MCP (parallel desktop) + Browser Harness (logged-in single) + Playwright (clean mobile). Routing matrix at reference/browser-tools-routing.md. |
| 6 | Pinecone | 2 live indexes: claude01-v2 (768d — RAG memory) + bz-canonical-messaging (1024d — compliance gate). 3 access paths (MCP / REST / Python). |
| 7 | Codex QC + Gemini | Codex 5.5 wrapper (codex_qc.py, 4 modes) + Gemini Flash (gemini_quick.py, free OAuth) + Gemini 2.5 Pro (gemini_pro.py, API key). Plus tool-youtube for YouTube transcripts (Gemini fabricates, never route YouTube there). |
| 8 | Hooks (project-scope) | 13 registered hooks (F:/Agentic-OS/.claude/hooks/): bridge, mirror, auto-commit, context monitor, compliance gates, drift checks, branch guard. |
| 9 | System-state mirror | Stop hook mirrors user-scope files (~/.claude/settings.json, Windows Terminal settings, etc.) into reference/system-state/. Closes the only backup gap. SOP. |
| 10 | Skills overview | 40 local skills (mkt/str/ops/viz/tool/meta/os) + 29 plugin skills (shopify + liquid + n8n-mcp-skills) + 8 slash commands. Skills auto-trigger from YAML frontmatter trigger phrases; not waiting on user. |
| 11 | Common pitfalls | 7 known foot-guns with one-line fixes: PowerShell trailing-space trim, stale gsd-active-task, missing MCP schemas, dead shell shim, gws not in PATH, outdated "Claude can't write to Docs" note, phantom hook refs in settings. |
| 12 | Specialist QC + probing tools | ~25 standalone scripts in tools/: Lighthouse (npx, v13.2.0, no API) + performance_snapshot, qc_pages_live, shopify_theme_drift_check, seo_audit_report, gsc_recovery_check, seo_full_site_sheet, check_copy_against_canonical (canonical messaging gate), anatomy_qc (image), ocr_text_check, scrapers (CreativeOS / Google Ads Transparency / Meta Ad Library), Xero audits, auction_insights, plus more. |
| 13 | Verify the stack | python tools/preflight_smoke.py [--stages 1,2,7] [--quiet] [--json] · or slash command /preflight. Expected baseline (2026-05-12): 7 PASS / 1 WARN (gws PATH on stale shells) / 1 SKIP (Claude-side MCP live). |
| Source | Count | Categories / examples |
|---|---|---|
| Local Agentic-OS skills | 40 | mkt (8 marketing: ad-copy / brand-voice / copywriting / creative-brief / icp / positioning / ugc-scripts / content-pipeline / content-repurposing) · str (6 strategy: ai-seo / campaign-strategy / programmatic-seo / schema-markup / seo-audit / trending-research) · ops (10 operations: campaign-pipeline / campaign-state / compliance-preflight / cron / go-live / pages-registry / quiz-deploy / shopify-page-builder / targeting-qc / video-audit) · viz (5 visual: excalidraw / image-pipeline / interface-design / nano-banana / stitch-design / ugc-heygen) · tool (4: firecrawl-scraper / humanizer / stitch / youtube) · meta (2: skill-creator / wrap-up) · os (2: heartbeat / session-manager) |
shopify-ai-toolkit plugin | 19 | shopify-admin, shopify-customer, shopify-functions, shopify-hydrogen, shopify-liquid, shopify-onboarding-dev, shopify-onboarding-merchant, shopify-partner, shopify-payments-apps, shopify-polaris-{admin-extensions, app-home, checkout-extensions, customer-account-extensions}, shopify-pos-ui, shopify-storefront-graphql, shopify-use-shopify-cli, shopify-app-store-review, shopify-custom-data, shopify-dev |
liquid-skills plugin | 3 | liquid-theme-a11y, liquid-theme-standards, shopify-liquid-themes |
n8n-mcp-skills plugin NEW | 7 | n8n expression syntax, MCP tools expert, workflow patterns, validation expert, node configuration, code JavaScript, code Python (czlonkowski; pairs with the n8n-mcp server) |
| Slash commands | 8 | archive-gsd, bank, bank-full, preflight, qc-off, qc-on, resume, start-here |
Claude does not wait for the user to name a skill. The available-skills list is injected at session start with every skill's YAML description (trigger phrases + negative triggers). Claude reads the user's message, matches against triggers, and invokes the relevant skill via the Skill tool. Example: "audit my campaigns" → triggers ads-audit; "write some ad copy for FOCUS PRO" → triggers mkt-ad-copy; "/preflight" → goes to the slash command file directly. Missed triggers should be flagged to the maintainer — fix the frontmatter description.
calum842 / srv843884) + Testing VPS (Joe SEO / srv1376875, hosts the n8n ads-agent dev); added §5b Cloudflare Pages as the new static-hosting layer (HappyUser89 GitHub, 4 projects, Zero Trust Access). §4 GitHub corrected to 2 accounts (Calum Edinburgh + HappyUser89; “Joe SEO” is a Hostinger account, not a GitHub one). §6 MCP +n8n-mcp (→7 servers). §7 .env added the n8n dual-host, Coolify dual-VPS, Hostinger API, ClickUp, Reamaze, Google Chat, and Cloudflare Account-API keys. §8 refreshed — Coolify dual-VPS, ClickUp now a REST API (not connector-only), +Tailscale / Reamaze / Google Chat. §10 tool-map counts refreshed (+n8n-mcp-skills plugin, 7 skills). Verified against connections-registry.md + connections.yaml + memory.F:/Agentic-OS/reference/tool-map.md indexes 13 areas of the live Claude Code stack — GSD bridge, all 6 MCP servers, Google services (MCP vs bns_docs.py vs gws), Shopify (4 layers complementary), browser tools routing, Pinecone (2 indexes), Codex+Gemini, 13 hooks, system-state mirror, 70 skills inventory, 7 common pitfalls, ~25 specialist QC/probing tools (Lighthouse, SEO suite, compliance gates, scrapers, Xero audits). Verification via python tools/preflight_smoke.py or /preflight slash command (~10s, 8 deterministic stages + Claude-side live MCP probe). System-state-mirror Stop hook mirrors load-bearing user-scope files (~/.claude/settings.json, Windows Terminal settings) into reference/system-state/ — closes the only backup gap exposed by today's PowerShell trailing-space incident (canonical ~/.claude/ nuked when PowerShell silently trimmed the trailing-space path argument; recovered from Claude Code's internal file-history). SOP at apps.nutritionalproducts.org/it-sop/system-state-mirror/. Reviewed by Codex 5.5 (REFINE on shadow-dir delete plan, all refinements applied: use Python shutil.rmtree with \\?\ prefix — cmd.exe + rd does not work; PowerShell silently trims).F:/Agentic-OS/reference/connections-registry.md indexes 24 external services (REST/GraphQL/MCP/CLI) with per-service contracts at reference/services/{name}.md. Every contract documents auth flow + env-var names + common failure modes + refresh recipe. Tier 1 services (shopify, cloudflare, browserbase-mcp, google-workspace, codex-cli) get full contracts + tool docstring headers + self-diagnostic prompts on auth failure. Mandatory pre-tool-lookup rule added to AGENTS.md and CLAUDE.md. Drift validator at tools/check-connections-registry.py. Triggered by recurring auth-discovery failures across sessions (most recent: hour-long Shopify token detour). Service contracts win over memory files on conflict. Reviewed by Codex 5.5 + Gemini before implementation.cloud-platform scope removed from bns-token.json (13→12 scopes) after discovering it triggers Workspace RAPT re-auth failures after ~30 days. All 7 BNS Python tools fixed to not pass explicit SCOPES to from_authorized_user_file(). Separate bq-token.json minted with bigquery-only scope via new tools/bq_first_auth.py. ga4_bq.py credential chain updated: bq-sa.json → bq-token.json → bns-token.json. Smoke-tested all 4 market GA4 BigQuery datasets. bns_sheets.py verified_update() extended with partial-range write support. Diagnostic: tools/bns_token_diagnose.py (tests each scope individually, can --fix). Canonical rule: memory/feedback_bns_token_scope_rapt.md.[email protected] is canonical going forward; [email protected] = LEGACY. bns-token.json minted with 13 scopes (openid, userinfo.email/profile, drive, spreadsheets, documents, gmail.modify, calendar, webmasters, analytics.readonly + analytics + analytics.edit, cloud-platform). All 9 Google services smoke-tested working. 5 Python helper scripts written and tested (tools/bns_drive.py, bns_sheets.py, bns_docs.py, bns_gmail.py, bns_calendar.py). Search Console: admin@bns added at siteFullUser for all 6 sites (4 Brainzyme stores + recoverup.co.uk + mynutrition365.com). Brand registry (config/brands.json) updated — mynutrition365 added as dormant stub, recoverup.co.uk domain added. Memory: new canonical feedback_bns_primary_admin_canonical.md; project_backend_access_registry.md and project_multi_account_google_mcp.md rewritten for Python-only path. Pending: drop Google MCPs from .mcp.json, migrate Brainzyme-side integrations (HubSpot/GHL/ClickUp/Shopify) to BNS where feasible.s8sk0ks4gk40kwsgco480cgg. Creds: admin / correct-horse-battery-staple-success. Traefik middleware http-basic-auth-s8sk0ks4gk40kwsgco480cgg returns 401 without creds, 200 with. Two upstream Coolify bugs hit and documented: (1) schema column http_basic_auth_password was varchar(255) but Laravel-encrypted output is 256 chars — widened to TEXT via ALTER TABLE; (2) direct DB writes via encrypt() are PHP-serialised but model cast uses decryptString() which does not deserialise — must save via Livewire UI (or Crypt::encryptString()) to get a value that round-trips correctly.