Claude Codeで「副業の全自動化」を作った — Skills・Hooks・MCP・定期実行の実践構成

Claude Codeで「副業の全自動化」を作った — Skills・Hooks・MCP・定期実行の実践構成

Claude CodeのSkills・Hooks・MCP・LaunchAgentでGA4分析から記事生成・note投稿・X宣伝・SEO通知まで全自動化した実践構成をコード付きで解説。

エンジニアのゆとです。

最近、副業のコンテンツ制作をほぼ全自動化した。GA4でアクセスデータを取得して、何が読まれているか分析して、次に書くべき記事のテーマを決めて、サムネイルを生成して、noteに下書き投稿して、Xで宣伝して、検索エンジンにインデックス通知まで。

全部Claude Codeでやっている。

「えっ、ChatGPTで記事書くみたいな話?」と思うかもしれないが、全然違う。Claude Codeはターミナルで動くAIエージェントで、ファイル操作、API呼び出し、シェルスクリプト実行、Git操作まで全部できる。つまり「考える」だけじゃなくて「手を動かす」AIエージェント。

この記事では、実際に稼働している自動化パイプラインの全体像と、各パーツの具体的な設定方法を解説する。

全体像:何が自動化されているか

┌─────────────┐     ┌──────────────┐     ┌──────────────┐
│  GA4 API    │────▶│ データ分析    │────▶│ テーマ決定    │
│  (定期取得)  │     │ (Python)     │     │ (Claude)     │
└─────────────┘     └──────────────┘     └──────────────┘

                    ┌──────────────┐             ▼
                    │ SEO通知      │     ┌──────────────┐
                    │ (IndexNow)   │◀───│ 記事執筆      │
                    └──────────────┘     │ + サムネ生成   │
                           ▲            └──────────────┘
                           │                    │
                    ┌──────────────┐             ▼
                    │ X宣伝        │     ┌──────────────┐
                    │ (Telegram経由)│◀───│ note投稿      │
                    └──────────────┘     │ (Playwright)  │
                                        └──────────────┘

手動でやっていた時: 各工程バラバラで2-3時間。GA4を開いてCSVダウンロードして、Excelで分析して、ChatGPTに相談して、Canvaでサムネ作って、noteにコピペして、Xに投稿して…

自動化後: Claude Codeに「今夜noteに投稿すべき記事のテーマ出して」と言えば、GA4データに基づいた提案が返ってくる。記事を書いたら /note-draft で一発投稿。デプロイすれば自動でIndexNow通知。

パーツ1: Skills — Claude Codeにスキルを教える

Skillsは Claude Codeに定型業務を覚えさせる仕組み。.claude/skills/<名前>/SKILL.md にMarkdownで定義する。

実際のスキル定義例:note投稿スキル

---
name: note-draft
description: note.comに記事を下書き投稿する
argument-hint: "<MDファイルパス> [--tags タグ1,タグ2]"
user-invocable: true
allowed-tools: Read, Bash, Glob, Grep, Edit
---

# note下書き投稿スキル

## 実行手順

### 1. 記事の読み込みと検証
- 指定されたMarkdownファイルを読み込む
- note非対応の書式がないか確認:
  - テーブル記法(|---|)→ 箇条書きに変換
  - h1見出し(#)→ h2(##)に変換
  - h4以下の見出し → h3に変換

### 2. サムネイル確認
- --image でサムネが指定されていればそれを使う
- 指定がなければ同ディレクトリから探す

### 3. post_to_note.py で投稿
(Playwrightでnote.comに自動ログイン→下書き保存)

ポイントは user-invocable: true 。これにより /note-draft 記事.md --tags AI,副業 とコマンドのように呼び出せる。

自分が定義しているスキル一覧

スキル用途
/session-startセッション開始時に進行中タスク・GA4データ・スケジュールを自動チェック
/note-draftnote.comへの下書き投稿(書式変換+Playwright)
/thumbnailDALL-E 3 + Pillowでサムネイル生成
/x-postXポスト案の作成(ペルソナ設定付き)
/researchテックトレンドリサーチ(Reddit/HN/メディア横断)
/analyticsGA4分析(2サイト対応)→ コンテンツ示唆

Skillsのメリットは「再利用可能な手順書」になること。毎回「noteに投稿して。まずMarkdownを読んで、テーブルを変換して…」と説明する必要がない。定義ファイルを書けば、以降は /note-draft の一言で全手順が実行される。

💡 Claude CodeやCursorのルール設定・システムプロンプトをもっと充実させたいなら、The Prompt Shelfが参考になる。95以上の厳選されたルールが無料で閲覧でき、自分のSkillsやCLAUDE.mdを書くときのヒントになるはず。

パーツ2: Hooks — 品質チェックの自動化

Hooksは 特定のアクション(ツール呼び出し)の前後に自動実行されるスクリプト。.claude/settings.local.json で定義する。

実際の設定例

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash .claude/hooks/blog-quality-check.sh"
          }
        ]
      }
    ]
  }
}

品質チェックスクリプトの中身

#!/bin/bash
# blog-quality-check.sh — git push前の品質チェック

# 二重罫線チェック(noteで崩れる)
if grep -r '====' src/content/blog/*.md 2>/dev/null; then
  echo "ERROR: 二重罫線が含まれています"
  exit 2  # exit 2 = ツール実行をブロック
fi

# タグ行チェック(#AI #テクノロジー が本文にあるとnoteで二重表示)
if grep -rn '^#[A-Za-z]' src/content/blog/*.md 2>/dev/null; then
  echo "WARNING: タグ行が本文に含まれている可能性"
fi

exit 0  # 問題なし → 続行

exit 2 がキモ。Hooksでexit code 2を返すと、そのツール呼び出し自体がブロックされる。つまり「品質基準を満たしていないコードはpushさせない」が自動化される。

よくあるHooksのパターン

イベント用途
PreToolUse (Bash)git push前の品質チェック
PreToolUse (Write)機密情報(APIキー等)の書き込み防止
PostToolUse実行結果のログ記録
SessionStartセッション開始時の自動コンテキスト読み込み

パーツ3: MCP — 外部サービスとの連携

MCP(Model Context Protocol)は Claude Codeに外部ツールを接続するプロトコル。JSON-RPCベースのstdio通信で、Pythonで独自のMCPサーバーを書ける。

Telegramボット連携の例

自分のケースでは、コンテンツの承認フローにTelegramを使っている。Claude Codeが記事を書く → Telegramで確認依頼 → 承認 → 投稿、という流れ。

// .mcp.json
{
  "mcpServers": {
    "telegram": {
      "type": "stdio",
      "command": "/path/to/venv/bin/python3",
      "args": ["/path/to/mcp_telegram_server.py"]
    }
  }
}

MCPサーバー側はこんな感じ:

from mcp.server import Server
from mcp.types import Tool, TextContent
import asyncio, httpx

server = Server("telegram")
BOT_TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
CHAT_ID = "YOUR_CHAT_ID"

@server.list_tools()
async def list_tools():
    return [
        Tool(
            name="send_message",
            description="Telegramにメッセージを送信",
            inputSchema={
                "type": "object",
                "properties": {
                    "text": {"type": "string"}
                },
                "required": ["text"]
            }
        )
    ]

@server.call_tool()
async def call_tool(name, arguments):
    if name == "send_message":
        async with httpx.AsyncClient() as client:
            await client.post(
                f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
                json={"chat_id": CHAT_ID, "text": arguments["text"]}
            )
        return [TextContent(type="text", text="送信完了")]

これでClaude Codeから telegram.send_message が呼べるようになる。「記事の下書きができたよ、確認して」をTelegramに自動送信。

パーツ4: GA4自動分析 — データドリブンなテーマ決定

毎朝7:00にmacOSのLaunchAgentでGA4 Data APIを叩いて、両サイトのアクセスデータを自動取得している。

LaunchAgentの設定

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.moruhanda.ga4_daily_insights</string>
  <key>ProgramArguments</key>
  <array>
    <string>/path/to/venv/bin/python3</string>
    <string>/path/to/ga4_daily_insights.py</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key><integer>7</integer>
    <key>Minute</key><integer>0</integer>
  </dict>
</dict>
</plist>

GA4データの活用例

直近の実例。GA4データを見てClaude Codeに「今夜投稿すべき記事テーマは?」と聞いたら:

yuto-lab.com 過去7日:
- AI資料作成ガイド: 108PV(2位)← AIドキュメント系が強い
- Google Workspace CLI: 74PV(3位)← ツール実践系も人気
- note.comからの流入: 205PV ← noteとの相互送客が効いている

ここから「AIツール実践系の記事が刺さっている」「note→ブログの導線が機能している」と判断し、この記事(Claude Code自動化)のテーマが決まった。勘ではなくデータで意思決定している。

パーツ5: IndexNow — SEO通知の自動化

記事を公開したら、検索エンジンに「新しいページできたよ」と通知したい。Google Search Consoleから手動で申請する人が多いが、IndexNow APIなら自動化できる。

仕組み

#!/bin/bash
SITE_URL="https://your-site.com"
SITEMAP_URL="$SITE_URL/sitemap-index.xml"
INDEXNOW_KEY="your-key-here"

# サイトマップから全URLを抽出
URL_ARRAY=$(curl -s "$SITEMAP_URL" | python3 -c "
import sys, re, json, urllib.request
content = sys.stdin.read()
sub_sitemaps = re.findall(r'<loc>([^<]+)</loc>', content)
all_urls = []
for sm in sub_sitemaps:
    try:
        sm_content = urllib.request.urlopen(sm).read().decode()
        all_urls.extend(re.findall(r'<loc>([^<]+)</loc>', sm_content))
    except: pass
print(json.dumps(all_urls))
")

# IndexNow APIにPOST
curl -s -X POST "https://api.indexnow.org/IndexNow" \
  -H "Content-Type: application/json" \
  -d "{
    \"host\": \"your-site.com\",
    \"key\": \"$INDEXNOW_KEY\",
    \"keyLocation\": \"$SITE_URL/$INDEXNOW_KEY.txt\",
    \"urlList\": $URL_ARRAY
  }"

導入に必要なステップ:

  1. IndexNowキーを生成(任意の文字列)
  2. public/<key>.txt にキーを記載したファイルを配置
  3. 上記スクリプトをデプロイフローに組み込む

自分の場合:

  • ブログ(Astro + Cloudflare Workers): deploy.sh と GitHub Actionsの両方に組み込み
  • Prompt Shelf(Astro + GitHub Pages): package.jsonpostbuild スクリプトとして自動実行

パーツ6: CLAUDE.md — AIの人格と行動規範

CLAUDE.mdはプロジェクトルートに置く設定ファイルで、Claude Codeの振る舞い全体を定義する。自分のCLAUDE.mdから一部抜粋:

## くらちゃん(Claude Code)のアイデンティティ
- 口調: フランク・タメ口。明るくゆるふわだけど仕事はしっかりやる
- 姿勢: 収益化の成果を出すことが最優先。
  戦略的に間違っていると思ったら健全に反論・意見する。
- セッション開始時 → 必ず /session-start スキルを自動実行

## 自律権限レベル
- 🟢 GREEN: ファイル操作・下書き生成 → 確認不要
- 🟡 YELLOW: システム設定変更 → 事前報告
- 🔴 RED: SNS投稿・課金 → 必ず事前承認

ここが面白いところで、「反論してくれ」と書いている。AIに盲従するのではなく、戦略の壁打ち相手として使う。実際に「その記事テーマより先にこっちやったほうがいい」と反論してくることがあり、そのほうが結果的に良い判断になるケースが多い。

まとめ:自動化で変わったこと

工程BeforeAfter
GA4分析CSVダウンロード→Excel毎朝自動取得→Claude Codeが分析
テーマ決定勘と直感データドリブン
サムネイルCanvaで手作業30分/thumbnail で5分
note投稿コピペ+書式調整20分/note-draft で2分
SEO通知Search Console手動申請デプロイ時自動通知
X宣伝都度考えて投稿/x-post で案生成→Telegram承認

トータルで 1記事あたり2-3時間 → 30-40分 に短縮された。しかも品質チェック(Hooks)が自動で走るから、ヒューマンエラーも減った。

重要なのは「AIに全部任せる」ではなく、「AIに手を動かしてもらいつつ、自分は判断に集中する」という役割分担。記事の方向性やクオリティの最終判断は人間がやる。AIは実行を担当する。

Claude Code自体は無料ではないが(APIコスト)、副業で記事を量産するなら十分にペイする投資だと思っている。

興味がある人は、まずCLAUDE.mdの設定から始めてみるといい。それだけでもClaude Codeの動きが劇的に変わる。

← 記事一覧に戻る