
Snowflake Cortex Agents向けのAgent SkillをGitHubから連携してエージェントから使う
データ事業本部の鈴木です。
SnowflakeのCortex AgentsはAgent Skillsを設定することが可能です。
SkillsはCoCoで作成したりローカルからアップロードも可能ですが、本番運用を考えた場合には、GitHubなどからデプロイして使えるのが理想的です。

GitHubからデプロイする場合、以下の2つの選択肢があると思います。
- GitHub Actionsからステージにデプロイして利用する
- GitHubのリポジトリを同期したSnowflake GitリポジトリにあるSkillsを利用する
この2通りを試してみたのでご紹介します。
0. 事前準備
i. 検証用のSkillの作成
以下のように検証用のSkillを作成しておきました。今回は検証用なので、エージェント単体で使えるようなものを作りました。
skills
└── exec-brief
└── SKILL.md
会議などで決まったことを渡すと、報告内容を決まった形式にまとめてくれるというものになります。
これをGitHubリポジトリにアップロードしておきました。

ii. Snowflake向けのリソースの作成
特に「ステージにデプロイして利用する例」ではスキル定義を配置するステージも必要ですので、データベース・スキーマ・ステージ(Server-side encryption)を作成しておきました。
「GitHubのリポジトリを同期したSnowflake GitリポジトリにあるSkillを利用する」場合でもエージェントやGitリポジトリを作成するためデータベース・スキーマは必要になります。
1. ステージにデプロイして利用する例
まずはステージにデプロイして利用する例を試してみました。これはGitHub ActionsからSnowflakeにアップロードするのが一番オーソドックスで早いかと思います。
i. ワークフローを定義するYAMLファイルを作成する
以下のように.github/workflows/snowflake-deploy.ymlを作成しました。
name: Deploy Cortex Agent skills
on:
push:
branches:
- main
paths:
- "skills/**"
- ".github/workflows/snowflake-deploy.yml"
permissions:
contents: read
id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
environment: dev
env:
SNOWFLAKE_ACCOUNT: 'デプロイ先のアカウント識別子'
SNOWFLAKE_DATABASE: ステージのあるデータベース名
SNOWFLAKE_SCHEMA: ステージのあるスキーマ名
SNOWFLAKE_STAGE: Skillsを配置するステージ名
steps:
- uses: actions/checkout@v4
- uses: snowflakedb/snowflake-actions@v3
with:
use-oidc: true
- name: Upload skills to stage
shell: bash
run: |
set -euo pipefail
stage="${SNOWFLAKE_DATABASE}.${SNOWFLAKE_SCHEMA}.${SNOWFLAKE_STAGE}"
uploaded=0
for dir in skills/*; do
[ -d "$dir" ] || continue
skill_name="$(basename "$dir")"
skill_file="$dir/SKILL.md"
[[ "$skill_name" =~ ^[A-Za-z0-9][A-Za-z0-9_-]*$ ]] || {
echo "Invalid skill folder name: $skill_name"
exit 1
}
[ -f "$skill_file" ] || {
echo "Missing SKILL.md: $skill_file"
exit 1
}
echo "Uploading: $skill_name"
snow stage copy \
"$skill_file" \
"@${stage}/skills/${skill_name}/" \
--overwrite \
--no-auto-compress \
--refresh \
-x
uploaded=$((uploaded + 1))
done
if [ "$uploaded" -eq 0 ]; then
echo "No skills found under skills/"
exit 1
fi
listed="$(
snow sql \
-q "LS @${stage}/skills/ PATTERN = '.*SKILL\\\\.md';" \
--format json \
--silent \
-x
)"
listed_count="$(
printf '%s\n' "$listed" |
jq 'if type == "array" then length else 0 end'
)"
echo "Uploaded ${uploaded} skill(s); stage lists ${listed_count} SKILL.md file(s)"
printf '%s\n' "$listed"
if [ "$listed_count" -lt "$uploaded" ]; then
echo "Stage listing is missing uploaded SKILL.md files"
exit 1
fi
ii. デプロイ向けのユーザー・ロールを作成する
Snowflakeアカウントで、以下のようにデプロイ向けのユーザー・ロールを作成しました。
-- デプロイ向けのロール作成
CREATE ROLE IF NOT EXISTS github_actions_skills_deploy_role;
-- ロールへの権限付与
GRANT USAGE ON DATABASE データベース名 TO ROLE github_actions_skills_deploy_role;
GRANT USAGE ON SCHEMA データベース名.スキーマ名 TO ROLE github_actions_skills_deploy_role;
GRANT USAGE ON WAREHOUSE COMPUTE_WH TO ROLE github_actions_skills_deploy_role;
GRANT READ
ON STAGE データベース名.スキーマ名.SKILL_STAGE
TO ROLE github_actions_skills_deploy_role;
GRANT WRITE
ON STAGE データベース名.スキーマ名.SKILL_STAGE
TO ROLE github_actions_skills_deploy_role;
CREATE USER github_actions_skills_deployer
TYPE = SERVICE
DEFAULT_ROLE = github_actions_skills_deploy_role
DEFAULT_NAMESPACE = データベース名.スキーマ名
DEFAULT_WAREHOUSE = COMPUTE_WH
WORKLOAD_IDENTITY = (
TYPE = OIDC
ISSUER = 'https://token.actions.githubusercontent.com'
SUBJECT = '`Default subject claim prefix値`:environment:dev'
);
-- デプロイ向けユーザーへのロールの付与
GRANT ROLE github_actions_skills_deploy_role TO USER github_actions_skills_deployer;
Default subject claim prefix値はGitHubリポジトリのSettings > Actions > OIDCから確認しました。今回は新規で作成したリポジトリのため、Use immutable subject claimが有効になっています。無効の場合は、有効にすると確認できます。
iii. GitHub Actionsからデプロイする
PRを作成して、mainブランチにワークフローとSkillをマージして、GitHub ActionsからSnowflakeのステージに定義をデプロイしました。

以下のようにデプロイできました。

iv. エージェントから動作確認する
Cortex AgentsのSkillを追加したいエージェントを開き、Configuration > SkillsからデプロイしたSkillを選択して保存しました。

エージェントに反映されるよう、SaveしてPublishしました。
CoWorkから質問をしてみると、確かにSkillを使って回答してくれました。

2. 同期したSnowflake GitリポジトリにあるSkillを利用する例
続いて、同期したSnowflake GitリポジトリにあるSkillを利用する場合も確認します。
i. Fine-grained tokenの作成
Snowflake Gitリポジトリにプライベートリポジトリを同期するため、Fine-grained tokenを作成しました。
Settings > Developer settings > Personal access tokensからFine-grained tokenを開き、今回Skillが入っているリポジトリを選択して、コンテンツの読み取りを許可したトークンを作成しました。

ii. Snowflake Gitリポジトリの作成
続いて、ローカル環境からSnowflake CLIでSnowflake Gitリポジトリを作成しました。
snow git setup リポジトリ名
を実行すると、対話形式でリポジトリ作成が行えました。
Origin url: Origin url: GitリポジトリのHTTPSリモートURL
Use secret for authentication? [y/N]: y
Secret identifier (will be created if not exists) [SUZUKI_SKILL_REPO_secret]: シークレット名
Secret 'シークレット名' will be created
username: GitHubユーザー名
password/token:
API integration identifier (will be created if not exists) [SKILL_REPO_api_integration]: SKILL_REPO_api_integration
Secret 'シークレット名' successfully created.
API integration 'SKILL_REPO_api_integration' successfully created.
+------------------------------------------------------------+
| status |
|------------------------------------------------------------|
| Git Repository リポジトリ名 was successfully created. |
+------------------------------------------------------------+
今回の操作では以下のようにリポジトリが作成されました。

iii. エージェントから動作確認する
ステージの場合と同様に、Cortex AgentsのSkillを追加したいエージェントを開き、Configuration > SkillsからデプロイしたSkillを選択して保存しました。
今回はブランチを参照するようにしましたが、タグなどでも設定可能でした。

Save & Publishして、CoWorkからSkillが利用できることを確認しました。

最後に
GitHubにあるSkillをSnowflake上のCortex Agentsから使う方法を2つ紹介しました。
Snowflake Gitの場合、現状は以下のガイドに記載のように、リポジトリの同期はフェッチの実行が必要なため、ステージにアップする場合と比べてそこまで違いはないかなと思いました。
もしSnowflake側でGitリポジトリの参照設定をしたい場合はGit、そうでなければステージと、しっくりくる方を使うとよいと思います。
参考になりましたら幸いです。







