read_queryLABSCO SUMMARY
Built for having more than one Snowflake.
The single connection string is where most database servers stop, and it is also where the accidents happen. Here the TOML file gives each environment its own profile with its own role and authenticator, so pointing a client at production is a deliberate choice of profile name rather than an edited string. Combined with writes being absent unless enabled, and exclusion patterns hiding whole databases from discovery, this is a server you can hand to an assistant without holding your breath.
What it is
A Snowflake MCP server — SQL queries, schema exploration and data insights from an LLM client. It is a fork of isaacwasserman/mcp-snowflake-server whose additions are aimed at running it against more than one environment safely: multiple authentication methods, a multi-connection TOML config, and a write guard that is off unless you turn it on.
What you get
- Query tools split by risk:
read_queryforSELECT, andwrite_queryforINSERT,UPDATEandDELETEpluscreate_tableforCREATE TABLE— both of which require--allow_writeand are simply absent otherwise - Schema exploration —
list_databases,list_schemas,list_tables, anddescribe_tablereturning column name, type, nullability, default and comment for adatabase.schema.table append_insight, which adds a finding to a running memo exposed as thememo://insightsresource- Prefetch mode, which pre-loads table schemas as
context://table/{table_name}resources instead of leaving them to be fetched on demand — it disableslist_tablesanddescribe_tablein exchange - Six authentication paths: password, key-pair with RSA or ECDSA keys, external browser, OAuth 2.0 client credentials, a pre-fetched OAuth bearer token, and a TOML connection file
- A TOML connections file holding several named environments — production, development, reporting, an OAuth profile — each with its own account, warehouse, database, role and authenticator, selected by name at launch
- Exclusion patterns in a runtime config file that filter databases, schemas or tables out of every discovery tool, matched case-insensitively as substrings
--exclude_toolsto disable named tools outright, and--exclude-json-resultsto omit embedded JSON resources from responses and cut context use
Requirements
A Snowflake account plus credentials in whichever form you chose — every connection parameter is available both as a CLI flag and as a SNOWFLAKE_<PARAM> environment variable, and SNOWFLAKE_DATABASE and SNOWFLAKE_SCHEMA are required. The recommended path is a TOML connections file, passed with --connections-file and a profile named by --connection-name; both flags are required together. Run it with uvx --python=3.13 --from mcp-snowflake-server-nsp mcp_snowflake_server, or from the published Docker image nsphung/mcp-snowflake-server-nsp — with docker run, -i is required to keep stdin open for the stdio transport and -d must not be used. The image is hardened: nonroot user, no shell in the runtime. Writes stay off until --allow_write is passed. MIT licensed.
Setup effort
One command — uvx --python=3.13 --from mcp-snowflake-server-nsp mcp_snowflake_server --connections-file ~/snowflake_connections.toml --connection-name myconn
USE CASES
Answering a question against production without risk
Run it on the production profile with writes off — the write and create tools are not registered at all, so there is nothing to refuse.
Getting oriented in an unfamiliar warehouse
Walk databases, schemas and tables, then describe the one you need with its column types and comments.
Running the same client against several environments
Register one server per profile from the same TOML file, so staging and production are separate entries rather than an edited connection string.
Keeping temp and system schemas out of the way
Add substring patterns to the runtime config so those databases, schemas and tables never appear in discovery results.
Building up findings as you go
Append each insight to the running memo so the session's conclusions accumulate somewhere readable.
8 tools
Listed in project docs. Your client may show a different list.
write_querycreate_tablelist_databaseslist_schemaslist_tablesdescribe_tableappend_insightBEFORE YOU INSTALL
What to know first
Tools you get
8 tools named in the project's documentation.
Requires
- uvx on PATH
- A default database and schema: SNOWFLAKE_DATABASE and SNOWFLAKE_SCHEMA, or database and schema in your TOML connection profile
Optional
- SNOWFLAKE_ACCOUNT in your environment
- SNOWFLAKE_PASSWORD in your environment
- SNOWFLAKE_PRIVATE_KEY_FILE in your environment
- SNOWFLAKE_PRIVATE_KEY_FILE_PWD in your environment
- SNOWFLAKE_OAUTH_CLIENT_ID in your environment
- SNOWFLAKE_OAUTH_CLIENT_SECRET in your environment
- SNOWFLAKE_OAUTH_TOKEN_REQUEST_URL in your environment
- SNOWFLAKE_TOKEN in your environment
- SNOWFLAKE_USER in your environment
Where it runs
All 3 documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
uvx --python=3.13 --from mcp-snowflake-server-nsp mcp_snowflake_server --connections-file ~/snowflake_connections.toml --connection-name myconnMCP Clients
VS Code
{
"servers": {
"snowflake": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"mcp-snowflake-server-nsp",
"--python=3.13",
"mcp_snowflake_server"
],
"envFile": "${workspaceFolder}/.env"
}
}
}OpenCode
{
"mcp": {
"snowflake": {
"type": "local",
"command": [
"uvx",
"--from",
"mcp-snowflake-server-nsp",
"--python=3.13",
"mcp_snowflake_server"
],
"enabled": true,
"timeout": 300000
}
}
}Claude Desktop — Docker
{
"mcpServers": {
"snowflake": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--env-file",
"<YOUR_PATH_TO_ENV>",
"nsphung/mcp-snowflake-server-nsp"
]
}
}
}