“We have data in BigQuery. Can we ask Claude questions about it?”
Yes, there are connection options. The more useful question is which data the connection should expose, what the metrics mean, and how you will check the answers.
The same preparation matters when the chosen interface is ChatGPT. A dashboard and an AI conversation should be able to use the same reporting calculations.
First decide what the question means
Suppose someone asks, “Which channel has the best customer acquisition cost?”
A connection cannot decide whether “customer” means a first-time kit buyer, a paying subscriber, an account signup, or a platform-reported conversion. It also cannot resolve conflicting attribution models by itself.
Before connecting the interface, agree:
- The customer population and acquisition event.
- The attribution rule assigning a customer to a channel.
- The date range, timezone, and reporting currency.
- The spend included in the numerator.
- Available history and any incomplete sources.
Keep these definitions with the reporting model. Prompt wording can help the interface explain a definition; SQL or backend logic should calculate it.
A small worked example
The following data and results are synthetic. They illustrate a reporting contract, not a client outcome.
Assume a daily reporting table with one row per date and channel. Each new paying customer is counted once, on their acquisition date, under an agreed acquisition model. Costs are in USD and reporting dates use UTC.
| Date | Channel | Advertising spend | New paying customers |
|---|---|---|---|
| 2026-10-01 | Meta | 120 | 6 |
| 2026-10-02 | Meta | 180 | 6 |
| 2026-10-01 | 90 | 15 | |
| 2026-10-02 | 110 | 10 |
For this example, paid CAC means advertising spend divided by newly acquired paying customers. It excludes sales costs and other acquisition overhead.
SELECT
channel,
SUM(advertising_spend) AS advertising_spend,
SUM(new_paying_customers) AS new_paying_customers,
SAFE_DIVIDE(
SUM(advertising_spend),
SUM(new_paying_customers)
) AS paid_cac
FROM `demo.reporting.channel_daily`
WHERE report_date BETWEEN DATE '2026-10-01' AND DATE '2026-10-02'
GROUP BY channel;Meta returns spend of $300, 12 new paying customers, and paid CAC of $25. Google returns $200, 25, and $8.
The period total is $500 / 37, approximately $13.51. Averaging the two channel CAC values would give the wrong total. This is one reason to return the calculation from the reporting layer rather than asking the model to improvise it.
The example does not prove that Google causes better customers, that either channel is profitable, or that this population has a particular LTV. Those questions need further definitions and evidence.
Return context alongside the numbers
A metric-specific tool can accept a bounded date range and return a defined calculation with its context. A schematic response might look like this:
{
"metric": "paid_cac",
"definition": "Advertising spend / new paying customers",
"period": {"from": "2026-10-01", "to": "2026-10-02"},
"currency": "USD",
"timezone": "UTC",
"data_as_of": "2026-10-03T06:00:00Z",
"rows": [
{"channel": "Meta", "spend": 300, "customers": 12, "paid_cac": 25},
{"channel": "Google", "spend": 200, "customers": 25, "paid_cac": 8}
],
"limitations": [
"Uses the agreed acquisition model",
"Excludes acquisition overhead beyond advertising spend"
]
}Freshness needs to reflect the inputs, not simply the moment the tool answered. If one source is incomplete, return that state explicitly. Missing data should not quietly become zero.
For changing campaign or application entities, stable references and current-state handling also matter. An old entity identifier can otherwise produce an answer that looks valid but describes outdated state.
Choose the connection path
Model Context Protocol (MCP) provides a way for an AI client to discover and call defined tools. It can expose warehouse queries or selected application operations.
Google documents a managed BigQuery MCP server with OAuth and IAM access control, including a read-only SQL tool. Assess that option before building a custom SQL interface.
Claude supports custom connectors using remote MCP. OpenAI also documents MCP server tools and authentication for ChatGPT integrations.
These are possible connection paths. Check the selected client's configuration, authentication support, and access setup, then verify the connection with the intended dataset or API.
Use broad warehouse access when it fits the users and data. Use a narrower tool such as get_channel_acquisition_metrics when the business needs a fixed definition, bounded inputs, or stronger control over what can be queried. Existing connectors can be sufficient when they cover the required sources and questions.
Keep access control in the server
Authentication establishes identity. Authorization determines which accounts, datasets, or application records that identity can access.
The backend must enforce those boundaries for every request. A prompt saying “only show this account” is not an authorization mechanism.
For a focused reporting connection, agree permitted datasets or operations, read permissions, input limits, and query-cost controls where relevant. Use the application's existing access model when exposing application data.
Treat retrieved text as data rather than instructions. It should not be able to change the tool's permissions or operating rules.
Validate a few questions before expanding
For the synthetic example, check that:
- A two-day channel comparison matches the SQL results above.
- The overall CAC uses total spend divided by total customers.
- “Best campaign” triggers a clarification about the metric and period.
- An incomplete source is reported as incomplete.
- A user cannot request another account's records.
- Unsupported questions are identified rather than answered with invented data.
Test different phrasings too. Structured output helps validate the response shape; it does not guarantee that an explanation is correct. Review representative answers against known results.
Where my experience fits
In a marketing analytics platform, I designed the BigQuery serving layer behind an MCP integration, including current entity state, stable references, and read-time status handling. A colleague built the MCP server transport, authentication, and scaffolding.
Within a connected-device product, I implemented authenticated Claude/MCP access to existing application and telemetry APIs using the product's account and permission model.
These are related engineering patterns: expose useful, interpretable data through an interface that respects the source system. They do not imply that every business needs a new warehouse or that every question needs a custom tool.
Start with a few valuable questions, accessible data, and explicit definitions. Explore AI access to your business data, or read about scoping a useful first reporting version.