mcpField
P
portview

portview

ローカル
github.com開発ツール612 日前に更新

portview について

portview は、Linux・macOS・Windows でポートと、それを使用しているプロセスを表示し、競合やコネクションリークを診断するコマンドラインツールです。Docker、SSH 経由のリモートホスト、インタラクティブな TUI に対応しています。コーディングエージェントがポートを照会できる MCP サーバーも含みます。

主な機能

  1. 01プロセス名・コマンド・メモリ・稼働時間付きのポート一覧
  2. 02競合・ワイルドカード公開・接続の蓄積を確認する doctor
  3. 03エージェントレスモードを含む SSH 経由のリモートホスト検査
  4. 04Docker コンテナのポート表示とライブ更新の TUI
  5. 05JSON 出力と CI 向け GitHub Action

活用シーン

  1. 01開発サーバー起動時にポートを占有しているプロセスを特定する
  2. 02doctor の診断結果に応じて CI ワークフローを失敗させる
  3. 03コーディングエージェントにポートを照会させ、変化を比較させる

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
cargoportview2.1.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

portview

CI Crates.io License: MIT

portview は、Linux、macOS、Windows でポートと、それを使用しているプロセスを一覧表示します。 プロセス名、コマンド、メモリ使用量、稼働時間を表示します。ポートを調査したり、 そのプロセスを停止したり、インタラクティブなターミナル UI で変化を監視したりできます。

portview のデモ

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 は対象を事前に表示します。クライアントに対して破壊的な操作としてマークされています

portview MCP サーバーのデモ

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 のインターフェースから取得します:

フィールドLinuxmacOSWindows
ポート/proc/net/tcp{,6}、udp{,6}proc_pidfdinfoGetExtendedTcp/UdpTable
PID/proc/*/fd/ 経由で inode から PID を取得proc_listpidsソケットテーブルに含まれる
プロセス/proc/<pid>/exeproc_pidpathQueryFullProcessImageNameW
メモリ/proc/<pid>/status VmRSSproc_pidinfoK32GetProcessMemoryInfo
起動時間/proc/<pid>/statproc_pidinfoGetProcessTimes

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: docker CLI とデーモンへのアクセスが必要です。
  • SSH: リモート側に portview がない場合、すべてのコマンドはエージェントレス収集に切り替わります。Linux では ss と ps を使用し、ss がない場合は lsof を使用します。リモート側には、これらのいずれかと POSIX シェルが必要です。エージェントレス収集ではリモート側の Docker を確認できないため、そのチェックは合格ではなくスキップとして報告されます。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。