Snowflake Cortex Agents向けのAgent SkillをGitHubから連携してエージェントから使う

Snowflake Cortex Agents向けのAgent SkillをGitHubから連携してエージェントから使う

SnowflakeのCortex Agentsでスキルを設定する際に、GitHubからスキルをデプロイする2つの方法を試してみました。GitHub Actionsからステージにデプロイする方法と、Snowflake Gitリポジトリを同期して利用する方法をそれぞれ紹介します。
2026.08.28

データ事業本部の鈴木です。

SnowflakeのCortex AgentsはAgent Skillsを設定することが可能です。

https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-skills

SkillsはCoCoで作成したりローカルからアップロードも可能ですが、本番運用を考えた場合には、GitHubなどからデプロイして使えるのが理想的です。

スキルの設定

GitHubからデプロイする場合、以下の2つの選択肢があると思います。

  • GitHub Actionsからステージにデプロイして利用する
  • GitHubのリポジトリを同期したSnowflake GitリポジトリにあるSkillsを利用する

この2通りを試してみたのでご紹介します。

0. 事前準備

i. 検証用のSkillの作成

以下のように検証用のSkillを作成しておきました。今回は検証用なので、エージェント単体で使えるようなものを作りました。

skills
└── exec-brief
    └── SKILL.md

会議などで決まったことを渡すと、報告内容を決まった形式にまとめてくれるというものになります。

これをGitHubリポジトリにアップロードしておきました。

GitHubリポジトリにアップしたSkill定義

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が有効になっています。無効の場合は、有効にすると確認できます。

https://github.blog/changelog/2026-04-23-immutable-subject-claims-for-github-actions-oidc-tokens/

iii. GitHub Actionsからデプロイする

PRを作成して、mainブランチにワークフローとSkillをマージして、GitHub ActionsからSnowflakeのステージに定義をデプロイしました。

アクションの実行

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

Skillのデプロイ

iv. エージェントから動作確認する

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

ステージ上のSkill追加

エージェントに反映されるよう、SaveしてPublishしました。

CoWorkから質問をしてみると、確かにSkillを使って回答してくれました。

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が入っているリポジトリを選択して、コンテンツの読み取りを許可したトークンを作成しました。

Fine-grained tokenの作成

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. |
+------------------------------------------------------------+

今回の操作では以下のようにリポジトリが作成されました。

作成されたSnowflake Gitリポジトリ

iii. エージェントから動作確認する

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

Skill参照の設定

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

Skillの利用確認

最後に

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

https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-skills#limitations

もしSnowflake側でGitリポジトリの参照設定をしたい場合はGit、そうでなければステージと、しっくりくる方を使うとよいと思います。

参考になりましたら幸いです。


Snowflake World Tour Tokyo 2026に参加しませんか?

Snowflakeの国内最大級イベント「Snowflake World Tour Tokyo」が2026年9月10日(木)・11日(金)にグランドプリンスホテル新高輪にて開催されます。
最新のAI・データ活用事例やライブデモを体感できる無料イベントです。

Snowflake World Tour Tokyoイベントに参加する


Snowflake Community Awards ファイナリストに選出されました

DevelopersIO で Snowflake 記事を執筆している かわばた が、Snowflake Community Awards「RISING COMMUNITY LEADER OF THE YEAR」部門・APJ枠のファイナリストに選ばれました。
最終選考の30%はコミュニティ投票です。記事がお役に立っていたようでしたら、9月15日(火)までにぜひ一票お願いします。フォームの「(4 of 6) RISING COMMUNITY LEADER OF THE YEAR」で Tomohiro Kawabata | Classmethod, Japan を選択、2分ほどで完了します。

投票フォームを開く


Snowflakeの導入支援はクラスメソッドに!

クラスメソッドでは Snowflake の導入を支援しております。
製品の詳細や支援の内容についてお気軽にお問い合わせください。

Snowflakeの詳細を見る

この記事をシェアする

関連記事