# 週次の配信ルーティンを Claude スキルに：月曜に下書き、クライアント承認、金曜にクリックレポート

_2026-10-06 · Shagerでエージェンシーの1週間を回すClaude Codeスキル。計画ファイルから下書き、クライアント承認、承認分だけ予約、金曜のクリックレポート。_

週次の配信ルーティンとは、毎週同じ3つの仕事をこなすスキルです。月曜日には、各クライアントのコンテンツ計画をアカウントごとのキャプション付きの Shager の下書きに変え、承認に回します。週の半ばには、承認されたものを予約します。金曜日には、アカウント別のクリックを取得してレポートを書きます。Claude Code では `/shager-weekly plan` や `/shager-weekly report` で起動でき、スケジューラーから `claude -p` でヘッドレスに実行することもできます。人によるチェックポイントは、下書きと予約の間に置きます。そこが最もコストが低く、最も多くの問題を拾える場所だからです。

この記事は、[Shager の基本スキル](/ja/blog/build-a-claude-skill-for-shager)を土台にしています。ここで焦点を当てるのはルーティンそのもの、つまり入力、モード、安全装置、そしてキーボードの前に誰もいなくても実行する方法です。

## 実際の1週間はどうなるのか

クライアント8社、接続アカウント約150のエージェンシーを例にとります。現実的な1週間は次のとおりです。

| いつ | モード | スキルがすること | 人の役割 |
|---|---|---|---|
| 月曜 09:00 | `plan` | 各クライアントの計画ファイルを読み、メディアをアップロードし、下書きを作り、承認を依頼する | 実行中は何もしない |
| 月曜〜水曜 | | クライアントが承認リンクから承認または修正依頼をする | クライアントのレビュー |
| 水曜 14:00 | `schedule` | 承認された投稿を、すべて計画どおりの時刻に予約する | アカウント担当者がサマリーにざっと目を通す |
| 金曜 15:00 | `report` | アカウント別・投稿別のクリックを取得し、クライアントごとにレポートを書く | アカウント担当者が送付する |

このルーティンが、その週のテーマを勝手に考え出すことはありません。戦略はエージェンシーの仕事なので、人が書いた計画ファイルをもとに動きます。ルーティンがなくしてくれるのは機械的な部分です。40通りのキャプション、計測リンク、形式の選択、フォローアップといった作業です。

## 計画ファイルはどんなものか

クライアントごと、週ごとに Markdown ファイルを1つ作り、スキルが読めるリポジトリに置きます。

```markdown
# Harbor Fitness, week 2026-W43
workspace: Harbor Fitness
timezone: America/New_York

## Post 1
when: 2026-10-20 07:00
target: group "All studios"
format: REEL
media: https://cdn.harborfitness.example/w43/6am-class.mp4 (1080x1920, 28s)
brief: New 6am strength class starts Monday. Free first session.
link: https://harborfitness.example/6am
first comment: Book your free first session

## Post 2
when: 2026-10-23 12:00
target: group "Downtown studios"
format: FEED
media: https://cdn.harborfitness.example/w43/smoothie-bar.jpg
brief: Smoothie bar reopens after renovation. 20% off this week.
link: https://harborfitness.example/smoothie
```

スキルが解析するのはただのテキストで、アカウント担当者なら誰でも、ツールを覚えることなく編集できるファイルです。

## SKILL.md

```markdown
---
name: shager-weekly
description: Run the agency's weekly Shager distribution routine. Use for "/shager-weekly plan", "/shager-weekly schedule" or "/shager-weekly report", or when asked to prepare, schedule or report this week's client posts from the plans folder.
argument-hint: "plan | schedule | report [client]"
disable-model-invocation: true
allowed-tools: Read Glob Write mcp__shager__whoami mcp__shager__list_workspaces mcp__shager__list_channels mcp__shager__list_groups mcp__shager__list_posts mcp__shager__get_post mcp__shager__get_analytics mcp__shager__upload_media_from_url mcp__shager__create_post mcp__shager__request_approval mcp__shager__schedule_post
---

# Shager weekly routine

Plans live in plans/<ISO week>/<client>.md. Reports go to reports/<ISO week>/.
Mode is the first argument. Process every client unless one is named.

## plan
For each post in each plan file:
1. Resolve workspace, group and channels. Skip channels not ACTIVE and list them.
2. upload_media_from_url with width, height and duration_ms from the plan.
3. create_post WITHOUT schedule_at: per_channel captions written from the
   brief (same facts, different wording, local detail from channel name),
   cta_url = link, campaign = "<client-slug>-<iso-week>-<n>",
   first_comment = "<first comment>: <link>", label = "W43 Post 1".
4. request_approval with the client's reviewer from plans/reviewers.md.
Write a summary: client, post label, post id, accounts, approval_url.

## schedule
For each client: list_posts with status APPROVED. For each, find its
planned time in the plan file by label and call schedule_post with
schedule_at in ISO 8601 with the workspace offset. Never schedule a post
that is not APPROVED. Never schedule a time in the past; list it instead.

## report
For each client: get_analytics from last Monday 00:00 to now (with offset).
Write reports/<week>/<client>.md with a table of clicks by account,
highest first, and the top three posts with their labels.
State plainly that these are link clicks, not leads.

## Errors
Stop the current client on 401 or 403 and record the code. On 422, record
the message against the post and continue. On 429, wait 60 seconds.
```

### 各安全装置がある理由

`disable-model-invocation: true` にしておくと、会話で「今週の投稿」が話題に出たからといって、Claude が自分からこのルーティンを始めることはありません。[Claude Code のスキルのドキュメント](https://code.claude.com/docs/en/skills)によると、このフィールドは自動読み込みを防ぐので、ルーティンは人か何かがコマンドを入力したときにしか実行されません。

`allowed-tools` のリストは、この仕事に必要なものがすべて揃っていて、それ以上はありません。`cancel_post` も、`create_connect_link` も、`create_workspace` もありません。ヘッドレスで動くルーティンに、人が想定していないことをさせるべきではないからです。

予約の対象は `APPROVED` 状態の投稿だけで、この状態になるのはクライアントがリンクから承認したときだけです。クライアントが承認しなければ、その投稿は公開されないだけで、水曜のサマリーにその旨が記載されます。承認をちょうどこの位置に置く理由は、[エージェンシーのためのクライアント承認ワークフロー](/ja/blog/client-approval-workflow-for-agencies)で説明しています。

## ルーティンにはどのキーを使うべきか

これは、ルーティンをどこまで信頼するかを決める判断です。

| 構成 | キーのスコープ | 結果 |
|---|---|---|
| 下書きのみ | `read`、`write` | `plan` と `report` は実行される。予約は人が Shager で行う |
| 承認ゲート付き | `read`、`write`、`publish`、かつ全ワークスペースで承認必須 | ルーティンはクライアントが承認したものだけを予約する |
| 完全自動 | `read`、`write`、`publish`、承認なし | どのみちレビューなしで投稿するような、リスクの低い定型コンテンツ専用 |

ほとんどのエージェンシーに私たちがおすすめするのは2行目です。`publish` スコープは、https://app.shager.ai/dashboard/agents でこのルーティン専用に作った1つのキーにだけ付与します。そうすれば、そこにある監査ログには、このルーティンが行った呼び出しだけがすべて表示されます。おかしな点があればそのキーを無効にすればよく、他の連携はすべてそのまま動き続けます。

## ターミナルを開かずに実行するには

Claude Code の非対話モードを使えば、スクリプトからスキルを実行できます。[ヘッドレスのドキュメント](https://code.claude.com/docs/en/headless)によると、ユーザーが呼び出すスキルは、プロンプトに `/skill-name` を含めれば `-p` モードで動作し、`--allowedTools` で権限ルールの構文を使ってツールを事前に許可できます。また `--permission-mode dontAsk` についても説明されています。本来なら確認を求める操作をすべて拒否するモードで、想定外のツール呼び出しは止まったままになるのではなく、失敗として終わります。

```bash
#!/usr/bin/env bash
# run-weekly.sh  (called by cron or your CI scheduler)
set -euo pipefail
cd /srv/agency-content
export SHAGER_API_KEY="$(cat /run/secrets/shager_weekly_key)"

claude -p "/shager-weekly $1" \
  --permission-mode dontAsk \
  --allowedTools "Read,Glob,Write(reports/**),mcp__shager__whoami,mcp__shager__list_workspaces,mcp__shager__list_channels,mcp__shager__list_groups,mcp__shager__list_posts,mcp__shager__get_post,mcp__shager__get_analytics,mcp__shager__upload_media_from_url,mcp__shager__create_post,mcp__shager__request_approval,mcp__shager__schedule_post" \
  --output-format json > "logs/weekly-$1-$(date +%F).json"
```

crontab はサーバーの現地時刻で次のように設定します。

```text
0 9 * * 1   /srv/agency-content/run-weekly.sh plan
0 14 * * 3  /srv/agency-content/run-weekly.sh schedule
0 15 * * 5  /srv/agency-content/run-weekly.sh report
```

これは、[Shager を Claude Code に接続する](/ja/blog/connect-shager-to-claude-code)で紹介しているように、Shager の MCP サーバーがプロジェクトの `.mcp.json` に登録され、キーを `SHAGER_API_KEY` から読み込む構成になっていることが前提です。JSON 出力にはセッション ID と最終的なサマリーが含まれるので、それをチームのチャンネルに転送します。

## 毎週、人が担うべきこと

3つあります。ルーティンは、これらを排除するのではなく、これらを前提に設計されています。

1. 計画ファイルを書くこと。テーマ、オファー、タイミングは戦略です。
2. 水曜のサマリーを読むこと。承認されていないもの、スキップされたチャンネル、422 で拒否されたものが一覧になっています。5分で済みます。
3. 金曜のレポートに背景を添えて送ること。アカウント別のクリックは事実ですが、それがクライアントにとって何を意味するかは対話の中で決まります。リンクのクリックはリードではないことをクライアントに伝え、CRM でその差を埋めたいなら[アカウント単位のリード計測](/ja/blog/utm-per-account-lead-attribution)を紹介しましょう。

## よくある質問

### クライアントの承認が水曜以降になったら？

手動で、あるいは木曜に2本目の cron を設定して、もう一度 `/shager-weekly schedule` を実行します。このモードはまだ予約されていない `APPROVED` の投稿だけを予約し、過去の時刻は受け付けないので、2回実行しても安全です。

### クライアントが店舗を増やしたとき、ルーティンが新しいアカウントを接続できますか？

意図的にできないようにしています。アカウントの接続にはクライアントが関わるので、人が意識して行うべき操作です。そのため `create_connect_link` は許可ツールから外しています。店舗が増えたら、アカウント担当者が接続リンクを送り、新しいチャンネルを適切なグループに追加します。次の実行からは自動的に対象になります。

### Claude Code ではなく Codex や Cursor でも使えますか？

Shager のツールはどの MCP クライアントでも同じなので、計画ファイル、モード、安全装置はそのまま移植できます。`SKILL.md` のフロントマターと `claude -p` による起動は Claude Code 固有です。他のクライアントでは、指示をプロンプトファイルとして残し、そのクライアント独自の自動化機能で動かすことになります。

## 次のステップ

1週間の運用はこのルーティンが担います。その周りの全体の流れは、[エージェントによるコンテンツパイプラインの全工程](/ja/blog/agent-content-pipeline-end-to-end)で紹介しています。クライアントのブリーフから、生成したメディアとキャプション、公開された投稿、計測されたクリックまで、Shager の呼び出しを順番どおりに追っています。

---
Source: https://shager.ai/ja/blog/skill-weekly-distribution-routine
