---
title: "Claude CodeでInstagram投稿を完全自動化する方法【Pencil MCP × Meta Graph API】"
description: "Claude CodeとPencil MCP、Meta Graph APIを組み合わせて、Instagramカルーセル投稿の企画からデザイン・投稿までをエージェントに任せる自動化フローを、実装コード付きで解説します。"
url: "https://shiftb.dev/articles/instagram-automation-claude-code"
publishedAt: "2026-04-23"
updatedAt: "2026-04-23"
author: "立川修平（ぶべ）"
category: "ai-development"
tags: ["Claude Code", "Instagram", "Pencil MCP", "自動化", "AI駆動開発"]
---

# Claude CodeでInstagram投稿を完全自動化する方法【Pencil MCP × Meta Graph API】

「そのInstagramのカルーセル投稿、どうやって作ってるんですか？」—— ShiftBの受講生や、SNSで発信している個人開発者から、最近これを聞かれる頻度が一気に増えました。**Canvaで1枚ずつ作って、スマホに画像を送って、手動で投稿する**——この反復作業に消耗している人はかなり多いはずです。

僕自身、以前は1本のカルーセル投稿に**平均1〜2時間**かけていました。企画→台本→デザイン→書き出し→スマホに転送→手動投稿。毎回同じ流れなのに、毎回地味に時間を食われる。「どう考えてもこれは自動化すべき作業」と思いながらも、各ステップのツールが分断されていて手を付けられずにいました。

その状態を変えたのが、**Claude Code × Pencil MCP × Meta Graph API**の組み合わせです。Claude Codeをエージェントとして中心に置き、デザインをPencil MCPで生成し、Instagramへの投稿はMeta Graph APIで直接叩く。各ステップをClaude Codeのスキルとして定義しておくことで、**「Hooks設定テンプレについてインスタ投稿作って」の一言から、投稿完了まで一気通貫**で完結するようになりました。

この記事では、そのフロー全体を実装コード付きで公開します。読み終えると以下の3つが手に入ります。

- **4ステップの自動化フロー全体像**：企画→台本→デザイン→投稿の各ステップを、どのツールでどう繋ぐか
- **Pencil MCPでカルーセルを自動生成する実装**：batch_designの操作例、フレーム・カード・コードブロックのデザインルール
- **Meta Graph APIでカルーセル投稿を実装するPythonスクリプト**：3段階のAPI呼び出し、ポーリング処理、トークン取得の手順

「AIに任せる部分」と「人間が決める部分」を分離してスキル化すれば、あなたの発信も“生産ラインに乗る”ようになります。[Pencil × Claude Code連携の基本](https://shiftb.dev/articles/pencil-mcp-claude-code)や[Claude Codeのカスタムコマンド活用](https://shiftb.dev/articles/claude-code-custom-commands)を押さえておくと、この記事の内容がより理解しやすくなります。

## なぜInstagram投稿を自動化するのか

### 手動運用で消耗する6つのポイント

Instagramのカルーセル投稿は、1本あたりの情報量が多く、フォロワー獲得効率が高い反面、**制作工数が他のSNSより圧倒的に重い**のが現実です。僕が手動運用していた頃の内訳を正直に書くと、以下のようになっていました。

| 作業 | 使うツール | 僕の平均所要時間 |
| --- | --- | --- |
| ネタ出し・構成検討 | メモアプリ | 10〜20分 |
| 各スライドのテキスト作成 | メモアプリ | 15〜30分 |
| デザイン作成（10枚） | Canva | 40〜60分 |
| 画像の書き出し・整理 | Canva + Finder | 5〜10分 |
| スマホへの転送 | AirDrop | 2〜5分 |
| Instagramアプリで投稿 | iPhone | 5〜10分 |

合計すると、1投稿に**おおよそ1〜2時間**かかります。週2本のペースで投稿すると、月に換算して**10時間前後**はSNS運用で消えていく計算です。個人開発者にとってこれは致命的で、本来プロダクト開発に充てられるはずの時間を、SNSの作業に毎週持っていかれることになります。

### なぜClaude Codeが自動化のハブに向いているのか

SNS自動化というと、まず思い浮かぶのはZapierやMake、あるいはn8nのようなワークフロー自動化ツールかもしれません。ただ、カルーセル投稿のように**「デザイン生成」と「API呼び出し」を両方含むフロー**だと、GUIベースの自動化ツールだと逆に組みにくくなります。デザインの微調整やテキストの差し替えは、結局手作業に戻ってしまうからです。

その点、Claude Codeは「自然言語で指示して、ツールを複数横断しながらファイルを書き換える」ことを得意とするエージェントです。**Pencil MCPが対応しているからデザイン生成ができて、ローカルでPythonスクリプトが動かせるからAPI投稿までできる**。これが、GUIワークフローツールにはない強みです。

さらに、Claude Codeにはスキル・カスタムコマンドの仕組みがあり、「毎回やる一連の流れ」を再利用可能な形で定義できます。詳しくは[Claude Codeのカスタムコマンド活用術](https://shiftb.dev/articles/claude-code-custom-commands)で解説していますが、**「今回のフローをスキルとして保存」しておくだけで、次回以降は1つのコマンドで投稿完了**まで持っていけます。

### この記事で自動化する範囲

前提として、この記事で作る自動化フローは**「1人の発信者が、Instagramビジネスアカウント1つに対して投稿する」**ケースを対象にしています。複数アカウントの一斉配信や、メンバー複数人での投稿承認フローなどは、別の設計が必要です。

また、この記事では**画像のみのカルーセル投稿**を扱います。リール動画やストーリーズ、ショッピングタグなどの拡張機能については、Meta Graph APIの対応範囲は広がっているものの、スコープが膨らみすぎるため本記事では触れません。

## 自動化フローの全体像——4つのステップ

### 4ステップの流れ

自動化フローは、大きく以下の4ステップに分かれます。それぞれのステップを**Claude Codeのスキル / カスタムコマンドとして定義**しておくのがポイントです。

![Instagram投稿自動化の4ステップフロー図](https://shiftb.dev/images/articles/instagram-automation-claude-code-flow.png)

| ステップ | やること | 使うツール |
| --- | --- | --- |
| Step 1 | 投稿計画を作成（テーマ・構成・各スライド内容） | Claude Code（会話） |
| Step 2 | マークダウンで台本を作成 | Claude Code + 通常のエディタ |
| Step 3 | カルーセルデザインを生成 | Pencil MCP（.penファイル） |
| Step 4 | S3アップロード → Instagramに投稿 | Python + Meta Graph API |

1つのClaude Codeセッションの中で、これらを順番に実行していきます。会話の中で「投稿計画を作って→台本→デザイン→投稿」と連続して進めていけるのが、従来のワークフローと大きく違う点です。

### Before / After 比較

自動化フローを整えた前後で、各工程がどう変わったかを表で比較します。

| 作業 | Before（手動運用） | After（自動化フロー） |
| --- | --- | --- |
| デザイン | Canvaで1枚ずつ手作業 | Pencil MCPで台本から一括生成 |
| 画像の書き出し | 1枚ずつ手動ダウンロード | export_nodesで10枚を1コマンド |
| 画像のホスティング | 不要（手動投稿なので） | S3にアップロードしてURL取得 |
| 投稿 | スマホから手動で10枚並べる | Meta Graph APIで自動投稿 |
| キャプション | 毎回自分で考える | Claude Codeが画像内容から生成 |
| ハッシュタグ | メモからコピペ | Claude Codeがテーマに合わせて選定 |

### 前提となる環境

このフローを動かすには、以下の環境が必要です。

- **Claude Code**：ターミナルから使う前提。公式のMCP設定でPencil MCPを有効化しておく（[Claude Codeの使い方](https://shiftb.dev/articles/how-to-use-claude-code)参照）
- **Pencil**：MCPサーバーが組み込まれているデザインエディタ。.penファイルで作業する（[Pencil.devの使い方](https://shiftb.dev/articles/pencil-dev-guide)参照）
- **Instagramビジネス or クリエイターアカウント**：通常の個人アカウントではAPIから投稿できない
- **Meta for Developersのアプリ**：Instagram Graph API利用のための登録が必要
- **AWS S3（または同等の画像ホスティング）**：Instagram APIは公開URLから画像を読み込むため、どこかにアップロード先が必要
- **Python 3.x**：投稿スクリプトを動かす。外部ライブラリ不要（標準ライブラリのみ）

## Step 1: 投稿計画とマークダウン台本の作成

### 投稿計画はClaude Codeとの会話で決める

最初のステップは投稿計画です。ここは、いきなりツールを叩くのではなく、**Claude Codeとの会話ベースで構成を固めていく**のがコツです。

たとえば僕の場合、プロンプトはこんな感じで始めます。

```
「Claude CodeのHooks設定テンプレについて、Instagramカルーセル投稿を作りたい。
ターゲットは個人開発者で、『知らない人が損してる』というトーン。
10枚以内でまとめたい。構成案を出して」
```

すると、Claude Codeが以下のような構成を提案してくれます。

- **カバー**：タイトル + 興味喚起
- **導入**：Hooksとは何か（1スライド）
- **テンプレ①〜④**：具体的な設定例（4スライド）
- **組み合わせ例**：実際の settings.json 全体像
- **まとめ**：要点の再確認
- **CTA**：フォロー誘導

Instagramのカルーセルは**最大10枚**なので、この10スライド以内に収める構成を組みます。10枚を使い切る必要はなく、**7〜8枚で完結したほうがエンゲージメント率が高くなる傾向**は僕の体感としてあります（最後まで見てもらいやすい）。

### マークダウン台本のフォーマット

構成が固まったら、各スライドのテキストをマークダウンでまとめます。このマークダウンが、後のPencil MCPでのデザイン生成の「原稿」になります。フォーマットはシンプルで構いません。

````
## スライド1（カバー）
知ってる人だけ得してる
Hooks設定テンプレ4選

## スライド2（導入）
Hooksとは？
Claude Codeの特定のタイミングで
自動的にコマンドを実行する仕組み。

設定場所:
~/.claude/settings.json

## スライド3（テンプレ①）
① 効果音で通知
Claude Codeの作業完了時に
効果音で知らせてくれる設定。

```json
"Notification": [{
  "command":
    "afplay /System/Library/
     Sounds/Glass.aiff"
}]
```
````

このフォーマットで書くと、Pencilデザイン生成時に「スライド何番に、何を載せればいいか」が一意に決まります。**Claude Codeが迷わず実装に進める構造になっている**ことが重要です。

### 1スライドあたりの文字量の目安

Instagramのカルーセルはフォーマット上、**スマホの画面1枚で完結する情報量**に収めるのが正解です。実際にやってみて、僕は以下のルールに落ち着きました。

| 要素 | 目安の文字量 | 備考 |
| --- | --- | --- |
| カバーのタイトル | 20〜25文字 | 大きい文字でもはみ出さない量 |
| 各スライドのタイトル | 15〜20文字 | ヘッダー部分に1行で収める |
| 各スライドの本文 | 100文字前後 | 30代の目でも読める文字サイズを維持 |
| コードブロック | 6〜8行まで | 横幅ははみ出さない程度に改行 |

### 良い台本と悪い台本の例

Hooksの「効果音で通知」のスライドを例に、良い・悪いを比較します。

**悪い例（詰め込みすぎ）**

```
## スライド3
Hooksの設定で作業完了時に効果音を鳴らすようにしておくと、
長いビルド作業の終わりなどをすぐ察知できるので便利です。
設定方法は以下の通りです。まず~/.claude/settings.jsonを開き、
hooksセクションのNotificationに以下を追加してください。
（以下コード略）
```

**良い例（1点集中）**

````
## スライド3
① 効果音で通知
作業完了時に効果音を鳴らす

```json
"Notification": [{
  "command": "afplay Glass.aiff"
}]
```
````

悪い例は、文章をそのままスライドに落とし込もうとしています。良い例は、**「見出し＋1行説明＋コード」**の三層構造で、指を止めて読むのに必要な情報量だけに絞り込まれています。Instagramは読者がスワイプで流し見する媒体なので、**1スライド＝1メッセージ**に徹するのが結果として情報を伝える近道になります。

## Step 2: Pencil MCPでカルーセルデザインを自動生成

### 使うPencil MCPツール

ここが自動化フローの核心部分です。Pencilは、**MCPサーバーを内蔵したデザインエディタ**で、.penファイルをClaude Codeから直接読み書きできます。基本的な使い方は[Pencil × Claude Code連携ガイド](https://shiftb.dev/articles/pencil-mcp-claude-code)にまとめていますが、カルーセル生成で使うツールは以下の5つに集約されます。

![Pencil MCPで.penファイルにカルーセルデザインを生成する流れ](https://shiftb.dev/images/articles/instagram-automation-claude-code-pencil.png)

| ツール | 用途 | 使うタイミング |
| --- | --- | --- |
| get_editor_state | 現在開いている.penファイルの状態を取得 | セッション開始時 |
| batch_get | ノードIDやパターンで要素を取得 | 既存の要素を参照するとき |
| batch_design | ノードの挿入・更新・コピー・削除 | デザイン生成のメイン |
| get_screenshot | デザインのプレビューを画像で確認 | 生成後のレビュー |
| export_nodes | フレームをJPEG / PNGに書き出し | Instagram投稿用画像の出力 |

### カルーセル生成の手順

Claude Codeは、以下の順序でカルーセルデザインを組み立てていきます。

1. **フレーム作成**：1080×1350pxのフレームを、スライド枚数分だけキャンバス上に並べる
2. **ヘッダー配置**：各スライド上部に、カテゴリやタイトルを入れた帯を置く
3. **カード配置**：白背景＋角丸のカード内にテキストを配置
4. **コードブロック**：コード部分はダーク背景＋モノスペースで視覚的に差別化
5. **装飾要素の配置**：キャラクターやふきだしなど、自分のブランドに合わせたパーツを追加
6. **スクリーンショットで確認**：get_screenshotで見た目を一枚ずつレビュー

### batch_designの具体的な操作例

実際のbatch_design呼び出しは、ちょっとしたスクリプトのように書きます。たとえばテキストの更新は以下の1行です。

```
U("nodeId", { content: "新しいテキスト" })
```

コードブロックの挿入は、フレーム＋テキストの2ステップで書きます。

```
codeBlock = I("parentId", {
  type: "frame",
  fill: "#1e1e2eff",
  cornerRadius: 16,
  padding: 24,
  width: "fill_container"
})
codeText = I(codeBlock, {
  type: "text",
  content: "コードの内容",
  fontFamily: "Roboto Mono",
  fontSize: 34,
  fill: "#e2e8f0ff"
})
```

これを、スライドの枚数分だけClaude Codeが自動で展開してくれる、というイメージです。1つのbatch_design呼び出しには**最大25個程度までの操作**をまとめて渡せるので、10枚のカルーセルでも数回の呼び出しで組み上がります。

### スキルに書いておくデザインルール

Pencilでカルーセルを毎回同じ品質で生成するには、**デザインルールをスキルファイルに書き込んでおく**のが必須です。僕は以下のようなルールを定義しています（実際の`.claude/skills/feed-pencil-design/SKILL.md`の抜粋）。

```
## デザインルール
- フレームサイズ: 1080x1350px
- 背景色: #f3f8fe
- ヘッダー: 黒背景 + 白テキスト (76px, Noto Sans JP, 900)
- 本文: ダークグレー (#333333), 48px
- コードブロック: ダーク背景 (#1e1e2e) + モノスペースフォント (Roboto Mono)
- 角丸: カード16px、ヘッダー24px
- スライド間の横間隔: 80px
```

フォントサイズやカラーコードまで指定しておくと、**Claude Codeが毎回ブレないデザインを生成してくれる**ようになります。ここの解像度が自動化フローの品質を決めるので、最初は手を抜かずに書き出すのがおすすめです。

### 画像の書き出し

デザインが完成したら、export_nodesでJPEGに書き出します。InstagramはJPEG推奨なので、PNGではなくJPEGで出しておきます。

```
export_nodes({
  nodeIds: ["slide1", "slide2", ..., "slide10"],
  format: "jpeg",
  outputDir: "./export"
})
```

書き出し後、**.penファイル上のx座標の昇順でソート**することだけ忘れないでください。Pencilで並べたときの「左→右」の順序が、そのままInstagramでの並び順になります。

## Step 3: Meta Graph APIでInstagramに投稿する仕組み

### なぜAPI経由で投稿するのか

ここまでで画像は完成しているので、あとはInstagramに投稿するだけです。ただ、スマホから手動で投稿してしまうと、せっかくのデザイン自動化が「ラストワンマイル」で切れてしまいます。**Meta Graph APIを使うと、PCから画像とキャプションを指定するだけでInstagramに直接投稿できます**。

InstagramのAPI投稿は、Instagramビジネスアカウントor クリエイターアカウントで、**Facebookページと連携済み**であることが条件です。個人アカウントのままだとAPI経由の投稿はできないので、必要ならプロアカウントに切り替えておいてください。

### カルーセル投稿は3段階のAPI呼び出し

Instagram Graph APIでカルーセル投稿を行うには、**3段階のAPI呼び出し**が必要です。ここはAPIの仕様なので、どんなライブラリを使っても同じ構造になります。

![Meta Graph APIによるカルーセル投稿の3段階フロー](https://shiftb.dev/images/articles/instagram-automation-claude-code-api.png)

```
# ① 各画像のコンテナを作成
POST /{account_id}/media
  image_url: "画像のURL"
  is_carousel_item: true

# ② カルーセルコンテナを作成
POST /{account_id}/media
  media_type: CAROUSEL
  children: [container_id_1, container_id_2, ...]
  caption: "キャプション"

# ③ 公開
POST /{account_id}/media_publish
  creation_id: carousel_container_id
```

ポイントは、**①のコンテナ作成後すぐに②を呼ぶと失敗する**ことです。Instagram側でメディアの処理に時間がかかるため、**ステータスが「FINISHED」になるまでポーリング**する必要があります。

### ステータスのポーリング処理

僕のスクリプトでは、各コンテナの作成後に**最大120秒までステータスをポーリング**しています。GETリクエストで`status_code`フィールドを確認し、`FINISHED`になったら次のステップに進む、という実装です。

| status_codeの値 | 意味 | スクリプトの挙動 |
| --- | --- | --- |
| IN_PROGRESS | メディア処理中 | 数秒待って再問い合わせ |
| FINISHED | 処理完了、公開可能 | 次のAPIを呼び出す |
| ERROR | エラー発生 | エラーメッセージを表示して中断 |
| PUBLISHED | すでに公開済み | 重複投稿を避けて終了 |

ポーリング間隔は2〜3秒程度が目安です。それ以下にすると**1時間あたりのAPI呼び出し上限（アプリ単位200件）**に当たりやすくなるので注意してください。

### Pythonスクリプトの構造

僕のスクリプトは`scripts/instagram_post.py`に置いてあり、外部ライブラリ不要（標準ライブラリのみ）で動きます。HTTPリクエストは`urllib.request`を使い、JSONのパースは`json`モジュールで十分です。

```
python3 scripts/instagram_post.py \
  --images "https://s3.../slide1.jpeg" \
           "https://s3.../slide2.jpeg" \
           ... \
  --caption "キャプションテキスト"
```

スクリプト内部では、①〜③のAPI呼び出しを順番に実行し、各ステップで必要なポーリングを挟みます。requestsなどのサードパーティライブラリを避けているのは、**Claude Codeから呼び出すだけのスクリプトに依存を増やしたくない**ためです。pipインストール不要で、Python 3.xが入っていればどこでも動きます。

### Meta Graph APIのセットアップ手順

Meta Graph APIを使うには、事前に**Meta for Developersでアプリを作成**する必要があります。僕が最初にセットアップしたときのメモから、必要最小限の手順を整理します。

1. **Meta for Developersにアカウント作成**：developers.facebook.comでFacebookアカウントでログインし、「マイアプリ」から新規アプリを作成。アプリタイプは「ビジネス」を選ぶ
2. **Instagram Graph API を追加**：アプリのダッシュボードで「製品を追加」→「Instagram Graph API」を追加する
3. **アクセストークンを発行**：Graph API Explorerで以下の権限を付けて発行する
   - `instagram_basic`
   - `instagram_content_publish`
   - `pages_read_engagement`
4. **短期トークンを長期トークンに変換**：短期トークンの有効期限は1時間、長期トークンは**約60日**。毎回発行し直すのは現実的ではないので、必ず長期トークンに変換しておく
5. **Instagram Business Account IDを取得**：Facebookページに紐づくInstagramアカウントのIDを取得する
6. **.envに設定**：`INSTAGRAM_BUSINESS_ACCOUNT_ID`と`INSTAGRAM_ACCESS_TOKEN`を.envに保存し、Pythonスクリプトから読み込む

長期トークンは約60日で切れるので、**期限が近づいたら再発行する運用を組んでおく**のが安全です。僕はカレンダーに「2ヶ月ごとにトークン再発行」のリマインダーを置いています。ここをサボるとある日突然APIが400エラーを返し始めるので要注意です。

## Step 4: Claude Codeスキルとして一気通貫フローを作る

### なぜスキルとして定義するのか

ここまでの3ステップを毎回手順書を見ながら動かすのは現実的ではありません。そこで、**Claude Codeのスキル / カスタムコマンドとして登録**して、一言で呼び出せるようにします。スキル化すると、以下のメリットが得られます。

| 観点 | 手順書を都度見る場合 | スキル化した場合 |
| --- | --- | --- |
| 呼び出し方 | 手順書をClaude Codeに貼り付け | /instagram-post の1コマンド |
| 手順のブレ | 貼り忘れ・順序ミスが起きる | スキルに定義された手順のみ |
| 品質のブレ | デザインルールを毎回指定 | スキル内のルールで一定に保たれる |
| 改善の反映 | 手順書の管理と更新が面倒 | スキルファイルを編集するだけ |

### スキルファイルの構造

僕の構成では、用途ごとにスキルを分けています。デザイン側と投稿側を別にしておくと、どちらかだけ改修したいときに楽です。

- `.claude/skills/feed-pencil-design/SKILL.md`：Pencilで .penファイルにカルーセルを生成するスキル
- `.claude/commands/instagram-post.md`：書き出し〜S3アップロード〜投稿を担うカスタムコマンド
- `scripts/instagram_post.py`：Meta Graph APIを叩くPythonスクリプト本体

### /instagram-post コマンドの中身

投稿側のカスタムコマンドは、以下のような簡潔な指示書になっています。Claude Codeは、この指示に沿って各ツールを順番に呼び出します。

```
# .claude/commands/instagram-post.md の例

1. ユーザーから対象カルーセルのNode IDを受け取る
2. x座標の昇順でソート（.penファイル上の左→右の並び順）
3. export_nodesでJPEGにエクスポート
4. /s3-upload で各画像をS3にアップロードしてURLを取得
5. 画像内容に基づいてキャプションとハッシュタグを生成
6. 最終キャプションをユーザーにレビュー依頼
7. 承認後、scripts/instagram_post.py を実行して投稿
```

ポイントは**「6. 最終キャプションをユーザーにレビュー依頼」**の部分です。キャプションはLLMに全部任せるとたまに違和感のある表現になるので、**投稿の直前だけ人間が確認する**工程を意図的に残しています。ここを挟むだけで、意図しない投稿事故を防げます。

### 実際の呼び出し例

全部揃った状態でのClaude Codeとのやりとりは、こんな感じになります。

```
User: Claude CodeのHooks設定テンプレについて
      Instagram投稿を作って

Claude: 構成案を作ります。
        [10枚構成の提案]

User: いいね、このまま進めて

Claude: [Pencil MCPを使ってカルーセル生成]
        [get_screenshotで各スライドを確認]

User: 3枚目のコードが少し長いから
      2行詰めて

Claude: [該当箇所を更新]

User: OK、このままインスタに投稿しといて

Claude: [export → S3 → API投稿]
        投稿完了しました。
```

企画から投稿まで、1つのClaude Codeセッションで完結するのがわかるかと思います。手動でやっていた頃の**1〜2時間の作業が、15〜20分程度の会話**に置き換わるイメージです。

## 実運用で使える応用テクニック

### テーマ別にテンプレートを使い分ける

発信を続けていくと、「技術Tips系」「オピニオン系」「事例紹介系」など、いくつかパターンが出てきます。全部を同じデザインテンプレで作ると単調になるので、**テーマ別に軽く背景色や装飾を変えたテンプレ**を2〜3種類用意しておくと運用が長続きします。

たとえば、**技術Tips系は青系×コードブロック**、**オピニオン系は白背景×大きめタイポ**、**事例紹介系はカード＋スクショ中心**、という具合です。Pencilの.penファイル内に3種類のテンプレフレームを置いておき、スキルからどれを使うかを選べるようにしておきます。

### キャプションとハッシュタグの生成戦略

キャプションは、僕のスキル内で以下の構造に固定しています。ここをブレさせないのが、フォロワーにとって「読みやすい投稿主」になる近道だと感じています。

1. **フック（1〜2行）**：タイトルの言い換え。スワイプしたくなる一文
2. **本文要約（3〜5行）**：カルーセルの要点を短く
3. **CTA（1〜2行）**：フォロー誘導、保存誘導、リンク案内
4. **ハッシュタグ（10〜20個）**：テーマ固定のものと、記事内容に応じたものを混ぜる

ハッシュタグの数は、**少なめ（数個）に絞るべきか、多め（10〜20個）に入れるべきか**で運用者の意見が分かれる部分です。僕自身は発見タブからの流入を狙いたいので10〜20個入れる派ですが、ここは自分の運用データを見ながら最適点を探っていくのが現実的です。

### 予約投稿・バッチ投稿への拡張

Meta Graph APIには、厳密な意味での「予約投稿」エンドポイントはありません（一部の承認済みアプリのみ利用可能）。ただ、スクリプト側で工夫することで、同等のことは実現できます。僕がやっているのは以下のやり方です。

- **ローカルcronで時間指定実行**：macのcronまたはlaunchdで、決まった時刻に投稿スクリプトを走らせる
- **週末にまとめてストック作成**：Claude Codeで3〜5本分のカルーセルを連続で作り、画像をまとめてS3に置いておく
- **投稿当日はコマンド1発**：ストックから1本選んで投稿コマンドを叩くだけにする

この運用にすると、**週1の「SNSバッチ作成日」さえ確保すれば、あとは毎日数分でSNS運用が回る**状態になります。個人開発者として、時間の使い方がかなり軽くなる実感があります。

### 投稿後の分析とフィードバックループ

投稿して終わり、ではなく、**インサイトを取得して次の企画に活かすループ**を作ると、自動化の価値が何倍にもなります。Meta Graph APIにはインサイト取得用のエンドポイントがあり、以下のようなメトリクスを取れます。

| メトリクス | 見る観点 | 次の企画への活かし方 |
| --- | --- | --- |
| reach | どれだけの人に届いたか | テーマ自体の需要を判断 |
| saved | 保存数（後で見返したい投稿） | Tips系コンテンツの評価軸 |
| shares | シェア数（他人に伝えたい投稿） | 拡散性のある話題選びの指標 |
| profile_visits | プロフィールへの流入 | フォロー動線の改善に直結 |

Claude Codeのスキルでインサイト取得スクリプトも書いておくと、**「直近5投稿のパフォーマンス比較して」**の一言で分析レポートが出てくる状態が作れます。発信を「感覚」ではなく「データ」で改善できるようになるのが、エンジニア発信者の強みです。

### レート制限と運用上の注意

Meta Graph APIには、**アプリごとに1時間あたり200件のAPI呼び出し**というレート制限があります。1つのカルーセル投稿で**最低でも「コンテナ作成10回＋カルーセル作成1回＋公開1回＋ポーリング数回」**を使うので、1投稿で20回前後のAPI呼び出しが走る計算です。

個人運用であれば1時間200件に当たることはまずありませんが、**ポーリング間隔を無闇に短くしない**ことだけ気をつけてください。2〜3秒間隔でポーリングしていれば、十分安全圏です。また、**ERROR時にリトライループを入れる場合は最大回数を必ず設定**してください。無限リトライはレート制限を一瞬で使い切る一番の原因です。

## よくある質問（FAQ）

### 個人アカウントのままでもAPI投稿できますか？

いいえ、できません。Instagram Graph APIは、**Instagramビジネスアカウントまたはクリエイターアカウント**でFacebookページと連携済みのものだけを対象にしています。個人アカウントから切り替えるのは無料でできますし、プロアカウントにしたからといって表示や機能が制限されることはないので、API運用を始めるなら先に切り替えておきましょう。

### CanvaではなくPencilを選んでいる理由は？

Canvaは非常に優秀なツールですが、**Claude Codeから直接編集する手段が用意されていません**。CanvaのAPIはあるものの、デザインをノード単位で細かく書き換えるような用途には向きません。Pencilは**MCPサーバーが内蔵されており、.penファイルをClaude Codeから直接操作できる**ので、自動化の相性が段違いに良いのが選定理由です。詳しい比較は[Pencil vs Figmaの比較記事](https://shiftb.dev/articles/pencil-vs-figma)でも触れています。

### S3以外でも画像ホスティングはできますか？

はい、できます。Instagram Graph APIの要件は**「パブリックにアクセス可能なHTTPS URL」**であること、画像のMIMEタイプが正しいこと、だけです。Cloudflare R2やSupabase Storage、GCPのCloud Storageなど、一時的にパブリックURLが出せる場所ならどれでも動きます。ただし、**認証付きURL（署名付きURLの有効期限が短すぎるものなど）は投稿失敗の原因**になるので、24時間程度は有効なURLを使うようにしてください。

### 投稿が失敗するケースでよくある原因は？

実装を何度かやって遭遇した失敗パターンは、主に以下の4つです。

1. **トークン期限切れ**：長期トークンでも約60日で切れる。400エラーが出たらまず疑う
2. **画像URLが非公開**：S3のバケットポリシーを閉じたまま投稿しようとすると失敗する
3. **画像サイズ / 比率の問題**：Instagramの仕様を外れる比率（極端な縦長など）は弾かれる
4. **ポーリング前に次のAPIを呼んでしまう**：status_codeがFINISHEDになる前に ②や③を呼ぶと失敗する

### Claude Codeのスキルはどこに置くのが正解？

個人利用であれば、**プロジェクト配下の`.claude/skills/`か、ユーザー全体で使える`~/.claude/skills/`**のどちらかに置けばOKです。SNS運用用のスキルは、基本的にプロジェクトに依存しないので、ユーザー全体側に置いたほうが便利です。[Claude Codeカスタムコマンドの記事](https://shiftb.dev/articles/claude-code-custom-commands)で置き場所の使い分けを詳しく解説しています。

### これから学び始める人はどこから手をつけるべき？

いきなり全工程を作ろうとすると必ず挫折するので、以下の順番で一つずつ動かすのがおすすめです。

1. まず[Claude Code](https://shiftb.dev/articles/how-to-use-claude-code)をインストールして、通常の開発で使い慣れる
2. 次に[Pencil × Claude Code連携](https://shiftb.dev/articles/pencil-mcp-claude-code)で、.penファイルを読み書きできる状態を作る
3. Meta for Developersでアプリを作り、Graph API Explorerから**「画像1枚だけの投稿」を手動で成功させる**
4. 単一画像をPythonスクリプトから投稿できるようにする
5. 最後にカルーセル対応と、スキル化・自動化を乗せていく

いきなり「10枚カルーセル × スキル化」を目指すと、どこで詰まったかがわからなくなるので、**ワンステップずつ動かして、動いた状態でコミットしていく**のが最短ルートです。

## まとめ：反復作業は「生産ライン」に乗せる

Instagram投稿のように、**毎回の構造が決まっている反復作業**は、個人開発者にとって自動化の最優先ターゲットです。この記事で扱ったフローのポイントを最後におさらいします。

- **自動化フローは4ステップに分解**：計画→台本→デザイン→投稿。各ステップをClaude Codeスキルにする
- **Pencil MCPで.penファイルを直接操作**：batch_design／export_nodesでカルーセル生成と書き出しを完結
- **Meta Graph APIは3段階**：コンテナ作成→カルーセル作成→公開。ポーリングを必ず挟む
- **キャプションの最終確認だけ人間が残す**：全自動にしないことで事故を防ぐ
- **インサイトAPIでフィードバックループを作る**：感覚ではなくデータで改善する

ShiftBでは、Claude Codeをはじめとするエージェントツールを活用して、**「発信・集客・開発」を1人で回せる個人開発者**を育てることを目的にしています。この記事のような自動化フローを自分の手で組めるようになると、発信の継続ハードルが一気に下がり、**プロダクト開発に使える時間**が増えていきます。

自分の発信や開発も「生産ラインに乗せていきたい」と感じた方は、ぜひShiftBの[AIシフトコース](https://shiftb.dev/courses/ai_shift)をのぞいてみてください。この記事のような自動化フローを自分の手で組めるようになるまで、現役エンジニアがサポートします。
