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?) | 按包提取任意字段,以表格形式呈现 |
实用工具
| 工具 | 描述 |
|---|
validate(alias, filter?, field?) | 验证显示过滤器和/或字段名称 |
complete(alias, field?, pref?) | 按前缀自动补全字段或首选项名称 |
get_preference(alias, preference?) | 读取解析器首选项 |
set_preference(alias, name, value) | 为本次会话设置解析器首选项 |
set_frame_comment(alias, frame, comment) | 为帧添加注释(会话作用域) |
流量结构
| 工具 | 描述 |
|---|
protocol_hierarchy(alias, filter?) | 带帧数/字节数的嵌套协议树 |
io_stats(alias, interval_ms?, filter?) | 每时间间隔的帧数和字节数 |
iograph(alias, graphs, interval_ms?, filters?) | 多线流量图;支持 packets、bytes、bits、sum:<field>、avg:<field>、min:<field>、max:<field>、load:<field>、frames:<field> |
follow_stream(alias, protocol, filter) | 重组一个流(tcp、udp、tls、http、http2、quic、sip、dccp、websocket) |
对话与拓扑
| 工具 | 描述 |
|---|
conversations(alias, type?, sort_by?) | 对话表——每对端之间的字节数/帧数 |
endpoints(alias, type?, sort_by?) | 端点表——每个主机的发送/接收量 |
两者支持的层类型包括:tcp、udp、ip、ipv6、eth、sctp、dccp、mptcp、wifi、bluetooth、zigbee、fc、fddi、usb 等。
协议统计
| 工具 | 描述 |
|---|
expert_info(alias, filter?) | 每帧异常检测——错误、警告、备注、聊天 |
protocol_stats(alias, protocol) | dns、http、http_requests、http_server、sip、dhcp、h225、http2、rtsp 的聚合统计 |
service_response_time(alias, protocol) | smb、smb2、snmp、ldap、diameter、rpc、gtp 等的请求/响应延迟 |
response_time_delay(alias, protocol) | radius、h225_ras、megaco、mgcp 的往返延迟 |
sequence_diagram(alias, type?) | tcp、icmp、icmpv6、any 的流程示意图数据 |
媒体与 VoIP
| 工具 | 描述 |
|---|
voip_calls(alias, filter?) | SIP/H.323 通话列表,含状态和参与者 |
rtp_streams(alias, stream_spec?) | RTP 流清单;传递 stream_spec 可获取每流的抖动/丢包 |
multicast_streams(alias, filter?) | UDP 多播流统计 |
导出与对象
| 工具 | 描述 |
|---|
export_objects(alias, type?) | 列出可提取的对象(http、imf、smb、tftp、dicom、ftp-data) |
download_object(alias, token) | 下载对象、TLS 会话密钥(ssl-secrets)或 RTP 音频(rtp:<spec>),以 base64 格式返回 |
逃生舱
| 工具 | 描述 |
|---|
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 子进程。会话相互隔离——不同别名的并发查询互不阻塞。