Snowflake Cortex AI模型上下文协议(MCP)服务器
MCP服务器目前支持以下功能:
- 皮质搜索:在Snowflake中查询非结构化数据,如检索增强生成(RAG)应用程序中常用的。
- 皮质分析员:通过丰富的语义建模在Snowflake中查询结构化数据。
- 皮质剂:跨结构化和非结构化数据检索的代理编排器
- 对象管理:对Snowflake最常见的对象执行基本操作,如创建、删除、更新等。
- SQL执行:运行由用户配置的权限管理的LLM生成的SQL。
- 语义视图查询:发现和查询雪花语义视图
入门指南
服务配置
一个简单的配置文件用于驱动所有工具。一个例子可以在 services/configuration.yaml 下面是一个模板。此配置文件的路径将传递给服务器,其内容用于在启动时创建MCP服务器工具。
Cortex服务
可以添加许多Cortex代理、搜索和分析服务。理想的描述既具有高度的描述性,又相互排斥。 只有明确列出的Cortex服务才能作为MCP客户端中的工具使用。
其他服务
其他服务包括工具 对象管理, 查询执行,以及 语义视图使用. 这些工具组可以通过在中设置为True来启用 other_services 配置文件的一部分。
SQL语句权限
这 sql_statement_permissions 该部分确保只有经过批准的语句才能在任何有权更改Snowflake对象的工具上执行。 该列表包含SQL表达式类型。标有True的是允许的,标有False的是不允许的。请看 SQL执行 对于每种表达式类型的示例。
agent_services: # List all Cortex Agent services
- service_name:
description: > # Describe contents of the agent service
database_name:
schema_name:
- service_name:
description: > # Describe contents of the agent service
database_name:
schema_name:
search_services: # List all Cortex Search services
- service_name:
description: > # Describe contents of the search service
database_name:
schema_name:
- service_name:
description: > # Describe contents of the search service
database_name:
schema_name:
analyst_services: # List all Cortex Analyst semantic models/views
- service_name: # Create descriptive name for the service
semantic_model: # Fully-qualify semantic YAML model or Semantic View
description: > # Describe contents of the analyst service
- service_name: # Create descriptive name for the service
semantic_model: # Fully-qualify semantic YAML model or Semantic View
description: > # Describe contents of the analyst service
other_services: # Set desired tool groups to True to enable tools for that group
object_manager: True # Perform basic operations against Snowflake's most common objects such as creation, dropping, updating, and more.
query_manager: True # Run LLM-generated SQL managed by user-configured permissions.
semantic_manager: True # Discover and query Snowflake Semantic Views and their components.
sql_statement_permissions: # List SQL statements to explicitly allow (True) or disallow (False).
# - All: True # To allow everything, uncomment and set All: True.
- Alter: True
- Command: True
- Comment: True
- Commit: True
- Create: True
- Delete: True
- Describe: True
- Drop: True
- Insert: True
- Merge: True
- Rollback: True
- Select: True
- Transaction: True
- TruncateTable: True
- Unknown: False # To allow unknown or unmapped statement types, set Unknown: True.
- Update: True
- Use: True\[!注意\] 以前版本的配置文件支持为列指定显式值,并为每个Cortex Search服务指定限制。相反,这些现在完全是基于用户提示的动态的。如果未指定,将返回搜索服务的默认search_columns,限制为10。
连接到Snowflake
MCP服务器使用 Snowflake Python连接器 适用于所有身份验证和连接方法。 请参阅Snowflake官方文档,了解全面的身份验证选项和最佳实践。
MCP服务器尊重分配给指定角色(在连接参数中传递)或用户默认角色(如果没有传递角色进行连接)的RBAC权限。
连接参数可以作为CLI参数和/或环境变量传递。服务器支持Snowflake Python连接器中可用的所有身份验证方法,包括:
- 用户名/密码验证
- 密钥对身份验证
- OAuth身份验证
- 单点登录(SSO)
- 多因素身份验证(MFA)
连接参数
连接参数可以作为CLI参数和/或环境变量传递:
| 参数 | CLI参数 | 环境变量 | 描述 |
|---|---|---|---|
| 帐户 | --帐户 | SNOWFLAKE_Account | 帐户标识符(例如xy12345.us-east-1) |
| 主机 | --主机 | SNOWFLAKE_Host | 雪花主机URL |
| 用户 | --用户,--用户名 | SNOWFLAKE_User | 身份验证用户名 |
| 密码 | --密码 | SNOWFLAKE_Password | 密码或编程访问令牌 |
| 角色 | --Role | SNOWFLAKE_Role | 用于连接的角色 |
| 仓库 | --仓库 | SNOWFLAKE_Warehouse | 用于查询的仓库 |
| 密码中的密码 | --密码中的通行码 | - | 密码中是否嵌入了通行码 |
| 密码 | --密码 | SNOWFLAKE_Passcode | MFA身份验证密码 |
| 私钥 | --私钥 | SNOWFLAKE_Private_Key | 密钥对身份验证私钥 |
| 私钥文件 | --私钥文件 | SNOWFLAKE_Private_Key_File | 私钥文件路径 |
| 私钥密码 | --私钥文件pwd | SNOWFLAKE_Private_Key_file_pwd | 加密私钥密码 |
| 身份验证器 | --身份验证器 | - | 身份验证类型(默认:雪花) |
| 连接名称 | --连接名称 | - | connections.toml(或config.toml)文件中的连接名称 |
\[!警告\] 弃用通知:CLI参数--account-identifier和--pat,以及环境变量SNOWFLAKE_PAT,已弃用,并将在未来的版本中删除。请使用--account和--password(或SNOWFLAKE_ACCOUNT和SNOWFLAKE_PASSWORD)相反。
传输配置
MCP服务器支持多种传输机制。有关MCP传输的详细信息,请参阅 FastMCP传输协议.
| 运输 | 描述 | 用例 |
|---|---|---|
stdio | 标准输入/输出(默认) | 本地开发,MCP客户端集成 |
sse (传统) | 服务器发送事件 | 流媒体应用程序 |
streamable-http | 可流式HTTP传输 | 容器部署、远程服务器 |
用法
# Default stdio transport
uvx snowflake-labs-mcp --service-config-file config.yaml
# HTTP transport with custom endpoint
uvx snowflake-labs-mcp --service-config-file config.yaml --transport streamable-http --endpoint /my-endpoint
# For containers (uses streamable-http on port 9000)
uvx snowflake-labs-mcp --service-config-file config.yaml --transport streamable-http --endpoint /snowflake-mcp运输定制
可用于的服务器自定义 sse 和 streamable-http 运输:
| 参数 | CLI参数 | 环境变量 | 默认值 |
|---|---|---|---|
| 主机 | --服务器主机 | SNOWFLAKE_MCP_Host | “0.0.0.0” |
| 端口 | --端口 | SNOWFLAKE_MCP_Port | 9000 |
| 端点 | --端点 | SNOWFLAKE_MCP_Endpoint | /MCP |
| 调试日志 | --verbose | SNOWFLAKE_MCP_verbose | false |
例子:
export SNOWFLAKE_MCP_ENDPOINT="/my-mcp"
uvx snowflake-labs-mcp --service-config-file config.yaml --transport streamable-http与MCP客户端一起使用
MCP服务器与客户端无关,将与大多数支持MCP工具和(可选)资源基本功能的MCP客户端一起工作。以下是本地安装的示例。要连接到容器化部署,请参阅 将MCP客户端连接到容器.
克劳德桌面
要将此服务器与Claude Desktop集成为MCP客户端,请将以下内容添加到应用程序的服务器配置中。默认情况下,它位于:
- macOS:~/库/应用程序支持/Claude/Claude_desktop_config json
- Windows:%APPDATA%\\Claude\\Claude_desktop_config.json
设置服务配置文件的路径并配置连接方法:
{
"mcpServers": {
"mcp-server-snowflake": {
"command": "uvx",
"args": [
"snowflake-labs-mcp",
"--service-config-file",
"
/tools_config.yaml",
"--connection-name",
"default"
]
}
}
}光标
通过打开光标并导航到设置->光标设置->MCP,在光标中注册MCP服务器。添加以下内容:
{
"mcpServers": {
"mcp-server-snowflake": {
"command": "uvx",
"args": [
"snowflake-labs-mcp",
"--service-config-file",
"
/tools_config.yaml",
"--connection-name",
"default"
]
}
}
}在聊天中添加MCP服务器作为上下文。
要排除Cursor服务器问题,请打开输出面板并从下拉菜单中选择Cursor MCP来查看日志。
快速代理
更新 fastagent.config.yaml 带有配置文件路径和连接名称的mcp服务器部分:
# MCP Servers
mcp:
servers:
mcp-server-snowflake:
command: "uvx"
args: ["snowflake-labs-mcp", "--service-config-file", "
/tools_config.yaml", "--connection-name", "default"]微软Visual Studio代码+GitHub副本
有关先决条件、环境设置、分步指南和说明,请参阅此 博客.
法典
通过添加以下内容在codex中注册MCP服务器 ~/.codex/config.toml
[mcp_servers.mcp-server-snowflake]
command = "uvx"
args = [
"snowflake-labs-mcp",
"--service-config-file",
"
/tools_config.yaml",
"--connection-name",
"default"
]编辑后,雪花mcp应出现在输出中 codex mcp list 从终端运行。
容器部署
将MCP服务器部署为远程访问或生产环境的容器。本指南为Docker和Docker Compose部署提供了分步说明。
Docker部署
按照以下步骤使用Docker部署MCP服务器:
步骤1:准备配置文件
创建MCP配置目录并复制模板:
mkdir -p ${HOME}/.mcp/
cp services/configuration.yaml ${HOME}/.mcp/tools_config.yaml步骤2:配置服务
编辑配置文件以匹配您的环境:
# Edit the configuration file as needed
# Update service names, database/schema references, and enable desired features
nano ${HOME}/.mcp/tools_config.yaml步骤3:构建容器映像
从提供的Dockerfile构建Docker镜像:
docker build -f docker/server/Dockerfile -t mcp-server-snowflake .步骤4:设置环境变量
配置Snowflake连接参数。选择以下身份验证方法之一:
用户名/密码验证:
export SNOWFLAKE_ACCOUNT=
export SNOWFLAKE_USER=
export SNOWFLAKE_PASSWORD=密钥对身份验证:
export SNOWFLAKE_ACCOUNT=
export SNOWFLAKE_USER=
export SNOWFLAKE_PRIVATE_KEY="$(cat
)"
export SNOWFLAKE_PRIVATE_KEY_FILE_PWD=步骤5:运行容器
使用配置和环境变量启动容器:
用户名/密码验证:
docker run -d \
--name mcp-server-snowflake \
-p 9000:9000 \
-e SNOWFLAKE_ACCOUNT=${SNOWFLAKE_ACCOUNT} \
-e SNOWFLAKE_USER=${SNOWFLAKE_USER} \
-e SNOWFLAKE_PASSWORD=${SNOWFLAKE_PASSWORD} \
-v ${HOME}/.mcp/tools_config.yaml:/app/services/tools_config.yaml:ro \
mcp-server-snowflake对于密钥对身份验证:
docker run -d \
--name mcp-server-snowflake \
-p 9000:9000 \
-e SNOWFLAKE_ACCOUNT=${SNOWFLAKE_ACCOUNT} \
-e SNOWFLAKE_USER=${SNOWFLAKE_USER} \
-e SNOWFLAKE_PRIVATE_KEY="${SNOWFLAKE_PRIVATE_KEY}" \
-e SNOWFLAKE_PRIVATE_KEY_FILE_PWD=${SNOWFLAKE_PRIVATE_KEY_FILE_PWD} \
-v ${HOME}/.mcp/tools_config.yaml:/app/services/tools_config.yaml:ro \
mcp-server-snowflake步骤6:验证部署
检查容器是否正在运行且可访问:
# Check container status
docker ps
# Check container logs
docker logs mcp-server-snowflake
# Test endpoint (should return MCP server info)
curl http://localhost:9000/snowflake-mcpDocker编写部署
按照以下步骤使用Docker Compose进行简化部署:
步骤1:准备配置文件
创建配置目录并复制模板:
mkdir -p ${HOME}/.mcp/
cp services/configuration.yaml ${HOME}/.mcp/tools_config.yaml步骤2:配置服务
编辑配置文件以匹配您的环境:
# Update service configurations as needed
nano ${HOME}/.mcp/tools_config.yaml步骤3:设置环境变量
配置Snowflake连接参数:
export SNOWFLAKE_ACCOUNT=
export SNOWFLAKE_USER=
# For username/password auth:
export SNOWFLAKE_PASSWORD=
# For key pair auth, also set:
# export SNOWFLAKE_PRIVATE_KEY="$(cat
)"
# export SNOWFLAKE_PRIVATE_KEY_FILE_PWD=步骤4:启动服务
使用Docker Compose启动容器:
docker-compose up -d步骤5:验证部署
检查服务是否正在运行:
# Check service status
docker-compose ps
# View logs
docker-compose logs
# Test endpoint
curl http://localhost:9000/snowflake-mcp将MCP客户端连接到容器
一旦您的MCP服务器在容器中运行,您就可以将各种MCP客户端连接到它。所有客户端的连接配置都是相同的,只是配置格式不同。
连接URL格式:
- 本地部署:
http://localhost:9000/snowflake-mcp - 远程部署: `http://:
/snowflake-mcp`
克劳德桌面
将此添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"mcp-server-snowflake": {
"url": "http://localhost:9000/snowflake-mcp"
}
}
}光标
将此添加到光标中的MCP设置中(设置->光标设置->MCP):
{
"mcpServers": {
"mcp-server-snowflake": {
"url": "http://localhost:9000/snowflake-mcp"
}
}
}快速代理
将此添加到您的 fastagent.config.yaml:
# MCP Servers
mcp:
servers:
mcp-server-snowflake:
url: "http://localhost:9000/snowflake-mcp"笔记:
- 对于远程部署,请替换
localhost:9000使用服务器的主机名和端口 - 确保防火墙允许端口9000(或配置的端口)上的连接
- 对于生产部署,考虑使用HTTPS和适当的身份验证
Cortex服务
Cortex Agent实例(in agent_services 部分),皮质搜索(in search_services 第节)和Cortex Analyst(in analyst_services 配置文件的第节)将用作工具。将这些部分留空以省略这些工具。
MCP服务器中仅支持Cortex Agent对象。也就是说,只有Snowflake中预先配置的Cortex Agent对象才能用作工具。看 Cortex代理运行API 了解更多详情。
确保所有服务的服务名称、数据库、模式等都有准确的上下文名称。理想的描述既具有高度的描述性,又相互排斥。
这 semantic_model 分析师服务中的值应该是Snowflake阶段的完全限定语义视图或语义YAML文件:
- 对于语义视图:
MY_DATABASE.MY_SCHEMA.MY_SEMANTIC_VIEW - 对于语义YAML文件:
@MY_DATABASE.MY_SCHEMA.MY_STAGE/my_semantic_file.yaml(注意@.)
对象管理
MCP服务器包括数十个工具,范围很窄,可以完成基本的操作管理。建议直接使用Snowsight进行高级对象管理。
MCP服务器当前支持 创建, 掉落, 创建或更改, 描述,以及 挂牌 下面的对象类型。 要启用这些工具,请设置 object_manager 在配置文件中设置为True other_services.
- Database
- Schema
- Table
- View
- Warehouse
- Compute Pool
- Role
- Stage
- User
- Image Repository请注意,这些工具也受以下配置文件中捕获的权限的控制 sql_statement_permissions. 用于创建和创建或更改对象的对象管理工具由 Create 许可。对象删除受以下因素控制 Drop 许可。
未来的版本中可能会包含更多的操作和对象。
SQL执行
通用SQL工具将提供一种执行MCP客户端生成的通用SQL语句的方法。用户可以完全控制配置文件中批准的SQL语句的类型。
在配置文件中列出 sql_statement_permissions 是 sqlglot表达式类型标记为False的将在执行前停止。标记为True的将被执行(或根据MCP客户端设置提示用户执行)。
要启用SQL执行工具,请设置 query_manager 在配置文件中设置为True other_services. 要允许所有SQL表达式通过额外的验证,请设置 All 真的。
并非所有Snowflake SQL命令都映射到sqlglot中,您可能会发现一些模糊的命令尚未在配置文件中捕获。 设置 Unknown 为True将允许这些未捕获的命令通过额外的验证。 您还可以直接添加新的表达式类型来纪念特定的表达式类型。
以下是sqlglot表达式类型的一些示例,以及附带的Snowflake SQL命令示例:
| SQLGlot表达式类型 | SQL命令 |
|---|---|
| 更改 | ALTER TABLE my_table ADD COLUMN new_column VARCHAR(50); |
| 指挥部 | CALL my_procedure('param1_value', 123); |
GRANT ROLE analyst TO USER user1; SHOW TABLES IN SCHEMA my_database.my_schema; | |评论| COMMENT ON TABLE my_table IS 'This table stores customer data.'; | |承诺| COMMIT; | |创建| CREATE TABLE my_table ( id INT, name VARCHAR(255), email VARCHAR(255) ); CREATE OR ALTER VIEW my_schema.my_new_view AS SELECT id, name, created_at FROM my_schema.my_table WHERE created_at >= '2023-01-01'; | |删除| DELETE FROM my_table WHERE id = 101; | |描述| DESCRIBE TABLE my_table; | |放下| DROP TABLE my_table; | |错误| COPY INTO my_table FROM @my_stage/data/customers.csv FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1 FIELD_DELIMITER = ','); REVOKE ROLE analyst FROM USER user1; UNDROP TABLE my_table; | |插入| INSERT INTO my_table (id, name, email) VALUES (102, 'Jane Doe', 'jane.doe@example.com'); | |合并| MERGE INTO my_table AS target USING (SELECT 103 AS id, 'John Smith' AS name, 'john.smith@example.com' AS email) AS source ON target.id = source.id WHEN MATCHED THEN UPDATE SET target.name = source.name, target.email = source.email WHEN NOT MATCHED THEN INSERT (id, name, email) VALUES (source.id, source.name, source.email); | |回滚| ROLLBACK; | |选择| `SELECT id, name FROM my_table WHERE id
