FigmaのDev Mode MCPが公式リリースされ、最近は アノテーション取得 までできてめちゃ便利になりました。
ただし仕組み上、「ローカル(127.0.0.1)のFigmaデスクトップアプリ」 へ接続する必要があるため、WSL上のローカル環境≠Windows上のローカル環境 という前提の違いで、WSLからはそのまま利用できません。実際、公式ガイド通りにClaude Code/Cursor/Codexから呼び出しても、WSLでは読み込めません。
この問題を、WSL→WindowsへのSSHローカルポート転送 で解決します。
具体的には WindowsをSSH サーバーとして起動し、WSLからのみアクセスできるようにして、WSLからWindowsの127.0.0.1:3845
(例)へ安全に到達させます。
⚠️ 代替案としてWSLを mirrored モードでLANに直接公開し、IP指定でアクセスする方法もありますが 非推奨 です。
WSLがLAN上に直接露出して(Windowsのファイアウォール保護の外側になる)、攻撃面が広がる/DockerやVSCodeのlocalhost
連携が不安定化しやすい(特に、デフォルトで簡単に到達できるWindows→WSLのhttp://localhost:ポート
(NATの自動ポートプロキシ)が機能しなくなり、WindowsからWSL上のサービスへ接続できない)ため。開発用途では NATのまま+トンネル が安全・安定です。
この構成はFigma Dev Mode MCP 以外のWSL→Windowsローカル資源にも使い回せる汎用性の高いもののため、Windowsで開発する人は設定しておくと後々使う場面があると思います。(例:ブラウザCDP、ADB、ローカルDB/モック、社内プロキシなど)。
TL;DR
-
やること:WindowsにOpenSSHサーバーを入れる→WSLから公開鍵認証で接続→
ssh -L
でローカルポート転送 - 安全性:FirewallでWSLサブネットのみ許可+鍵認証。WSLを外部公開しないので安全
-
補足:自動起動(
sshd
自動起動・WSL ログイン時に自動でトンネル確立)も簡単
① OpenSSH サーバーをインストール&起動(管理者PowerShell)
#OpenSSHインストール
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
#起動
Start-Service sshd
#起動確認
Get-Service sshd
#停止
Stop-Service sshd
②ファイアウォールでWSLサブネットからだけ許可(管理者PowerShell)
#vEthernet (WSL (Hyper-V firewall)):WSL仮想NICのインターフェース名
$if = "vEthernet (WSL (Hyper-V firewall))"
New-NetFirewallRule -DisplayName "Allow SSH from WSL subnet" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22
-RemoteAddress 【WSLサブネット】 -InterfaceAlias $if -Profile Public
#作成したルールを表示
Get-NetFirewallRule -DisplayName "Allow SSH from WSL subnet" |
Format-Table DisplayName, Enabled, Direction, Action, Profile
※【WSLサブネット】の確認方法(WSL)
#eth0インターフェースのネットワークCIDRを抽出する(例:172.28.96.0/20)
ip route | awk '/proto kernel/ && /eth0/ {print $1}'
③SSH鍵ペアを作成(WSL)
ssh-keygen -t ed25519 -C "wsl" -f ~/.ssh/id_wsl
④公開鍵をWindowsに配置(管理者PowerShell)
#WSL内の公開鍵ファイルを読み取り、Windowsの管理者用authorized_keysに書き込む
Get-Content \\wsl.localhost\Ubuntu\home\【WSLユーザー名】\.ssh\id_wsl.pub `
| Out-File -Encoding ascii C:\ProgramData\ssh\administrators_authorized_keys
※【WSLユーザー名】と【Windowsユーザー名】の確認方法(WSL/PowerShellどちらも)
whoami
⑤権限を厳格化(管理者PowerShell)
$p = 'C:\ProgramData\ssh\administrators_authorized_keys'
# 継承を無効化(親フォルダからの不要な権限を削除)
icacls $p /inheritance:r
# AdministratorsとSYSTEMだけにフルアクセス権を付与
icacls $p /grant:r "Administrators:F" "SYSTEM:F"
# 設定反映のためsshd再起動
Restart-Service sshd
⑥SSHトンネルを張る(WSL)
#バックグラウンドで実行(-f)
ssh -N -f -i ~/.ssh/id_wsl -L 3845:127.0.0.1:3845 【Windowsユーザー名】@【WindowsホストのWSL側IP】
#トンネルを閉じる
pkill -f "ssh -N -f -L 3845:127.0.0.1:3845"
※【WindowsホストのWSL側IP】の確認方法(WSL)
## デフォルトゲートウェイ(WSL→Windowsホスト)を取得(例:172.24.96.1)
ip route | awk '/^default/ {print $3}'
3845部分を変えれば任意のポートを通せます
例:-L 8080:127.0.0.1:8080 で8080ポートを転送
⑦通常通りFigma Dev Mode MCPに接続
以下公式サイト通りに設定する。
- Dev Mode MCP公式英語版
-
Dev Mode MCP公式日本語版
英語版と日本語版でエンドポイントが異なりますが、どちらでも問題ありませんでした。(英語版~/mcpの方が新しいらしい?)
補足①:OpenSSH サーバーを永続的に起動する設定(管理者PowerShell)
# OpenSSHサーバー(sshd)を自動起動に設定(デフォルトはManual)
Set-Service -Name sshd -StartupType Automatic
# sshd サービスの現在の状態と起動設定を確認
Get-Service sshd | Format-Table Status, StartType
補足②:WSLログイン時に自動接続
① トンネル貼り用のスクリプトを作成
nano ~/.ssh/start_tunnel.sh
中身
#!/bin/bash
# WindowsホストのWSL側IPを取得
WIN_IP=$(ip route | awk '/^default/ {print $3}')
# 既に同じトンネルがあれば何もしない
if ! pgrep -f "ssh -N -f -L 3845:127.0.0.1:3845" > /dev/null; then
ssh -N -f -i ~/.ssh/id_wsl \
-L 3845:127.0.0.1:3845 \
【Windowsユーザー名】@"$WIN_IP"
fi
保存後、実行権限を付与
chmod +x ~/.ssh/start_tunnel.sh
② .bashrc に自動実行を追加
echo "~/.ssh/start_tunnel.sh" >> ~/.bashrc
.bashrc は WSL シェル起動時に毎回読み込まれる設定ファイルです。
WSLを起動したとき、自動でトンネルが張られる
既に張ってある場合は二重接続しない
ssh -i ~/.ssh/id_wsl により公開鍵認証で無人接続
トンネルを手動で切るとき
pkill -f "ssh -N -f -L 3845:127.0.0.1:3845"