Skip to main content
Glama
README.md
# Rainy MCP Server 

一个真正支持 AI IDE(暂不支持Antigravity)的 Rainy MCP 服务器,实现了符合 MCP (Model Context Protocol) 规范的 SSE 传输层。(由 RainyMarks 开发)

## 特性

- **真正的 SSE 实现**:完整实现 MCP SSE 传输规范,支持 EventSource 长连接
- **会话管理**:自动管理客户端会话生命周期,支持超时清理
- **异步工具调用**:工具执行不阻塞主线程,结果通过 SSE 推送
- **23 个强大工具**:覆盖网络抓包、TLS/SSL分析、IPSec/ISAKMP、数字证书解析等场景
- **期末考试专用**:支持 SM2/SM3/SM4 国密分析,TLS握手分析,证书公钥提取等
- **零外部 MCP 依赖**:完全自包含实现,无需安装 `mcp` 包

## 架构

```
┌─────────────────┐     GET /sse      ┌──────────────────┐
│   Cursor IDE    │ ◄───────────────► │  SSE MCP Server  │
│  (MCP Client)   │                   │                  │
│                 │  POST /messages   │  - SessionMgr    │
│                 │ ────────────────► │  - ToolRegistry  │
│                 │                   │  - RainyMCP      │
└─────────────────┘                   └──────────────────┘
                                              │
                                              ▼
                                      ┌──────────────┐
                                      │   tshark     │
                                      │ (Wireshark)  │
                                      └──────────────┘
```

## 前置要求

- Python 3.8+
- Wireshark (需要 `tshark` 命令行工具)

### 安装 Wireshark

**Windows:**
- 下载安装 [Wireshark](https://www.wireshark.org/download.html)
- 确保安装时勾选 "TShark" 组件
- 将 Wireshark 安装目录添加到系统 PATH(如 `C:\Program Files\Wireshark`)

**macOS:**
```bash
brew install wireshark
```

**Linux (Ubuntu/Debian):**
```bash
sudo apt install tshark
```

## 安装

```bash
# 克隆项目
git clone <repository-url>
cd Rainy_mcp

# 安装依赖
pip install -r requirements.txt
```

## 使用方法

### 1. 启动服务器

```bash
python rainy_mcp.py
```

可选参数:
```bash
python rainy_mcp.py --host 127.0.0.1 --port 3000 --tshark-path /path/to/tshark
```

启动成功后会显示:
```
服务器地址: http://127.0.0.1:3000
SSE 端点: http://127.0.0.1:3000/sse
消息端点: http://127.0.0.1:3000/messages
已注册 8 个 Rainy 工具
```

### 2. 配置 Cursor IDE

在项目根目录创建 `mcp.json`(或 `.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "rainy": {
      "url": "http://127.0.0.1:3000/sse"
    }
  }
}
```

### 3. 在 Cursor 中使用

重启 Cursor 或刷新 MCP 连接后,可以直接使用 Rainy 工具:

> "帮我分析这个 pcap 文件中的 HTTP 流量"
>
> "列出所有可用的网络接口"
>
> "提取流量包中的所有 IP 地址"

## 可用工具 (23个)

### 基础工具 (8个)

| 工具名称 | 描述 |
|---------|------|
| `list_interfaces` | 列出所有可用的网络接口 |
| `capture_live` | 实时抓包分析,支持过滤器 |
| `analyze_pcap` | 分析 pcap/pcapng 文件内容 |
| `get_protocols` | 获取 tshark 支持的协议列表 |
| `get_packet_statistics` | 获取数据包统计信息(I/O、会话、端点) |
| `extract_fields` | 提取数据包中的特定字段 |
| `analyze_protocols` | 分析特定协议(HTTP、TCP、DNS 等) |
| `analyze_errors` | 分析网络错误(重传、丢包等) |

### 🎓 期末考试专用工具 (15个)

#### TLS/SSL 分析
| 工具名称 | 描述 | 考试用途 |
|---------|------|---------|
| `analyze_tls_handshake` | TLS 握手完整分析 | 🔥 提取 random 随机数、cipher_suites |
| `extract_certificates` | 提取 TLS 证书 | 🔥 获取签名证书和加密证书 |
| `get_cipher_suites` | 获取加密套件列表 | 🔥 找出四个 cipher suite |

#### IPSec/ISAKMP 分析
| 工具名称 | 描述 | 考试用途 |
|---------|------|---------|
| `analyze_ipsec` | 分析 ESP/AH 协议 | IPSec 协议分析 |
| `analyze_isakmp` | IKE/ISAKMP 分析 | 🔥 主模式前四个包、DH公钥、证书 |

#### 数字证书解析
| 工具名称 | 描述 | 考试用途 |
|---------|------|---------|
| `parse_certificate` | X.509 证书深度解析 | 🔥 序列号、公钥、签名值、SM3摘要 |
| `extract_public_key` | 提取公钥 | 🔥 RSA/SM2(512bit)/ECC 公钥 |
| `get_signature_value` | 获取签名值 | 🔥 ServerKeyExchange签名、SM2签名 |

#### 流重组与协议分析
| 工具名称 | 描述 |
|---------|------|
| `follow_tcp_stream` | TCP 流追踪重组 |
| `follow_udp_stream` | UDP 流追踪重组 |
| `extract_http_objects` | HTTP 对象提取 |
| `analyze_dns_detail` | DNS 深度分析 |

#### 安全检测与智能摘要
| 工具名称 | 描述 |
|---------|------|
| `detect_anomalies` | 异常检测(端口扫描、可疑流量) |
| `generate_traffic_summary` | 智能流量摘要报告 |
| `get_conversation_graph` | IP 通信图谱数据 |

> 输出控制:证书/签名相关工具(如 `analyze_tls_handshake`、`extract_certificates`、`parse_certificate`、`extract_public_key`、`get_signature_value`)新增参数 `full_output`(默认 false),开启后不再截断长字段;流重组工具 `follow_tcp_stream` / `follow_udp_stream` 新增 `max_lines`(默认 2000,<=0 表示不截断)。

## 工具详细说明

### list_interfaces
列出系统上所有可用的网络接口。

```json
// 无需参数
{}
```

### capture_live
实时抓包分析。需要管理员/root 权限。

```json
{
  "interface": "eth0",        // 必需:网络接口名称
  "duration": 10,             // 可选:抓包时长(秒),默认 10
  "filter": "tcp port 80",    // 可选:BPF 过滤器
  "max_packets": 100          // 可选:最大数据包数,默认 100
}
```

### analyze_pcap
分析已保存的 pcap 文件。

```json
{
  "file_path": "capture.pcap",  // 必需:文件路径
  "filter": "http",             // 可选:显示过滤器
  "max_packets": 100            // 可选:最大数据包数
}
```

### extract_fields
提取特定字段并统计。

```json
{
  "file_path": "capture.pcap",
  "fields": ["ip.src", "ip.dst"],  // 必需:字段列表
  "filter": "",                     // 可选:显示过滤器
  "max_packets": 5000               // 可选:最大数据包数
}
```

### analyze_errors
分析网络传输错误。

```json
{
  "file_path": "capture.pcap",
  "error_type": "all",  // 可选:all/malformed/tcp/retransmission/duplicate_ack/lost_segment
  "max_packets": 5000
}
```

## 🎓 期末考试场景示例

### 第八章:TLS 分析
```
> "分析这个pcap中的TLS握手,找出random随机数和cipher_suites"
> "提取第一个包的随机数和第二个包选中的加密套件"
```

### 第八章:ISAKMP 分析
```
> "分析ISAKMP流量,找出主模式的前四个包"
> "提取IKE密钥交换中的DH公钥和证书"
```

### 第九章:数字证书分析
```
> "解析流量中的证书,提取公钥和签名值"
> "根据证书序列号找到对应的公钥"
```

### 第七章:SM2 签名验签
```
> "提取SM2签名值(r,s)和公钥,准备验签"
> "找出签名报文和签名原文"
```

### 第六章:SM3 摘要
```
> "从证书中提取国密SM3摘要值"
```

## 端点说明

| 端点 | 方法 | 描述 |
|-----|------|------|
| `/` | GET | 状态页面 |
| `/status` | GET | 状态页面 |
| `/sse` | GET | SSE 长连接端点,返回 `text/event-stream` |
| `/messages` | POST | JSON-RPC 消息接收端点 |

## SSE 协议流程

```
1. Client ──GET /sse──────────────────────────► Server
2. Client ◄──event: endpoint, data: /messages?session_id=xxx── Server
3. Client ──POST /messages?session_id=xxx────► Server
   (JSON-RPC: initialize)
4. Client ◄──event: message, data: {result}─── Server
5. Client ──POST /messages (tools/list)──────► Server
6. Client ◄──event: message, data: {tools}─── Server
7. Client ──POST /messages (tools/call)──────► Server
8. Client ◄──event: message, data: {content}─ Server
```

## 常见问题

### Q: 为什么看不到网络接口?
A: 列出网络接口需要管理员权限。请以管理员身份运行 PowerShell/终端后启动服务器。

### Q: Cursor 连接失败怎么办?
1. 确认服务器已启动且在 3000 端口运行
2. 检查 `mcp.json` 配置是否正确(使用 `url` 而非 `serverUrl`)
3. 访问 http://127.0.0.1:3000/status 确认服务器状态
4. 重启 Cursor 刷新 MCP 连接

### Q: tshark 命令找不到?
确保 Wireshark 已安装且 tshark 在系统 PATH 中。可以通过 `--tshark-path` 参数指定完整路径:
```bash
python rainy_mcp.py --tshark-path "C:\Program Files\Wireshark\tshark.exe"
```

## 技术栈

- **Web 框架**: Starlette (ASGI)
- **服务器**: Uvicorn
- **协议**: MCP over SSE (Server-Sent Events)
- **后端工具**: tshark (Wireshark CLI)

## 许可证

MIT License