スマホのClaudeから自宅PCのMCPサーバーを呼び出す ── WSL + Tailscale Funnelで実現

目次

はじめに

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フレームワーク: FastMCPmcp[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で以下を有効にする必要があります。

  1. DNS → MagicDNS を有効化
  2. DNS → HTTPS Certificates を有効化
  3. 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を登録する

  1. PCブラウザで claude.ai にログイン
  2. Settings → Connectors → Add Custom Connector
  3. URL: https://your-machine.your-tailnet.ts.net/mcp
  4. 名前: 任意(例: mcp-remote-host
  5. Advanced settings: 空白のまま(認証なし)
  6. 「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からサーバーに到達できない場合は、.wslconfiglocalhostForwarding=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対応のツールを作り溜めている方は、ぜひ試してみてください。

参考リンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次