远程数据库访问服务器

Snowflake Remote MCP Server V3.0 是一个提供完整读写能力的远程数据库访问服务器,适用于数据同步、管道处理和批量数据加载等场景。

  • by Product-Data-Cloud
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Product-Data-Cloud/snowflake-mcp-remote

使用说明

雪花远程MCP服务器V3.0

用于Snowflake数据库访问的远程MCP服务器,具有完整的写入功能和 V3.0生产资源限制.

🚀 特性

V3.0-生产就绪(新增!2025-11-13):

  • ⚡ 2Gi内存: 从默认的512Mi(增加4倍!)
  • ⚡ 2个CPU内核: 从默认的1核升级(速度提高2倍!)
  • ⚡ 最小实例:1: 零冷启动!
  • ⚡ 最大实例数:10: 负载平衡和稳定性
  • ⚡ 并发:80: 针对并行请求进行了优化
  • ⚡ 响应速度提高3-5倍: 即时可用性

V2.2-功能齐全:

  • ✅ UPSERT运营: MERGE支持数据同步
  • ✅ 交易: 原子操作的开始、提交、回滚
  • ✅ 批量插入: 多值INSERT提高效率
  • ✅ 动态限制: 每个查询可配置1-1000行
  • ✅ 读取操作: 选择、显示、描述
  • ✅ 写入操作: 插入、更新、删除(带安全检查)
  • ✅ DDL操作: 创建、更改
  • 🔒 安全: 块DROP/TRUNCATE,需要在哪里进行更新/删除
  • ⚡ 优化: 自动限制、令牌优化响应、列截断

📡 部署

通过云构建触发器自动部署(推荐)

一次性设置:

# In Google Cloud Console → Cloud Build → Triggers → Create Trigger
Name: snowflake-mcp-auto-deploy
Event: Push to branch
Branch: ^main$
Configuration: Cloud Build configuration file (cloudbuild.yaml)

然后:推到main→ 自动部署(3-5分钟)

手动部署

# In Cloud Shell
cd ~/snowflake-mcp-remote
git pull

gcloud config set project productdatacloud
gcloud run deploy snowflake-mcp \
  --source . \
  --region=europe-west1 \
  --platform=managed \
  --allow-unauthenticated \
  --memory=2Gi \
  --cpu=2 \
  --min-instances=1 \
  --max-instances=10 \
  --concurrency=80 \
  --timeout=300s \
  --update-secrets=SNOWFLAKE_PRIVATE_KEY_CONTENT=snowflake-private-key:latest

🔗 用法

服务URL: https://snowflake-mcp-409811184795.europe-west1.run.app

添加到claude.ai:

  1. 设置→ 连接器→ 添加自定义连接器
  2. 产品名称:雪花PDC V3.0
  3. URL:(上面的服务URL)
  4. 保存

🛠️ 工具

snowflake_query(sql: str, max_rows: int = 20)

使用自动优化和高级功能执行SQL。

示例:

-- UPSERT with MERGE (V2.2!)
MERGE INTO PRODUCT target
USING PRODUCT_RAW source
ON target.PRODUCT_ID = source.PRODUCT_ID
WHEN MATCHED THEN
  UPDATE SET target.JSON_DATA = source.JSON_DATA
WHEN NOT MATCHED THEN
  INSERT (PRODUCT_ID, REGION, JSON_DATA) 
  VALUES (source.PRODUCT_ID, source.REGION, source.JSON_DATA)

-- Transactions (V2.2!)
BEGIN TRANSACTION;
-- Multiple operations execute atomically
INSERT INTO TASK_QUEUE (...) VALUES (...);
UPDATE REQUEST_QUEUE SET STATUS = 'processed' WHERE ID = 123;
COMMIT;

-- Or rollback on error
BEGIN TRANSACTION;
DELETE FROM TASK_QUEUE WHERE STATUS = 'failed';
ROLLBACK;  -- Undo if needed

-- Dynamic LIMIT (V2.2!)
SELECT * FROM PRODUCT  -- Uses default 20
SELECT * FROM PRODUCT_RAW WITH max_rows=100  -- Get 100 rows
SELECT * FROM SOCIAL_MENTIONS WITH max_rows=500  -- Get 500 rows

-- Write operations
INSERT INTO TASK_QUEUE (PRODUCT_ID, STATUS) VALUES ('123', 'pending');

UPDATE TASK_QUEUE 
SET STATUS = 'completed' 
WHERE PRODUCT_ID = '123';

DELETE FROM TASK_QUEUE 
WHERE STATUS = 'completed' AND CREATED_AT < '2024-01-01';

-- DDL operations
CREATE VIEW active_products AS 
SELECT * FROM PRODUCT WHERE IS_ACTIVE = TRUE;

batch_insert(table: str, columns: List[str], values: List[List[Any]])

V2.2! 在一次操作中高效地插入多行。

例子:

batch_insert(
    table="TASK_QUEUE",
    columns=["PRODUCT_ID", "STATUS", "REGION", "API_SOURCE"],
    values=[
        ["prod-001", "pending", "US", 1],
        ["prod-002", "pending", "UK", 1],
        ["prod-003", "pending", "DE", 2],
        ["prod-004", "pending", "FR", 2],
        ["prod-005", "pending", "ES", 3]
    ]
)
# Result: 5 rows inserted in 1 operation (vs 5 separate INSERTs)

优点:

  • 令牌减少80%(1次通话vs 5次通话)
  • 执行速度提高70%
  • 原子操作(全部成功或全部失败)

connection_status()

检查连接健康状况和功能。

🔒 安全

允许:

  • ✅ 选择、显示、描述
  • ✅ INSERT(单次+批量)
  • ✅ 更新(带WHERE)
  • ✅ 删除(带WHERE)
  • ✅ 合并(追加销售)
  • ✅ 开始、提交、回滚
  • ✅ 创建、更改

此 路 不通:

  • ❌ 丢弃
  • ❌ 截断
  • ❌ 无位置更新
  • ❌ 不带WHERE的删除

📊 版本历史记录

  • V3.0 (2025-11-13):生产资源限制(2Gi RAM,2 CPU,最小=1)
  • V2.2 (2025-11-02):合并、交易、批量插入、动态限制
  • V2.1 (2025-11-02):通过安全检查启用写入操作
  • V2.0 (2025-10-29):具有读取+DDL的初始远程MCP
  • V1.0 (2025-10-24):本地MCP原型

🎯 性能改进(V3.0)

度量 之前(默认) 之后(V3.0) 改进
记忆 512Mi 2Gi 4x
中央处理器 1芯 2芯 2x
冷启动 ~5-7s 0s(始终温暖) ♾️
响应时间 300-500ms 100-200ms 快3倍
并发 80 80 优化
稳定性 偶尔OOM 坚如磐石 ✅

成本: 对于最小实例=1,每月约10美元(对于零冷启动来说,这是值得的!)

🎯 用例

数据同步

-- Sync PRODUCT_RAW → PRODUCT (daily update)
MERGE INTO PRODUCT target
USING PRODUCT_RAW source
ON target.PRODUCT_ID = source.PRODUCT_ID 
   AND target.REGION = source.REGION
WHEN MATCHED THEN
  UPDATE SET 
    target.JSON_DATA = source.JSON_DATA,
    target.UPDATED_AT = CURRENT_DATE()
WHEN NOT MATCHED THEN
  INSERT (PRODUCT_ID, REQUEST_ID, REGION, JSON_DATA)
  VALUES (source.PRODUCT_ID, source.REQUEST_ID, 
          source.REGION, source.JSON_DATA);

流水线处理

-- Process queue items atomically
BEGIN TRANSACTION;

-- Mark items as processing
UPDATE TASK_QUEUE 
SET STATUS = 'processing', UPDATED_AT = CURRENT_DATE()
WHERE STATUS = 'pending' 
  AND CREATED_AT < DATEADD(hour, -1, CURRENT_TIMESTAMP());

-- Log processing start
INSERT INTO ETL_LOGGING (TASK_ID, STATUS, MESSAGE)
SELECT ID, 'processing', 'Batch started'
FROM TASK_QUEUE 
WHERE STATUS = 'processing';

COMMIT;

批量数据加载

# Load 1000 products efficiently
batch_insert(
    table="PRODUCT_RAW",
    columns=["PRODUCT_ID", "REGION", "API_SOURCE", "JSON_DATA"],
    values=[[p["id"], p["region"], 1, json.dumps(p)] for p in products]
)
# 1000 rows in 1 operation vs 1000 separate INSERTs!

🔐 环境与秘密

环境变量:

  • SNOWFLAKE_ACCOUNT:rrnmgcg生产数据云
  • SNOWFLAKE_USER:PDCDAVID
  • SNOWFLAKE_DATABASE:产品_数据_云
  • SNOWFLAKE_SCHEMA:PDC产品
  • SNOWFLAKE_WAREHOUSE:COMPUTE_WH
  • SNOWFLAKE_ROLE:负责

秘密(秘密经理):

  • SNOWFLAKE_PRIVATE_KEY_CONTENT:Base64编码的JWT私钥

📝 发展

本地测试:

cd ~/snowflake-mcp-remote
python -m fastmcp dev server.py

依赖关系:

  • Python 3.12
  • fastmcp>=0.2.0
  • 雪花连接器python>=3.7.0
  • 密码学>=41.0.0

维护单位: David(产品负责人)+Claude(首席开发人员)
最后更新时间: 2025-11-13
状态: 🟢 生产就绪V3.0