LocalCan
公式AIエージェントにlocalhost用の公開URL(トンネル)、ライブHTTPトラフィックの検査、スナップショット公開、アクセス制御を提供します。
LocalCan MCPで何ができますか?
- キャプチャしたトラフィックを検査 — アシスタントに
list_trafficで最近のやり取りを一覧表示させたり、get_exchangeで完全なリクエスト/レスポンスをmarkdown、curl、またはHAR形式で取得させたりできます。 - パブリックトンネルを管理 —
create_public_urlやpause_public_urlなどのツールを使ってPublic URLの作成、一時停止、再開、削除ができ、カスタムリクエストヘッダーの設定も可能です。 - スナップショットを公開・更新 —
publish_snapshotでフォルダを共有可能なスナップショットとしてデプロイし、後からupdate_snapshotで更新してプレビューリンクを最新の状態に保てます。 - アクセスとコメントを制御 —
set_passwordでURLをパスワード保護し、list_commentsでコメントスレッドを確認し、アシスタントから直接返信や解決ができます。 - トンネルとサービスの状態を確認 —
get_statusでキャプチャが実行中かどうかを確認したり、list_public_urlsでどのリンクが稼働中、一時停止中、またはスナップショットを配信中かを確認できます。
ドキュメント
MCPサーバー
LocalCanのModel Context Protocolサーバーを実行し、MCPホストに接続する方法と、ツールとスイッチの完全なリファレンス。
localcan mcp は、stdio上でModel Context Protocolサーバーを実行します。MCPホスト(Claude Code、Codex、Cursor、Claude Desktopなど)がこれを起動し、LocalCanのツールを呼び出して、キャプチャしたトラフィックの読み取り、Public URL(トンネル)の管理、スナップショットの公開を行います。ツールがデータを返すにはLocalCanが実行されている必要があるため、デスクトップアプリを開くか、最初に localcan start -d を実行してください。
ツール
サーバーは26のツールを公開しています。読み取りはそのまま動作します。変更を行う16のツールには書き込みアクセスが必要で、これはデフォルトでオフになっています(下記のスイッチを参照)。Public URLの作成または追加にはアクティブなライセンスが必要です。スナップショットの公開とURLのパスワード保護にはサブスクリプションプランが必要なため、永続ライセンスではPublic URLを開くことはできても、これらの操作は拒否されます。ライセンスがない場合、制限されたツールは明確なアクティベーションメッセージを返しますが、既存のURLの一時停止、再開、削除は引き続き機能します。
トラフィック:
| ツール | 機能 | パラメータ |
|---|---|---|
get_status | キャプチャがオンかどうかと、バッファリングされたトラフィックの量を報告します。 | なし |
enable_capture | キャプチャをオンにします。キャプチャはデフォルトでオフで、デーモンが再起動するとリセットされます。 | なし |
list_traffic | 最近の交換を新しい順に一覧表示します。 | last(デフォルト20)、host 部分文字列、project ID、method、status(正確なコードまたは 5xx のようなクラス) |
get_exchange | IDで1つの交換を返します。 | id 必須(完全なIDまたは一意のプレフィックス)、format markdown、curl、http、har、jsonのいずれか(デフォルトmarkdown)、include_response(デフォルトtrue) |
交換とは、LocalCanがバックエンドに転送したリクエストであり、クライアントの元のリクエストのバイト単位のコピーではありません。データモデルについては トラフィック を参照してください。
Public URL:
| ツール | 機能 | パラメータ |
|---|---|---|
list_services | LocalCanが提供するサービスを一覧表示します。各サービスには <project>/<service> ハンドル、ローカルターゲット、エンドポイント数があります。 | なし |
list_public_urls | 一時停止中のものを含むPublic URLを一覧表示し、各URLの状態(アクティブ、一時停止、エラー、起動中、非アクティブ)と提供内容(ライブ、スナップショット、なし)を表示します。各行には access も含まれます:なし、パスワード、リンク、またはチームポリシー名。スナップショットを提供する一時停止中のURLは、状態が「一時停止」で「スナップショットを提供中」と表示されるため、「リンクは稼働していますか?」という質問には状態ではなく提供内容から答えてください。 | なし |
get_public_url_status | 1つのPublic URLの状態、提供内容(ライブ、スナップショット、なし)、および access 保護を報告します。リストと同じ語彙に加えて、ローカルターゲットとリクエストヘッダールールも含まれます。 | url 必須 |
create_public_url | 新しいプロジェクトのローカルポート用にPublic URLを作成し、割り当てられたアドレス(例:my-app-12.localcan.dev)を返します。数秒かかります。トンネルが拒否された場合(プランのPublic URL制限など)やタイムアウトした場合は、試行はロールバックされ、何も残りません。マシンがオフラインになっても到達可能なリンクが必要な場合は、add_snapshot でスナップショットを追加してください。仮想ホストとして提供されるアプリの場合は、host と headers のHostルールを渡します(下記参照)。 | port 必須、name オプション(アドレスを形成)、protocol httpまたはtcp(デフォルトhttp)、host オプション(デフォルトlocalhost)、headers オプション(リクエストヘッダールール、各 {name, value, mode?, enabled?}) |
add_public_url | すでに設定されているサービスにPublic URLを追加します。プロトコルはサービスのターゲットに従うため、tcp:// ターゲットにはTCPトンネルが取得されます。作成時と同じように失敗時はロールバックされます。 | service ハンドル必須 |
pause_public_url | アドレスを維持したままPublic URLをオフラインにし、後で再開できるようにします。生成された *.localcan.dev アドレスは、一時停止中7日間予約されます。カスタムドメインは期限切れになりません。 | url 必須 |
resume_public_url | 一時停止中のPublic URLを同じアドレスでオンラインに戻します。 | url 必須 |
remove_public_url | Public URLを完全に削除します。生成されたアドレスは解放され、カスタムドメインは引き続きあなたのもので、再度追加できます。サービスの最後のエンドポイントを削除すると、空になったサービスとプロジェクトも削除されます。アドレスを維持しながらスナップショットの提供を停止するには、remove_snapshot を使用してください。破壊的とマークされているため、ホストは通常確認を求めます。 | url 必須 |
set_public_url_headers | Public URLのリクエストヘッダールールを置き換えます。これは、LocalCanがアプリに転送する前に設定するヘッダーです。完全なリストを渡します。空のリストでクリアされます。get_public_url_status は同じ形式でルールを報告するため(mode 設定、追加、または削除、および enabled)、そこで読み取ったリストを編集して書き戻すことができます。 | url と headers 必須 |
仮想ホストとして提供されるアプリ(myapp.test のLaravel HerdまたはValetサイト、nginxの server_name)は、自身のホスト名を認識する必要があり、LocalCanはデフォルトでパブリックホスト名を転送します。host とHostルール(headers: [{"name": "Host", "value": "{{target_host}}"}])を渡すと、アプリは正しいサイトを提供します。値のテンプレートは ヘッダー のものです。
スナップショット(スナップショット を参照):
| ツール | 機能 | パラメータ |
|---|---|---|
publish_snapshot | フォルダを新しいPublic URLのスナップショットとして公開し、マシンがオフラインになっても到達可能にします。可能な場合はビルド済みの静的出力を指定し、LocalCanにビルドさせる場合はプロジェクトルートを指定します(依存関係はすでにインストールされている必要があります)。新しいアドレスを返します。常に新しいURLを作成するため、既存のプレビューを更新するには update_snapshot を使用してください。 | path 必須(絶対パス)、name オプション(アドレスを形成) |
add_snapshot | 既存のPublic URLにスナップショットを追加し、既存のリンクがオフラインでも提供を続けられるようにします。URLにすでにスナップショットがある場合は update_snapshot を指します。 | url と path 必須 |
update_snapshot | Public URLのスナップショットを再公開します。path を省略すると同じソースから再ビルドされ、別のフォルダを指定するには渡します。URLにスナップショットがない場合は add_snapshot を指します。 | url 必須、path オプション |
remove_snapshot | Public URLからスナップショットを削除します。URLは予約されたままで、トンネルが稼働している間はライブ提供を続けます。破壊的とマークされています。 | url 必須 |
get_snapshot_status | Public URLのスナップショットを報告します:ソースフォルダ、公開日時、ソースがそれ以降変更されたか(古いか)、URLが現在ライブまたはスナップショットのどちらを提供しているか。また、レビューコメント(状態と数)と、コメントがオンになった後のスナップショットのバージョン番号も含まれます。 | url 必須 |
アクセス制御(アクセス制御 を参照):
| ツール | 機能 | パラメータ |
|---|---|---|
set_password | Public URLをパスワードで保護し、パスワードを持っている人だけが開けるようにします。LocalCanのサーバーで強制されるため、そのURLのスナップショットもカバーします。パスワードを渡さない場合は強力なパスワードを生成して返すので、共有できます。サブスクリプションプランが必要です。 | url 必須、password オプション(省略すると生成) |
clear_access | パスワード保護を削除し、URLを再び公開します。URLやそのスナップショットは削除しません。破壊的とマークされているため、ホストは通常確認を求めます。 | url 必須 |
get_access_status | Public URLの保護を報告し、パスワードで保護されている場合は現在のパスワードを返します。パスワードは list_public_urls では決して返されず、ここでのみ返されます。 | url 必須 |
コメント(レビュー担当者がスナップショットに残すレビューコメント、コメント を参照):
| ツール | 機能 | パラメータ |
|---|---|---|
list_comments | Public URLのスナップショットのコメントスレッドとその返信を一覧表示します。各スレッドには、ページパス、アンカー(CSSセレクタとその要素内のピンの位置)、レビュー担当者のビューポートとブラウザ、およびコメントが残されたスナップショットバージョンが含まれます。既読にすることはありません。 | url 必須、status open、resolved、またはall(デフォルトopen)、page パス、version 数 |
reply_comment | アカウント名でスレッドに返信を投稿します。スレッドのレビュー担当者は、チームの返信通知がオフでない限り、または購読を解除していない限り、メールで受け取ります。返信のみで、新しいスレッドはページにピン留めされます。 | url、comment_id、body 必須 |
resolve_comment | スレッドを解決済みとしてマークします(返信を含む)。 | url と comment_id 必須 |
reopen_comment | 解決済みのスレッドを再開します。 | url と comment_id 必須 |
set_comments | スナップショットのコメントを切り替えます:オン、一時停止(既存のスレッドは読み取り可能、新しいものは不可)、またはオフ。保護されたURLとサブスクリプションプランが必要です。 | url と state 必須 |
フィードバックループ
ツールは、エージェントが単独で実行できる1つのループに連鎖します:list_comments で開いているスレッドを読み、ソースを編集し、update_snapshot で新しいバージョンを公開し、次にスレッドごとに reply_comment と resolve_comment を実行します。コメントは新しいバージョンに引き継がれるため、レビュー担当者は同じピンで返信を確認できます。サーバーはこれをエージェントに自身で伝えます。ホストがエージェントのプロンプトに追加するMCP命令は、ループ、レビューラウンドのセットアップ(publish_snapshot、set_password、set_comments)、および仮想ホストのレシピを説明しています。エージェントができない2つのこと:スレッドを開始すること(レビュー担当者がページにピン留めします)と、スレッドを既読にマークすること(未読はアプリ内の自分の受信トレイの状態です)。
エージェントの接続
接続方法はエージェントの実行方法によって異なります。ターミナルエージェント(Claude Code、Codex)はシェルのPATHを継承するため、素の localcan コマンドで機能します。GUIアプリ(Cursor、Claude Desktop、VS Codeなど)はシェルのPATHを読み込まないため、バイナリへの絶対パスが必要です(例:/Users/you/.localcan/bin/localcan)。デスクトップアプリの設定では、正しいパスが入力された既製の設定をコピーできます。これはWindowsでも信頼できる方法です。
Claude Code
claude mcp add --scope user localcan -- localcan mcp
--scope user フラグは、サーバーをすべてのプロジェクトに登録します。これを省略すると、現在のプロジェクトのみに登録されます。
Codex
codex mcp add localcan -- localcan mcp
これにより、サーバーが ~/.codex/config.toml に書き込まれます。CodexデスクトップアプリまたはIDE拡張機能の場合は、localcan の代わりに絶対パスを渡してください。
Cursor、Claude Desktop、Windsurf
これらは同じ mcpServers 形式を共有します:
{
"mcpServers": {
"localcan": {
"command": "/Users/you/.localcan/bin/localcan",
"args": ["mcp"]
}
}
}
適切なファイルに追加してから再読み込みします:
- Cursor:
~/.cursor/mcp.json、次に設定でサーバーを有効にします。 - Claude Desktop:
claude_desktop_config.json(設定、開発者、設定の編集)、次に終了して再起動します。 - Windsurf:
~/.codeium/windsurf/mcp_config.json、次にMCPパネルを更新します。
VS Code
VS Code(Copilotエージェントモード)は、明示的な型を持つ servers キーを使用します。これをワークスペースの .vscode/mcp.json に追加します:
{
"servers": {
"localcan": {
"type": "stdio",
"command": "/Users/you/.localcan/bin/localcan",
"args": ["mcp"]
}
}
}
同じサーバーオブジェクトで code --add-mcp を実行することもできます。
Zed
Zedは settings.json で context_servers を使用します:
{
"context_servers": {
"localcan": {
"source": "custom",
"command": "/Users/you/.localcan/bin/localcan",
"args": ["mcp"]
}
}
}
エージェントパネルの設定から追加することもできます。
エージェントアクセス、編集、書き込みアクセス
これら3つはすべて、デスクトップアプリの設定(「AIエージェント(MCP)」セクション)またはターミナルから制御されます:エージェントアクセスには localcan mcp enable / disable、編集には localcan mcp redact <on|off>、書き込みアクセスには localcan mcp access <read_only|read_write>、現在の状態を確認するには localcan mcp status を使用します。
- エージェントアクセスはデフォルトでオンです。オフにすると、エージェントがLocalCanを一切使用できなくなります。サーバーは起動したままですが、オンに戻すまで、すべてのツールは明確な「アクセスが無効です」というメッセージを返します。
- 編集(Redaction)はエージェントに対してデフォルトでオンです。機密ヘッダー(Authorization、クッキー、APIキー)はツールの応答から削除されます。URLと本文は編集されません。オフにすると、自分のエージェントが生の値を受け取れるようになります。
- 書き込みアクセスはデフォルトでオフです。読み取りはオフでも機能しますが、書き込みツールは、アプリ内(「エージェントがPublic URLを作成・変更することを許可」)または
localcan mcp access read_writeでオンにするまで、明確な読み取り専用メッセージを返します。エージェントアクセスをオンにしても書き込みアクセスは付与されません。これらは別々のスイッチです。すべての書き込み呼び出しはサーバーの診断出力に記録され、ホストがそれをキャプチャするため、エージェントが何を変更したかの記録が残ります。set_passwordに渡されたパスワードは、そのログではマスクされます。
ツールが拒否する場合
- すべてのツールはデーモン接続メッセージでエラーになります:LocalCanが実行されていません。デスクトップアプリを開くか、
localcan start -dを実行してください。 list_trafficは何も返しません:キャプチャがオフです(デフォルトでオフで、デーモンが再起動するとリセットされます)。localcan traffic enableを実行するか、エージェントにenable_captureを呼び出させてください。- 「MCPアクセスが無効です」:エージェントアクセスがオフになっています。
localcan mcp enableを実行するか、設定のトグルを切り替えてください。 - 「MCPは読み取り専用です」:ツールが何かを変更し、書き込みアクセスがオフです。
localcan mcp access read_writeを実行するか、設定のトグルをオンにしてください。 - 「Public URLにはライセンスが必要です」:Public URLの作成と追加にはアクティブなライセンスが必要です。アプリ内でアクティベートするか、
localcan license activate <key>でアクティベートしてください。 - 「サブスクリプションプランが必要です」:スナップショットとアクセス制御はサブスクリプション限定です。永続ライセンスはPublic URLを開けますが、スナップショットの公開やパスワード設定はできません。ダッシュボードからサブスクライブして、再試行してください。
- 「すでにスナップショットがあります」または「まだスナップショットがありません」:メッセージで指定されたツールを使用してください。
add_snapshotはスナップショットのないURLにスナップショットを添付し、update_snapshotはすでにあるものを更新します。 - 「スナップショットの上限に達しました」:プランでは、同時にスナップショットを提供できるPublic URLの数が制限されています。メッセージにはスロットをすでに使用しているURLがリストされ、新しいものを公開する代わりに
update_snapshotで更新できます。 - 「コメントには保護されたURLが必要です」:
set_commentsがアクセス制御のないURLで呼び出されました。最初にset_passwordを実行してください。 - 「アカウントに表示名がありません」:返信には投稿する名前が必要です。ダッシュボードで設定するか、アプリから所有者として開いた後、スナップショットページで一度返信してください。
- ホストがサーバーを失敗またはツールなしと表示する:GUIアプリがPATH上で
localcanを見つけられません。絶対パスを使用してください。最も簡単なのは、設定の設定コピーを使用することです。