はじめに
Anthropicが提唱した「Agent Skills」は、AIの民主化をかなり促進しました。
エンジニアでなくても、そんなに難しくない業務フローを自然言語で生成AIに指示して実行させることができるようになりました。
今回、私の日々の定型業務である
「生成AIの最新記事を数件、WEBから収集・要約」
をスキル(Skill)化し、さらにそれを1日1回、定時自動実行するようにしました。
本稿では、その作り方ややり方を記載し、そのまま実行できるようにしています。
想定している読者
- Agent Skillsの概要が既にわかっている人
- Agent Skillsで、とにかく何かを動かしたい人
- でも何でもいいわけじゃなくて、動かして意味があるもの、役に立つものにしたい人
ですので、Agent Skillsそのものについての解説はほとんどありません。
それらを知りたい人は、他の良質な解説記事や公式情報を参照してください。生成AIに質問するのもいいと思います。
実現可能な条件
以下の条件を満たしていないと、本稿にあることは実現できません。
- GitHubアカウントを持っていること
定時自動実行をGitHub Actionsで行うため。 - OpenAIのAPI実行が可能であること
具体的には、OpenAIのAPIキーを持っていて、Credit Balanceが最低数ドル分あること。
Codex CLIを使うため。
Agent Skillsとは?軽く復習
イメージを貼って、軽く復習します。
※詳細かつ正確な情報はここから得てください。
Agent Skillsとは、
特定の仕事のやり方「スキル(Skill)」をAIに指示し、その通りに実行させる仕組み
です。
その「指示」は、SKILL.mdファイルに、主に自然言語で記載します。

特定の仕事のやり方を記したSKILL.mdは、AIに対する「作業指示書」となります。
「定型業務を定時に自動実行」とは
1文で表現すると、
①1日1回定時に、自動で、
②生成AIの最新記事を数件、WEBから収集・要約・整形し、それをSlackに投稿する。
です。
②が定型業務であり、「スキル(Skill)」になります。
②のスキルの実行は、OpenAI Codex CLIが行います。
そのスキルの定時自動実行である①には、GitHub Actionsのworkflowを使います。
特定のスキルを自動実行するので、プロンプトに端を発する「対話」はありません。
従って、「プロンプトと各SKILL.mdのdescriptionを照合し、適切なスキルを選択」というプロセスはありません。
実行時刻が来たら、特定のスキルを即実行、となります。
| 対象 | 内容 | 誰が・どこで |
|---|---|---|
| スキルの内容 (定型業務) |
生成AIの最新記事を数件、WEBから収集・要約・整形し、それをSlackに投稿する。 同じものをファイルにも出力する。 |
OpenAI Codex CLI |
| そのスキルの実行方法 | 定時自動実行。上記スキルを、1日1回、定時に自動実行する。 | GitHub Actionsのworkflow |
作成手順
以下の手順で作成していきます。
| 順番 | 内容 | 場所 |
|---|---|---|
| 1 | (無ければ)投稿先のSlackのワークスペースとチャンネルを作成する | Slack |
| 2 | Slackアプリを作成し、Incoming Webhook URLを得る | Slack |
| 3 | GitHubに専用のリポジトリを作る | GitHubリポジトリ |
| 4 | SKILL.mdを作成する | GitHubリポジトリ |
| 5 | GitHub Actionsの環境変数を設定する | GitHubリポジトリ |
| 6 | GitHub Actionsのworkflowとyamlを作成する | GitHubリポジトリ |
1.(無ければ)投稿先のSlackのワークスペースとチャンネルを作成する
記事を投稿するSlackのワークスペースとチャンネルを作成します。
ここで作成します。
2.Slackアプリを作成し、Incoming Webhook URLを得る
チャンネルへの投稿をSlack側で受け付けるアプリを作成します。
アプリは、ここで作成します。
アプリの名前を「genai_trend_articles」としました。
以降、この名前を使用します。
Slackへの投稿は、Incoming Webhook方式です。
アプリをCreateしたら、設定画面で、Incoming Webhook URLを取得します。

3.GitHubに専用のリポジトリを作る
リポジトリの名前を「genai_trend_skill」としました。
以降、この名前を使用します。
4.SKILL.mdを作成する
GitHubのリポジトリで、スキルを定義するSKILL.mdを作成します。
SKILL.mdの場所
SKILL.mdの場所は、
.agents/skills/genai-trend-skill/SKILL.md
です。
リポジトリのディレクトリ構成
青枠は、記事の内容が書き込まれたファイルとその置き場所です。
実行時に自動作成されます。事前に作成する必要はありません。

SKILL.md(Markdownソース)
フロントマターとして、スキルの名前であるnameと、スキルの説明となるdescriptionが必須です。
---
name: genai-trend-skill
description: |
日本語の生成AI最新記事を収集・選別・要約し、Slackに投稿する。
Collect, curate, and summarize the latest articles on Japanese generative AI, then post them to Slack.
---
# GenAI Trend Reporting
日本語の生成AI最新記事を収集・選別・要約し、Slackに投稿する。その後、その投稿内容をファイルにも出力する。
## 必要な設定
このskillは、実行環境に以下の情報が環境変数として事前設定されている前提で動作する。各環境変数の名前と用途は以下である。
- `SLACK_WEBHOOK_URL`: Slack Incoming Webhook URL。Slackへ記事を送信する処理で必ず使う。Slack送信時は、この環境変数に保存されたURLへ記事を送信する。
- `OPENAI_API_KEY`: OpenAI API key。OpenAI API を使って記事の収集、選別、要約、整形などを行う処理で使う。OpenAI API を呼び出すときは、この環境変数に保存されたAPI keyを参照する。
## 実行手順
以下の順番で実行する。
1. 記事の収集
2. 収集した記事の要約と整形
3. 整形した記事のSlack投稿
4. 整形した記事のファイル出力
個々の処理の詳細は下記の通り。
### 1. 記事の収集
生成AI関連記事を、以下の条件やルールに従って、Webから収集する。
最新情報が必要な業務なので、必ずWebブラウズをする。
#### 収集条件・ルール
- 日本語の記事のみ収集する。
- 収集対象とする分野は以下3つとする。
- 技術的進展
- 生成AIを用いた業務刷新や新規ビジネス
- 生成AI業界の大きな動き
- 実行日から1週間以内に公開された記事のみ収集する。
- 社会的または生成AI業界的なインパクトがある、またはありそうな記事のみ収集する。
- 同一トピックの記事の重複はさせない。
- 3分野のどれかに偏りすぎないように選別する。
- 収集する記事の件数の指示がある場合はその件数、指示がない場合は5件を収集する。
### 2. 収集した記事の要約と整形
収集した記事を、後のSlack投稿のため、要約し、整形する。
#### 整形ルール
各記事を、以下の3行で構成されるブロックにする。
- 記事タイトル
- 日本語で約100字の要約
- 出典URL
`記事タイトル`、`要約`、`出展URL` などの見出し語は無しとする。
記事ブロックと記事ブロックの間には、空行を1行入れる。
### 3. 整形した記事のSlack投稿
整形した記事をSlackに送信し、投稿する。
#### Slack送信ルール
- 送信方式は Incoming Webhook。Slack送信時は `SLACK_WEBHOOK_URL` を参照し、そのURL宛てに整形した記事を送る。
- Block Kit は使わず、プレーンテキストで送る。
- 整形した記事の全部を一括して送信し、1回の投稿とする。記事ごとの送信と投稿ではない。
- 整形した記事をそのままSlackに送信すること。送信時に何らかのファイルを参照してはならない。
- 日本語の文字を文字化けさせないようにすること。整形した記事をバイト列として加工したり、文字化けを招きやすい文字列処理はしないこと。
#### Slack送信失敗時
- Slack送信に失敗してもリトライしない。
- 失敗時は repo 直下の `logs/slack_send_error_latest.log` にログを追記する。
- ログには少なくとも以下を含める。
- 発生日時
- 失敗理由
- `SLACK_WEBHOOK_URL`、`OPENAI_API_KEY`の値はログに書かない。
### 4. 整形した記事のファイル出力
Slack送信の後に、整形した記事を、下記手順に従い、決められたファイルに書き込む。
Slack送信に失敗しても、このファイル出力を行う。
1. 実行時刻のタイムスタンプを `YYYYMMDDHHMMSS` 形式で生成する。
2. 整形した記事を `reports/history/genai_trend_YYYYMMDDHHMMSS.md` に書き込む。`reports/history` が存在しない場合は作成する。
3. 同じ整形した記事を `reports/latest.md` に書き込む。このファイルは毎回洗い替える。
## 全般を通してのルール
- 記事の収集、収集した記事の要約と整形、整形した記事のSlack投稿、整形した記事のファイル出力は、それぞれ、分離した論理ステップとして扱う。
- 定期実行を含む非対話実行で破綻しないよう、手動確認を一切必要としないようにする。
- `SLACK_WEBHOOK_URL` は Slack Incoming Webhook 送信時に使う。
- OpenAI API 呼び出しが必要な際には `OPENAI_API_KEY` を使う。
- `SLACK_WEBHOOK_URL`、`OPENAI_API_KEY`の値そのものはログに書かない。
SKILL.mdの要点
フロントマター
| 要素 | 値 |
|---|---|
| name | genai-trend-skill |
| description | 日本語の生成AI最新記事を収集・選別・要約し、Slackに投稿する。 Collect, curate, and summarize the latest articles on Japanese generative AI, then post them to Slack. |
必要な設定
環境変数SLACK_WEBHOOK_URL:Slack Incoming Webhook 送信時に使うURL
環境変数OPENAI_API_KEY:OpenAI APIキー文字列
処理の順番
- 記事の収集
- 収集した記事の要約と整形
- 整形した記事のSlack投稿
- 整形した記事のファイル出力
1.記事の収集
Webから記事収集をする。
以下がその際の条件やルール。
- 日本語の記事のみ収集する。
- 収集対象とする分野は以下3つとする。
・技術的進展
・生成AIを用いた業務刷新や新規ビジネス
・生成AI業界の大きな動き - 実行日から1週間以内に公開された記事のみ収集する。
- 社会的または生成AI業界的なインパクトがある、またはありそうな記事のみ収集する。
- 同一トピックの記事の重複はさせない。
- 3分野のどれかに偏りすぎないように選別する。
- 収集する記事は5件。
2.収集した記事の要約と整形
収集した記事1件は、以下の3行1ブロックに整形する。
(記事ブロック間には空行を1行設ける。)
- 記事タイトル
- 日本語で約100字の要約
- 出典URL
3.整形した記事のSlack送信
整形した記事をそのままSlackに送信する。
Incoming Webhook方式。環境変数「SLACK_WEBHOOK_URL」の設定値であるURL宛てに送信する。
日本語の文字化けをさせない。
Slack送信失敗時はリトライせず、 repo 直下の logs/slack_send_error_latest.log にログを追記する。
4.整形した記事のファイル出力
整形した記事を、
reports/history/genai_trend_YYYYMMDDHHMMSS.mdを作成して、書き込む。
(YYYYMMDDHHMMSSはタイムスタンプ)
reports/latest.mdにも書き込む。このファイルは、毎回洗い替える。
5.GitHub Actionsの環境変数を設定する
以下の環境変数を設定します。
GitHub Actionsで実行するだけなら、環境変数ではなくsecretsでもいいです。
secretsというものが無い実行環境もあるので、普段、スキルを作る時は、secretsではなく環境変数にするようにしています。
| 環境変数名 | 環境変数値 |
|---|---|
| OPENAI_API_KEY | OpenAI APIキー文字列。 |
| SLACK_WEBHOOK_URL | Slack Incoming Webhook 送信時に使うURL。手順3で取得したもの。 |
6.GitHub Actionsのworkflowとyamlを作成する
GitHub Actionsのworkflowと、それを定義するyamlを作成します。
workflowの作成手順の概要
ワークフローの名前を「GenAI trend auto」にしました。
以降、この名前を使用します。
yamlファイル genai-trend-auto.yml
name: GenAI trend auto
on:
workflow_dispatch:
schedule:
- cron: '0 20 * * *'
jobs:
run-codex:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Run Codex
uses: openai/codex-action@v1
env:
SLACK_WEBHOOK_URL: ${{ vars.SLACK_WEBHOOK_URL }}
with:
openai-api-key: ${{ vars.OPENAI_API_KEY }}
prompt: |
Use the repo-local skill in this repository and run it once.
Follow the skill instructions exactly.
At the end, briefly report:
- whether Slack sending succeeded or failed
- which files were created or updated
sandbox: danger-full-access
safety-strategy: drop-sudo
output-file: codex-output.md
- name: Upload codex output
uses: actions/upload-artifact@v4
with:
name: codex-output
path: codex-output.md
- name: Upload generated reports if present
if: always()
uses: actions/upload-artifact@v4
with:
name: generated-reports
path: reports/
if-no-files-found: ignore
- name: Upload logs if present
if: always()
uses: actions/upload-artifact@v4
with:
name: logs
path: logs/
if-no-files-found: ignore
このyamlは、自動実行も手動実行も、両方行えます。
cron: '0 20 * * *'により、UTCで20:00、日本時間で04:00に、このワークフローが自動実行されます。
ここは、お好みの時刻にしてしてください。UTC=日本時間-9時間です。
※ただし、GitHub Actionsでは、この設定時刻より45分~2時間くらい遅れて自動実行されます。
Codex CLIを事前にインストールする必要はありません(uses: openai/codex-action@v1)。
注!このworkflow1回の実行で、Credit Balanceを0.4~0.7ドル消費します。Credit Balanceに注意してください。
実行結果
成功すると、Slackの当該チャンネルに、
指定した形式
・記事タイトル
・日本語で約100字の要約
・出典URL
で、5件が投稿されます。
私の実行結果の一部を以下に列挙します。




