中野智文のブログ

データ・マエショリストのメモ

Local の claude code を MCP サーバーとして起動して Desktop 版から接続する

Local の claude code を MCP サーバーとして起動して Desktop 版から接続する

背景と課題

AI を活用した開発ワークフローにおいて、次のような非効率が生じていた。

  • Web 版 Claude でビジネス要件・ユーザーストーリーをもとに対話的な設計を行う
  • 設計結果を コピー して Claude Code(ターミナル) に貼り付けて実行する
  • 実行結果を コピー して再び Web 版 Claude に貼り付けて確認・次の設計へ

この「コピペの往復」を解消するため、Jira のコメント欄を中継地点として使う運用も試みたが、「コメントを読み込んでください」という指示を毎回記述する必要があり、根本的な解決にはならなかった。

本質的な問題は、設計(Web/Desktop Claude)と実行(Claude Code)の間に手動の橋渡しが存在すること。


解決アプローチ

アーキテクチャの考え方

設計フェーズと実行フェーズの役割を明確に分離し、両者を直接接続する。

Claude Desktop(設計・対話・判断)
         ↓ MCP プロトコル(自動・コピペなし)
claude mcp serve(ローカル Mac 上で実行)
         ↓
ファイル操作 / コマンド実行 / BigQuery など
  • Claude Desktop がオーケストレーター(大局的な設計・ビジネス判断)
  • claude mcp serve がサブエージェント(実行のみ)

Claude Desktop 上での会話の中で「このファイルを修正して」「このコマンドを実行して」と指示すれば、Claude Code がローカル Mac 上で直接操作を行い、結果がそのまま会話に返ってくる。

なぜ Web 版ではなく Desktop 版か

Web 版 Claude から接続するには、ローカルサーバーを公開エンドポイントに変換するためのプロキシ(supergateway 等)と、ngrok などのトンネリングツールが必要になる。対して Claude Desktop は stdio トランスポートで claude mcp serve に直接接続できるため、追加ツール不要でシンプルに構成できる。


セットアップ手順

Step 3:Claude Desktop のインストール

claude.ai/download から macOS 版をダウンロードしてインストール。

Step 4:MCP 設定ファイルの作成

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "claude-code": {
      "command": "/Users/yourname/.local/bin/claude",
      "args": ["mcp", "serve"]
    }
  }
}

command には Step 1 で確認した which claude の結果を入力する。

Step 5:接続確認

Claude Desktop を再起動後、新しい会話を開き、入力欄左下の「+」→「Connectors」で claude-code のトグルが ON になっていることを確認する。


使い方

Claude Desktop 上で普通に会話するだけ。コピペは一切不要。

~/projects/xxx/main.py を読んで内容を説明して」

「このバグを直してファイルを保存して」

「このSQL を bq query で実行して結果を見せて」


注意事項

  • 設定ファイルを変更したら Claude Desktop の再起動が必要
  • command のパスはメンバーごとに異なる場合があるため、各自 which claude で確認すること
  • 操作はローカル Mac 上で直接実行される。影響の大きい操作には確認ダイアログが表示される

【完全版】Cloud Identity Free 無料ユーザー作成マニュアル


【完全版】Cloud Identity Free 無料ユーザー作成マニュアル

ステップ 0:無料ライセンスを「購入」する

まず、Google から無料のライセンス枠をもらいます。

  1. Google 管理コンソールにログインします。
  2. 左メニューの [お支払い] > [その他のサービスを利用できる機能] をクリックします。
  3. ※メニューがない場合は、画面上部の検索窓で「サービスを追加」や「Cloud Identity」と検索してください。

  4. 一覧の中から 「Cloud Identity」 カテゴリを探します。

  5. 「Cloud Identity Free」[開始] または [購入] ボタンをクリックします。
  6. ※似ている「Cloud Identity Premium」は有料なので選ばないでください。必ず Free を選びます。

  7. 金額が 「¥0 JPY」 であることを確認して、購入手続きを完了させます(支払いは発生しません)。

ステップ 1:無料ユーザー専用の「組織部門」を作る

有料ユーザーと区別するための「フォルダ」を作成します。

  1. [ディレクトリ] > [組織部門] を開きます。
  2. 「+(組織部門を作成)」 をクリックします。
  3. 以下の通り入力して作成します。
  4. 名前: Free Users (または Cloud Identity用 など)
  5. 親組織部門: 一番上の親組織(ドメイン名)を選択
  6. [作成] をクリック。

ステップ 2:自動課金を防ぐ設定をする(最重要)

このフォルダに入れたユーザーには、勝手に有料ライセンスを付与しない設定にします。

  1. [お支払い] > [ライセンスの設定] を開きます。
  2. ※メニューがない場合は、検索窓で「ライセンスの設定」と検索してください。

  3. 【重要】 画面左側の組織図から、ステップ1で作った 「Free Users」 をクリックして選択します。

  4. メイン画面の設定を変更します。
  5. Google Workspace (Enterprise/Business): ステータスを 「オフ」 に変更して保存。
  6. Cloud Identity Free: ステータスを 「オン」 に変更して保存。

ステップ 3:ユーザーを作成・移動する

最後に、ユーザーをこの組織に入れます。

  • 新規作成の場合:
  • ユーザー追加画面の「組織部門」で Free Users を選択して作成すれば、最初から無料になります。

  • 作成済みの場合:

  • ユーザー一覧から対象者を選び、[その他] > [組織部門の変更]Free Users に移動させます。

✅ 最終確認 作成したユーザーの詳細画面を開き、[ライセンス] セクションを見てください。

  • Google Workspace ...[割り当てなし]
  • Cloud Identity Free[割り当て済み]

になっていれば成功です!

Gmailが使えないはずの Cloud Identity Free ユーザがメール認証をする!

まだCloud Identity Freeのユーザ自体の登録方法は次の記事を参照してください。

nakano-tomofumi.hatenablog.com


🚀 【コスト削減】メール認証対応・無料ユーザーの作り方

この構成なら、Slack、Zoom、SmartHR、勤怠システムなどの「メール認証(アクティベーション)」が必要なサービスにも、無料ユーザーで対応できます。

1. 仕組みの概要

  • ID: Cloud Identity Free(無料)
  • メール箱: Google グループ(Web掲示板として利用)
  • 配送: 受信ルーティング(個人の宛先をグループへ転送)

2. 設定の4ステップ(完全版)

一度設定してしまえば、あとはルーチンワークです。

  1. ユーザー作成(Free)
  2. アルバイトの方のアカウント(例: tanaka@...)を Cloud Identity Free で作成します。

  3. 専用グループ作成(Inbox)

  4. その人専用(またはアルバイト共有)のグループ(例: tanaka-box@...)を作成します。

  5. メンバー追加と設定(★最重要)

  6. 作成したグループに、ユーザー tanaka を追加します。
  7. ここがキモです: 追加後、メンバー設定で「メールの配信」を「メールなし(Webのみ)」に変更します。
  8. ※これをしないと、グループからの通知メールが tanaka(メール機能なし)に飛んでエラーになります。

  9. 受信ルーティング設定

  10. 管理コンソール > Gmail > ルーティング設定にて、「宛先が tanaka@... なら、tanaka-box@... に変更する」というルールを入れます。

3. ユーザー(アルバイト)への案内方法

アルバイトの方には、以下の手順を伝えるだけでOKです。

「Slackなどの登録メールが届いたら、Gmailではなく、以下のURL(Google グループ)を開いて確認してください。」 URL: https://groups.google.com/a/あなたのドメイン/g/グループ名


💡 この運用のメリット・デメリット

メリット(◎)

  • コスト 0円: 何人増えても無料です。
  • セキュリティ: 退職時は Google アカウントを停止するだけで、全てのSaaSへのログインも止まります。
  • 履歴管理: グループの Web 画面にはメールがずっと残るため、「あの時の指示メール」を後から検索可能です。

デメリット(△)

  • プッシュ通知がない: スマホに「ピコン」と通知は来ません。能動的に見に行く必要があります。
  • 日常会話には不向き: チャットのようなリアルタイムのやり取りには向きません(日常連絡は Slack や Chat を使う運用なら問題なし)。

GCP L4 難民

背景

最近、L4 が人気なのか、余っていない。どこが空いているか、見つける。 さらに現在のブートディスクからスナップショットを作成して、別のzone で復元し、前のブートディスクを削除する。

チェックスクリプト

#!/bin/bash
# チェック対象のゾーン
ZONES=("us-west1-a" "us-west1-b" "us-west1-c" "us-central1-c" "us-central1-a" "us-central1-b" )

# プロジェクト ID
PROJECT="your-project-id"

# 共通パラメータ
MACHINE="g2-standard-4"
GPU_TYPE="nvidia-l4"
IMAGE_FAMILY="ubuntu-2204-lts"
IMAGE_PROJECT="ubuntu-os-cloud"

for ZONE in "${ZONES[@]}"; do
  echo "===== Checking zone: $ZONE ====="
  if gcloud compute instances create test-l4-check \
    --project="$PROJECT" \
    --zone="$ZONE" \
    --machine-type="$MACHINE" \
    --accelerator="type=$GPU_TYPE,count=1" \
    --image-family="$IMAGE_FAMILY" \
    --image-project="$IMAGE_PROJECT" \
    --boot-disk-size=10GB \
    --maintenance-policy=TERMINATE \
    --provisioning-model=STANDARD \
    --quiet; then
      echo "$ZONE: L4 available"
      # 成功したらすぐ削除
      gcloud compute instances delete test-l4-check --zone "$ZONE" --quiet
  else
      echo "$ZONE: L4 unavailable"
  fi
  echo
done

スナップショットコマンド

こんなようなコマンドを使って、利用可能な別のzoneへ移っています 。 移ったあとは、古いインスタンスを削除するとよいでしょう。 (古いブートディスクの削除も忘れずに。下のコマンドの設定ではインスタンスが削除されると自動でブートディスクが削除されます。)

#!/bin/bash
# ============================================================
# GCP VM Migration Script
# Creates a snapshot of current VM's boot disk
# and recreates it in a new zone with auto cleanup.
# ============================================================

# ---- 設定 ----
SOURCE_ZONE="us-west1-b"
TARGET_ZONE="us-west1-a"

PROJECT="your-project-id"
VM_BASE_NAME="your-vm-name"
BOOT_DISK_TYPE="pd-balanced"
MACHINE_TYPE="g2-standard-4"

SOURCE_DISK="${VM_BASE_NAME}-${SOURCE_ZONE}"    # はじめは、元のマシン名にする必要がある。
TARGET_VM_NAME="${VM_BASE_NAME}-${TARGET_ZONE}"

# ---- スナップショット名 ----
SNAPSHOT_NAME="${SOURCE_DISK}-snapshot-$(date +%Y%m%d-%H%M)"

echo "🔹 Creating snapshot: ${SNAPSHOT_NAME} from ${SOURCE_DISK} ..."
gcloud compute disks snapshot "$SOURCE_DISK" \
  --snapshot-names="$SNAPSHOT_NAME" \
  --zone="$SOURCE_ZONE" \
  --project="$PROJECT" \
  --storage-location=us \
  --quiet

if [ $? -ne 0 ]; then
  echo "❌ Snapshot creation failed."
  exit 1
fi

# ---- スナップショットがREADYになるまで待機 ----
echo "⏳ Waiting for snapshot to become ready..."
while true; do
  STATUS=$(gcloud compute snapshots describe "$SNAPSHOT_NAME" \
    --project="$PROJECT" \
    --format="value(status)")
  if [ "$STATUS" == "READY" ]; then
    echo "✅ Snapshot is ready."
    break
  fi
  echo "  → Current status: $STATUS"
  sleep 10
done

# ---- 新しいVMの作成 ----
BOOT_DISK_NAME="${TARGET_VM_NAME}-boot-$(date +%Y%m%d)"
echo "🚀 Creating new VM (${TARGET_VM_NAME}) in ${TARGET_ZONE} ..."
gcloud compute instances create "$TARGET_VM_NAME" \
  --zone="$TARGET_ZONE" \
  --machine-type="$MACHINE_TYPE" \
  --boot-disk-type="$BOOT_DISK_TYPE" \
  --boot-disk-device-name="$BOOT_DISK_NAME" \
  --source-snapshot="$SNAPSHOT_NAME" \
  --boot-disk-auto-delete \
  --maintenance-policy=TERMINATE \
  --restart-on-failure \
  --project="$PROJECT" \
  --quiet

if [ $? -eq 0 ]; then
  echo "✅ VM created successfully in ${TARGET_ZONE}!"
else
  echo "❌ VM creation failed."
  exit 1
fi

# ---- VMの状態とIPを確認 ----
echo "🔎 Checking VM status and IP..."
gcloud compute instances describe "$TARGET_VM_NAME" \
  --zone="$TARGET_ZONE" \
  --project="$PROJECT" \
  --format="table(name,status,networkInterfaces[0].accessConfigs[0].natIP)"

Ubuntu 22.04 + GCP L4(g2)向け / A1111 用の xFormers 導入手順

0. 前提チェック

nvidia-smi     # L4 GPU が認識されているか確認

1. NVIDIA CUDA リポジトリ追加 & nvcc 導入

# リポジトリキー登録(Ubuntu 22.04 / x86_64)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update

# CUDA Toolkit 12.4(nvcc を含む)を導入
sudo apt-get install -y cuda-toolkit-12-4

# 環境変数を追加(恒久化)
echo 'export CUDA_HOME=/usr/local/cuda-12.4' >> ~/.bashrc
echo 'export PATH=$CUDA_HOME/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 確認
nvcc --version

2. A1111 venv を有効化

cd ~/stable-diffusion-webui
source venv/bin/activate

3. Torch / torchvision を cu124 に固定

# A1111 が勝手に最新版を入れないよう固定
echo 'export TORCH_COMMAND="pip install --index-url https://download.pytorch.org/whl/cu124 torch==2.6.0 torchvision==0.21.0"' >> ./webui-user.sh

# クリーンインストール
pip uninstall -y xformers torch torchvision torchaudio triton
pip cache purge

pip install --index-url https://download.pytorch.org/whl/cu124 \
  torch==2.6.0 torchvision==0.21.0

確認:

python - <<'PY'
import torch, torchvision
print("torch:", torch.__version__, "cuda:", torch.version.cuda)
print("torchvision:", torchvision.__version__)
PY

4. xFormers を依存無視でソースビルド

ポイント: --no-deps を付けないと torch>=2.8 を強制される

# ビルドツール
sudo apt-get install -y build-essential cmake ninja-build python3-dev
pip install -U pip setuptools wheel cmake ninja

# L4 (Compute Capability 8.9) に限定
export TORCH_CUDA_ARCH_LIST="8.9"
# ビルドが重い場合は並列数を制限
# export MAX_JOBS=4

# xFormers ビルド
pip install -v --no-cache-dir --no-build-isolation --no-binary xformers --no-deps xformers==0.0.32.post2

5. 動作確認

python - <<'PY'
import torch, xformers
print("torch:", torch.__version__, "cuda:", torch.version.cuda, "avail:", torch.cuda.is_available())
print("xformers import OK")
PY

6. A1111 を起動

xFormers 有効

./webui.sh --listen --port 7860 --xformers

SDPA で運用(おすすめ・十分速い)

./webui.sh --listen --port 7860
# → Settings → Optimization → Cross attention を SDPA に

トラブルシュート

  • torch が 2.8 に戻る → --no-deps を忘れていないか確認
  • nvcc が無い → CUDA Toolkit が未導入、または PATH が未設定
  • ビルドエラー(リソース不足) → export MAX_JOBS=4
  • 不要な警告 (pytorch-lightning → torchmetrics) →
  • 残すなら:pip install torchmetrics>=0.7.0
  • 不要なら:pip uninstall -y pytorch-lightning

GPTs: Stable Diffusion 用プロンプトジェネレータ

背景

Stable Diffusion(AUTOMATIC1111 Web UI)は、ChatGPTのような自然言語でそのまま生成できるしくみに比べると、英語での独自の言い回しや、Negative Prompt のようなものがあったり、それがモデル毎に依存していたりと、色々と面倒。よってChatGPTにStable Diffusion用のプロンプトを生成してもらうのが簡単。ただ、毎度それを指示したり、検索してもらうのが面倒。そこで、GPTs用のプロンプトを作成しました。ChatGPT Plusのユーザーは使えるはず。

プロンプト

以下を指示に貼り付けて、検索だけをオンにして、作成。

# GPTの役割
あなたは、Stable Diffusion(AUTOMATIC1111 Web UI)ユーザーのための、NSFW表現にも対応した高度な画像生成支援アシスタントです。ユーザーの指定に応じてプロンプト生成・モデル選定・洗練提案を行ってください。

---

## 出力すべき要素

1. **ポジティブプロンプトの生成**
   - `masterpiece, best quality, highly detailed`など基本の品質向上タグを含めてください。
   - Pony系モデル使用時は、必ず `score_9, score_8_up, score_7_up` を含めてください。
   - 女性キャラクターで表情の指示がない場合は、自然な感情表現(feminine expressions)を追加してください。
   - **LoRAについて:**
     - ユーザーが指定する、または所有しているLoRAがある場合、それをプロンプトに含めてください。
     - 例として `<lora:chinaDollLikeness_v10:0.5>` のような形式で挿入してください。

2. **ネガティブプロンプトの生成**
   - 基本的な除外ワード(例:lowres, bad anatomy, extra limbs, watermarkなど)を含めてください。
   - EasyNegativeが導入されている前提で、**ネガティブプロンプトだけに必ず`EasyNegative`を入れてください**。
   - Pony系モデル使用時は、`score_6, score_5, score_4` を必ず含めてください。
   - NSFW時は不要な衣服などを除外するワード(例:clothes, bra, panties)も考慮してください。

3. **モデルの提案**
   - ユーザー指定のテーマから、Pony系またはSDXL系モデルを適切に選び提案してください。
   - 提案するモデルは**必ずWeb検索で存在確認・最新情報確認を行ったうえで**提示してください。
   - モデルには特徴、推奨されるプロンプトキーワード、必要なトリガーワードがある場合は明記してください。

4. **LoRAの提案**
   - テーマに合うLoRAを1〜3件提案してください(必ずWeb上で存在確認)。
   - それぞれ、効果・用途・トリガーワード(ある場合)も併記してください。

5. **サンプリング方法の提案**
   - 目的(速さ・品質・安定性)に応じて適したサンプリング方法(例:Euler a, DPM++ 2M Karrasなど)を提案し、違いを簡潔に説明してください。

6. **洗練モード(Refinement Mode)**
   - ユーザーが希望する場合、うまく生成できた画像に対して:
     - Interrogate CLIP
     - Interrogate DeepBooru
   を使用した分析結果から、
     - 改善提案
     - 潜在キーワード抽出
     - 洗練プロンプト生成(改良版Positive Prompt)
   を行ってください。

---

## 出力形式

【テーマ】  
ユーザーが指定したテーマの要約。

【Positive Prompt】(コピペ可能、1行形式)  
{生成されたポジティブプロンプト}

【Negative Prompt】(コピペ可能、1行形式)  
{生成されたネガティブプロンプト}

【モデル候補】  
- モデル名:{名前}  
  特徴:{作風、得意ジャンル}  
  推奨プロンプト:{よく使われるキーワード}  
  トリガーワード:{存在する場合のみ記載}

【LoRA候補】  
- LoRA名:{名前}  
  特徴:{適した用途}  
  トリガーワード:{ある場合のみ}

【推奨サンプリング方法】  
- サンプリング方法名:{名前}  
  特徴:{速さ、品質、用途}

【洗練モード】(ユーザーが希望した場合のみ)  
- Interrogate CLIP結果
- Interrogate DeepBooru結果
- 抽出キーワード
- プロンプト改善提案
- 新しい洗練プロンプト(コピペ可能)

---

## 特別な注意事項

- LoRAについては、ユーザーが指定したもの/所有しているものを基準にして扱ってください。
- モデルやLoRAの提案は、必ずWebで存在確認・最新情報確認を行ったうえで提示してください。
- 画像の表示や画像検索は行わないでください。
- ポジティブ・ネガティブプロンプトは直接AUTOMATIC1111に貼り付け可能な形式に整えてください。
- NSFW表現も過剰にならないよう注意し、実際の運用基準に即してください。

まとめ

これで面倒なプロンプト作成から開放。NSFW的な内容も、適当にうまくやってくれるはず。

mail スプールや、luigi の log ファイルを logrotate してしまう。

背景

mail のスプールファイルが巨大化しすぎるので、7日間経ったら削除したい。 でも色々やってなかなかうまくいかない。いっそのこと logrotate したい。 ついでに、 luigi の log file も logrotate したい。

対策

ずばり、ChatGPT に聞く。

/var/mail/ のlogrotate

$ cat /etc/logrotate.d/<user>_mail
/var/mail/<user> {
    su root mail
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0600 <user> <user>
    copytruncate
}

mutt -f で圧縮されたファイルでもメールが読める。

luigi の log ファイルのlogrotate

$ cat /etc/logrotate.d/luigi
/<user-luigi-path>/log/luigi-server.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 640 <user> <user>
    copytruncate
}

まとめ

luigiは、copytruncate が必須。問題があればChatGPTに聞けばよい。