{"tokens":{"storage":"Ad platform tokens are encrypted at rest with AES-256-GCM and never leave the server.","assistant_exposure":"The connected assistant never holds an ad platform token: it talks to the gateway, the gateway talks to the platforms.","revocation":"Revoking an assistant's access happens in the dashboard and does not require rotating any platform credential."},"authentication":{"protocol":"OAuth 2.1 with PKCE (S256), dynamic client registration (RFC 7591), protected resource metadata (RFC 9728).","api_keys":"No static API keys exist for the MCP surface."},"scoping":{"model":"Per ad account, not per connection. Only accounts explicitly ticked in the dashboard are reachable.","enforcement":"Server side, on every call, including calls routed through run_tool. Nested account identifiers in arguments are checked too."},"writes":{"name":"Safe Writes","preview":"Every write returns a description of the change and stops. Applying it requires a second call with confirm set to true.","creation":"Campaigns are always created paused. There is no option to create them active.","free_plan":"The Free plan announces no write tool and refuses any write call."},"data":{"advertising_data":"Never stored: answers stream from the platform APIs to the assistant.","stored":["__session, __client_uat (cookie): Keeps you signed in, so the dashboard does not ask again on every page.","gma_org (cookie): Remembers which organisation you are looking at, when you belong to more than one.","oauth state (cookie): Ties an advertising platform's authorisation response to the request you started. Without it, the flow cannot be verified.","sidebar:state (cookie): Remembers whether you collapsed the sidebar.","theme (local storage): Remembers whether you chose light or dark.","gma_consent (local storage): Remembers your answer about analytics, so we do not ask again.","Vercel Web Analytics (local storage): Counts page views and where visitors come from. No cookie, no cross-site identifier, no profile."],"retention":["Your account and organisation: For as long as the account exists. Deleting the account removes them, and an organisation left with nobody in it is removed with it.","Advertising access tokens: Until you disconnect the platform, or the platform revokes them. Disconnecting deletes the row rather than marking it revoked.","Advertising data itself: Never stored. Campaigns, spend and performance are read from the platform on demand and passed straight to your assistant.","Usage counters: Thirteen months, so a year-on-year comparison is possible. They hold a count, not a query.","Invitations: Kept as a record of who was invited and when. The link itself is stored only as a hash and is never recoverable."],"subprocessors":[{"name":"Vercel","role":"Hosts the website and the dashboard.","region":"Edge in Paris, functions in Virginia (iad1).","outside_eu":true},{"name":"Neon","role":"PostgreSQL database.","region":"AWS us-east-1, Virginia.","outside_eu":true},{"name":"Cloudflare","role":"Runs the MCP gateway and serves DNS.","region":"Nearest edge location. Requests from Europe are served in Europe.","outside_eu":false},{"name":"Clerk","role":"Sign-in, sign-up, password reset and session management.","region":"United States.","outside_eu":true},{"name":"Resend","role":"Sends transactional email: invitations and the welcome message.","region":"AWS eu-west-1, Ireland.","outside_eu":false}]},"boundaries":{"human_only":["Granting OAuth consent on an advertising platform.","Choosing which ad accounts to expose."],"rationale":"These are not exposed as agent capabilities at all: the boundary is architectural, not advisory."},"guarantees":[{"title":"Your assistant never holds an ad token","detail":"It talks to the gateway; the gateway talks to Google, Meta, TikTok and Pinterest. Ad platform credentials are encrypted at rest with AES-256-GCM and never leave the server, so a leaked chat transcript is not a leaked ad account."},{"title":"Exposure is per account, not per connection","detail":"A Google MCC or a Meta Business Manager can sit over dozens of client accounts. Connecting one does not expose them all. The gateway answers only for the account IDs you explicitly ticked, and returns nothing for the rest."},{"title":"Safe Writes: every change previews first","detail":"Every write tool returns a description of the change and stops. Applying it takes a second call with confirm set to true. An assistant that picked the wrong campaign shows you the wrong campaign instead of pausing it. Campaigns are always created paused."},{"title":"OAuth 2.1, not an API key in a config file","detail":"The client registers itself dynamically, PKCE is required, and the code is bound to the redirect URI it was issued for. Revoking an assistant's access does not mean rotating a secret across your team."}],"last_reviewed":"2026-08-29"}