Snowflake MCP Server

io.github.nsphungPublished by GitHub account nsphungv0.14.4Updated Oct 27, 2026

A Snowflake MCP server — SQL queries, schema exploration, and data insights for AI assistants

VerifiedSTDIODesktop onlyDatabasesData & Analytics

Overview

AI-generated overview

Connects an AI assistant to Snowflake so it can run SQL queries, explore schemas and record data insights.

What you can do
  • Run read-only SELECT queries against Snowflake
  • List databases, schemas and tables, and describe a table's columns
  • Optionally run INSERT, UPDATE, DELETE and CREATE TABLE statements when write mode is enabled
  • Append data insights to a running memo resource the assistant can read back
  • Pre-load table schemas as resources in prefetch mode
When to use it
Useful when an assistant needs to answer questions from a Snowflake warehouse, inspect its schema, or draft SQL against real tables. Best for analysts and developers who already have Snowflake credentials and want read-only exploration by default.
Requirements
Runs locally over stdio via uvx (Python 3.13) or a Docker image. Needs a Snowflake account identifier, user, warehouse, database and schema, plus credentials for one auth method: password, key-pair file, external browser, OAuth client credentials or a bearer token. Can also read a TOML connections file with named profiles. Network access to Snowflake is required.
Before you install
Credentials are supplied through environment variables or a TOML file, including SNOWFLAKE_PASSWORD, SNOWFLAKE_PRIVATE_KEY_FILE_PWD, SNOWFLAKE_OAUTH_CLIENT_SECRET and SNOWFLAKE_TOKEN; keep that file out of version control. Write tools are off by default but become able to modify or delete data once write mode is enabled. Queries and results are sent to Snowflake, and the assistant sees query results, so avoid exposing sensitive tables.

Installation

In SourceWeft

  1. Open Snowflake MCP Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README


Snowflake MCP Server NSP

A Model Context Protocol (MCP) server / MCP server that connects AI assistants to Snowflake — enabling SQL queries, schema exploration, and data insights directly from your LLM client.

Highlights:

  • Multiple authentication methods: password, key-pair, external browser, OAuth 2.0 (client credentials & bearer token), TOML connection files
  • TOML multi-connection config — manage production, staging, and development environments in one file
  • Write-safety guard — write operations are disabled by default and must be explicitly enabled
  • Exclusion patterns — filter out databases, schemas, or tables from discovery
  • --exclude-json-results flag — reduces LLM context window usage
  • Selective tool exclusion via --exclude_tools
  • Prefetch mode — pre-load table schema as MCP resources
  • Docker support with hardened image (DHI, nonroot user, no shell in runtime)

Table of Contents


Quick Start

The fastest way to try it — using uvx with a TOML connection file:

bash
# 1. Create a connections filecat > ~/snowflake_connections.toml << 'EOF'[myconn]account = "your_account"user = "your_user"password = "your_password"warehouse = "COMPUTE_WH"database = "MY_DB"schema = "PUBLIC"role = "MYROLE"EOF
# 2. Run the serveruvx --python=3.13 --from mcp-snowflake-server-nsp mcp_snowflake_server \  --connections-file ~/snowflake_connections.toml \  --connection-name myconn

Claude Code

Add to your MCP client config (e.g. claude_desktop_config.json) using snowflake_connections.toml:

jsonc
"mcpServers": {  "snowflake": {    "command": "uvx",    "args": [      "--python=3.13",      "--from", "mcp-snowflake-server-nsp",      "mcp_snowflake_server",      "--connections-file", "/absolute/path/to/snowflake_connections.toml",      "--connection-name", "myconn"    ]  }}

Visual Studio Code (VSCode)

uvx — [Install in VS Code] [Install in VS Code Insiders]

Docker — [Install in VS Code (Docker)] [Install in VS Code Insiders (Docker)]

Or add manually to your MCP client config (e.g. .vscode/mcp.json) using .env file (see Authentication):

jsonc
"snowflake": {      // Snowflake MCP server      "type": "stdio",      "command": "uvx",      "args": [        "--from", "mcp-snowflake-server-nsp",        "--python=3.13",        "mcp_snowflake_server"      ],      "envFile": "${workspaceFolder}/.env"    }

OpenCode

Add to your MCP client config (e.g. opencode.jsonc) with .env file (see Authentication):

jsonc
"snowflake": {  "type": "local",  "command": [    "uvx",    "--from",    "mcp-snowflake-server-nsp",    "--python=3.13",    "mcp_snowflake_server",  ],  "enabled": true,  "timeout": 300000,}

Components

Resources

URIDescription
memo://insightsA continuously updated memo aggregating data insights appended via append_insight.
context://table/{table_name}(Prefetch mode only) Per-table schema summaries including columns and comments.

Tools

Query Tools
ToolDescriptionRequires
read_queryExecute SELECT queries. Input: query (string).—
write_queryExecute INSERT, UPDATE, or DELETE queries. Input: query (string).--allow_write
create_tableExecute CREATE TABLE statements. Input: query (string).--allow_write
Schema Tools
ToolDescriptionInput
list_databasesList all databases in the Snowflake instance.—
list_schemasList all schemas within a database.database (string)
list_tablesList all tables within a database and schema.database, schema (strings)
describe_tableDescribe columns of a table (name, type, nullability, default, comment).table_name as database.schema.table
Analysis Tools
ToolDescriptionInput
append_insightAdd a data insight to the memo://insights resource.insight (string)

Authentication

Password

Set credentials via environment variables or CLI flags (see Configuration Reference):

bash
SNOWFLAKE_USER="[email protected]"SNOWFLAKE_ACCOUNT="myaccount"SNOWFLAKE_AUTHENTICATOR="snowflake"SNOWFLAKE_PASSWORD="secret"SNOWFLAKE_WAREHOUSE="COMPUTE_WH"SNOWFLAKE_DATABASE="MY_DB"SNOWFLAKE_SCHEMA="PUBLIC"SNOWFLAKE_ROLE="MYROLE"

Key-Pair

Both RSA (RS256) and ECDSA (ES256, ES384, ES512) private keys are supported (requires snowflake-connector-python ≥ 4.5.0 for ECDSA).

bash
SNOWFLAKE_USER="[email protected]"SNOWFLAKE_ACCOUNT="myaccount"SNOWFLAKE_AUTHENTICATOR="snowflake_jwt"SNOWFLAKE_PRIVATE_KEY_FILE="/absolute/path/to/key.p8"SNOWFLAKE_PRIVATE_KEY_FILE_PWD="passphrase"  # Optional — only if key is encryptedSNOWFLAKE_WAREHOUSE="COMPUTE_WH"SNOWFLAKE_DATABASE="MY_DB"SNOWFLAKE_SCHEMA="PUBLIC"SNOWFLAKE_ROLE="MYROLE"

Or via CLI: --private_key_file /path/to/key.p8 --private_key_file_pwd passphrase

External Browser

bash
SNOWFLAKE_AUTHENTICATOR="externalbrowser"

Or in a TOML connection entry: authenticator = "externalbrowser"

OAuth 2.0 Client Credentials

Use the OAuth 2.0 client credentials flow to authenticate with a client ID and secret (no user interaction required):

bash
SNOWFLAKE_AUTHENTICATOR="oauth_client_credentials"SNOWFLAKE_ACCOUNT="myaccount"SNOWFLAKE_OAUTH_CLIENT_ID="your_client_id"SNOWFLAKE_OAUTH_CLIENT_SECRET="your_client_secret"SNOWFLAKE_OAUTH_TOKEN_REQUEST_URL="https://your-idp.example.com/oauth/token"SNOWFLAKE_OAUTH_SCOPE="session:role:MY_ROLE"  # OptionalSNOWFLAKE_WAREHOUSE="COMPUTE_WH"SNOWFLAKE_DATABASE="MY_DB"SNOWFLAKE_SCHEMA="PUBLIC"SNOWFLAKE_ROLE="MYROLE"

OAuth Bearer Token

Use a pre-fetched OAuth bearer token:

bash
SNOWFLAKE_AUTHENTICATOR="oauth"SNOWFLAKE_ACCOUNT="myaccount"SNOWFLAKE_TOKEN="eyJhbGciOiJSUzI1NiJ9..."SNOWFLAKE_WAREHOUSE="COMPUTE_WH"SNOWFLAKE_DATABASE="MY_DB"SNOWFLAKE_SCHEMA="PUBLIC"SNOWFLAKE_ROLE="MYROLE"

TOML Connection File (Recommended)

Manage multiple environments in a single file. See example_connections.toml for a full template.

toml
[production]account = "your_account"user = "your_user"password = "your_password"authenticator = "snowflake"warehouse = "COMPUTE_WH"database = "PROD_DB"schema = "PUBLIC"role = "ACCOUNTADMIN"
[development]account = "your_account"user = "dev_user"authenticator = "externalbrowser"warehouse = "DEV_WH"database = "DEV_DB"schema = "PUBLIC"role = "DEVELOPER"
[reporting]account = "your_account"user = "reporting_user"authenticator = "snowflake_jwt"private_key_file = "/path/to/private_key.pem"private_key_file_pwd = "passphrase"  # Optionalwarehouse = "REPORTING_WH"database = "REPORTING_DB"schema = "REPORTS"role = "REPORTING_ROLE"
[analytics_oauth]account = "your_account"authenticator = "oauth_client_credentials"oauth_client_id = "your_client_id"oauth_client_secret = "your_client_secret"oauth_token_request_url = "https://your-idp.example.com/oauth/token"oauth_scope = "session:role:ANALYTICS_ROLE"  # Optionalwarehouse = "ANALYTICS_WH"database = "ANALYTICS_DB"schema = "PUBLIC"role = "ANALYTICS_ROLE"

Pass the file with --connections-file and select a profile with --connection-name. Both flags are required together.


Installation

The package is published on PyPI as mcp-snowflake-server-nsp.

Contributing or running from source? See CONTRIBUTING.md for local development setup, test commands, formatting, and building the Docker image from source.


Via UVX

TOML configuration (recommended)
jsonc
"mcpServers": {  "snowflake_production": {    "command": "uvx",    "args": [      "--python=3.13",      "--from", "mcp-snowflake-server-nsp",      "mcp_snowflake_server",      "--connections-file", "/path/to/snowflake_connections.toml",      "--connection-name", "production"      // Optional flags — see Configuration Reference    ]  },  "snowflake_staging": {    "command": "uvx",    "args": [      "--python=3.13",      "--from", "mcp-snowflake-server-nsp",      "mcp_snowflake_server",      "--connections-file", "/path/to/snowflake_connections.toml",      "--connection-name", "staging"    ]  }}
Individual parameters
jsonc
"mcpServers": {  "snowflake": {    "command": "uvx",    "args": [      "--python=3.13",      "--from", "mcp-snowflake-server-nsp",      "mcp_snowflake_server",      "--account", "your_account",      "--warehouse", "your_warehouse",      "--user", "your_user",      "--password", "your_password",      "--role", "your_role",      "--database", "your_database",      "--schema", "your_schema"      // Optional: "--private_key_file", "/absolute/path/key.p8"      // Optional: "--private_key_file_pwd", "passphrase"      // Optional flags — see Configuration Reference    ]  }}

Via Docker Hub

The image is published on Docker Hub — no build step required:

bash
docker pull nsphung/mcp-snowflake-server-nsp

Note: -i (--interactive) is required to keep stdin open for the MCP stdio transport. Do not use -d (detach).

Claude Desktop — claude_desktop_config.json

With .env file (see Authentication):

jsonc
"mcpServers": {  "snowflake": {    "command": "docker",    "args": [      "run", "--rm", "-i",      "--env-file", "/absolute/path/to/.env",      "nsphung/mcp-snowflake-server-nsp"    ]  }}

With TOML connections file:

jsonc
"mcpServers": {  "snowflake": {    "command": "docker",    "args": [      "run", "--rm", "-i",      "-v", "/path/to/snowflake_connections.toml:/app/snowflake_connections.toml:ro",      "nsphung/mcp-snowflake-server-nsp",      "--connections-file", "/app/snowflake_connections.toml",      "--connection-name", "production"    ]  }}
VS Code — .vscode/mcp.json

With .env file:

jsonc
"snowflake": {  "type": "stdio",  "command": "docker",  "args": [    "run", "--rm", "-i",    "nsphung/mcp-snowflake-server-nsp"  ],  "envFile": "${workspaceFolder}/.env"}

With TOML connections file:

jsonc
"snowflake": {  "type": "stdio",  "command": "docker",  "args": [    "run", "--rm", "-i",    "-v", "/path/to/snowflake_connections.toml:/app/snowflake_connections.toml:ro",    "nsphung/mcp-snowflake-server-nsp",    "--connections-file", "/app/snowflake_connections.toml",    "--connection-name", "production"  ]}
OpenCode — opencode.jsonc
jsonc
"snowflake": {  "type": "local",  "command": [    "docker", "run", "--rm", "-i",    "--env-file", "/absolute/path/to/.env",    "nsphung/mcp-snowflake-server-nsp"  ],  "enabled": true,  "timeout": 300000}

Configuration Reference

All connection parameters can also be set as environment variables (SNOWFLAKE_<PARAM_UPPER>).

FlagEnv varDefaultDescription
--accountSNOWFLAKE_ACCOUNT—Snowflake account identifier
--userSNOWFLAKE_USER—Snowflake username
--passwordSNOWFLAKE_PASSWORD—Password (not required for key-pair / SSO)
--warehouseSNOWFLAKE_WAREHOUSE—Virtual warehouse to use
--databaseSNOWFLAKE_DATABASE(required)Default database
--schemaSNOWFLAKE_SCHEMA(required)Default schema
--roleSNOWFLAKE_ROLE—Role to assume
--private_key_fileSNOWFLAKE_PRIVATE_KEY_FILE—Absolute path to RSA or ECDSA (ES256/384/512) private key file (.p8 / .pem)
--private_key_file_pwdSNOWFLAKE_PRIVATE_KEY_FILE_PWD—Passphrase for encrypted private key
--connections-file——Path to TOML connections file
--connection-name——Connection profile name in TOML file (required with --connections-file)
--allow_write—falseEnable write_query and create_table tools
--prefetch / --no-prefetch—falsePre-load table schema as context://table/* resources (disables list_tables / describe_table)
--exclude_tools—[]Space-separated list of tool names to disable
--exclude-json-results—falseOmit embedded JSON resources from responses (reduces context window usage)
--log_dir——Directory for log file output
--log_level—INFOLog verbosity: DEBUG, INFO, WARNING, ERROR, CRITICAL

Exclusion Patterns

Edit runtime_config.json to exclude databases, schemas, or tables from all discovery tools. Patterns are matched case-insensitively as substrings.

json
{  "exclude_patterns": {    "databases": ["temp"],    "schemas": ["temp", "information_schema"],    "tables": ["temp"]  }}

The server loads this file automatically at startup from the working directory.


License

This project is licensed under the MIT License. See the LICENSE file for the full text.


Fork and Attribution

This repository is a fork of isaacwasserman/mcp-snowflake-server.

[MseeP.ai Security Assessment Badge]

  • Upstream authors and contributors retain copyright for their contributions.
  • Fork-specific changes are maintained by nsphung.
  • A summary of notable modifications is tracked in NOTICE.

Source: README.md at commit d2971d3

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

2
  1. v0.14.4LatestSep 24, 2026
  2. v0.14.3Sep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts