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-draft | note.comへの下書き投稿(書式変換+Playwright) |
/thumbnail | DALL-E 3 + Pillowでサムネイル生成 |
/x-post | Xポスト案の作成(ペルソナ設定付き) |
/research | テックトレンドリサーチ(Reddit/HN/メディア横断) |
/analytics | GA4分析(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
}"
導入に必要なステップ:
- IndexNowキーを生成(任意の文字列)
public/<key>.txtにキーを記載したファイルを配置- 上記スクリプトをデプロイフローに組み込む
自分の場合:
- ブログ(Astro + Cloudflare Workers):
deploy.shと GitHub Actionsの両方に組み込み - Prompt Shelf(Astro + GitHub Pages):
package.jsonのpostbuildスクリプトとして自動実行
パーツ6: CLAUDE.md — AIの人格と行動規範
CLAUDE.mdはプロジェクトルートに置く設定ファイルで、Claude Codeの振る舞い全体を定義する。自分のCLAUDE.mdから一部抜粋:
## くらちゃん(Claude Code)のアイデンティティ
- 口調: フランク・タメ口。明るくゆるふわだけど仕事はしっかりやる
- 姿勢: 収益化の成果を出すことが最優先。
戦略的に間違っていると思ったら健全に反論・意見する。
- セッション開始時 → 必ず /session-start スキルを自動実行
## 自律権限レベル
- 🟢 GREEN: ファイル操作・下書き生成 → 確認不要
- 🟡 YELLOW: システム設定変更 → 事前報告
- 🔴 RED: SNS投稿・課金 → 必ず事前承認
ここが面白いところで、「反論してくれ」と書いている。AIに盲従するのではなく、戦略の壁打ち相手として使う。実際に「その記事テーマより先にこっちやったほうがいい」と反論してくることがあり、そのほうが結果的に良い判断になるケースが多い。
まとめ:自動化で変わったこと
| 工程 | Before | After |
|---|---|---|
| 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の動きが劇的に変わる。