Snowflake管理の MCP サーバー¶
概要¶
注釈
Snowflakeはモデルコンテキストプロトコルリビジョン 2025-06-18 をサポートしています。
モデルコンテキストプロトコル( MCP )は、 オープンソース標準 であり、 AI エージェントがビジネスアプリケーションや、データベースやコンテンツリポジトリなどの外部データシステムと安全にやり取りできるようにします。 MCP は、エンタープライズビジネスが統合の課題を減らし、モデルから成果を迅速に提供できるようにします。リリース以来、 MCP はエージェントアプリケーションの基盤となり、ツールの呼び出しとデータの取得のための一貫性のある安全なメカニズムを提供しています。
Snowflakeが管理する MCP サーバーを使用すると、 AI エージェントは、別途インフラストラクチャを導入することなく、Snowflakeアカウントから安全にデータを取得できます。MCP サーバーを構成すると、標準ベースのインターフェース上で、Cortex Analyst、Cortex Search、Cortex Agentsをツールとして提供でき、カスタムツールと SQL 実行も扱うことができます。MCP クライアントはこれらのツールを検出して呼び出し、アプリケーションに必要なデータを取得します。Snowflake上の管理 MCP サーバーを使用すると、アクセス制御とプライバシー制御を維持しながら、スケーラブルなエンタープライズグレードのアプリケーションを構築できます。Snowflake上の MCP サーバーは以下を提供します。
標準化された統合: 急速に進化する標準に準拠した、ツールの検出と呼び出しのための統一されたインターフェース。
包括的な認証: Snowflakeの組み込み OAuth サービスにより、 MCP 統合のための OAuth ベースの認証が可能になります。
堅牢なガバナンス: ツールの検出と呼び出しを管理するための MCP サーバーとツールに対するロールベースのアクセス制御( RBAC )。
MCP ライフサイクルの詳細については、 ライフサイクル をご参照ください。MCP の実装例については、 マネージドSnowflake MCP サーバーを使い始める クイックスタートをご参照ください。
MCP サーバーのセキュリティの推奨事項¶
重要
MCP サーバー接続のホスト名を構成する場合、アンダースコア( _ )ではなくハイフン( - )を使用します。MCP サーバーでは、アンダースコアを含むホスト名に接続の問題があります。
複数の MCPサーバーをツールと説明を確認せずに使用すると、ツール汚染やツールシャドウイングなどの脆弱性につながる可能性があります。Snowflakeでは、サードパーティの MCP サーバーを使用する前に確認することを推奨しています。これには、別のSnowflakeユーザーまたはアカウントからの任意の MCP サーバーが含まれます。サードパーティ MCP サーバーが提供するすべてのツールを確認します。
認証メソッドとして OAuth を使用することを推奨します。ハードコードされたトークンを使用すると、トークン漏洩が発生する可能性があります。
プログラムアクセストークン(PAT)を使用する場合、MCP を操作できる最小権限のロールを使用するように設定します。これは、高い権限を持つロールへのアクセスによるシークレットの漏洩を防ぐのに役立ちます。
最小権限の原則に従い、MCP サーバーとツールに適切な権限を設定します。MCP サーバーへのアクセスは、ツールへのアクセスを認めるものではありません。各ツールについて権限を付与する必要があります。
MCP サーバーオブジェクトの作成¶
ツールとその他のメタデータを指定してオブジェクトを作成します。必要な認証の後、サーバーに接続する MCP クライアントはこれらのツールを検出して呼び出すことができます。
MCP サーバーを作成するデータベースとスキーマに移動します。
MCP サーバーを作成します。
CREATE [ OR REPLACE ] MCP SERVER [ IF NOT EXISTS ] <server_name> FROM SPECIFICATION $$ tools: - name: "product-search" type: "CORTEX_SEARCH_SERVICE_QUERY" identifier: "database1.schema1.Cortex_Search_Service1" description: "cortex search service for all products" title: "Product Search" - name: "revenue-semantic-view" type: "CORTEX_ANALYST_MESSAGE" identifier: "database1.schema1.Semantic_View_1" description: "Semantic view for all revenue tables" title: "Semantic view for revenue" $$
Snowflakeは現在、次のタイプのツールをサポートしています。
** CORTEX_SEARCH_SERVICE_QUERY :** Cortex Search Serviceツール
** CORTEX_ANALYST_MESSAGE :** Cortex Analystツール
SYSTEM_EXECUTE_SQL: SQL 実行
CORTEX_AGENT_RUN: Cortex Agent ツール
GENERIC: tool for UDFs and stored procedures
次の例は、さまざまなツールタイプを構成する方法を示しています。
Using the Analyst tool, your client can generate text from SQL. Use the following code to specify the tool configuration.
注釈
The Snowflake-managed MCP server only supports using semantic views with Cortex Analyst. It does not support semantic models.
tools: - name: "revenue-semantic-view" type: "CORTEX_ANALYST_MESSAGE" identifier: "database1.schema1.Semantic_View_1" description: "Semantic view for all revenue tables" title: "Semantic view for revenue"Using the Search tool requests, your client can perform unstructured search on their data.
tools: - name: "product-search" type: "CORTEX_SEARCH_SERVICE_QUERY" identifier: "database1.schema1.Cortex_Search_Service1" description: "cortex search service for all products" title: "Product Search"SQL 実行ツールの場合、クライアントはSnowflakeで SQL クエリを実行できます。以下のコードを使用して、ツール構成を指定します。
tools: - title: "SQL Execution Tool" name: "sql_exec_tool" type: "SYSTEM_EXECUTE_SQL" description: "A tool to execute SQL queries against the connected Snowflake database."Agentツールの場合、クライアントはエージェントにメッセージを渡します。エージェントはリクエストを処理して応答を返します。以下のコードを使用して、ツール構成を指定します。
tools: - title: "Agent V2" name: "agent_1" type: "CORTEX_AGENT_RUN" identifier: "db.schema.agent" description: "agent that gives the ability to..."カスタムツールの場合、ツール構成内にユーザー定義関数(UDF)またはストアドプロシージャ署名を提供します。カスタムツールにより、MCP サーバーを通じて、UDFs およびストアドプロシージャをツールとして呼び出すことができます。
ツールの構成で以下を指定する必要があります。
type: UDF の場合はfunction、 ストアドプロシージャの場合はprocedure
Warehouse
Input schema: 関数の署名に対応
以下の例を使用し、UDFs およびストアドプロシージャを使用してカスタムツールを作成および構成します。
次の例は、カスタムツールとして使用できる UDFs の作成を示しています。
-- create a simple udf
CREATE OR REPLACE FUNCTION MULTIPLY_BY_TEN(x FLOAT)
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'multiply_by_ten'
AS
$$
def multiply_by_ten(x: float) -> float:
return x * 10
$$;
SHOW FUNCTIONS LIKE 'MULTIPLY_BY_TEN';
-- test return json/variant
CREATE OR REPLACE FUNCTION CALCULATE_PRODUCT_AND_SUM(x FLOAT, y FLOAT)
RETURNS VARIANT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'calculate_values'
AS
$$
import json
def calculate_values(x: float, y: float) -> dict:
"""
Calculates the product and sum of two numbers and returns them in a dictionary.
The dictionary is converted to a VARIANT (JSON) in the SQL return.
"""
product = x * y
sum_val = x + y
return {
"product": product,
"sum": sum_val
}
$$;
-- test return list/array
CREATE OR REPLACE FUNCTION GET_NUMBERS_IN_RANGE(x FLOAT, y FLOAT)
RETURNS ARRAY -- Use ARRAY to explicitly state a list is being returned
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'get_numbers'
AS
$$
def get_numbers(x: float, y: float) -> list:
"""
Returns a list of integers between x (exclusive) and y (inclusive).
Assumes x < y.
"""
# Ensure x and y are treated as integers for range generation
start = int(x) + 1
end = int(y) + 1 # range() is exclusive on the stop value
# Use a list comprehension to generate the numbers
# The Python list will be converted to a Snowflake ARRAY.
return list(range(start, end))
$$;
次の例は、カスタムツールとして使用できるストアドプロシージャの作成を示しています。
-- create a simple stored procedure
CREATE OR REPLACE PROCEDURE MULTIPLY_BY_TEN_SP(x FLOAT)
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'multiply_by_ten'
AS
$$
# The handler logic is identical to the UDF for a scalar return
def multiply_by_ten(x: float) -> float:
return x * 10
$$;
-- test return json/variant
CREATE OR REPLACE PROCEDURE CALCULATE_VALUES_SP(x FLOAT, y FLOAT)
RETURNS VARIANT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'calculate_values'
AS
$$
# The handler logic is identical to the UDF for a VARIANT return
def calculate_values(x: float, y: float) -> dict:
"""
Calculates the product and sum of two numbers and returns them in a dictionary.
The dictionary is converted to a VARIANT (JSON) in the SQL return.
"""
product = x * y
sum_val = x + y
return {
"product": product,
"sum": sum_val
}
$$;
-- test return list/array
CREATE OR REPLACE PROCEDURE GET_NUMBERS_SP(x FLOAT, y FLOAT)
RETURNS ARRAY
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'get_numbers'
AS
$$
def get_numbers(x: float, y: float) -> list:
"""
Returns a list of integers between x (exclusive) and y (inclusive).
The Python list will be converted to a Snowflake ARRAY.
"""
# Ensure x and y are treated as integers for range generation
start = int(x) + 1
end = int(y) + 1 # range() is exclusive on the stop value
# Use a list comprehension to generate the numbers
return list(range(start, end))
$$;
以下の例は、UDFs およびストアドプロシージャ向けのカスタムツールの構成を示しています。
CREATE MCP SERVER my_mcp_server
FROM SPECIFICATION $$
tools:
- title: "Custom Tool 1"
identifier: "EXAMPLE_DATABASE.AGENTS.MULTIPLY_BY_TEN"
name: "multiply_by_ten"
type: "GENERIC"
description: "Multiplied input value by ten and returns the result."
config:
type: "function"
warehouse: "COMPUTE_SERVICE_WAREHOUSE"
input_schema:
type: "object"
properties:
x:
description: "A number to be multiplied by ten"
type: "number"
- title: "Custom Tool 2"
identifier: "EXAMPLE_DATABASE.AGENTS.CALCULATE_PRODUCT_AND_SUM"
name: "calculate_product_and_sum"
type: "GENERIC"
description: "Calculates the product and sum of two numbers and returns them in a JSON object."
config:
type: "function"
warehouse: "COMPUTE_SERVICE_WAREHOUSE"
input_schema:
type: "object"
properties:
x:
description: "First number"
type: "number"
y:
description: "Second number"
type: "number"
- title: "Custom Tool 3"
identifier: "EXAMPLE_DATABASE.AGENTS.GET_NUMBERS_IN_RANGE"
name: "get_numbers_in_range"
type: "GENERIC"
description: "Returns a list of integers between two numbers."
config:
type: "function"
warehouse: "COMPUTE_SERVICE_WAREHOUSE"
input_schema:
type: "object"
properties:
x:
description: "Start number (exclusive)"
type: "number"
y:
description: "End number (inclusive)"
type: "number"
- title: "Custom Tool 4"
identifier: "EXAMPLE_DATABASE.AGENTS.MULTIPLY_BY_TEN_SP"
name: "multiply_by_ten_sp"
type: "GENERIC"
description: "Multiplied input value by ten and returns the result."
config:
type: "procedure"
warehouse: "COMPUTE_SERVICE_WAREHOUSE"
input_schema:
type: "object"
properties:
x:
description: "A number to be multiplied by ten"
type: "number"
- title: "Custom Tool 5"
identifier: "EXAMPLE_DATABASE.AGENTS.CALCULATE_PRODUCT_AND_SUM_SP"
name: "calculate_product_and_sum_sp"
type: "GENERIC"
description: "Calculates the product and sum of two numbers and returns them in a JSON object."
config:
type: "procedure"
warehouse: "COMPUTE_SERVICE_WAREHOUSE"
input_schema:
type: "object"
properties:
x:
description: "First number"
type: "number"
y:
description: "Second number"
type: "number"
- title: "Custom Tool 6"
identifier: "EXAMPLE_DATABASE.AGENTS.GET_NUMBERS_IN_RANGE_SP"
name: "get_numbers_in_range_sp"
type: "GENERIC"
description: "Returns a list of integers between two numbers."
config:
type: "procedure"
warehouse: "COMPUTE_SERVICE_WAREHOUSE"
input_schema:
type: "object"
properties:
x:
description: "Start number (exclusive)"
type: "number"
y:
description: "End number (inclusive)"
type: "number"
$$;
MCP サーバーを表示するには、次のコマンドを使用します。
SHOW MCP SERVERS IN DATABASE <database_name>; SHOW MCP SERVERS IN SCHEMA <schema_name>; SHOW MCP SERVERS IN ACCOUNT;
The following shows the output of the command:
| created_on | name | database_name | schema_name | owner | comment | ------------------------------------------+-------------------+---------------+-------------+--------------+------------------------------ | Fri, 23 Jun 1967 07:00:00.123000 +0000 | TEST_MCP_SERVER | TEST_DATABASE | TEST_SCHEMA | ACCOUNTADMIN | [NULL] | | Fri, 23 Jun 1967 07:00:00.123000 +0000 | TEST_MCP_SERVER_2 | TEST_DATABASE | TEST_SCHEMA | ACCOUNTADMIN | Test MCP server with comment |
MCP サーバーについて説明するには、次のコマンドを使用します。
DESCRIBE MCP SERVER <server_name>;
The following shows the output of the command:
| name | database_name | schema_name | owner | comment | server_spec | created_on | ------------------------------------------------------------------------------------------------------+------------------------------------- | TEST_MCP_SERVER | TEST_DATABASE | TEST_SCHEMA | ACCOUNTADMIN | [NULL] | {"version":1,"tools":[{"name":"product-search","identifier":"db.schema.search_service","type":"CORTEX_SEARCH_SERVICE_QUERY"}]} | Fri, 23 Jun 1967 07:00:00.123000 +0000 |
MCP サーバーを削除するには、次のコマンドを使用します。
DROP MCP SERVER <server_name>;
アクセス制御¶
You can use the following privileges to manage access to the MCP server and the underlying tools.
Privilege |
Object |
Description |
|---|---|---|
CREATE |
MCP SERVER |
Required to create the MCP server |
OWNERSHIP |
MCP SERVER |
オブジェクト設定の更新に必要です |
MODIFY |
MCP SERVER |
オブジェクト設定の更新、削除、記述、表示、使用( |
USAGE |
MCP SERVER |
MCP サーバーに接続し、ツールを検出するために必要です |
USAGE |
Cortex Search Service |
MCP サーバーでCortex Searchツールを起動するために必要です |
SELECT |
セマンティックビュー |
MCP サーバーでCortex Analystツールを起動するために必要です |
USAGE |
Cortex Agent |
MCP サーバーでCortex Agentをツールとして起動するために必要です |
USAGE |
ユーザー定義関数(UDF)またはストアドプロシージャ |
MCP サーバーで UDF またはストアドプロシージャをツールとして起動するために必要です |
OAuth 認証の設定¶
MCP クライアントの認証を構成します。Snowflakeが管理する MCP サーバーは、 MCP プロトコルの 認証 推奨事項に沿った OAuth 2.0 をサポートします。Snowflakeが管理する MCP サーバーは、動的なクライアント登録をサポートしていません。
まず、セキュリティ統合を作成します。このコマンドについては、 CREATE SECURITY INTEGRATION (Snowflake OAuth) をご参照ください。
CREATE [ OR REPLACE ] SECURITY INTEGRATION [IF NOT EXISTS] <integration_name> TYPE = OAUTH OAUTH_CLIENT = CUSTOM ENABLED = TRUE OAUTH_CLIENT_TYPE = 'CONFIDENTIAL' OAUTH_REDIRECT_URI = '<redirect_URI>'
次に、システム関数を呼び出して、クライアント設定用のクライアントIDとキーを取得します。統合名は大文字と小文字を区別し、大文字である必要があります。
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('<integration_name>');
カスタム MCP クライアントを使用して MCP サーバーと対話する¶
カスタム MCP クライアントを構築している場合、次のセクションではクライアントが対話するSnowflakeエンドポイントを示します。
注釈
Snowflake MCP サーバーは現在、ツール機能のみをサポートしています。
MCP サーバーの初期化¶
認証後、次の API エンドポイントに GET と POST コールを発行してサーバーを初期化します。
POST /api/v2/databases/{database}/schemas/{schema}/mcp-servers/{name}
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": { "protocolVersion": "2025-06-18" }
}
次の例はその応答を示しています。
{
"jsonrpc": "2.0", // passthrough from req
"id": 1, // passthrough from req
"result": {
"proto_version": "2025-06-18",
"capabilities": {
"tools": {
"listChanged": false
}
},
"server_info": {
"name": "<snowflake-mcp-name>",
"title": "Snowflake Server: <snowflake-mcp-name>",
"version": "1.0.0"
}
}
}
ツールを検出して呼び出す¶
MCP クライアントは、 tools/list と tools/call リクエストでツールを検出し、呼び出すことができます。
ツールを検出するには、 ツール/リストリクエスト に示すように、 POST コールを発行します。
POST /api/v2/databases/{database}/schemas/{schema}/mcp-servers/{name}
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
次の例はその応答を示しています。
{
"jsonrpc": "2.0", // passthrough from req
"id": 1, // passthrough from req
"result": {
"tools": [ // search
{
"name":"product-search",
"description":"Test search tool",
"inputSchema": {
"type": "object",
"description": "A search query and additional parameters for search.",
"properties": {
"query": {
"description": "Unstructured text query. Exactly one of 'query' or 'multi_index_query' must be specified.",
"type": "string"
},
"columns": {
"description": "List of columns to return.",
"type": "array",
"items": {
"type": "string"
}
},
"filter": {
"description": "Filter query.",
"type": "object"
},
"limit": {
"description": "Max number of results to return.",
"type": "integer",
"default": 10
}
}
},
"outputSchema": {
"type": "object",
"description": "Search results.",
"properties": {
"results": {
"description": "List of result rows.",
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"description": "Map of column names to values (as bytes)."
}
},
"request_id": {
"description": "ID of the request.",
"type": "string"
}
},
"required": ["results", "request_id"]
}
},
{ // analyst
"name":"revenue-semantic-view",
"description":"Test tool",
"inputSchema": {
"type": "object",
"description": "A message and additional parameters for Cortex Analyst.",
"properties": {
"message": {
"description": "The user’s question.",
"type": "string"
}
}
}
}
]
}
}
ツールを呼び出すには、 ツール/コールリクエスト に示すように、 POST コールを発行します。
For the Analyst tool, your client passes messages in the request. The SQL statement is listed in the output. You must pass the name of the tool that you're invoking in the request in the name parameter.
POST /api/v2/databases/<database>/schemas/<schema>/mcp-servers/<name>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "test-analyst",
"arguments": {
"message": "text"
}
}
}
次の例はその応答を示しています。
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "string"
}
]
}
}
検索ツールのリクエストでは、クライアントはクエリと次のオプション引数を渡すことができます。
列
フィルター
制限
The search results and request ID are returned in the output. You must pass the name of the tool that you're invoking in the request as the name parameter.
POST /api/v2/databases/{database}/schemas/{schema}/mcp-servers/{name}
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "product-search",
"arguments": {
"query": "Hotels in NYC",
"columns": array of strings,
"filter": json,
"limit": int
}
}
}
次の例はその応答を示しています。
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"results": {}
}
}
制限事項¶
Snowflake管理の MCP サーバーは、 MCP プロトコル内のリソース、プロンプト、ルート、通知、バージョンネゴシエーション、ライフサイクルフェーズ、サンプリングといった構成要素をサポートしていません。
非ストリーミング応答のみがサポートされています。