live
Infrastructure brief · Bono internal

Cum am construit ecosistemul MCP — secure by design.

Un singur punct central de identitate. Chei criptografice care nu părăsesc hardware-ul. Zero secrete partajate între servicii. Standarde publice — nu invenții.

MCP-uri active
3
crg (flux înființare SRL) · ats · minute-bot
Login central
1
super.bono.ro · OAuth 2.1
Shared secrets
0
între servicii — verificare cu cheie publică
Semnat cu RS256 · cheia privată trăiește în Google Cloud KMS · FIPS 140-2
OAuth 2.1 + PKCE RFC 7519 JWT RFC 7517 JWKS RFC 8707 Resource Indicators Google Workspace SSO Firestore Audit Log
§1 · Premisă

Ce am evitat și ce am ales.

Ecosistemul nostru — recrutare, înființare SRL, analize meeting — trebuia să răspundă la o întrebare simplă la fiecare apel: cine sună acum și cu ce drept?

Înainte · căi ușoare, respinse
  • Cheie partajată („API key") între servicii — scapă unul, scapă toate. Greu de rotit fără downtime.
  • Username/parolă pe fiecare MCP — friction pentru tine, parole în 4-5 locuri.
  • Service-to-service „anonymous" — niciun audit trail real, nicio identitate în log-uri.
Acum · identitate delegată
  • Login o singură dată la super.bono.ro via Google Workspace. Doar emails @bono.ro.
  • Token „pașaport digital" semnat criptografic — toate serviciile îl verifică local, fără să întrebe pe nimeni.
  • Cheia privată în HSM — nici noi developerii nu o putem citi. Rotația = un click, fără downtime.
  • Identitate la fiecare hop — emailul utilizatorului propagat end-to-end pentru audit.

E modelul standard OAuth 2.1 + PKCE, folosit de Google, Microsoft, Auth0, AWS Cognito. Nu am inventat — am implementat corect.

§2 · Arhitectură

Trei layere, un singur flow.

Indiferent ce produs accesezi, drumul identității e același.

Utilizator
chris@bono.ro
browser · Claude
━━▶ 1. login Google
Punct de login
super.bono.ro
OAuth 2.1 + Google Workspace
↓ 2. emite JWT semnat cu cheia din HSM ↓
Token primit
Bearer JWT (RS256)
1h TTL · refresh 90d
━━▶ 3. apel cu Authorization
MCP Server
ats-mcp · crg-mcp (înființare SRL) · minute-bot
verifică semnătura local cu JWKS
↓ 4. dacă verificarea OK, forwardează tokenul ↓
━━▶
Backend
ats-api.bono.ro · ONRC · Firestore
re-verifică token, aplică tenant scoping, returnează doar datele tale
Toate săgețile = HTTPS / TLS. Tokenul e verificabil la fiecare hop, fără să întrebe pe nimeni.
§3 · Ecosistem

MCP-urile noastre.

Fiecare e un serviciu independent în Google Cloud Run, autentificat prin același punct central, audit-uit împreună.

Login central + memorie corporate
super.bono.ro (minute-bot)
live

Inima ecosistemului. Un singur serviciu care face trei lucruri majore: emite identități, ascultă Slack, înțelege conversațiile noastre.

Role 1
Punct central de login
Emite și verifică tokenurile pentru întregul ecosistem MCP. OAuth 2.1 + RS256 via Cloud KMS HSM, JWKS publică, hard @bono.ro-only.
Role 2
Slack bot + Plaud webhook
Ascultă Slack channels, indexează threads, generează brief-uri din meeting recordings (Plaud) + context Jira. Trigger pe mențiuni sau scheduled.
Role 3
RAG Engine corporate
Voyage embeddings + Postgres vector store. PII scrubbing înainte de indexare. Răspunde la întrebări despre ce s-a discutat intern.
Înființare SRL
crg-mcp
live

Automatizează verificarea ONRC și flow-ul de înființare SRL — denumire, cod CAEN, asociați, hand-off către semnătura electronică calificată.

backend: ONRC public API
bearer din super.bono.ro
Applicant Tracking
ats-mcp
live

10 tooluri pentru recrutare: list/get jobs, search applications, candidate history, submit application, status transitions, comments. Multi-tenant.

backend: ats-api.bono.ro (.NET 8)
delegated identity per ADR 0003
32 teste auth (unit + integration)
Company Directory
compdir-mcp
parked

Director intern de companii partener. Cod gata, deploy parcat pe blocant VPC connector.

blocant: ADR 0004
Wishlist engine
desire-mcp
parked

Captură + prioritizare cerințe client. Scaffold gata, parcat pe API-ul admin upstream.

Toolkit & Catalog
mcp-platform
foundation

Pachetele care fac MCP-urile noastre consistente: mcp-toolkit, mcp-catalog, mcp-gateway, create-bono-mcp.

6 pachete publicate
4 ADR-uri arhitecturale
§4 · Securitate

Primitives criptografice, cap-coadă.

Nu vorbim despre policy — vorbim despre cod care există, e testat, e deployed.

Identity

OAuth 2.1 + PKCE

Authorization Code cu PKCE S256. Public clients (Claude Desktop), zero client_secret. Validare strictă @bono.ro domain.

minute-bot · routes/oauth.ts
Signing

RS256 în HSM

Cheie privată RSA-2048 trăiește în Google Cloud KMS. Semnarea via API; cheia nu părăsește hardware-ul. Rotație nativă, fără re-deploy.

minute-bot · lib/jwt-rs256.ts
Verification

JWKS publică

Cheia publică la /.well-known/jwks.json (RFC 7517). Cache-uită 5 min la consumer, verificare locală, fără round-trip la serviciul central.

mcp-toolkit · delegatedIdentityVerifier.ts
Privacy

PII tokenization

Date sensibile (email, CNP, telefoane) sunt înlocuite cu token-uri opace (pii:v1:…) înainte de logs sau LLM contexts. HMAC per-request → impredictibil cross-context.

mcp-toolkit · piiTokenizer.ts
Privacy

PII audit hashing

Email-urile log-uite sunt SHA-256-ed înainte de scriere în audit log. Putem corela vizite ale aceluiași user fără să stocăm emailul în plaintext.

mcp-toolkit · piiAuditHash.ts
Privacy

RAG PII scrubbing

Datele care intră în vector store trec prin @bono-ro/rag-toolkit care detectează & anonimizează PII înainte de embedding. Nu doar la output.

rag-toolkit · pii/scrubber.ts
Authorization

RBAC + tenant scoping

Fiecare tool declară explicit ce scopes și roles cere. Fail-closed: tool fără declarație → 403. Tenant scoping în query, înainte de execuție.

ADR 0002 · per-tool requires
Audit

Audit log durabil

Fiecare invocare de tool, fiecare auth event, fiecare PII reveal — scris în Firestore. Eveniment cheie: tenant_scope_violation (Sev-1, alertat).

mcp-toolkit · audit/firestoreAuditStore.ts
Audit

Sev-1 alerts

Evenimente critice (tenant_scope_violation, auth.identity_rejected burst) trigger alertă imediată în #it-bono. Nu așteptăm audit anual.

Cloud Monitoring · OTel
§5 · Garanții

Ce facem — și ce nu facem.

Ce facem
  • Identitate verificată Google Workspace, hard-enforced @bono.ro
  • Access tokens expiră în 1 oră; auto-refresh până la 90 zile
  • Cheia privată în HSM, never plaintext
  • Audit log durabil pentru fiecare API call
  • Tenant scoping în query, nu doar în UI
  • PII tokenized înainte de logs sau LLM contexts
  • PII scrubbing înainte de embedding în RAG vector store
  • Standards-based: nimic invented in-house pe partea de crypto
Ce NU facem
  • Niciun endpoint public fără autentificare
  • Zero credențiale partajate între servicii
  • Niciun secret în repo / .env committed / memoria proceselor
  • Nu există grace period pentru tokens expirate
  • Emails externe NU pot obține token, indiferent de Google
  • Tools fără declarație de scopes/roles = blocked
  • Nu stocăm parole — Google Workspace e singura sursă de identitate
  • Niciun PII în URL-uri sau query params
§6 · Standarde

Stăm pe umerii internetului.

Fiecare piesă de securitate e un standard public, peer-reviewed, implementat în mii de produse. Auditabil, înțeles, predictibil.

draft-ietf-oauth-v2-1
OAuth 2.1

Consolidare modernă a OAuth 2.0. PKCE mandatory pentru public clients.

RFC 7636
PKCE

Proof Key for Code Exchange. Blochează authorization code interception.

RFC 7519
JWT

JSON Web Tokens. Formatul universal de claims portabile.

RFC 7517
JWKS

JSON Web Key Set. Cheia publică distribuită la endpoint standard.

RFC 8414
AS metadata

Discovery: /.well-known/oauth-authorization-server.

RFC 8707
Resource indicators

Audience binding per resource. Tokenele scoped, nu cross-server-replayable.

RFC 7591
Dynamic client reg

Clienții se înregistrează automat. Zero manual config.

W3C
TraceContext

Trace propagation cross-service. Distributed observability standard.

FIPS 140-2
Cloud KMS HSM

Google Cloud KMS = FIPS 140-2 Level 3 hardware security modules.

§7 · Honest roadmap

Ce hardening urmează.

Transparență: ce nu e încă production-hardened. Punem aceste lucruri pe roadmap explicit, nu le ascundem.

Delegated identity în mod optional · Wave 2 → required
Astăzi, MCP-urile acceptă request-uri fără identitate delegată ca fallback (caller-only auth). Wave 2 flip la required, după ce toți callerii sunt migrati.
RBAC per-tool · fail-open migration window
Per ADR 0002, tools fără declarație de roles sunt încă acceptate (fail-open) pentru perioada de migrare. Wave 2 = fail-closed pe tot ecosistemul.
JWKS rotation · operator dashboard
Rotația cheii e suportată tehnic (KMS asymmetricSign cu version-id), dar nu avem încă UI de operator. Pentru moment, rotația = comandă gcloud + env var update.
Audit log · backpressure handling
Audit events curg în Firestore. Dacă Firestore are downtime tranzitoriu, evenimentele pot fi pierdute (no retry queue). Pe roadmap: buffered queue cu DLQ.
RAG PII guardrails · integrare parțială
Modulul de PII scrubbing (rag-toolkit) e integrat în minute-bot, dar nu există încă system-prompt guardrail (e.g., refuse to summarize raw PII). Pe roadmap pentru Q3.
Cross-tenant isolation · CI tests
ats-mcp e multi-tenant cu enforce explicit. Nu avem însă teste end-to-end care să verifice că user din tenant A nu poate accesa date din tenant B prin manipulare claim. Pe roadmap.
compdir-mcp & desire-mcp · deploy parked
Ambele au cod scris dar sunt blocate pe upstream-uri externe (VPC connector pentru intranet, respectiv admin API). Vor primi același auth pattern când upstream-urile sunt gata.