Claude Code を動かしている環境のメモ
Claude Code を動かしている環境を作ったときの構成メモ。
前提環境
- WSL2
- Docker
- Docker Desktop でもなんでも
思想
こんな感じのことを考えて環境を作っています。
- Claude Code は事実上自分とは別の独立したユーザーとして扱い、自分と同等の権限を渡すことはしない
- 同等の権限を渡すということは自分と同等の操作ができてしまうということ
- Claude Code を信用していないのはもちろんだが、Claude Code を使用している自分を一番信用していない
- .ssh, .aws などのcredential 系を読める権限で動かした場合は漏洩したとみなすくらいの心構えでいるべき
- なんらかの権限を渡す場合はreadonlyなもののみを最小限で渡すようにする
構成
構成はこんな感じです。
権限を制限した隔離環境で動かしたいので雑に Docker 上で動かすようにしています。
docker
Dockerfile
やっていることはこれくらい。
私はJVMを使いがちなので Amazon Corretto のイメージを使っていますが、人によるでしょう。
- claude code をインストールする
- ほしい開発ツールを用意する
- その他ツールのインストール
- uid をホスト側と合わせる
docker-compose
マウントしているのはこれくらい
- ~/.claude
- ~/.claude.json
- これはセッション情報やclaudeの認証情報などが書き込まれるので、ホストのファイルは分けておくとよい
- 自作ツール類
以下はオプション
- maven, ivy, gradle, npm などのキャッシュディレクトリ
- 各種設定 ~/.gitconfig, ~/.emacs.d とか
以下は絶対にマウントしない
- credential 系
- .ssh
- .aws
- ...
ツール類
以下は大体 Claude Code で作ったものです。
Server Manager
コンテナ側に公開するサーバープロセスを一括管理するcliツールです。
機能としてはこれくらい。
- 一括起動・停止
- プロセスごとの色分けログ
Text to Speech Server/Client
http でリクエストを受け付けて、 PowerShell プロセス上の SpeechSynthesizer に喋らせるサーバーです。
コンテナ側には tts コマンドを提供し、tts コマンドからは tts server に文字列を送信することで音声化して喋らせています。
どのように喋らせるか
rules に以下のようなプロンプトを追加して喋らせています。
Microsoft Haruka に英語をそのまま入力として渡すととても聞き取りづらいので、カタカナ英語にしてもらうことで割と聞きやすいものになりました。
これらとは別に hook でも喋らせています。
# 音声出力
## 音声出力について
以下の出力をttsコマンドで音声化すること:
- ユーザーへの応答メッセージ
- 思考プロセス(<thinking>タグ内の内容)
- 確認や質問
以下は音声化しない:
- コマンド実行結果の生ログ
- ファイルの内容表示
音声化する文字列に英語が含まれていた場合、カタカナ英語として聞き取りやすいように変換して出力すること。
ttsコマンドは以下のように使用します。
```
$ tts ${音声として出力する文字列}
```
音声出力プロセスの終了待ちはしなくてもいいです。
## カタカナ英語変換ルール
- ファイル名: ハイフン・アンダースコアは省略し続けて読む(plan-all.py → プランオールドットパイ、test_utils.ts →
テストユーティルズドットティーエス)
- 拡張子: 「ドット」+一般的な読み方(.py → ドットパイ、.ts → ドットティーエス)
- 略語: アルファベット読み(CI/CD → シーアイシーディー、TTS → ティーティーエス)
- 一般的な技術用語: カタカナ読み(GitHub → ギットハブ、Terraform → テラフォーム)
MCP Servers
各種サービスやツールをreadonlyな権限で利用させるためのMCPサーバーを用意しています。
- github (gh command)
- AWS Resources
などなど。
設定置き場
MCP Server の定義は ~/.claude.json に置くっぽいのですが、これはセッション情報やらなにやらが混ざっていて取り回しが悪いです。
そこで、エンプラ用の設定を置く場所である /etc/claude-code/managed-mcp.json にマウントすることで読み込ませるようにしています。
Discussion