[2/5] OpenClaw を卒業した夜 — API 料金が月 100 万円超えてた話と、機密 418 件が出てきた話
Anthropic API 料金が月 100 万円を超えた話と、機密 418 件が `~/.openclaw/` 配下から出てきた話。Part 1 の env 罠から続く OpenClaw 卒業の意思決定と、その後の大掃除の夜の記録。
Anthropic API 料金が月 100 万円を超えた話と、機密 418 件が `~/.openclaw/` 配下から出てきた話。Part 1 の env 罠から続く OpenClaw 卒業の意思決定と、その後の大掃除の夜の記録。
Part 1 の続きです。
env 継承の罠を一通りつぶして、 ふと思ったんですよね。
あれ、 そもそも OpenClaw 自体、もう要らんのちゃう?
これは正直、 もうしばらく前からぼくの頭の片隅にあった疑問でした。 ただ、 移行のコストを考えると後回しにしてただけ。 でもこの夜、 そのスイッチが入りました。
Part 1 で書いた .zshenv への移植 + launchctl setenv の話、 あれだけ言えば「対症療法 OK」やったはずなんやけど、 OpenClaw の gateway(自前で動かしてた常駐デーモン)を起動し直そうとしたら、 また別の罠で動かない。
具体的には、 OpenClaw の gateway は launchd plist 経由で 直接 node を exec する設計でした。 zsh を経由してないから .zshenv も走らない。 これを直そうと plist の ProgramArguments を zsh -c "source ~/.zshenv && exec node ..." 風にしてみたら、 今度は launchd 経由の op CLI セッションが切れててクラッシュ、 再起動ループ。
…と、 1 つの env トラブルがあちこちで派生して、 全部 OpenClaw が起点。
ここで電卓を叩きました。 「OpenClaw を残して env 周りを真面目に直す労力」と、 「OpenClaw を卒業する労力」を秤にかけた感覚です。
env トラブルだけやったら、 多分まだ後回しにしてました。 ぼくが決断したのは、 もう一つの わかりやすい数字があったから。
少し前まで、 OpenClaw は Anthropic のサブスク(Pro / Max 系)経由で動かしてました。 でも OpenClaw みたいな外部統合エージェントからの API 利用は、 サブスクの保護範囲から外される動きがあって、 結局 API 直課金に振り替わったんです。
その月の請求書を見たら、 約 100 万円。
「あれ、 これ年で 1200 万…?」
請求書のスクショ撮って、 二度見しました。 サブエージェント並列で 1 日 20〜30 個立ち上げる運用してたので、 トークン消費量は確かに多かったんですが、 月 100 万円という数字はさすがにぼくの想定の上限を完全に振り切ってる。
これがこの夜のもう 1 つの主役。 ぼくは Anthropic の Max プランをすでに契約してて、 そっちはサブスクの範囲で問題なく動いてました。 で、 ぼくが OpenClaw でやってた作業(サブエージェント並列実行 / メモリ参照 / Slack 経由のあい呼び出しなど)は、 ほぼ全部 Claude Code 単体でもできることに気づき始めてたタイミング。
「メモリ移行できるなら、 Claude(ClaudeApp) でええやん」
これが、 ぼくの中で完全にスイッチが入った瞬間でした。 「いつかやろう」やった卒業が、 「今夜やる」に格上げされた感じです。 100 万円という数字には、 そのくらいの説得力がありました。
OpenClaw の中で、 ぼくが一番大事にしてたのは ~/.openclaw/workspace/memory/ 配下のメモリ群です。 プロジェクト別の .md、 日次ログ、 スキル定義、 全部 Markdown。
これは Claude.app から Read で普通に参照できるんですよ。
実際、 OpenClaw を捨てる前から、 Claude Code 側にも ~/.claude/skills/ 配下に symlink で workspace/skills/* を持ち込んでありました。 つまり、 すでに 半分は Claude.app 側で動かす運用になってた。
残ってる差分は:
3 つ並べてみて、 「失うものより得るものの方が大きい」と即断できる構造になってました。 特に、 自動メモリ昇格は便利機能やけど、 ぼくが自分で「これメモる」って意識的に書き出した方が、 結局精度高くなることも多かった。 自動化と手動の境目を見直す機会、 とも言えました。
判断は固まりました。
卒業を実行する前に、 ぼくは ~/.openclaw/ 配下を全部消すつもりやったんですが、 念のため「消す前に何があるか」を機械的に把握しときたかったんです。 自作の Python スクリプトで、 既知のトークン形式(OpenAI の sk-proj- / Anthropic の sk-ant- / Slack の xoxb- xapp- / Notion の ntn_ / Supabase の sbp_ など)を全 file 走査。
結果、 出てきた件数を見て、 ぼくは固まりました。
69 ファイル、 計 418 件
内訳:
~/.openclaw/.env — OpenAI Project API Key~/.openclaw/openclaw.json + 9 個のバックアップ — 同じ機密が複数ファイルに散在~/.openclaw/agents/main/agent/auth-profiles.json — OpenAI / Anthropic / Google 全部~/.openclaw/agents/main/sessions/*.jsonl(57 ファイル) ← これが一番ヤバい~/.openclaw/tasks/runs.sqlite — SQLite に Anthropic キー特に最後の 57 ファイル。 これは OpenClaw のエージェント会話履歴 jsonl です。 LLM 呼び出しのときの context(system prompt や config 内)に API キーが含まれてて、 それがそのままログとして書き出されてた。
普通、 LLM 統合ツールを設計するとき、 「会話履歴に機密が混入しないようにマスク処理を入れる」のは基本中の基本です。 OpenClaw はそこが甘くて、 結果として 1 ユーザーのローカルディスクに 400 件超の生機密が散らばってました。
…これも卒業の後押しになりました。 「自前運用してた間にも、 こんなに機密漏れリスクを抱えてたんやな」と。
LLM 統合ツールを選ぶときの確認ポイント
${VAR} 参照か?「便利だから」で選ぶ前に、 この 3 つだけは見ておくと事故が減ります。
決断は固まったので、 そこからは作業です。 流れだけ書くと:
launchctl bootout で停止(自動再起動も無効化)~/.openclaw/ 配下、 workspace/ 以外を全削除(find ... -exec rm -rf {} + で慎重に)/opt/homebrew/lib/node_modules/openclaw を npm uninstall(846 パッケージ削除)~/Library/LaunchAgents/ai.openclaw.gateway.plist* 7 個削除.zshenv から OpenClaw 専用 env 4 個を削除(SLACK_*_OPENCLAW, OPENCLAW_GATEWAY_AUTH_TOKEN)ディスク使用量は約 416 MB → 151 MB(workspace のみ)。 削除前後で全 MCP の動作確認、 Claude Code 単体運用に切り替えても全部 ✓ Connected を確認。
その間、 ずっと「あい」と話しながら作業してました。 「次これ実行していい?」って投げて、 ぼくが GO を返すたびに作業が一段進む。 ひとりで全部やってたら絶対朝に間に合わなかった。
OpenClaw 卒業の決断は、 経済合理性(年 1200 万円規模のコスト削減) + セキュリティ強化(機密 418 件の根絶) + 運用簡素化(env 継承の三重罠から解放)の三方良し。
Claude.app と Claude Code だけで全部完結する時代、 自前で組んだ統合ツールは「必須」ではなくなりました。
ただ、 OpenClaw 自体は素晴らしいツールで、 ぼくにとっては 2026 年 4 月までずっと相棒みたいな存在でした。 「卒業」と書きましたが、 退場じゃなくて巣立ち、 みたいな感覚に近いです。
次の Part では、 卒業翌日(つまり昨晩)、 ぼくがメインで開発してる中古品 AI 査定の Web サービスの本番(preview)で 38 件のエラーが焼かれてた話を書きます。 これも夜のうちに直し切りました。