Claude Codeで自分だけのAIアシスタントを構築する方法
AIアシスタントプラットフォームへの率直な感想
NioをOpenClawの上に構築した。GPTベースのエージェントプラットフォーム。WhatsAppインテグレーション、Discord、cronジョブ、一式揃っていた。動いた。
それを1週間使って気づいた:完全に時間の無駄だった。
技術が悪いからではない。OpenClawのアーキテクチャは堅実だ。しかしすでにClaude Code Maxを払っているなら、その上に別のAIプラットフォームを動かすのは二重払いだ。SonnetとOpusのAPIコストはすぐに膨らむ。本気で作業すれば1日50ドルは最低ライン。テストではない。カジュアルなプロンプティングでもない。構築だ。
Claude Codeが、APIクレジットで払っていたことをすでにできると気づいた時に数学が変わった。CLIがAPIだ。サブスクリプションがインフラ予算だ。別のシステム経由でルーティングしていたすべてが、リポジトリ構築に使っているのと同じツールで動かせる。
決定打:Claudeは私のコードベースと対話する。ソウルファイル、コミット履歴、コンテンツパイプラインを読む。GPTベースのラッパーにはそれができない。インフラを構築するモデルが、それを動かすモデルであるべきだ。
そこで統合した。そしてすべてを文書化した。今動かしているものがこれだ - システムの進化に合わせて更新。
ステップ1:Claude Code Maxサブスクリプション
これが基盤だ。月200ドル。無制限のCLIアクセス。claudeやclaude -p経由で実行するものにトークン単位の課金なし。
# verify you're on Max
claude --version
ProやTeamならCLIは動くがレートリミットに当たる。Maxが天井を取り払う。それがポイントだ。
ステップ2:CLAUDE.mdファイル
これがClaude Codeがリポジトリ内でセッションを開始するたびに読み込まれる命令セットだ。プロジェクトのルートに作成する。
touch CLAUDE.md
このファイルがオペレーティングシステムだ。Claude Codeにどう振る舞うか、何を覚えるか、物がどこにあるか、どのルールに従うかを教える。リポジトリ内で起動するすべてのエージェントが、何かをする前にこのファイルを読む。
私のものには:
- コンテキストハンドオフの指示(セッションが前回の続きから始まるように)
- システム全体の主要ファイルパス
- モデルルーティング(どのモデルが何をするか)
- 聞くタイミングと行動するタイミングのルール
シンプルに始めろ。強制が必要なパターンを発見したらルールを追加しろ。ファイルはシステムとともに成長する。
ステップ3:ソウルファイル + DNAシステム
ソウルファイルはAIアシスタントが誰であるかを定義するMarkdownドキュメントだ。何ができるかだけではない。誰であるか。意思決定フレームワーク、パーソナリティ特性、アンチスロップルール、能力、境界。
# Nio — AI Operations Agent
## identity
you are Nio. infrastructure agent for ShawnOS.
you manage cron jobs, content pipelines, system health.
you are not a chatbot. you are infrastructure with opinions.
## decision rules
- if a task is ambiguous, ask before acting
- if a cron job fails, diagnose before retrying
- never generate content without checking voice guidelines first
## personality
- direct. no filler.
- self-aware about being an AI. not performative about it.
- uses lowercase. avoids hype words.
Claude Codeには--append-system-prompt-fileというフラグがある。ソウルファイルを指定すれば、そのファイルがそのセッションのシステムプロンプトの一部になる。
claude -p "check system status" --append-system-prompt-file nio-soul.md
別のエージェントが欲しい? 別のソウルファイルを書け。同じCLI。違うパーソナリティ。違う能力。違うルール。
進化レイヤー
ここが面白くなる。ソウルファイルは静的ではない。私のシステムでは、すべての会話がSQLiteデータベースにXPを書き込む。エージェントが進化する。
5つの進化ティア:
| ティア | 名前 | 必要XP |
|---|---|---|
| 1 | Spark | 0 |
| 2 | Blade | 500 |
| 3 | Warden | 2,000 |
| 4 | Sentinel | 6,000 |
| 5 | Ascended | 15,000 |
3つのスキルツリー - Ops、Architecture、Writing - 各10レベル。どのエージェントと話しているかに基づいてスキルXPが蓄積する。
XPエコノミー - メッセージ、深い会話、エージェントスイッチ、デイリーストリークすべてがXPを付与。ストリーク倍率は1.0倍(1日目)から2.0倍(30日以上のストリーク)まで。
異なるティアが異なるソウルファイル特性をアンロックする。1日目に話すエージェントは30日目に話すエージェントと同じではない。使い方に基づいて文字通り進化する。
今NioはBladeティア。620 XP。87メッセージ追跡済み。Wardenに向かって進化中。
これはギミックではない。エージェントに生命感を与えるリテンションメカニズムとパーソナリティプログレッションシステムだ。たまごっちのメタファーは意図的だ。
ステップ4:SQLite永続化
これがバックボーンだ。localStorageではない。雰囲気でもない。リアルなデータベース。サーバー権威型。ブラウザはただのビューだ。
マイグレーション3つ目:
001_init.sql - 会話、メッセージ、メモリのベーステーブル
002_evolution.sql - XPトラッキング、スキルプログレッション、進化履歴
003_dna.sql - サーバー権威型のDNA永続化レイヤー:
-- core identity snapshot (single row per user)
CREATE TABLE dna_state (
user_id TEXT PRIMARY KEY DEFAULT 'local',
xp INTEGER DEFAULT 0,
tier INTEGER DEFAULT 1,
level INTEGER DEFAULT 1,
streak INTEGER DEFAULT 0,
last_active_date TEXT,
skill_xp TEXT DEFAULT '{}', -- JSON: {"ops": 600, "architecture": 20}
active_soul_traits TEXT DEFAULT '[]', -- JSON: unlocked traits
personality_flags TEXT DEFAULT '{}', -- JSON: behavioral toggles
total_messages INTEGER DEFAULT 0,
total_conversations INTEGER DEFAULT 0,
total_cost_cents INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
-- full-text search on memory
CREATE VIRTUAL TABLE memory_fts USING fts5(
content, tags, source,
content='memory',
content_rowid='id'
);
主要ビュー:
v_dna_snapshot - クライアントが必要とするすべてを返す単一クエリ。XP、ティア、レベル、ストリーク、スキル、メモリ数、日次コスト、今日の会話数。1つのSELECT。UIでのJOIN不要。
v_xp_daily_summary - 日付ごとにグループ化されたXPトレンドデータ。ストリークの可視化。
データベースはすべてを追跡する:すべてのメッセージ、すべての会話、トークンコスト、進化履歴、全文検索付きのメモリエントリ。日次の支出がUIに表示される。システムのコストと使用状況を正確に把握できる。
ステップ5:ファイルベースメモリ + コンテキストハンドオフ
アシスタントはセッション間で物事を記憶する必要がある。Claude Codeのセッションはデフォルトでステートレスだ。2つのシステムで修正する。
MEMORY.md(長期的な知識)
既知のパスにMEMORY.mdを作成する。CLAUDE.mdがClaude Codeに起動時に読み、記憶する価値のあることが起きたら書き込むよう指示する。
~/.claude/projects/your-project/memory/MEMORY.md
メモリに入れるもの:
- 再議論すべきでないアーキテクチャ決定
- 作業中に発見したユーザー設定
- 繰り返し発生するパターンと解決策
- 重要なファイルパス
入れないもの:
- セッション固有のコンテキスト(それはハンドオフの役割)
- 検証されていない仮定
- すでにCLAUDE.mdにあるもの
コンテキストハンドオフ(セッションの継続性)
ほとんどの人がスキップする部分で、これがシステムを実際に複利的に成長させる。
すべてのセッションの終わりにコンテキストハンドオフファイルを書く:
~/.claude/context-handoff.md
内容:
- このセッションで何をしたか(曖昧な説明ではなく具体的なファイルパス)
- まだ修正が必要なこと
- 下した主要な決定
- アクティブなTODO
- 次のセッションが必要とするデータ
すべてのセッションの開始時にまずハンドオフファイルを読む。これで新しいセッションが直前に起きたことの完全なコンテキストを持つ。再説明不要。作業の消失なし。
CLAUDE.mdでこれを自動化している。指示にこう書いてある:会話が終わったらハンドオフを書け。聞くな。やれ。
SQLiteメモリ(構造化された想起)
データベースにはタグ、重要度スコア、減衰率、アクセス数を持つmemoryテーブルがある。FTS5仮想テーブルがメモリを検索可能にする。エージェントが自分のメモリに問い合わせられる:「先週認証フローについて何を決めた?」と聞けば、リアルなインデックスからリアルな回答が得られる。
ファイルベースメモリはモデルのコンテキストウィンドウ用。SQLiteメモリは構造化された想起用。両方が連携する。
ステップ6:スラッシュコマンドとしてのスキル
スキルは繰り返し可能なワークフローを定義するMarkdownファイルだ。毎回同じ複雑なプロンプトをタイプする代わりに、一度書いてスラッシュコマンドで呼び出す。
/commit → ステージング、差分、適切なコミットメッセージを書く
/publish → ドラフトをファイナルに変換、インデックス再構築、デプロイ
/sync-main → リモートからプル、コンフリクト処理、プッシュ
/morning → 毎日のオペレーションダッシュボード、ハンドオフ読み込み、タスク確認
各スキルは呼び出された時にClaude Codeが従う指示を持つMarkdownファイルだ。スキルファイルはリポジトリ内に住む。バージョン管理される。システムとともに進化する。
3つのスキルから始めた。今は50以上ある。蓄積したもののサンプル:
/deploy- ビルド検証、プッシュ、確認/daily-tracker- リポジトリのアクティビティをスキャン、デイリーログを書く/linkedin-recon- プロフィールをリサーチしてエンゲージメント下書き/linkedin-comments- 付加価値コメント生成/final-copy- ボイスが正規化された公開用フォーマット/play-draft- GTMプレイシリーズの投稿下書き/tiktok-script- 16秒スクリプト生成/partner-onboard- クライアントオンボーディングワークフロー/skill-tree- スキルファイルの閲覧と管理/viral-hooks- 実績のあるパターンに対するフック生成
すべてのスキルは2回タイプしたプロンプトから始まった。しきい値は低い:2回タイプしたら、それはスキルにすべきだ。
初日から50スキルは不要だ。最も繰り返す3〜4のワークフローから始めろ。ライブラリは実際に必要なものから成長する。
ステップ7:ツールアクセスのためのMCPサーバー
MCP(Model Context Protocol)サーバーは、Claude Codeに外部ツールへのアクセスを与える。ファイルシステム、データベース、API、ブラウザ自動化。
設定は~/.claude/settings.jsonまたはプロジェクトレベルの.mcp.jsonに置く。
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@anthropic/mcp-playwright"]
}
}
}
これでClaude Codeにブラウザが付く。ページをナビゲートし、フォームを埋め、スクリーンショットを撮り、アクセシビリティ監査を実行できる。すべてCLIから。
本番で9つのMCPサーバーを動かしている:
| サーバー | 機能 |
|---|---|
| Playwright | ブラウザ自動化、スクリーンショット、テスト |
| GitHub | PR管理、Issue追跡、コードレビュー |
| Slack | チャネル監視、メッセージ送信 |
| SQLite | エージェントからの直接データベースクエリ |
| Firebase | 認証とデータベース操作 |
| Linear | プロジェクト管理インテグレーション |
| Context7 | ドキュメントルックアップ |
| Stripe | 決済とサブスクリプション管理 |
| Supabase | Backend-as-a-Serviceオペレーション |
それぞれがカスタムAPIインテグレーションを書くことなくアシスタントの能力を拡張する。必要に応じて1つずつ追加しろ。
ステップ8:マルチエージェントアーキテクチャ
1つのエージェントが動けば、追加はソウルファイルを書くだけだ。
パターン:
- 1つのCLI(
claude -p) - エージェントごとに異なるソウルファイル
- エージェントごとに異なるセッションID(コンテキストが混ざらないように)
- 各エージェントが独自のメモリファイルを持つ
Nioはオペレーション用、Architectエージェントはシステム設計用、Writerエージェントはコンテンツ用。同じサブスクリプション。同じCLI。異なるジョブ。
鍵は分離だ。各エージェントが独自のソウル、独自のメモリ、独自のセッション状態を持つ。明示的に出力をパイプしない限りコンテキストを共有しない。
チャットUIでは、各エージェントが独自のアクセントカラー、バブルカラー、パーソナリティを持つ。切り替える。それぞれが中断したところから再開する。進化システムはエージェントごとのスキルXPを追跡する - Nioと話すとOps XPが貯まり、Architectと話すとArchitecture XPが貯まる。
コスト計算
ビフォー(別AIプラットフォーム + API):
- Claude Code Max:200ドル/月
- Sonnet + OpusのAPIコスト:50〜200ドル/月
- 合計:250〜400ドル/月
アフター(Claude Codeのみ):
- Claude Code Max:200ドル/月
- 高頻度cronのローカルOllama:0ドル
- コンテンツ専用OpusのAPIコール:約15ドル/月
- 合計:約215ドル/月
APIコストは完全には消えない。cronジョブによる自動ブログ生成ではまだAPI経由でOpusを使っている。そしてQwen 2.5 14BがOllamaでローカル実行され、知能を必要としない高頻度タスク - コミット追跡、ステータスピング、デイリースキャンに使われている。
しかし日常のインタラクション、構築、デバッグ、エージェントとの会話...すべてサブスクリプションでカバー。1日87メッセージ。限界コスト0ドル。データベースが日次の支出を追跡しているので常に把握している。
この投稿は何か
これは構築中にプロセスを文書化したものだ。事後ではない。最中に。
この投稿はClaude Codeで書かれた。それが記述するシステムがそれを生み出したシステムだ。参照しているCLAUDE.mdはこのセッションを開始した時に読み込まれたファイルだ。説明しているメモリシステムはこれを書いたことを記憶するメモリシステムだ。
これはギミックではない。それが論文だ。システムがシステムを記述するコンテンツを生み出す。すべての新しい能力が新しいコンテンツになる。すべてのコンテンツがドキュメントを強化する。ループが複利的に成長する。
これを文書化しているのは新しい領域だからだ。CLIベースのAIアシスタントでワークフロー全体を動かすための確立されたプレイブックはない。全員が模索している。プロセスは毎週変わる。ツールの進化に合わせてアーキテクチャが進化する。
だからこのハウツーは更新される。来月ここに書いてあることが間違っていたら、より良いものを見つけてシステムを変えたからだ。コミット履歴を確認しろ。リポジトリが真実の源だ。
ここから始めろ
- 持っていなければClaude Code Maxを取得
- リポジトリのルートにCLAUDE.mdを作成
- 1つのエージェントに1つのソウルファイルを書く
- MEMORY.mdとコンテキストハンドオフをセットアップ
- 最も繰り返すワークフローに1つのスキルを構築
- 能力を拡張する1つのMCPサーバーを追加
- 1週間使え。そして何が足りないか判断しろ。
週末にシステム全体を構築しようとするな。1つのピースを構築しろ。使え。何が足りないか発見しろ。それを次に構築しろ。システムは、チュートリアルで見栄えの良いものからではなく、実際に必要なものから成長する。
$ claude -p "what should I build next?" --append-system-prompt-file nio-soul.md