Problem and my role
When I audited how reports were made, analysts pulled data by hand from several ad, analytics, and search platforms and assembled each report themselves. I audited the process, built the automation in stages, and redesigned the data isolation.
Workflow
MVP. The data was exported automatically into a shared drive, where a Python script picked it up and built the report.
Version 1. I exposed the warehouse data on GCP and the slide renderer as an MCP server, so any tool-calling agent can query the data and generate reports. Client isolation could only be enforced in the prompt.
Version 2. I made that isolation structural: an interface layer where every component runs inside the system and each client's data is separated through IAM.
Controls
In version 1, client isolation lived in the prompt, which is not a safe boundary. Version 2 replaced it with an interface layer where all components run inside the system and per-client isolation is enforced through IAM, alongside validated queries and session-scoped access.
Testing
Unit tests cover the pipeline and the MCP server’s tools.
An automated adversarial eval suite in LangSmith tries to cross client boundaries and checks that every attempt is refused.
Result
Report generation time dropped by about 24 hours, so analysts spend that time on analysis and client work.