はじめに
Pencil(AIエディタ)とClaude DesktopをMCPで連携させていると、 「昨日まで繋がっていたのに、今日起動したら繋がらない」 という現象に遭遇することがあります。
原因の多くは、Pencilが起動するたびに 使用するポート番号をコロコロ変えてしまう(動的ポート仕様) ためです。
その都度 lsof でポートを調べて、設定ファイル(JSON)を書き換えるのはあまりにも面倒です。
そこで、「現在のPencilのポートを自動検出し、設定ファイルを書き換えてくれるコマンド」 を作りました。
.zshrc にコピペするだけで、コマンド一発で同期できるようになります。
解決策:自作コマンド fixport を作る
Macのターミナル設定ファイル(.zshrc)に**関数(function)**として登録します。
エイリアス(別名)だと複雑な処理(if文など)が書きにくいので、関数を使います。
以下が、そのままコピペして使える手順です。
手順1. .zshrc ファイルを開く
ターミナルで以下のコマンドを実行して、設定ファイルを開きます。
(VS Codeなどで開いてもOKですが、ここではnanoを使います)
nano ~/.zshrc
手順2. ファイルの末尾に以下のコードを貼り付ける
以下のコードブロックをすべてコピーして、ファイルの一番下に貼り付けてください。
# Claude DesktopとPencilのポート同期用コマンド
function fixport() {
echo "🔍 Pencilのポートを探しています..."
# 1. 現在Pencilが開いているポート番号を取得
local PENCIL_PORT=$(lsof -i -P | grep Pencil | grep LISTEN | awk '{print $9}' | cut -d: -f2 | head -n 1)
if [ -z "$PENCIL_PORT" ]; then
echo "❌ Pencilが起動していないか、サーバーがOFFになっています。"
else
echo "✅ 現在のPencilポートを検出: $PENCIL_PORT"
local CONFIG_PATH="$HOME/Library/Application Support/Claude/claude_desktop_config.json"
# 2. jqを使ってJSON構造を正しく書き換え
# pencilサーバーのargs配列の2番目(インデックス1)を書き換える
if command -v jq >/dev/null 2>&1; then
tmp=$(mktemp)
jq ".mcpServers.pencil.args[1] = \"$PENCIL_PORT\"" "$CONFIG_PATH" > "$tmp" && mv "$tmp" "$CONFIG_PATH"
echo "🔄 設定ファイルを更新しました(jqを使用)。"
else
# jqがない場合の代替案(sedで強引にやる場合)
# "--ws-port" の次の行の数字部分だけを置換する
sed -i '' -e "/\"--ws-port\"/{n;s/\"[0-9]*\"/\"$PENCIL_PORT\"/;}" "$CONFIG_PATH"
echo "🔄 設定ファイルを更新しました(sedを使用)。"
fi
echo "🚀 Claude Desktopを再起動してください(Cmd+Q → 起動)"
fi
}
念のため
brew install jq
解説:
-
lsofでPencilがLISTENしているポートを探し出し、変数に入れます。 -
sedコマンドを使って、JSONファイル内の"--ws-port", "古い数字"の部分を、正規表現で"--ws-port", "新しい数字"に書き換えています。
手順3. 保存して反映させる
-
保存:
Ctrl + Oを押し、Enterを押す。 -
終了:
Ctrl + Xを押す。 - 反映: ターミナルで以下のコマンドを実行して、設定を読み込み直します。
source ~/.zshrc
使い方
これで準備完了です!
今後、Pencilと繋がらないときは、ターミナルで一言こう打つだけです。
fixport
実行結果のイメージ:
🔍 Pencilのポートを探しています...
✅ 現在のPencilポートを検出: 52871
🔄 設定ファイルを更新しました。
🚀 Claude Desktopを再起動してください(Cmd+Q → 起動)
これで面倒な lsof 確認も、エディタでの書き換えも不要になります。
快適なMCPライフを!
(以下余白)