はじめに
MCPサーバー、便利ですよね。Claude DesktopやClaude Codeから自作ツールを呼び出せる。でも、ひとつ不満がありました。
PCの前にいないと使えない。
通勤中にスマホからブログ記事を下書きしたい。外出先でClaudeにWordPress投稿を頼みたい。でもMCPサーバーはローカルで動いているから、モバイルのClaudeからは繋がらない。
そこで、自宅のWindows PC(WSL)上で動くMCPサーバーをTailscale Funnel経由でインターネットに公開し、Claudeモバイルアプリからリモートで呼び出せるようにしました。
この記事では、そのセットアップ手順と、実際に動かすまでの流れを解説します。
環境・前提条件
- OS: Windows 11 + WSL2 (Ubuntu)
- Python: 3.12(WSL側)
- パッケージ管理: uv
- MCPフレームワーク: FastMCP(
mcp[cli]) - トンネル: Tailscale Funnel
- Claudeプラン: MAX(リモートMCP Connectors利用に必要)
前提知識:Claude MobileはリモートMCPに対応済み
実は2025年7月から、ClaudeのiOS/Androidアプリはリモート MCPサーバーへの接続をサポートしています。
具体的には、claude.aiのWebインターフェースでSettings → Connectors → Add Custom ConnectorからリモートMCPサーバーのURLを登録すると、その設定がモバイル・Web・Desktopに自動同期されます。
つまり、MCPサーバーをHTTPSエンドポイントとして公開できれば、スマホのClaudeから使えるということです。Pro/Max/Team/Enterpriseプランで利用可能です。
詳細はAnthropic公式ドキュメントをご参照ください。
アーキテクチャ
全体像はシンプルです。
Claude Mobile/Web/Desktop (MAX)
│ HTTPS
▼
Tailscale Funnel (Windows側)
│ localhost:8321
▼
FastMCP Server (WSL2)
├─ 自作ツール (tools/*.py)
└─ 既存MCPサーバーのプロキシ (servers.yaml)
Tailscale Funnelが、自宅PCのローカルポートをインターネットにHTTPSで公開してくれます。TLS証明書の取得・更新は全自動。ポート開放もDDNSも不要です。
セットアップ手順
Step 1: WSL側 ── FastMCPサーバーを作る
まずWSLでプロジェクトを作成します。
mkdir -p ~/mcp-remote-host && cd ~/mcp-remote-host
uv init
uv add "mcp[cli]"
最小限の server.py を作ります。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("mcp-remote-host")
@mcp.tool()
def echo(message: str) -> str:
"""メッセージをそのまま返す(疎通確認用)"""
return f"Echo from WSL: {message}"
@mcp.tool()
def server_info() -> str:
"""サーバーの基本情報を返す"""
import platform, os
return f"Host: {platform.node()}, Python: {platform.python_version()}, CWD: {os.getcwd()}"
起動してみます。
uv run mcp run server.py:mcp --transport streamable-http
デフォルトではポート8000で起動しますが、--port 8321 のようにカスタムポートも指定できます。
ローカルで確認します。
curl -X POST http://localhost:8321/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
ツール一覧のJSONが返ればOKです。
Step 2: Tailscale Funnelで公開する
Windows側でTailscale Funnelを有効にします。
Funnelの有効化(初回のみ)
Tailscaleをまだ使っていない場合は、公式サイトからインストールしてログインします。
Funnelを使うには、Tailscale Admin Consoleで以下を有効にする必要があります。
- DNS → MagicDNS を有効化
- DNS → HTTPS Certificates を有効化
- Access Controls に Funnel属性を追加
初めてFunnelコマンドを実行すると、有効化ページへのURLが表示されます。ブラウザで開いて許可するだけです。
Funnelの起動
# PowerShell
tailscale funnel 8321
以下のような出力が表示されます。
Available on the internet:
https://your-machine.your-tailnet.ts.net/
|-- / proxy http://127.0.0.1:8321
WSL2の localhost はWindows側と共有されているため、Windows側のTailscale FunnelがそのままWSLのサーバーに到達します。
バックグラウンドで実行する場合は --bg フラグを付けます。
tailscale funnel --bg 8321
この時点で、スマホのブラウザから https://your-machine.your-tailnet.ts.net にアクセスしてみてください。サーバーが起動していれば何らかのレスポンスが、起動していなければ502エラーが返ります。502は「Funnelは動いている、サーバーがまだ」という意味なので、到達確認としては成功です。
Step 3: claude.aiにConnectorを登録する
- PCブラウザで claude.ai にログイン
- Settings → Connectors → Add Custom Connector
- URL:
https://your-machine.your-tailnet.ts.net/mcp - 名前: 任意(例:
mcp-remote-host) - Advanced settings: 空白のまま(認証なし)
- 「Add」をクリック
この設定はモバイル・Web・Desktopに自動同期されます。一度やれば完了です。
Step 4: モバイルClaudeから呼び出す
Claudeモバイルアプリを開いて、新しいチャットで試してみます。
echoツールで Hello from mobile と送って
Echo from WSL: Hello from mobile が返ってくれば成功です。自宅PCのWSL上で動くMCPサーバーに、スマホのClaudeから到達できています。
ハマったポイント
Tailscale Funnelの有効化
tailscale funnel 8321 を実行すると「Funnel is not enabled on your tailnet」と表示される場合があります。表示されるURLをブラウザで開いて、Funnel機能を有効化すれば解決します。
WSL2とWindowsのlocalhost共有
Windows 11のデフォルト設定では、WSL2の localhost がWindows側と共有されます。もしTailscale Funnelからサーバーに到達できない場合は、.wslconfig に localhostForwarding=true を設定するか、WSL2のIP(hostname -I で確認)を直接指定してください。
ツールを拡張する
疎通確認ができたら、実用的なツールを追加していきます。
自作ツールの追加
tools/ ディレクトリに .py ファイルを置き、register_tools(mcp) 関数を実装します。
# tools/wordpress.py
import os
import requests
def register_tools(mcp):
@mcp.tool()
def wp_create_post(title: str, content: str, status: str = "draft") -> str:
"""WordPressに新規投稿を作成する"""
resp = requests.post(
f"{os.environ['WP_URL']}/wp-json/wp/v2/posts",
auth=(os.environ['WP_USER'], os.environ['WP_APP_PASSWORD']),
json={"title": title, "content": content, "status": status}
)
data = resp.json()
return f"投稿作成: ID={data['id']}, URL={data['link']}"
tools.yaml で個別に無効化もできます。未記載のモジュールはデフォルト有効です。
# tools.yaml
# 無効にしたいモジュールだけ記載
example: false
既存MCPサーバーをプロキシで集約
自作ツール以外にも、既存のstdio MCPサーバーを servers.yaml に書くだけで丸ごと取り込めます。
servers:
- name: github
command: "npx @modelcontextprotocol/server-github"
env:
GITHUB_TOKEN: "${GITHUB_TOKEN}"
- name: my-local-server
command: "uv run mcp run ../my-server/server.py:mcp"
こうすると、Claudeから見たときに全ツールが1つのリモートMCPサーバーに集約されます。PC用に作ったMCPサーバーのコードを一切書き換えずにモバイルから使えるようになります。
運用のコツ
起動スクリプト
Windows側のPowerShellスクリプトにまとめておくと、PC再起動後もワンコマンドで復旧できます。
# start-mcp.ps1
tailscale funnel --bg 8321
wsl -d Ubuntu -- bash -c "cd ~/mcp-remote-host && uv run mcp run server.py:mcp --transport streamable-http"
タスクスケジューラに登録すれば、Windowsログオン時に自動起動も可能です。
セキュリティについて
Tailscale FunnelのURLは *.ts.net のサブドメインで、外部から推測するのは困難です。個人用途であれば認証なし(authless)でも実用上問題ありません。
より厳密にしたい場合は、サーバー側でAPIキー認証を追加するか、Tailscale ACLで接続を制限できます。公開する場合はOAuth 2.1の導入を検討してください。
まとめ
今回のポイントをまとめます。
- Claudeモバイル/Webは、2025年7月からリモートMCPサーバーに対応済み(Pro/Max/Team/Enterprise)
- Tailscale Funnelを使えば、自宅PCのローカルサーバーをHTTPSで公開できる(証明書自動、ポート開放不要、URL固定、無料)
- FastMCPのコードはそのまま動く。WSL上で
--transport streamable-httpで起動するだけ - 既存のstdio MCPサーバーもプロキシで集約できる。コード書き換え不要
- セットアップは1時間程度。一度設定すればスマホから自宅PCのツールを自由に使える
以前の記事でClaude CodeからWordPressに投稿する仕組みを作りましたが、今回はClaude Codeすら不要になりました。スマホの普通のチャット画面から「ブログ記事を下書きして」と言うだけで投稿できます。
MCP対応のツールを作り溜めている方は、ぜひ試してみてください。

コメント