A recent enterprise architecture engagement reinforced a pattern I keep coming back to: the hard part is not simply getting data into Snowflake or placing an LLM on top of it. The real work is deciding where trusted analytical truth lives, how identity survives source-system change, what can safely be exposed, and how agents can use enterprise data without becoming uncontrolled database clients.
The requirement
The organization needed a modern enterprise data and AI foundation while moving from a legacy operational platform to a next-generation platform. Data was spread across operational databases, CRM, customer-success and support SaaS applications, APIs and file-based feeds. The warehouse existed, but the target state needed a more durable approach for ingestion, customer identity, trusted business data, governed reporting and AI-agent access.
The architecture also had to support multiple ingestion styles rather than forcing every source into one pattern: scheduled batch for latency-tolerant data, API or incremental extraction for SaaS platforms, CDC for operational databases where inserts, updates and deletes matter, and event-based ingestion where continuous processing is justified.
On the AI side, the requirement was equally important: an enterprise agent such as Claude should be able to use Snowflake for historical, cross-system and certified analytical context, while current operational state and writes remain with the systems that own those transactions. Internal users and future customer-facing experiences also needed clearly separated access boundaries.
A source-aware ingestion strategy, layered Snowflake architecture, enterprise identity crosswalk, stable business Gold model, governed semantic/access layer, internal-versus-customer access model, and a hybrid agent architecture using approved MCP/API tools. Snowflake provides analytical intelligence; operational systems remain authoritative for current state and writes.
1. Start with capabilities, not a single ingestion tool
The first decision was not “Which connector do we standardize on?” It was to define a small set of ingestion capabilities and then choose the simplest reliable path for each source.
Batch
Best for small, latency-tolerant sources, reference datasets, or periodic extracts where a full refresh remains practical.
Incremental / API
Useful for SaaS platforms and APIs that expose modified timestamps, cursors, bulk APIs, or change endpoints.
CDC
For operational databases where inserts, updates and deletes need to be captured from a transaction/change mechanism with lower latency.
Events / Streaming
For event-oriented sources where the business needs continuous ingestion or event history rather than periodic snapshots.
This matters because orchestration and change capture are not the same thing. Airflow, for example, is excellent at schedules, dependencies, retries, backfills and workflow control, but it is not itself the transaction-log CDC engine. When true CDC is required, I would use a purpose-built change-capture mechanism and let the orchestration layer coordinate the surrounding workflow.
Choose the ingestion pattern by source capability, volume, freshness, recovery and operating model — not by forcing every source through the same technology.
Visual 1 — Source-specific ingestion, common Snowflake standards
Different sources can enter through different mechanisms while converging on the same platform contract.
2. Raw → Curated → Identity → Gold
I use medallion principles, but I do not treat the layers as labels for folders. Each layer has a specific contract.
Raw — preserve source meaning
Land data close to the source with ingestion metadata, load timestamps, source identifiers and enough traceability to support replay or reconciliation. Raw can be snapshot-based, append-only or CDC-fed depending on the source.
Curated — make data trustworthy
Standardize data types and business keys, deduplicate, validate quality, reconcile source data, normalize legacy and next-generation schemas, and preserve history using SCD patterns where the business requires it.
Identity — resolve the enterprise customer
Map source-system customer/account identifiers to a durable enterprise identity before downstream business metrics rely on them.
Gold — model stable business concepts
Create governed data products around Customer, Revenue, Invoice, Usage, Adoption, Support, Journey, Risk and other business domains rather than mirroring operational schemas.
CDC answers “what changed in the source?” SCD answers “how should warehouse history be represented?” A pipeline may use both, but they solve different problems.
3. Identity before Gold
The most important design choice in this architecture was to avoid making a legacy customer ID, next-generation customer ID, or CRM account ID the enterprise key.
During a platform migration, the same real-world customer can exist under different identifiers across operational applications, CRM, customer-success platforms and support systems. If each Gold model independently joins those source keys, the organization ends up with multiple versions of customer truth.
Instead, I designed a persistent enterprise identity crosswalk:
High-confidence records map to the durable enterprise identity. Ambiguous records remain explicitly unresolved rather than being forced into a false match. That unresolved population is measurable and can be addressed through stewardship.
Visual 2 — Enterprise identity protects Gold from source migration
Source keys can change while the enterprise identity and downstream business contract stay stable.
4. Gold should be stable even when source systems are not
During a legacy-to-next-generation migration, source schemas will drift. Field names change, business rules move, and one system may temporarily contain data the other does not. I do not want every report, semantic model or AI agent to absorb that volatility.
The pattern I use is to isolate source differences below Gold:
As migration progresses, the legacy adapter can eventually be retired without changing the business-facing contract. This is one of the strongest reasons to model Gold around durable business concepts instead of physical source tables.
5. Add a semantic layer for both BI and AI
Trusted tables alone are not enough. Business terms such as revenue, active customer, adoption, churn risk or service utilization need consistent definitions. Without a semantic layer, a BI dashboard and an AI agent can each produce technically valid SQL while still answering the business question differently.
I therefore place governed semantic definitions above Gold. In Snowflake, Semantic Views and Cortex analytical capabilities can provide a governed path for natural-language questions while keeping the underlying business meaning explicit.
The goal is that BI and AI consume the same trusted business definitions, certified metrics and access policies.
6. Internal and customer access need different boundaries
Security is not “roles versus views.” They solve different parts of the problem. Roles answer who can access something. Governed views, data products and semantic models define what is exposed. Row-access and masking policies constrain which rows and sensitive attributes are visible.
I would typically maintain a common trusted core and create explicit consumption boundaries:
Visual 3 — Same trusted core, different access contracts
Internal analytics can be broader; customer-facing access is constrained to approved objects and tenant-scoped data.
I would not automatically create one Semantic View per customer. A more scalable pattern is a reusable customer-facing semantic model with tenant-aware security, while internal users have access to broader metrics and cross-customer information when appropriate.
Separate virtual warehouses can still be valuable for BI, AI and customer-facing workloads because they improve workload isolation, scaling and cost attribution. I do not treat the warehouse itself as the primary security boundary.
7. Agent architecture: read and reason in Snowflake, verify and act in the source
The most useful design rule for AI agents is also one of the simplest:
Read and reason in Snowflake; verify and act in the source system.
I designed the agent path with a clear separation of authority. The enterprise agent sits outside the warehouse and receives an authenticated request. A governed tool/routing layer then decides whether the request needs analytical context from Snowflake or current operational state from a source system. The agent is never treated as an unrestricted database user.
For historical, cross-system or certified questions, the agent uses a governed Snowflake path backed by Gold data, semantic definitions and approved analytical tools. For anything that depends on the latest operational state—or requires a write—the agent calls the owning application's MCP/API, re-checks the current state where necessary, applies that system's authorization and business rules, and records the outcome.
For example, the agent can identify a high-value customer with declining adoption from governed warehouse data. If the next step is to change a CRM status, create a support case or update an operational record, it does not write to Snowflake and wait for the change to propagate. It calls the source directly, verifies the state, executes the action with a scoped identity, uses idempotency to protect retries, and links the action back to the original request with a common run or correlation ID.
Visual 4 — Hybrid agent control plane
The agent has two governed paths, each with a different authority.
8. MCP and agents: how the access pattern was designed
MCP became useful because it gives an external agent a standard way to discover and invoke approved tools, but I kept the responsibilities deliberately separate. Claude or another enterprise agent provides reasoning and orchestration. MCP is the tool interface. Snowflake and the source systems still enforce authentication, authorization and data permissions.
The design supports two Snowflake access patterns without unnecessarily stacking MCP layers. If the organization operates an external MCP service, that service can connect to Snowflake using normal authenticated Snowflake connectivity and a tightly scoped role. In that pattern, there is no requirement to create a second MCP server inside Snowflake. Alternatively, Snowflake can expose its own managed MCP endpoint and approved Snowflake-native analytical capabilities can be published through that endpoint.
That distinction matters because the architecture should not automatically become Claude → external MCP → Snowflake MCP → Snowflake. The cleaner implementation is to choose one governed Snowflake access path and keep source-system MCP/API tools separate for current-state verification and actions.
It is also important not to confuse three different concepts:
Claude / Enterprise Agent
The reasoning and orchestration layer deciding which approved capability to use.
Cortex Agent
An optional Snowflake-side agent capability for analytical reasoning and tool use within the Snowflake environment.
MCP
The protocol/interface through which an agent discovers and invokes approved tools.
Snowflake Security
Authentication, roles, grants, row policies, masking and governed objects remain responsible for authorization.
There are also two valid integration patterns that should not be accidentally drawn as mandatory layers on top of each other.
In Pattern A, an externally hosted MCP service connects to Snowflake using normal authenticated connectivity and a tightly scoped Snowflake role. In Pattern B, Snowflake itself exposes the managed MCP endpoint. Which one is better depends on governance, identity, operational ownership, and how much Snowflake-native AI capability the organization wants to expose.
Visual 5 — Two valid MCP patterns, not two mandatory MCP layers
The external agent can use either a custom external MCP service with normal Snowflake connectivity, or a Snowflake-managed MCP endpoint.
How the agent flow works end to end
1. Authenticate
The user or service enters through a trusted identity. The agent does not invent or self-assign access.
2. Route
The agent selects an approved analytical or operational tool based on the request.
3. Enforce
The MCP/API tool and Snowflake or source system enforce scoped roles, tenant boundaries and permissions.
4. Audit
A shared run ID links model usage, Snowflake queries, tool calls, source actions and outcomes.
This is also why MCP is not the security boundary. It standardizes the tool call, but the tool server must validate identity and scope, and the underlying platform still has to enforce the final authorization.
9. Design observability and cost attribution into the architecture
A production AI/data platform needs to answer more than “Did the query run?” I use a shared correlation or run identifier across the agent request, model call, Snowflake query and source-system action where practical.
That creates a trace from user or service identity → agent/tool call → analytical query → source action → outcome. It also enables meaningful cost attribution across three different cost domains:
Snowflake platform
Warehouse credits, serverless/Cortex services, storage and data movement where applicable.
AI/model usage
Input/output tokens, model selection, retries and AI service consumption.
External runtime
Agent hosting, APIs, MCP services, serverless compute, logging and observability.
Business workflow
The useful unit is often cost per successful workflow or decision, not simply cost per query.
10. What I would validate before locking products
Good architecture should make irreversible decisions deliberately and postpone reversible implementation choices until there is evidence. I would validate the following before standardizing technology:
Source estate
Underlying database technologies, API/change capabilities, volumes, growth, freshness expectations, delete handling and recovery requirements.
Customer identity
Reliable shared identifiers, migration mappings, unresolved populations, match confidence and stewardship needs.
Existing warehouse assets
Which Gold models can be retained, which need refactoring, and which lack enough trust or lineage to preserve.
Access and AI operating model
Internal versus customer consumption, tenant isolation, agent identity, human approval, source actions, operational state and audit requirements.
This keeps technologies such as Openflow, external orchestration, dedicated CDC tooling, Cortex Agent, a custom MCP service, or a dedicated MDM platform in the right place: they are implementation choices that should earn their way into the architecture based on requirements.
Architecture principles I would carry forward
Batch, incremental, CDC and events can coexist without fragmenting the downstream architecture.
Do not let source-system keys become permanent enterprise truth during a major platform migration.
Absorb legacy-versus-next differences below Gold.
Semantic governance is more valuable than simply allowing a model to generate SQL.
Snowflake is the governed analytical plane; operational systems retain current state and write authority.
The tool interface can be standardized while security remains enforced by identity, roles, policies and source permissions.
What comes next
I do not publish client source code. The companion Architecture Lab uses a clean-room reference implementation written separately with synthetic data, generic source names and simplified business rules. Its purpose is to demonstrate the engineering pattern without reproducing a client's implementation.
Open the companion reference implementation →
Public reference implementation scope
Example source configs · Batch + CDC ingestion patterns · Raw/Curated SQL · Enterprise identity crosswalk · Gold data product · Semantic View · customer-safe row policy · external MCP tool · agent read-versus-action routing · query/run tagging.
The broader lesson is simple: enterprise AI becomes much easier to govern when the data architecture already knows what is trusted, who is allowed to see it, and which system is authoritative for an action.