setup-snowflake · git:20260827.7ff2e25 · 2026-08-27 · sha256 f2942e315dad4dba
setup-snowflake git:20260827.7ff2e25C
Immutable. This exact content is served forever at /api/v1/blob/f2942e315dad4dba.
---
name: setup-snowflake
description: >-
First-time Snowflake setup wizard: install the Snowflake MCP tooling, write connection
config from the template, and verify a live query round-trip. Use when the user says
"set up snowflake", "configure the warehouse", "add snowflake credentials", or hits
authentication/connection errors that suggest Snowflake was never configured. For
day-to-day remote querying after setup, use connect-snowflake.
---
# Skill: Setup Snowflake
## Purpose
Guided first-time Snowflake setup wizard. Installs dependencies, configures
the MCP server, collects credentials, writes `.env`, tests the connection,
explores available data, and gets the user querying.
## When to Use
- User says `/setup-snowflake`, "connect to snowflake", "set up snowflake",
"I have a snowflake account"
- Routed here from `/connect-data` when the user selects Snowflake
## Invocation
`/setup-snowflake` — start the setup wizard
## Instructions
### Step 1: Check Existing Configuration
**1a. Check `.env` for credentials:**
Read `.env` (if it exists) and check for these variables:
- `SNOWFLAKE_ACCOUNT`
- `SNOWFLAKE_USER`
- `SNOWFLAKE_PASSWORD`
**1b. Check MCP server is configured:**
Read `.mcp.json` (if it exists) and check for a `snowflake` server entry.
**1c. Check `uvx` is installed:**
Run `which uvx` or check `~/.local/bin/uvx`.
**Decision matrix:**
- All credentials + MCP configured → skip to Step 5 (test connection)
- Credentials exist but no MCP config → skip to Step 3 (configure MCP)
- Missing credentials → continue to Step 2
- `uvx` not installed → install it in Step 3
### Step 2: Collect Credentials
Ask one question at a time:
1. **Account Identifier**
- "What's your Snowflake account identifier?"
- Help text: "Find it in Snowsight: click your name in the bottom-left →
click your account name under **Account** → click **View account details** →
copy the **Account identifier** from the modal. It looks like
`ORGNAME-ACCOUNTNAME` (e.g., `MYORG-MYACCOUNT`)."
2. **Username**
- "What username did you create during Snowflake signup?"
3. **Password**
- "Paste your Snowflake password. I'll write it directly to `.env` and
never display it in the terminal."
**CRITICAL SECURITY RULES:**
- **Never** echo, print, or log the password in any command
- **Never** pass the password as a CLI argument (visible in `ps`)
- **Never** include the password in any output shown to the user
- **Never** use `Bash` with `echo` or `cat` to write credentials — use the
`Write` or `Edit` tool only
### Step 3: Install Dependencies & Configure MCP Server
**3a. Install `uv` (if `uvx` not found):**
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
Then verify: `~/.local/bin/uvx --version`
**3b. Write `.env`:**
1. If `.env` already exists, read it first to preserve existing variables
(e.g., `SLACK_TOKEN`, `MOTHERDUCK_TOKEN`)
2. Add or update these variables:
```
SNOWFLAKE_ACCOUNT=<account_identifier>
SNOWFLAKE_USER=<username>
SNOWFLAKE_PASSWORD=<password>
SNOWFLAKE_WAREHOUSE=COMPUTE_WH
```
3. Use the **Write** or **Edit** tool — NOT bash echo/cat
4. Confirm: "Credentials saved to `.env`. This file is gitignored and never
committed."
**3c. Create `snowflake-mcp-config.yaml`** (if it doesn't exist):
```yaml
# Snowflake MCP Server Configuration
# Controls which Snowflake services are available via MCP tools.
# Auth is handled via .env (SNOWFLAKE_ACCOUNT, SNOWFLAKE_USER, SNOWFLAKE_PASSWORD).
agent_services: []
search_services: []
analyst_services: []
other_services:
object_manager: true
query_manager: true
semantic_manager: true
sql_statement_permissions:
- Select: true
- Create: false
- Drop: false
- Update: false
- Delete: false
- Insert: false
```
Note: SQL permissions are read-only by default for safety. Users can enable
write permissions later if needed.
**3d. Add Snowflake to `.mcp.json`:**
1. Read `.mcp.json` if it exists (preserve other servers)
2. Add the `snowflake` server entry:
```json
{
"mcpServers": {
"snowflake": {
"command": "<absolute_path_to_uvx>",
"args": [
"snowflake-labs-mcp",
"--service-config-file",
"snowflake-mcp-config.yaml",
"--account",
"<account_identifier>",
"--user",
"<username>",
"--warehouse",
"COMPUTE_WH",
"--password",
"<password>"
]
}
}
}
```
3. The `command` must be the **absolute path** to `uvx` (e.g.,
`/Users/<name>/.local/bin/uvx`). Find it with `which uvx` or
check `~/.local/bin/uvx`.
4. All credentials go in `args` with explicit flags (`--account`,
`--user`, `--warehouse`, `--password`). The env var approach does
not work — the server ignores `SNOWFLAKE_PASSWORD` from the `env`
block and requires `--password` as a CLI arg.
5. **Do NOT use `--connection-name`** — it requires a Snowflake
`connections.toml` config file that most users won't have.
### Step 4: Restart Required
The MCP server won't be available until Claude Code restarts and loads the
new `.mcp.json` config.
Tell the user:
- "Everything is configured. The Snowflake MCP server needs Claude Code to
restart to pick up the new config."
- "Exit with `/exit`, then run `claude` again."
- "When you're back, run `/setup-snowflake` — I'll detect your saved config
and jump straight to testing the connection."
Stop here — do not proceed to Step 5 in this session.
### Step 5: Test Connection
Use the Snowflake MCP `run_snowflake_query` tool to run:
```sql
SELECT CURRENT_ACCOUNT(), CURRENT_USER(), CURRENT_WAREHOUSE(), CURRENT_VERSION()
```
**If connection succeeds:**
- Show: account name, username, warehouse, Snowflake version
- Continue to Step 6.
**If connection fails:**
- Show the error message
- Offer to re-enter credentials (go back to Step 2)
- Common issues to suggest: wrong account identifier format, password typo,
account not yet activated, warehouse suspended
### Step 6: Explore Available Data
Run these queries via the Snowflake MCP:
1. `SHOW DATABASES` — list available databases
2. `SHOW SCHEMAS IN SNOWFLAKE_SAMPLE_DATA` — list schemas in the sample data
3. `SHOW TABLES IN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1` — list TPC-H tables
Present a summary to the user:
- "You have access to **N** databases."
- "The sample data includes **TPC-H** with 8 tables: CUSTOMER, ORDERS,
LINEITEM, PART, PARTSUPP, SUPPLIER, NATION, REGION."
- Brief description of what TPC-H models (retail order processing).
Suggest a first query: "Try asking me something like: *What are the top 10
customers by total order value?*"
### Step 7: Optional — Create Dataset Knowledge
Offer: "Want me to set up TPC-H as a named dataset so I always know what
tables and columns are available?"
**If yes:**
1. Create `.knowledge/datasets/snowflake-tpch/manifest.yaml`:
```yaml
dataset_id: snowflake-tpch
display_name: Snowflake TPC-H (SF1)
connection_type: snowflake_mcp
database: SNOWFLAKE_SAMPLE_DATA
schema: TPCH_SF1
warehouse: COMPUTE_WH
notes: >
TPC-H benchmark dataset at scale factor 1. 8 tables modeling a
retail order-processing scenario. Read-only sample data provided
by Snowflake.
```
2. Generate `schema.md` by querying `INFORMATION_SCHEMA.COLUMNS` for
each table and formatting with `schema_to_markdown()` or manually
3. Create empty `quirks.md` with section headers
4. Update `.knowledge/active.yaml` to point to `snowflake-tpch`
5. Confirm: "TPC-H is now your active dataset. Ask any question to get started."
**If no:** Skip — the user can run `/connect-data` later.
## Rules
1. Never display passwords or secrets in terminal output or chat
2. Always use Write/Edit tool for `.env` — never Bash echo/cat
3. Always test the connection before declaring success
4. After writing `.mcp.json` or `.env` for the first time, tell the user to
restart — the MCP server won't load until next session
5. Preserve existing `.env` variables when adding Snowflake credentials
6. Preserve existing `.mcp.json` servers when adding the Snowflake entry
7. Use absolute path for `uvx` in `.mcp.json` `command` field
8. Default SQL permissions to read-only (Select only) for safety