はじめに 📝
2026年10月8日に Claude 公式ブログで公開された記事 「Building effective agent automations」(著者: Lance Martin、CJ Avilla)の内容を、日本語で要約して紹介します。
Anthropic 社内では「スケジュールで起動 → バックグラウンドで情報収集 → 大事なことだけ報告」というシンプルなエージェント自動化が使われているそうです。記事ではその参考実装として、Claude Managed Agents(ベータ) で作った「デイリーブリーフ」エージェントを題材に、運用で効いてくる設計上のポイントが解説されています。
このエージェントは Slack チャンネルや GitHub リポジトリを読み、前回実行時からの差分を把握して、要点を Slack に投稿します。
イメージを掴むために、デプロイ定義(deployment.md)の一部を載せておきます 👇
---
name: Daily brief
agent: ./agent.md
environment_id: ./environment.yaml
schedule:
type: cron
expression: "32 7 * * 1-5"
timezone: America/New_York
vault_ids: [vlt_...] # Sources の手順で作成する Vault
resources:
- path: ./memory_store_preferences.yaml
access: read_only
instructions: The reader's preferences. Re-read them every run. Never write here.
- path: ./memory_store_state.yaml
access: read_write
instructions: Your state. Bookmarks, ledger, notes, proposals, and run records.
---
Write today's brief.
The reader's time zone is America/New_York. Work out every date in that zone.
Follow your run steps in order. Today's edition is titled "Daily brief, <weekday> <month> <day>".
ant apply deployment.md # デプロイを適用
ant beta:deployments run --deployment-id <id> # 手動でテスト実行
3行まとめ ✨
- 📌 情報源は「直近24時間」のような固定窓ではなく、ソースごとのブックマーク(タイムスタンプ) から読む
- ✅ 投稿前に各項目をライブで再確認し、Slack の成功応答を確認してから状態を更新する
- 🔒 設定(preferences)はエージェントが編集できない場所に置き、読み取り専用権限と予算上限でガードレールを張る
全体構成:6つのコンポーネント 🧩
エージェントは次の6要素で構成されています。
| コンポーネント | 役割 |
|---|---|
| Sources(情報源) | Slack チャンネル、GitHub リポジトリなど |
| Destination(出力先) | Slack の1チャンネル |
| Agent | モデル・ツール・実行手順(agent.md) |
| Schedule | cron、タイムゾーン、Vault、メモリ、予算(deployment.md) |
| Memory |
preferences(読み取り専用)と state(読み書き) |
| Guardrails | 権限・ネットワーク・予算の制限 |
参考実装のリポジトリ構成は以下の通りです。
daily-brief/
├── agent.md モデル、ツール、指示
├── deployment.md スケジュール、タイムゾーン、予算、入力メッセージ
├── environment.yaml ネットワーク許可リスト
├── memory_store_preferences.yaml ユーザーの好み設定
├── memory_store_state.yaml ブックマーク、台帳、メモ、実行記録
├── vault.yaml 認証情報を保持する Vault
├── claude-lock.json ant apply が書き出すリソースID
└── slack/manifest.yaml Bot アプリ1つ
Sources:情報源の読み方 📥
🔑 エージェント専用のスコープ付き認証情報を渡す
シークレットはサンドボックスの外にある Vault に保存します。MCP 呼び出しはプロキシ経由で行われ、シェルからは $SLACK_BOT_TOKEN のようなプレースホルダーしか見えません。
const vaultId = process.env.VAULT_ID!; // claude-lock.json にある Vault の ID
await client.beta.vaults.credentials.create(vaultId, {
display_name: "SLACK_BOT_TOKEN",
auth: {
type: "environment_variable",
secret_name: "SLACK_BOT_TOKEN",
secret_value: process.env.SLACK_BOT_TOKEN!,
networking: { type: "limited", allowed_hosts: ["slack.com"] },
injection_location: { header: true },
},
});
🔖 前回の続きから読む(ブックマーク方式)
「直近24時間」と指定するのではなく、ソースごとのタイムスタンプを bookmarks.json に保存します。これにより、
- 実行が遅れても取りこぼしが出ない
- 実行が早まっても同じ項目を重複して報告しない
"slack": "2026-09-14T13:02:11Z"
⚠️ 読み込み失敗を「静かな日」と取り違えない
あるソースの読み込みに失敗したら、
- そのソースのブックマークは進めない
- 他のソースの内容は通常どおり報告する
- ブリーフの最後に「読めなかったソース」を明記する
「何もなかった」と「読めなかった」は全く違う、という点が強調されています。
Destination:投稿先の扱い 📤
- 日付入りタイトルで、Slack の1チャンネルに投稿する
- 投稿前に当日分が既に投稿済みか確認し、重複を防ぐ
✅ 投稿が届いたことを確認してから記録する
Slack が "ok": true とメッセージの ts を返したときだけ「送信済み」とみなし、その後で台帳(ledger)とブックマークを更新します。結果が不明な場合は「maybe posted」として記録し、それ以外は何も変更しないのがポイントです。
curl -s https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"channel": "C0123456789", "text": "Daily brief, Tue Sep 15 ..."}'
Agent:ブリーフの中身を作る 🧠
agent.md のフロントマターではモデル・MCP サーバー・ツールを定義します(Web 検索・Web 取得は無効化)。
---
name: Daily brief
model: claude-sonnet-5-5
mcp_servers:
- type: url
name: github
url: https://api.githubcopilot.com/mcp/
tools:
- type: agent_toolset_20260401
configs:
- name: web_search
enabled: false
- name: web_fetch
enabled: false
- type: mcp_toolset
mcp_server_name: github
default_config:
permission_policy:
type: always_allow
---
✂️ ブリーフは短く
項目に載せるのは、読み手が今日行動するもの、またはこれから下す判断を変えるものだけ。迷ったら載せない。
- 「レビュー待ち12件」のような件数は項目ではない → ブロックされているものだけリンクする
- 台帳にあってまだ未解決の項目は「still waiting, day 3」のように1行で継続表示
- クローズされた項目は何も言わずに外す
- preferences で「もう不要」とされた話題は復活させない
台帳(ledger.md)はこんな形式です。
2026-09-09 slack:C0123456789 1788963600.000100 refund thread: customer waiting on a decision
2026-09-11 github 481 review blocked, day 2 (still waiting)
2026-09-11 slack:C0234567891 1789117333.000300 enterprise escalation: owner named, in progress
🔁 投稿直前にもう一度確認する
読み込んでから投稿するまでの間にも状況は変わります。報告する項目ごとに、投稿直前にライブのソースを再確認します。
- 解決済みになっていたら → 外す
- 未解決だが変化があったら → 行を修正
- 確認できなかったら → 外して、実行記録の「cuts」に残す
古い「まだあなた待ちです」が1つあるだけで、10件の抜け漏れより信頼を損なう
だからこそ、ステータスは断言するか、外すか。曖昧にぼかさない。また、リンクは手で組み立てず、PR の html_url や Slack の permalink などソース自身のリンクフィールドをコピーします。
Schedule:スケジュール ⏰
デプロイメントが cron スケジュール、タイムゾーン、Vault、メモリストア、予算を保持します。
🌏 日付は読み手のタイムゾーンで計算する
エージェントの日付計算を読み手のタイムゾーンに合わせておかないと、「今日」を「昨日」と呼んでしまう事故が起きます。
Memory:2種類のメモリ 💾
| メモリ | エージェントの権限 | 内容 |
|---|---|---|
preferences |
読み取り専用(書くのは読み手) | 読み手の好み。毎回読み直し、読めなければ停止 |
state |
読み書き | ブックマーク、報告済み項目の台帳、実行記録、設定変更の提案、ソースの挙動メモ |
エージェントが自分の設定を書き換えられないようにしつつ、変更は「提案」として state に残す設計になっています。
Guardrails:ガードレール 🛡️
🚧 できることを制限する
プロンプトインジェクションされた場合の被害を抑えるため、
- GitHub トークンは読み取り専用
- preferences は読み取り専用
- 環境のネットワーク許可リスト
- Bot は必要なチャンネルにだけ招待
💰 予算上限は実測から決める
まずは通常実行コストの 3〜5倍 に上限を設定し、実際の数値を見ながら絞り込みます。
budget:
type: limit
max_list_cost:
amount: "500" # セント単位の文字列: "500" は $5.00
currency: USD
上限に達した実行は budget_reached で一時停止しますが、これが**「静かな日のブリーフ」に見えてしまう**点に注意が必要です。
まとめ 🎯
記事のガイドラインは、最終的に次の6つのルールに集約されています。
- 📖 各ソースは固定の時間窓ではなくブックマークから読む
- ⚠️ 読み込み失敗は「静かな日」ではなく読めなかったと報告する
- 🔁 すべての項目を投稿直前に再確認する
- ✅ Slack が確認を返したときだけ送信済みとし、その後でブックマークと台帳を更新する
- 🔒 preferences はエージェントが編集できないストアから毎回読み直す
- 🛡️ 読むだけの場所は読み取り専用にし、実行ごとの支出に上限を設ける
どれも「エージェントが賢いかどうか」ではなく、定期実行の自動化を毎日信頼して使えるかどうかに効く設計です。Managed Agents を使わない場合でも、cron + LLM で日報やアラート要約を作っている方にはそのまま応用できる内容だと思います。
まずは参考実装をクローンして、自分のチームの Slack チャンネル・リポジトリ向けにデイリーブリーフを動かしてみるのがおすすめです 🚀