OSS Snowflake MCP Server
io.github.Snowflake-Labs/mcp
About OSS Snowflake MCP Server
OSS Snowflake MCP Server is an MCP server published by the GitHub account Snowflake-Labs. MCP Server for Snowflake from Snowflake Labs
It runs on your own machine: your AI client starts it from the PyPI package snowflake-labs-mcp at version 1.3.5.
It asks for 2 secrets: SNOWFLAKE_PASSWORD and SNOWFLAKE_PRIVATE_KEY. Give it a key with the least access that still works.
Version 1.3.5 was published on 28 October 2025, and the source code is public, so you can read it before installing.
Written from the registry entry. 9 automated checks on the registry entry and the package code: 7 pass, 0 warn, 0 fail, 2 info. How we check.
What it asks for
| Variable | Required | Secret | Description |
|---|---|---|---|
SNOWFLAKE_ACCOUNT | No | No | Account identifier (e.g. xy12345.us-east-1) |
SNOWFLAKE_HOST | No | No | Snowflake host URL |
SNOWFLAKE_USER | No | No | Username for authentication |
SNOWFLAKE_PASSWORD | No | Yes | Password or programmatic access token |
SNOWFLAKE_ROLE | No | No | Role to use for connection |
SNOWFLAKE_WAREHOUSE | No | No | Warehouse to use for queries |
SNOWFLAKE_PASSCODE | No | No | MFA passcode for authentication |
SNOWFLAKE_PRIVATE_KEY | No | Yes | Private key for key pair authentication |
SNOWFLAKE_PRIVATE_KEY_FILE | No | No | Path to private key file |
SNOWFLAKE_PRIVATE_KEY_FILE_PWD | No | No | Password for encrypted private key |
SNOWFLAKE_MCP_HOST | No | No | Host address to bind the server to (default: 0.0.0.0) |
SNOWFLAKE_MCP_PORT | No | No | Port number for the server to listen on (default: 9000) |
SNOWFLAKE_MCP_ENDPOINT | No | No | Endpoint path for the MCP server (default: /mcp) |
Checks
| Check | Result | Detail |
|---|---|---|
| Source repository linked | Pass | https://github.com/Snowflake-Labs/mcp |
| Version pinned | Pass | Every package has an explicit version |
| Secrets requested | Info | Asks for 2 secrets: SNOWFLAKE_PASSWORD, SNOWFLAKE_PRIVATE_KEY |
| Known package registry | Pass | All packages come from npm, PyPI, OCI, NuGet or MCPB |
| Namespace ownership | Info | Name verified via GitHub account Snowflake-Labs |
| Registry text aimed at the AI | Pass | Description and settings contain no hidden characters or instructions to the AI |
| Install scripts | Pass | snowflake-labs-mcp 1.3.5 has no setup.py; nothing runs at install |
| Code red flags | Pass | Read 28 files in snowflake-labs-mcp 1.3.5: no obfuscation, encoded execution, credential reads or data-collection endpoints found |
| Text aimed at the AI | Pass | No hidden characters or instructions to the AI in 28 files, including comments and the README |
Code review: Pass, with notes
We read all 3,415 lines in 15 files of snowflake-labs-mcp 1.3.5 on 2026-10-31, without running it.
Official Snowflake server that lets an AI query and manage your Snowflake account, including Cortex Search/Analyst/Agent. Everything it sends goes only to your own Snowflake account (with a usage tag Snowflake uses to count MCP traffic). It can run SQL and create or drop objects, so set the sql_statement_permissions list carefully (it refuses everything by default) and do not expose the HTTP mode on a network, as it has no login.
What we found
- Note run_snowflake_query runs any SQL the AI writes. A middleware allow/deny list (sql_statement_permissions in the YAML) gates it, and with no permissions configured every statement is refused (default-deny). Users who set 'all: true' give the AI full DML/DDL.
query_manager/tools.py:53-64 - Note create_object / drop_object / create_or_alter_object can create, replace and drop databases, warehouses, users, roles etc. Gated only by 'create'/'drop' in sql_statement_permissions; no per-call confirmation. mode='replace' does CREATE OR REPLACE.
object_manager/tools.py:211-247 - Note query_semantic_view appends where_clause and order_by as raw SQL text and is NOT checked by the permission middleware (server_utils.py only checks run_snowflake_query and create*/drop*). Snowflake runs one statement per execute, so this cannot chain a DROP, but it lets the AI run arbitrary read subqueries even when SELECT is not allowed.
semantic_manager/tools.py:218-222 - Note cortex_analyst executes the SQL that Cortex Analyst generates without passing it through the SQL permission check.
utils.py:249-254 - Note Statement type is taken from sqlglot.parse_one (first statement only); multi-statement bypass is blocked in practice by the connector's single-statement default, not by this check.
query_manager/tools.py:67-82 - Note With --transport http/sse/streamable-http the server binds 0.0.0.0:9000 by default with no authentication on the MCP endpoint, so anyone on the network can drive the user's Snowflake session. stdio (the default) is not affected.
server.py:484-489 - Info starts_with is concatenated into a quoted literal after stripping single quotes only (SHOW statements cannot bind). Single-statement execution limits the impact to a syntax error.
object_manager/tools.py:137-140 - Info database/schema/service names from tool input are put into REST API paths unencoded; the host is fixed to the user's Snowflake account, so this is not SSRF.
cortex_services/tools.py:71-74 - Info validate_semantic_view_tool is dead code (never called).
semantic_manager/tools.py:268-288 - Info No pyproject.toml/METADATA in the reviewed copy; dependencies listed are those imported by the code. No install hooks, obfuscation, encoded payloads, dynamic imports, disabled TLS or hard-coded secrets found.
package - Info lines_read (3415) is the real line count of every file (Read tool / splitlines). The manifest's 3430 counts one extra empty 'line' after the trailing newline of 15 files; no file or line was skipped.
manifest.tsv
| Talks to | <account>.snowflakecomputing.com (or SNOWFLAKE_HOST / --host): Snowflake credentials via the official connector; SQL statements; Cortex Search/Analyst/Agent REST calls with the user's query text; a QUERY_TAG {origin:sf_sit,name:mcp_server,version} on every session so Snowflake can count MCP usage (at startup (connect + a zero-compute 'SELECT 'MCP Server Snowflake'' query) and on every tool call) |
|---|---|
| Keys and settings | SNOWFLAKE_ACCOUNT / SNOWFLAKE_HOST / SNOWFLAKE_USER: Snowflake (connection)SNOWFLAKE_PASSWORD / SNOWFLAKE_PAT (deprecated): Snowflake login onlySNOWFLAKE_ROLE / SNOWFLAKE_WAREHOUSE / SNOWFLAKE_PASSCODE: Snowflake login onlySNOWFLAKE_PRIVATE_KEY / SNOWFLAKE_PRIVATE_KEY_FILE / SNOWFLAKE_PRIVATE_KEY_FILE_PWD: used locally by the connector for key-pair authSNOWFLAKE_DEFAULT_CONNECTION_NAME: local (picks a connection from the Snowflake config file)SERVICE_CONFIG_FILE: local (path of the YAML tool config)SNOWFLAKE_MCP_HOST / SNOWFLAKE_MCP_PORT / SNOWFLAKE_MCP_ENDPOINT: local (HTTP bind settings)/snowflake/session/token (file, SPCS containers only): Snowflake as an OAuth bearer token |
| Files on your machine | Reads the YAML service config file (path from --service-config-file / SERVICE_CONFIG_FILE) and exposes it as an MCP resource; reads /snowflake/session/token when running inside Snowpark Container Services; the connector may read a private-key file or Snowflake connections file named in config. No other file reads or writes. No path from tool input touches the file system. |
| Runs programs | None. No subprocess, os.system, eval or exec. Only SQL sent to Snowflake. |
| Telemetry | No third-party telemetry. Every Snowflake session is tagged QUERY_TAG {"origin":"sf_sit","name":"mcp_server","version":{major:1,minor:3}} (server.py:49-53, 'Used to quantify Snowflake usage'); this goes only to the user's own Snowflake account and cannot be switched off without editing code. |
| Tools | create_object, drop_object, create_or_alter_object, describe_object, list_objects, run_snowflake_query, list_semantic_views, describe_semantic_view, show_semantic_dimensions, show_semantic_metrics, get_semantic_view_ddl, write_semantic_view_query_tool, query_semantic_view, cortex_agent, cortex_search, cortex_analyst |
| Tool descriptions | clean (descriptions are plain and on-task; cortex tool descriptions embed the user's own YAML service list) |
This covers the package's own code only, not the 8 packages it depends on (fastmcp, snowflake-connector-python, snowflake-core (snowflake.core), pyyaml, requests, pydantic, typing_extensions, sqlglot). A new version drops this review until we read it again.
Popularity & health: 65 / 100
Worked out from public numbers and our own checks, not from user reviews or ratings. It says how used and how looked-after a server is, not whether it is safe.
109 forks, 98 merged pull requests. Sources: GitHub, npm, PyPI (pypistats.org) and Hacker News (Algolia), fetched 2026-10-31.
What people say
No Hacker News threads link to its source code.
Look further: search Reddit, search Hacker News, read its GitHub issues. These are not reviews we checked.
Facts
| Registry name | io.github.Snowflake-Labs/mcp |
|---|---|
| Publisher | GitHub account Snowflake-Labs |
| How the name is verified | Name verified via GitHub account Snowflake-Labs. The registry ties the name prefix to that account or domain; it does not check the code. |
| Type | Local: runs on your machine from a package |
| Packages | pypi snowflake-labs-mcp 1.3.5 (stdio) |
| Version | 1.3.5 |
| Published | |
| Last updated | |
| Source repository | https://github.com/Snowflake-Labs/mcp |
| Website | None linked |
| Category | Databases & data (assigned by keyword rule, not by hand) |
Related servers in Databases & data
- GenPark Distributed ID Snowflake Generator3/464-bit Twitter Snowflake-compatible distributed unique ID generator…
- Cost Guard MCP7/8Pre-flight query cost and result-size guardrails for AI agents on…
Faucet7/7SQL database to MCP tools and REST API: PostgreSQL, MySQL, SQL…
IDs-LE7/7Extract every UUID, ULID, NanoID, ObjectId and Snowflake, and…- Snowflake MCP Server7/8A Snowflake MCP server — SQL queries, schema exploration, and data…