Snowflake MCP server
Prebuilt SnapLogic agentic-tool pipelines that let an LLM read from and act on Snowflake, callable as MCP tools via Pipeline Execute. Published in the SnapLogic pattern catalog.
Overview
This tool pack gives an agent full read, write, and query access to Snowflake tables, including SQL execution, row inserts, updates, deletes, CSV exports, and streaming ingestion. It also exposes Snowflake's Cortex AI services so an agent can answer analytical questions, run LLM inference, generate embeddings, and search indexed content, all within the same Snowflake account.
For setup instructions, see SnapLogic MCP Server quickstart.
Example Prompts
- What were total sales last quarter by region?
- Ask the sales semantic model which product line grew fastest this year
- Using our semantic model, how many active customers did we have in Q1?
- What's the trend in average order value over the last six months?
- Summarise this customer feedback using llama3.1-70b
- Classify these support ticket bodies as billing, technical or account, low temperature
- Rewrite this product description to be two sentences, max 200 tokens
- Use Cortex Complete to draft a short summary of the rows we just pulled from ORDERS
- Embed 'customer complaints about billing accuracy' with snowflake-arctic-embed-l-v2.0
- Generate an embedding vector for this support ticket summary
Tools
| Tool Name | Functions |
|---|---|
| SnowflakeCortexAnalyst | Answer a business question via Cortex Analyst over a semantic model. |
| SnowflakeCortexComplete | Run an LLM completion on a Cortex-hosted model. |
| SnowflakeCortexEmbed | Generate an embedding vector for a piece of text via Cortex. |
| SnowflakeCortexSearch | Retrieve documents from a managed Cortex Search service. |
| SnowflakeDeleteRows | Delete rows from a Snowflake table matching a SQL condition. |
| SnowflakeDeleteRowsChild | Snowflake Delete Rows Child |
| SnowflakeExecuteSQL | Execute any SQL statement against Snowflake and return its result. |
| SnowflakeExportData | Unload a SELECT result to an internal Snowflake stage as CSV. |
| SnowflakeInsertRows | Insert a row into a Snowflake table from a field map. |
| SnowflakeInsertRowsChild | Snowflake Insert Rows Child |
| SnowflakeQuery | Select rows from a Snowflake table with an optional WHERE clause and row limit. |
| SnowflakeSnowpipeStream | Stream a record into a Snowflake table via Snowpipe Streaming. |
| SnowflakeSnowpipeStreamChild | Snowflake Snowpipe Stream Child |
| SnowflakeUpdateRows | Update rows in a Snowflake table matching a SQL condition. |
| SnowflakeUpdateRowsChild | Snowflake Update Rows Child |
| SnowflakeVectorSearch | Cosine-similarity search over a VECTOR column, returning scored neighbours. |
Set up the MCP Server tools
- Download snowflake_tools.zip.
- In SnapLogic Designer, open the target project space (or create one), then choose Import Project / Import Pipelines and select the downloaded snowflake_tools.zip. Designer unpacks each pipeline into the project.
- Attach the required account to the connectivity snaps (see Connection Setup).
- Expose the project as an MCP server — each pipeline becomes a tool named after its label. New to this? Start with the MCP quickstart, then use the MCP Server Pipeline Builder to generate the server from the imported pipelines.
Configure account
Attach a Snowflake account (user/password, key-pair, or OAuth 2.0) to the Snowflake snaps in Designer after import.
These pipelines ship without credentials by design — attach a valid account in Designer before the tools will execute.
See the SnapLogic account documentation for this connector: Sp Snowflake Account Config.Html.
SnowflakeCortexAnalyst
Answers business questions in plain English by querying a Cortex Analyst semantic model, so the agent does not need to write SQL for governed subject areas. Use it for analytical questions such as revenue breakdowns or sales trends over a defined semantic model.
| Parameter | Type | Default | Description |
|---|---|---|---|
| question* | string | — | The business question in natural language, e.g. What were total sales last quarter by region? |
| semantic_model_file* | string | — | Stage path of the semantic model YAML, e.g. @MY_DB.PUBLIC.MY_STAGE/semantic_model.yaml. |
* Required parameter.
Try asking:
- What were total sales last quarter by region?
- Ask the sales semantic model which product line grew fastest this year
- Using our semantic model, how many active customers did we have in Q1?
- What's the trend in average order value over the last six months?
SnowflakeCortexComplete
Runs LLM inference on a Cortex-hosted model inside Snowflake, returning the completed text. Use it to summarize, classify, or rewrite content, often over data the other tools just retrieved from the warehouse.
| Parameter | Type | Default | Description |
|---|---|---|---|
| model* | string | — | Cortex model to call, e.g. llama3.1-70b. |
| prompt* | string | — | The user prompt sent to the model. |
| max_tokens | string | — | Maximum tokens to generate. Omitted if not supplied. |
| temperature | string | — | Sampling temperature, e.g. 0.1 for deterministic output. Omitted if not supplied. |
* Required parameter.
Try asking:
- Summarise this customer feedback using llama3.1-70b
- Classify these support ticket bodies as billing, technical or account, low temperature
- Rewrite this product description to be two sentences, max 200 tokens
- Use Cortex Complete to draft a short summary of the rows we just pulled from ORDERS
SnowflakeCortexEmbed
Converts a piece of text into an embedding vector using a Cortex embedding model. Use it to generate vectors for similarity search or to store embeddings in a Snowflake VECTOR column.
| Parameter | Type | Default | Description |
|---|---|---|---|
| model* | string | — | Cortex embedding model, e.g. snowflake-arctic-embed-l-v2.0. |
| text* | string | — | The text to embed. One string per call. |
* Required parameter.
Try asking:
- Embed 'customer complaints about billing accuracy' with snowflake-arctic-embed-l-v2.0
- Generate an embedding vector for this support ticket summary
- Turn this paragraph into a vector so I can store it in the embeddings table
- Embed my search phrase before we run the similarity search
SnowflakeCortexSearch
Searches a managed Cortex Search service and returns the best-matching documents for a free-text query. Use it for question-answering over indexed text content, where Snowflake manages the retrieval index.
| Parameter | Type | Default | Description |
|---|---|---|---|
| database* | string | — | Database containing the Cortex Search service, e.g. MY_DB. |
| schema* | string | — | Schema containing the Cortex Search service, e.g. PUBLIC. |
| service_name* | string | — | Name of the Cortex Search service to query, e.g. DOCS_SEARCH. |
| query* | string | — | Free-text search query. |
| columns | string | — | Comma-separated columns to return, e.g. title,content. Omit to use the service default. |
| limit | string | — | Maximum number of results to return. Defaults to 10. |
| filter_json | string | — | Cortex Search filter expression restricting which indexed rows are searched. |
* Required parameter.
Try asking:
- Search the DOCS_SEARCH service for how to reset a password, top 5 results
- Find support articles about billing disputes in the MY_DB.PUBLIC search service
- Query our knowledge search service and just return the title and content columns
- Look up onboarding documentation in Cortex Search, limit to 3 hits
- Search the indexed contracts service for renewal clauses, filtered to this year
SnowflakeDeleteRows
Deletes rows from a Snowflake table that match a SQL condition, for cleanup tasks such as purging staging data or dropping test records. Confirm the condition with the user before executing, as it can match many rows at once.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name* | string | — | Table to delete from, e.g. TEMP_RECORDS. |
| schema_name | string | — | Schema containing the table, e.g. PUBLIC. Omit to use the account's default schema. |
| delete_condition* | string | — | SQL condition selecting the rows to delete, without the WHERE keyword, e.g. CREATED_DATE < '2024-01-01'. |
* Required parameter.
Try asking:
- Delete everything in TEMP_RECORDS created before 2024-01-01
- Remove the row in PUBLIC.CUSTOMERS where ID = 99
- Clear out the STAGING_EVENTS rows where PROCESSED = TRUE
- Purge the test orders from the ORDERS table where CUSTOMER_ID = 0
SnowflakeDeleteRowsChild
Lets the LLM snowflake delete rows child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name | string | TEMP_RECORDS |
— |
| schema_name | string | PUBLIC |
— |
| delete_condition | string | CREATED_DATE < '2024-01-01' |
— |
SnowflakeExecuteSQL
Runs any SQL statement against Snowflake, including SELECT queries with joins, DDL, and metadata commands such as SHOW TABLES and DESCRIBE. Use it as the flexible, general-purpose option when the structured read and write tools are not sufficient.
| Parameter | Type | Default | Description |
|---|---|---|---|
| sql_statement* | string | — | The SQL statement to execute, e.g. SHOW TABLES IN SCHEMA PUBLIC. Query type is auto-detected. |
* Required parameter.
Try asking:
- What tables exist in the PUBLIC schema?
- Describe the columns on the CUSTOMERS table
- Run a query joining ORDERS to CUSTOMERS and give me revenue per region for last quarter
- Create a view called ACTIVE_CUSTOMERS over the customers with a positive balance
- How many rows are in EVENTS grouped by event type?
SnowflakeExportData
Exports the result of a SELECT statement to an internal Snowflake stage as a CSV file, so users can download the data or pass it to another system. The stage path is optional and defaults to the user stage.
| Parameter | Type | Default | Description |
|---|---|---|---|
| select_query* | string | — | The SELECT statement whose result is unloaded, e.g. SELECT * FROM PUBLIC.CUSTOMERS WHERE BALANCE > 1000. |
| staging | string | — | Internal stage path to write to, e.g. @~/exports/. Defaults to @~/. |
| staging_location | string | — | Present in the tool signature; the pipeline pins the unload to Internal staging. |
* Required parameter.
Try asking:
- Export all customers with a balance over 1000 to a CSV on the stage
- Unload last quarter's orders to @~/exports/ as a CSV file
- Dump the results of a query on the EVENTS table to internal staging so I can download it
- Write the ACTIVE_CUSTOMERS view out to a CSV in my user stage
SnowflakeInsertRows
Inserts a new row into a Snowflake table from a field map of column names and values. Use it when the user wants to record a new customer, order, log entry, or any other data without writing an INSERT statement.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name* | string | — | Table to insert into, e.g. CUSTOMERS. |
| schema_name | string | — | Schema containing the table, e.g. PUBLIC. Omit to use the account's default schema. |
| record* | object | — | Field map of the new row, keyed by column name, e.g. {NAME, EMAIL, BALANCE}. |
* Required parameter.
Try asking:
- Add a customer to PUBLIC.CUSTOMERS: Acme Corp, [email protected], balance 5000
- Insert a new row into the ORDERS table for order 1042, customer 17, total 249.99
- Log an entry in the AUDIT_LOG table with action 'export' and user 'jarcega'
- Create a record in the PRODUCTS table for SKU A-100, name 'Widget', price 12.50
SnowflakeInsertRowsChild
Lets the LLM snowflake insert rows child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name | string | CUSTOMERS |
— |
| schema_name | string | PUBLIC |
— |
SnowflakeQuery
Reads rows from a Snowflake table using an optional filter condition and row limit, without the caller writing any SQL. Use it as the default read tool for single-table lookups, and fall back to SnowflakeExecuteSQL only when joins or aggregation are needed.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name* | string | — | Table to read from, e.g. CUSTOMERS. |
| schema_name | string | — | Schema containing the table, e.g. PUBLIC. Omit to use the account's default schema. |
| where_clause | string | — | SQL WHERE condition without the WHERE keyword, e.g. BALANCE > 1000. Omit to return all rows. |
| limit_rows | string | — | Maximum number of rows to return. Omit for no limit. |
* Required parameter.
Try asking:
- Show me the customers in PUBLIC.CUSTOMERS with a balance over 1000
- Pull the first 50 rows of the ORDERS table in the SALES schema
- List everything in EVENTS where EVENT_TYPE = 'page_view'
- What's in the PRODUCTS table? Just give me the top 10 rows
- Get the accounts in PUBLIC.ACCOUNTS where STATUS = 'churned'
SnowflakeSnowpipeStream
Streams a record into a Snowflake table via Snowpipe Streaming for low-latency, high-frequency event ingestion. Use it for event-shaped writes; use SnowflakeInsertRows for standard transactional inserts.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name* | string | — | Table to stream into, e.g. EVENTS. |
| schema_name | string | — | Schema containing the table, e.g. PUBLIC. Omit to use the account's default schema. |
| max_client_lag | string | — | Maximum client lag in milliseconds before the buffered rows are committed. Defaults to 1000. |
| record* | object | — | Field map of the row to stream, keyed by column name. |
* Required parameter.
Try asking:
- Stream a page_view event for user u123 into the EVENTS table
- Push this telemetry record into PUBLIC.EVENTS with a 2 second max client lag
- Send a click event into the streaming events table right now
- Ingest this sensor reading into the READINGS table via Snowpipe
SnowflakeSnowpipeStreamChild
Lets the LLM snowflake snowpipe stream child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name | string | EVENTS |
— |
| schema_name | string | PUBLIC |
— |
| max_client_lag | string | 1000 |
— |
SnowflakeUpdateRows
Updates rows in a Snowflake table that match a SQL condition, applying a field map of new column values. Confirm the condition and scope with the user before calling, as it can match a single row or many rows at once.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name* | string | — | Table to update, e.g. CUSTOMERS. |
| schema_name | string | — | Schema containing the table, e.g. PUBLIC. Omit to use the account's default schema. |
| update_condition* | string | — | SQL condition selecting the rows to update, without the WHERE keyword, e.g. ID = 42. |
| record* | object | — | Field map of the new column values, e.g. {BALANCE: 7500, STATUS: 'premium'}. |
* Required parameter.
Try asking:
- Set the balance to 7500 and status to premium for the customer with ID 42
- Mark every order in ORDERS where STATUS = 'pending' as 'shipped'
- Update the email on PUBLIC.CUSTOMERS where ID = 17 to [email protected]
- Bump the price to 14.99 on the PRODUCTS row with SKU = 'A-100'
SnowflakeUpdateRowsChild
Lets the LLM snowflake update rows child, exposed as an MCP tool callable via Pipeline Execute.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name | string | CUSTOMERS |
— |
| schema_name | string | PUBLIC |
— |
| update_condition | string | ID = 1 |
— |
SnowflakeVectorSearch
Searches a VECTOR column in a Snowflake table for the nearest neighbours by cosine similarity, returning scored results. Use it for retrieval over embeddings you manage in your own tables; use SnowflakeCortexSearch when a managed Cortex Search service already indexes the content.
| Parameter | Type | Default | Description |
|---|---|---|---|
| table_name* | string | — | Table holding the vectors, e.g. DOCUMENT_EMBEDDINGS. |
| vector_column* | string | — | Column of type VECTOR to search against, e.g. EMBEDDING. |
| schema_name | string | — | Schema containing the table, e.g. ML. Omit to use the account's default schema. |
| where_clause | string | — | SQL condition narrowing the candidate rows before the similarity search. |
| limit_rows | string | — | Number of nearest neighbours to return. Defaults to 10. |
* Required parameter.
Try asking:
- Find the closest matches in ML.DOCUMENT_EMBEDDINGS on the EMBEDDING column
- Give me the top 5 nearest neighbours from the DOCUMENT_EMBEDDINGS table with their scores
- Search the embeddings table but only over rows where SOURCE = 'support_tickets'
- Which rows in the KB_VECTORS table are most similar, limit it to 3?