SharkMCP
MCP サーバーで、Wireshark のプログラムインターフェースである sharkd を LLM 向けのツールセットとして公開します。PCAP/PCAPNG ファイルを読み込み、自然言語で分析できます。
必要条件
- Python 3.10+
- Wireshark(
sharkd を提供)
インストール
git clone https://github.com/weirdmachine64/sharkmcp.git
cd sharkmcp
pip install -e .
または、インストールせずにリポジトリから直接実行:
uvx --from git+https://github.com/weirdmachine64/sharkmcp sharkmcp
設定
.mcp.json に追加:
{
"mcpServers": {
"sharkmcp": {
"command": "uvx",
"args": ["--from", "git+https://github.com/weirdmachine64/sharkmcp", "sharkmcp"],
"env": {
"SHARKMCP_TIMEOUT": "300"
}
}
}
}
| 環境変数 | デフォルト | 説明 |
|---|
SHARKMCP_SHARKD_BIN | sharkd | sharkd バイナリへのパス |
SHARKMCP_TIMEOUT | 300 | リクエストごとのタイムアウト(秒) |
ツール
読み込まれた各 PCAP には専用の sharkd サブプロセスが割り当てられます。高コストなスキャン(会話、エキスパート情報、オブジェクトエクスポート)の結果はメモリにキャッシュされ、ページ分割された後続の呼び出しでは再スキャンなしで提供されます。
セッション
| ツール | 説明 |
|---|
load_pcap(path, alias?) | PCAP/PCAPNG ファイルを読み込む |
list_pcaps() | 読み込まれたすべての PCAP を一覧表示 |
unload_pcap(alias) | セッションを終了しメモリを解放 |
概要
| ツール | 説明 |
|---|
pcap_summary(alias) | フレーム数、期間、ファイルサイズ、検出されたプロトコル |
server_info(alias) | 利用可能なすべてのタップタイプ、フォロープロトコル、フィールドタイプ |
パケット検査
| ツール | 説明 |
|---|
list_packets(alias, filter?, columns?, refs?) | 表示フィルター付きのページ分割されたフレームリスト |
packet_detail(alias, frame, include_bytes?, include_hidden?) | 1フレームの完全なプロトコルツリー |
extract_fields(alias, fields, filter?) | パケットごとに任意のフィールドをテーブルとして抽出 |
ユーティリティ
トラフィック構造
会話とトポロジ
| ツール | 説明 |
|---|
conversations(alias, type?, sort_by?) | 会話テーブル — ピアペアごとのバイト数/フレーム数 |
endpoints(alias, type?, sort_by?) | エンドポイントテーブル — ホストごとの送受信数 |
サポートされるレイヤタイプ:tcp, udp, ip, ipv6, eth, sctp, dccp, mptcp, wifi, bluetooth, zigbee, fc, fddi, usb など。
プロトコル統計
メディアとVoIP
| ツール | 説明 |
|---|
voip_calls(alias, filter?) | 状態と参加者を含むSIP/H.323コールリスト |
rtp_streams(alias, stream_spec?) | RTPストリーム一覧。stream_spec を指定するとストリームごとのジッタ/損失を表示 |
multicast_streams(alias, filter?) | UDPマルチキャストストリーム統計 |
エクスポートとオブジェクト
脱出ハッチ
| ツール | 説明 |
|---|
tap(alias, specs, filter?, skip?, limit?) | 任意のsharkdタップを直接実行 — 1回のPCAPスキャンで最大16仕様。有効な識別子を見つけるには server_info を使用。 |
例
> load_pcap("/captures/traffic.pcap", alias="traffic")
> protocol_hierarchy("traffic")
> expert_info("traffic", limit=20)
> conversations("traffic", type="tcp", sort_by="bytes")
> extract_fields("traffic", ["dns.qry.name", "dns.a"], filter="dns")
> follow_stream("traffic", "http", "tcp.stream eq 0")
> export_objects("traffic", type="http")
> download_object("traffic", "eo:http_0")
アーキテクチャ
LLM
│ MCP (stdio)
▼
SharkMCP server
│ JSON-RPC 2.0 (stdin/stdout)
├─ sharkd [pcap-1]
├─ sharkd [pcap-2]
└─ sharkd [pcap-N]
読み込まれたPCAPごとに1つの sharkd サブプロセスが存在します。セッションは分離されており、異なるエイリアスに対する同時クエリが互いにブロックされることはありません。