portview について
portview は、Linux・macOS・Windows でポートと、それを使用しているプロセスを表示し、競合やコネクションリークを診断するコマンドラインツールです。Docker、SSH 経由のリモートホスト、インタラクティブな TUI に対応しています。コーディングエージェントがポートを照会できる MCP サーバーも含みます。
主な機能
- 01プロセス名・コマンド・メモリ・稼働時間付きのポート一覧
- 02競合・ワイルドカード公開・接続の蓄積を確認する doctor
- 03エージェントレスモードを含む SSH 経由のリモートホスト検査
- 04Docker コンテナのポート表示とライブ更新の TUI
- 05JSON 出力と CI 向け GitHub Action
活用シーン
- 01開発サーバー起動時にポートを占有しているプロセスを特定する
- 02doctor の診断結果に応じて CI ワークフローを失敗させる
- 03コーディングエージェントにポートを照会させ、変化を比較させる
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
portview
portview は、Linux、macOS、Windows でポートと、それを使用しているプロセスを一覧表示します。 プロセス名、コマンド、メモリ使用量、稼働時間を表示します。ポートを調査したり、 そのプロセスを停止したり、インタラクティブなターミナル UI で変化を監視したりできます。
Docker、SSH 経由のリモートホスト、 コーディングエージェント向けの MCP サーバーにも対応しています。
インストール
Homebrew:
brew install mapika/tap/portview
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/mapika/portview/main/install.sh | sh
Windows(PowerShell):
irm https://raw.githubusercontent.com/mapika/portview/main/install.ps1 | iex
または cargo install portview を使用するか、
リリースからバイナリをダウンロードしてください。
機能
portview # list all listening ports
portview 3000 # inspect port 3000 in detail
portview node # find ports by process name
portview watch # interactive TUI with live refresh
portview watch --docker # TUI with Docker containers as rows
portview kill 3000 --force # terminate the process using port 3000
portview doctor # diagnose port conflicts and issues
portview ssh user@server # inspect ports on a remote host
portview ssh user@server watch # remote TUI over SSH
portview ssh user@server --agentless # no portview needed on the remote
portview mcp # run as an MCP server for AI agents
特長
スキャン
$ portview
╭──────┬───────┬─────┬──────────────┬──────┬────────────┬────────┬────────┬────────────────────────────╮
│ PORT │ PROTO │ PID │ ADDR │ USER │ PROCESS │ UPTIME │ MEM │ COMMAND │
├──────┼───────┼─────┼──────────────┼──────┼────────────┼────────┼────────┼────────────────────────────┤
│ 3000 │ TCP │ 8 │ 127.0.0.1 │ root │ node │ 7s │ 44 MB │ node /opt/app/web.js │
│ 5000 │ TCP │ 11 │ 127.0.0.1 │ root │ python3.12 │ 7s │ 18 MB │ python3 /opt/app/worker.py │
│ 6380 │ TCP │ 12 │ 127.0.0.1 │ root │ node │ 7s │ 1.2 GB │ node /opt/app/cache.js │
│ 7000 │ TCP │ 10 │ 127.0.0.1 │ root │ node │ 7s │ 45 MB │ node /opt/app/ingest.js │
│ 8080 │ TCP │ 9 │ 127.0.0.1 │ root │ node │ 7s │ 44 MB │ node /opt/app/api.js │
╰──────┴───────┴─────┴──────────────┴──────┴────────────┴────────┴────────┴────────────────────────────╯
--all はリスニングしていない接続も含め、接続ごとに 1 行で表示します。
--wide はコマンド全体を表示します。--json はスクリプト用に JSON 出力を生成します。
所有者を特定できないポートも一覧に表示され、値を埋められない列には - が表示されます。これは、sudo を使わない状態で別のユーザーのプロセスを調べる場合や、プロセスが終了した後も残る TIME_WAIT などのソケットで発生します。
以下の scan、doctor、MCP の例は、分離された名前空間内で
demo/record.shにより取得した実際の出力です。そのため、ユーザーはrootで、パスは/opt/appになっています。Docker の例は、実行中のデーモンが必要なため、説明用のものです。
MCP サーバー(AI エージェント向け)
portview mcp は、stdio を使用して
Model Context Protocol 経由でポートの照会、診断、プロセスの終了を行います。
Claude Code に登録するには、次のようにします。
claude mcp add portview -- portview mcp
または、手動で設定します。
{
"mcpServers": {
"portview": {
"command": "portview",
"args": ["mcp"]
}
}
}
| ツール | 機能 |
|---|---|
list_ports | 利用可能なプロセスの詳細とともに、リスニング中のポートを一覧表示します |
inspect_port | プロセスの作業ディレクトリや子孫プロセスを含め、ポートを調査します |
find_process | プロセス名またはコマンドの部分文字列からポートを検索します |
doctor | 競合、ワイルドカードによる公開、接続の蓄積、メモリ使用量の超過を確認します |
diff_ports | 基準状態から開いた、閉じた、または所有者が変わったポートを報告します |
kill_port | ポートを使用しているプロセスを終了します。dry_run は対象を事前に表示します。クライアントに対して破壊的な操作としてマークされています |
MCP サーバーは portview のバイナリに含まれています。kill_port ツールを無効にするには、
--read-only を指定します。
portview mcp --read-only
MCP Registry には、
mcp-name: io.github.Mapika/portview として登録されています。
ウォッチモード(インタラクティブ TUI)
portview watch # live-refresh every 1s
portview watch --docker # include Docker containers
portview watch --sort mem # sort by memory on launch
| キー | 操作 |
|---|---|
j/k、↑/↓ | 行を移動します |
Enter | ポートを調査します(コマンド全体、cwd、子プロセス、接続) |
d/D | プロセスを終了するか、Docker コンテナを管理します |
/ | すべての列を対象にフィルターします |
←/→、r | ソート列を切り替え、順序を反転します |
t | プロセスツリー表示を切り替えます |
a | すべて/リスニング中のみを切り替えます |
q | 終了します |
ツリー表示(t):子プロセスを親プロセスの下にまとめて表示します。
詳細表示(Enter):折り返しのないコマンド全体、作業ディレクトリ、ポートを含む子プロセスの一覧、開いている接続(--all モードの場合)を表示します。
Doctor
portview doctor は、ポートの競合、ワイルドカードバインド、接続の蓄積、高いメモリ使用量をチェックします:
$ portview doctor
✓ No port conflicts
✓ No wildcard exposure issues
! Port 7000 has 16 CLOSE_WAIT connections — possible connection leak
! node (PID 12) is listening on port 6380 and using 1.2 GB of memory
2 warnings found
| チェック項目 | フラグ |
|---|---|
| ポートの競合 | 同じポートに複数の PID がバインドされている |
| ワイルドカードへの公開 | データベース(postgres、redis、mysql、mongod、…)が 0.0.0.0 でリッスンしている |
| Docker ホストとの競合 | ホストがすでに使用しているポートをコンテナが公開している |
| 接続の蓄積 | 1 つのポートで TIME_WAIT または CLOSE_WAIT 接続数が多い状態。これらだけではリークがあるとは判断できません |
| 高いメモリ使用量 | リッスン中のプロセスが 1 GB を超える常駐メモリを使用している |
Docker は自動検出されます。スクリプトで使う場合は portview doctor --json を実行してください(エラー時の終了コードは 1 です)。
CI での使用
GitHub Action は doctor を実行し、エラーまたは警告がある場合にワークフローを失敗させることができます:
- uses: mapika/portview@v2
with:
fail-on: error # error | warning | never
各検出結果を実行画面にインラインで注釈し、サマリーテーブルを作成します。また、findings(JSON)、count、errors、warnings をステップ出力として公開します:
- uses: mapika/portview@v2
id: doctor
with:
fail-on: never
- run: echo '${{ steps.doctor.outputs.findings }}' | jq .
portview がすでに PATH にある場合は、install: false を設定してください。Linux と macOS のランナーに対応しています。
SSH リモートモード
SSH 経由でリモートホスト上のポートを調査します:
portview ssh user@server # one-shot scan
portview ssh user@server watch # full interactive TUI
portview ssh user@server doctor # remote diagnostics
portview ssh user@server 3000 # inspect a remote port
portview ssh user@server --ssh-opt "-p 2222" # custom SSH port
リモート TUI での終了操作は SSH 経由で転送されます。
リモートホストに portview がインストールされていない場合、SSH モードは ss と ps、または ss が利用できない場合は lsof と ps を使ってデータを収集します。これには、リモートホスト上の POSIX シェルと収集ツールが必要です。
$ portview ssh user@server
portview not found on user@server — falling back to agentless mode (ss + ps over SSH).
╭──────┬───────┬─────┬──────────────┬──────┬─────────┬────────┬───────┬──────────────────────╮
│ PORT │ PROTO │ PID │ ADDR │ USER │ PROCESS │ UPTIME │ MEM │ COMMAND │
├──────┼───────┼─────┼──────────────┼──────┼─────────┼────────┼───────┼──────────────────────┤
│ 3000 │ TCP │ 6 │ 127.0.0.1 │ root │ node │ 3s │ 45 MB │ node /opt/app/web.js │
│ 8080 │ TCP │ 7 │ 127.0.0.1 │ root │ node │ 3s │ 45 MB │ node /opt/app/api.js │
╰──────┴───────┴─────┴──────────────┴──────┴─────────┴────────┴───────┴──────────────────────╯
リモートホストに portview がインストールされている場合でも、この方法でデータを収集するには --agentless を使用してください。スキャン、ポートの調査、プロセス検索、診断、監視モードに対応しています。
収集したデータで診断を実行します:
portview ssh user@server doctor --agentless
ローカルモードと同じ診断チェックを使用します。エージェントレスモードではリモートコンテナを照会しないため、Docker チェックはスキップされます。
リモートポートを監視します。TUI ではプロセスを終了できます:
portview ssh user@server watch --agentless
監視モードでは、単一の永続的な SSH 接続を通じて更新を収集します。
Docker 連携
--docker を使うと、Docker コンテナが公開しているポートも含められます:
$ portview --docker
╭──────┬───────┬───────┬──────────────┬────────┬──────────┬────────┬────────┬────────────────────────────╮
│ PORT │ PROTO │ PID │ ADDR │ USER │ PROCESS │ UPTIME │ MEM │ COMMAND │
├──────┼───────┼───────┼──────────────┼────────┼──────────┼────────┼────────┼────────────────────────────┤
│ 3000 │ TCP │ 48291 │ 127.0.0.1 │ mark │ node │ 3h 12m │ 248 MB │ next dev [docker:web] │
│ 8080 │ TCP │ - │ 0.0.0.0 │ docker │ pv-nginx │ - │ - │ nginx:alpine :8080->80/tcp │
╰──────┴───────┴───────┴──────────────┴────────┴──────────┴────────┴────────┴────────────────────────────╯
コンテナのみの行にはホストプロセスがないため、PID、UPTIME、MEM は - と表示されます。
監視モードで Docker の行にカーソルを合わせて d を押すと、コンテナの停止または再起動、あるいはログの表示ができます。
JSON 出力
portview --json # pipe to jq, scripts, dashboards
portview --docker --json # includes Docker ownership data
portview watch --json # streaming JSON, one array per tick
portview doctor --json # machine-readable diagnostics
カスタムカラー
PORTVIEW_COLORS="port=red,pid=magenta,command=bright_cyan" portview
列:port、proto、pid、user、process、uptime、mem、command。無効にするには --no-color を使用します。
仕組み
ローカルのポートおよびプロセスデータは、OS のインターフェースから取得します:
| フィールド | Linux | macOS | Windows |
|---|---|---|---|
| ポート | /proc/net/tcp{,6}、udp{,6} | proc_pidfdinfo | GetExtendedTcp/UdpTable |
| PID | /proc/*/fd/ 経由で inode から PID を取得 | proc_listpids | ソケットテーブルに含まれる |
| プロセス | /proc/<pid>/exe | proc_pidpath | QueryFullProcessImageNameW |
| メモリ | /proc/<pid>/status VmRSS | proc_pidinfo | K32GetProcessMemoryInfo |
| 起動時間 | /proc/<pid>/stat | proc_pidinfo | GetProcessTimes |
Linux では、portview は /proc/<pid>/exe から実行ファイル名を読み取ります。
/proc/<pid>/comm のスレッド名はランタイムによって変更されることがあり、15 バイトに制限されています。
Docker 連携では docker CLI を使用します。SSH モードでは、システムの ssh
クライアントを使って、リモートホスト上で portview またはエージェントレスの収集ツールを実行します。
MCP モードでは、stdin/stdout 上で改行区切りの JSON-RPC 2.0 を使用します。
ソースからビルドする
git clone https://github.com/mapika/portview
cd portview
cargo build --release
Rust 1.85 以降(edition 2024)が必要です。シェル補完と man ページはビルド時に生成されます。
リポジトリには Dockerfile が含まれています。コンテナからホストを調査するには、
ホストのネットワーク名前空間と PID 名前空間を共有してください:
docker run --rm -i --network host --pid host portview
コントリビュート
開発環境のセットアップとガイドラインについては CONTRIBUTING.md を、録画を再生成する方法については demo/README.md を参照してください。
変更は、ご自身の環境だけでなく、3 つすべてのプラットフォームで型チェックが通る必要があります:
cargo check --target aarch64-apple-darwin
cargo check --target x86_64-pc-windows-msvc
制限事項
- Linux: 他のユーザーのポートも一覧表示されますが、プロセス名の特定には
sudoが必要です(/proc/<pid>/fd/を読み取るため)。帰属先を特定できない行は非表示にせず、PID、ユーザー、プロセス、コマンドに-が表示されます。 - macOS:
sudoを使わない場合、他のユーザーのポートは一覧表示されません。ソケットはproc_pidfdinfoを使ってプロセスごとに列挙されるため、開けないプロセスは列挙対象に含まれません。同じ理由から、doctor は TIME_WAIT の集中を検出できません。CLOSE_WAIT は通常どおり検出されます。 - Windows: アクセスできないシステムプロセスが所有するポートは、PID とともに一覧表示されますが、名前とユーザーには
-が表示されます。Kill は常に強制終了します。詳細をすべて表示するには、管理者として実行してください。 - Docker:
dockerCLI とデーモンへのアクセスが必要です。 - SSH: リモート側に portview がない場合、すべてのコマンドはエージェントレス収集に切り替わります。Linux では
ssとpsを使用し、ssがない場合はlsofを使用します。リモート側には、これらのいずれかと POSIX シェルが必要です。エージェントレス収集ではリモート側の Docker を確認できないため、そのチェックは合格ではなくスキップとして報告されます。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。