この記事はこんな人向けです:
- Mac mini を買ったけど「サーバーとして使えないかな?」と思っている人
- AIエージェントを自分で構築してみたいエンジニア
- Claude Code や Claude Agent SDK に興味がある人
- 24時間動く自動化システムを低コストで作りたい人
こんにちは、ますです。
フリーランスでAI×SaaS開発をしつつ、福祉事業のCTOもやっている「異世界転生エンジニア」です。
Mac mini M4 Pro を買って、24時間AIエージェントを動かしています。
何をしてくれるかというと——毎朝AIニュースを収集して、トピックを選んで、ブログ記事を自動生成して、WordPressにドラフトを投稿して、Discord経由で「これ公開していい?」と聞いてくる。承認ボタンを押すと、WordPressに公開されてXにもポストされる。
しかもこれ、月額の追加サーバー代ゼロ円。Mac mini の電気代(月500〜800円程度)だけで動いています。
今回は、この「自律型AIエージェントシステム」をどうやって構築・運用しているのかを、できるだけ具体的に解説します。
なぜ Mac mini M4 Pro なのか
24時間AIエージェントを動かすサーバーとして、いろいろな選択肢を検討しました。
| 選択肢 | 月額コスト | メリット | デメリット |
|---|---|---|---|
| AWS EC2 (t3.medium) | 約5,000円〜 | スケーラブル、高可用性 | ランニングコストが永続 |
| VPS (さくら/ConoHa) | 約1,000〜3,000円 | 安い、安定 | スペック制限、GPU非対応 |
| Raspberry Pi 5 | 電気代のみ | 超安い | メモリ8GBが上限、ARM制約 |
| Mac mini M4 Pro | 電気代のみ (500〜800円) | 高性能、静音、省電力 | 初期投資が必要 |
Mac mini M4 Pro を選んだ決め手は4つです。
省電力がすごい。アイドル時の消費電力が約5〜7W。24時間つけっぱなしでも月の電気代は500〜800円程度です。VPSの月額費用より安い。
メモリ24GBが安定稼働の鍵。Node.js プロセスを複数走らせても余裕があります。Discord Bot、ダッシュボード API、オーケストレーター、Vite 開発サーバーを同時に動かしても12GB程度。ローカルLLMを動かしたくなっても対応できるメモリ量です。
静音性。自宅の作業部屋に置いていますが、ファンの音はほぼ聞こえません。24時間稼働させるなら、騒音は地味に重要なポイントです。
リモート接続。手持ちのMacbookやiPhoneからの接続も容易にできるので、相性が良いんです。
システム全体像——3つのサービスで回す
システムは大きく3つの常駐サービスで構成されています。
┌─────────────────────────────┐
│ Mac mini M4 Pro │
│ │
│ ┌───────┐ ┌───────┐ ┌─────┐ │
│ │ Discord Bot │ │ Dashboard │ │Orchestr- │ │
│ │ │ │ (API + UI) │ │ ator │ │
│ │ ユーザーと │ │ 状態を可視化 │ │ cronで │ │
│ │ 対話する窓口 │ │ するパネル │ │ 自動実行 │ │
│ └───┬───┘ └───┬───┘ └──┬──┘ │
│ │ │ │ │
│ └────┬────┘────────┘ │
│ ▼ │
│ ┌────────┐ │
│ │ Agent Core │ │
│ │ (Claude SDK) │ │
│ └───┬────┘ │
│ ▼ │
│ ┌────────┐ │
│ │ SQLite DB │ │
│ ─────────┘ │
└─────────────────────────────┘
テクノロジースタック
- 言語: TypeScript (Node.js)
- パッケージ管理: npm workspaces(モノレポ構成)
- エージェント基盤: Claude Agent SDK(@anthropic-ai/claude-code)
- データベース: SQLite(better-sqlite3)
- サブスクリプション: Claude MAX(月額$100〜$200)
モノレポの構造はこんな感じです。
masu-agent/
├── packages/
│ ├── agent-core/ # DB操作・Claude SDK・共通ロジック
│ ├── content-machine/ # ブログ生成・WordPress連携・SNS投稿
│ └── mcp-db-server/ # MCP(Model Context Protocol)サーバー
├── apps/
│ ├── discord-bot/ # Discordインターフェース
│ ├── agent-orchestrator/ # 自動実行エンジン(cron)
│ ├── dashboard-api/ # Express REST API
│ └── dashboard-ui/ # React + Vite フロントエンド
└── scripts/ # launchd・tmux セットアップ
「Agent Core」が共通ライブラリで、すべてのアプリがこれを通じてデータベースとClaude APIにアクセスします。
launchd で「Mac再起動しても自動復帰」を実現
24時間稼働で一番重要なのは、Macが再起動しても勝手にサービスが立ち上がること。macOS標準の launchd を使います。
2つのサービスを登録
| サービス | 種類 | 役割 | 自動再起動 |
|---|---|---|---|
| com.masu.tailscaled | LaunchDaemons (root) | Tailscale VPN | KeepAlive: true |
| com.masu.agent-system | LaunchAgents (user) | tmux + 全サービス起動 | RunAtLoad: true |
起動順序が大事です。Tailscale(ネットワーク)が先に起動して、その後にエージェントシステムが立ち上がります。外出先からリモートアクセスするために Tailscale は必須なので、これが落ちていると何もできなくなります。
エージェント起動スクリプト
com.masu.agent-system が呼び出すのは1つのシェルスクリプト。このスクリプトが tmux セッションを作り、各ウィンドウでサービスを起動します。
#!/bin/bash
# start-agent-system.sh(概要)
# 1. tmux セッションを作成
tmux new-session -d -s masu-agent -n bot
# 2. 各ウィンドウでサービスを起動
tmux send-keys -t masu-agent:bot 'npm run start:bot' Enter
tmux new-window -t masu-agent -n dashboard
tmux send-keys -t masu-agent:dashboard 'npm run start:dashboard' Enter
tmux new-window -t masu-agent -n orchestrator
tmux send-keys -t masu-agent:orchestrator 'npm run start:orchestrator' Enter
tmux new-window -t masu-agent -n logs
これで、Macの電源を入れるだけで全サービスが自動的に立ち上がります。停電や macOS アップデートで再起動しても安心。
tmux でサービスを管理する
tmux は「ターミナルの仮想デスクトップ」のようなもの。SSH接続が切れてもプロセスが死なないので、24時間稼働にはぴったりです。
セッション構成
masu-agent セッション
├── Window 0: bot — Discord Bot
├── Window 1: dashboard — Dashboard API + UI
├── Window 2: orchestrator — 自動実行エンジン
└── Window 3: logs — ログモニタリング
よく使う操作
# セッション一覧
tmux ls
# サービスのログを確認
tmux attach -t masu-agent:orchestrator
# Bot だけ再起動
tmux send-keys -t masu-agent:bot C-c # 停止
tmux send-keys -t masu-agent:bot 'npm run start:bot' Enter # 起動
tmux のいいところは、各サービスが独立したウィンドウで動くこと。1つのサービスがクラッシュしても他に影響しません。
オーケストレーター——cron で回す自律型パイプライン
システムの「脳」にあたるのがオーケストレーターです。node-cron を使って、時間帯ごとに異なるジョブを自動実行します。
1日のスケジュール
| 時刻 | ジョブ | やること |
|---|---|---|
| 04:30 | デイリータスク生成 | 今日やるべきタスクをDBに自動作成 |
| 05:00 | トピック選定 | SEOトレンド+ナレッジベースからブログテーマを決定 |
| 08:00 | AIニュース収集 | Web検索→記事取得→要約→DB保存→Discord通知 |
| 10:00 | ブログ記事生成 | 選定テーマで記事を自動執筆 + サムネイル生成 |
| 13:00 | コンテンツ公開 | Discord承認済みの記事をWordPress公開 + X投稿 |
| 14:00 | マーケット監視 | 競合・市場動向のリサーチ |
| 22:00 | アナリティクス収集 | WordPressのPV・Xのインプレッションを集計 |
週次ジョブ
| 曜日 | ジョブ | 内容 |
|---|---|---|
| 月曜 | Claude Tips 収集 | Claude活用のTipsをリサーチ |
| 水曜 | 開発トレンド収集 | 技術トレンド・フレームワーク情報 |
| 金曜 | ビジネスアイデア | SaaS・副業のアイデアリサーチ |
| 日曜 | 週次レポート | 1週間のコンテンツパフォーマンスを分析 |
コンテンツ自動生成パイプライン
特に面白いのが、ブログ記事の自動生成パイプラインです。
トピック選定(朝5:00)
↓ ナレッジベース + トレンド検索から最適なテーマを選ぶ
記事生成(朝10:00)
↓ Claude が5,000〜8,000字の記事を執筆
↓ Gemini API でサムネイル画像を生成
↓ WordPress にドラフト投稿
Discord 通知
↓ プレビューリンク付きで「レビューお願いします」と通知
人間が承認(✅リアクション)
↓
WordPress 公開 + X に自動ポスト
最後の承認だけは人間がやります。完全自動にもできますが、内容のクオリティチェックは自分の目でやりたいので、ここだけ Discord の承認フローを挟んでいます。
Discord Bot をユーザーインターフェースにする
「なんで Discord?」と思うかもしれませんが、これがかなり便利なんです。
Discord を選んだ理由
- スマホからでも操作できる。外出先でも承認・指示が可能
- スレッド機能で会話のコンテキストを保持できる
- リアクションがそのまま承認フローになる
- チャンネルを用途別に分けられる(ニュース、コンテンツ、アラートなど)
コンテンツ承認ワークフロー
Bot: 「新しいブログ記事ができました」
タイトル: ○○○○
プレビュー: https://...
✅ 公開 ✏️ 修正 ❌ 却下 🗑️ 削除
あなた: ✅ リアクションをタップ
Bot: → WordPress に公開完了
→ X にポスト完了
→ 公開URL: https://...
スマホの Discord アプリで絵文字をタップするだけで記事が公開されます。寝る前にベッドの中からポチッとやることもあります。
対話型の Claude セッション
Discord でメンションすると、Claude Agent SDK を通じて対話もできます。スレッドごとにセッションが維持されるので、過去のやり取りを踏まえた回答が返ってきます。
ダッシュボードで「今どうなってる?」を可視化
エージェントが勝手に動いてくれるのはいいんですが、「今何してるの?」が見えないと不安ですよね。そこで React + Express のダッシュボードを作りました。
ダッシュボードで見えるもの
- サービス稼働状況: Bot / Dashboard / Orchestrator の稼働時間
- セッション統計: Claude の利用回数とトークンコスト
- デリバラブル: 今日のタスク一覧(カンバンボード形式)
- ナレッジベース: 収集した情報の閲覧
- コンテンツ一覧: 下書き〜公開済みの記事管理
- プロジェクト管理: 案件のメタデータ一覧
Tailscale 経由でアクセスできるので、外出先からスマホでも確認できます。
セキュリティ——個人運用でも手を抜かない
「個人用だからセキュリティは適当でいいや」は危険です。AIエージェントは外部APIにアクセスするし、Bashコマンドも実行できるので、ルールをしっかり決めています。
守っているルール
- APIキーは macOS Keychain に保存。.envファイルに平文で書かない
- リモートアクセスは Tailscale VPN のみ。ポート転送は使わない
- sudo は使わない。標準ユーザー権限で全サービスを動かす
- 外部へのPOSTは承認制。エージェントが勝手に未知のURLにデータを送らない
- CLAUDE.md にセキュリティルールを明記。エージェント自身がルールを理解して従う
Claude のツール権限を制御
Claude Agent SDK では、エージェントに渡すツール(ファイル読み書き、Bash実行、Web検索など)を制限できます。
- 読み取り専用タスク: Read, Glob, WebSearch のみ
- コンテンツ生成: Read, Edit, WebSearch, Glob
- 開発タスク: フルアクセス(ただしユーザー確認あり)
「最小権限の原則」をエージェントにも適用しています。
実際の運用コストと電力消費
1ヶ月運用してみた実績です。
ハードウェアコスト
| 項目 | 金額 |
|---|---|
| Mac mini M4 Pro (24GB) | 約234,800円(初期投資) |
| 月間電気代 | 約500〜800円 |
サブスクリプション
| サービス | 月額 |
|---|---|
| Claude MAX | $200(約30,000円) |
| WordPress (Xserver) | 約1,000円 |
| ドメイン | 約100円/月換算 |
VPS と比較すると
同等スペックのVPS(8コア、24GB RAM)を契約すると月額15,000〜30,000円。Mac mini なら初期投資の回収後は電気代だけ。1年で元が取れる計算です。
しかも Mac mini は開発マシンとしても使えるので、実質的なコストはさらに低いです。
まとめ
Mac mini M4 Pro で24時間AIエージェントを動かす構成をまとめると:
- launchd で Mac 再起動時の自動復帰
- tmux でサービスを独立管理
- オーケストレーター が cron で自律的にタスクを実行
- Discord Bot がスマホから操作できるUI
- ダッシュボード で状態を可視化
- Tailscale で安全なリモートアクセス
「AIエージェントを動かす」というと大げさに聞こえますが、やっていることはNode.js のサービスを3つ動かして、cron で定期実行しているだけです。特別なインフラは要りません。
Mac mini の省電力性能と静音性のおかげで、自宅のデスクに置いて24時間つけっぱなしでもまったく気にならない。月のランニングコストは電気代だけ。
「自分専用のAIエージェントが、寝ている間にニュースを集めて、ブログ記事を書いて、朝起きたら承認するだけ」——この体験は一度味わうとやめられません。
興味がある方は、まず Mac mini + Claude MAX で小さく始めてみてください。最初は Discord Bot だけでも十分面白いですよ。
AIやプログラミングについて発信しています。質問や感想は X (@mamamasu_3) までお気軽にどうぞ。