SharkMCP
一个 MCP 服务器,它将 sharkd(Wireshark 的程序化接口)作为一组工具暴露给 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) | 所有可用的 tap 类型、跟踪协议、字段类型 |
封包检查
| 工具 | 描述 |
|---|
list_packets(alias, filter?, columns?, refs?) | 带显示过滤器的分页帧列表 |
packet_detail(alias, frame, include_bytes?, include_hidden?) | 单个帧的完整协议树 |
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 tap——一次 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 对应一个 sharkd 子进程。会话相互隔离——不同别名的并发查询互不阻塞。