内容
# mev-mcp
用于检测Polygon上与MEV相关的活动的多功能服务器 — 待处理内存池流量、已确认的兑换历史和gas定价 — 作为工具提供,可供AI代理或您通过Claude Desktop直接调用。
这是一个用于诊断和研究的工具,而不是生产环境的MEV检测器。它旨在诚实地反映它所看到的和它所遗漏的,而不是看起来比实际更有能力。
## 功能
| 工具 | 功能描述 | 数据来源 |
|---|---|---|
| `check_pending_swaps_on_pool` | 查看给定Uniswap v3池的待处理交易,按路由类型细分,并与已确认的历史记录进行自我检查 | 公共内存池 (`eth_subscribe`) |
| `check_confirmed_swaps_on_pool` | 获取池在最近区块范围内的真实兑换数量和源合约 | 最终链状态 (`eth_getLogs`) |
| `get_gas_price_percentiles` | 获取最近区块的gas价格分布 | `eth_feeHistory` |
| `hello` | 连接性检查 | — |
仅支持Polygon。Arbitrum使用集中式排序器,没有公共内存池,因此待处理交易工具在那里没有意义。
## 诚实的部分:内存池覆盖是部分的,工具会告知您
给定池上的兑换可以通过许多不同的合约进行路由 — Uniswap自己的 `SwapRouter`、`SwapRouter02`、`UniversalRouter`,或许多聚合器(1inch、Odos、Paraswap等)。`check_pending_swaps_on_pool` 目前解码:
- 直接调用池合约
- `SwapRouter` / `SwapRouter02` 单跳兑换(`exactInputSingle`、`exactOutputSingle`)和多跳兑换(`exactInput`、`exactOutput`,通过打包路径解码)
- `UniversalRouter` `V3_SWAP_EXACT_IN` / `V3_SWAP_EXACT_OUT` 命令
- `1inch AggregationRouter v6` 兑换
这是一个有意义的内存池流量切片,但它**不是详尽的**。在中等活跃的Polygon池的测试中,超过一半的已确认兑换量通过列表外的合约路由 — 其他聚合器、智能合约钱包和我们尚未解码的路由合约。
为了避免显示为沉默的 `count: 0` — 与“此池只是安静”的情况无法区分 — `check_pending_swaps_on_pool` 运行快速的已确认兑换检查,针对可比较的窗口,并返回 `coverage_estimate` 字段与原始计数一起:
```jsonc
{
"count": 0,
"routes": { "router_swap": 0, "universal_router_swap": 0, "aggregator_1inch": 0, "direct_pool_call": 0 },
"confirmed_check": { "swap_count": 4, "by_to_address": { "...": 1 } },
"coverage_estimate": "低 — 已确认的兑换存在于此池,但没有被捕获;可能通过未识别的合约路由"
}
```
可能的 `coverage_estimate` 值:
- `无近期活动 — 最近N个区块中无已确认兑换(~M分钟);此池似乎真正不活跃` — 已确认窗口足够大(≥300区块),可以信任零结果
- `不确定 — 窗口太短,无法得出结论` — 已确认窗口小于最小可靠阈值
- `低 — 已确认的兑换存在于此池,但没有被捕获;可能通过未识别的合约路由` — 池是活跃的,但没有待处理交易与已知路由器匹配
- `低 / 中 / 高(比率R:N个待处理交易捕获 vs M个已确认交易)` — 至少找到一些待处理匹配;与已确认交易量的比率给出覆盖信号
- `未知 — 自检抛出异常:ExceptionType: 消息` — 自检本身抛出异常;原始 `count` 仍然成立
- `未知 — 自检返回错误:…` — 已确认检查端点的RPC或其他错误
如果您需要快速、可靠地查看池是否活跃 — 独立于内存池覆盖 — 直接使用 `check_confirmed_swaps_on_pool`。它读取已确认的区块,因此它没有路由器覆盖盲点,只有其 `by_to_address` 分解中的相同聚合器长尾警告(您将看到它不尝试标记的合约地址)。
## 要求
- Python 3.10+
- 支持内存池 (`eth_subscribe`) 的Polygon RPC提供商 — 大多数免费层提供商(包括Alchemy的免费层)支持此功能以获取 `newPendingTransactions`
- 对于 `check_confirmed_swaps_on_pool`:具有 `eth_getLogs` 功能的端点。免费层计划通常限制每个调用的区块范围(Alchemy的免费层:10个区块);该工具会自动分块请求,可通过 `MEV_MCP_LOGS_CHUNK_SIZE` 配置(默认 `10`)。在付费计划上,提高此值(例如,至 `500`)可以显著加快已确认兑换查找速度。
## 设置
```bash
git clone https://github.com/matiosera3-ops/mev-mcp
cd mev-mcp
pip install -e .
```
将以下内容添加到您的Claude Desktop配置(`claude_desktop_config.json`):
```jsonc
{
"mcpServers": {
"mev-mcp": {
"command": "python",
"args": ["-m", "mev_mcp.server"],
"env": {
"POLYGON_RPC_URL": "https://您的-polygon-rpc-url",
"MEV_MCP_LOGS_CHUNK_SIZE": "10"
}
}
}
}
```
尚未发布到PyPI — 目前从源代码安装。
## 已知限制
- **路由器覆盖是部分的。** 见上文。欢迎贡献添加其他聚合器(Odos、Paraswap、0x)的解码器 — 现有的 `SwapRouter`/`UniversalRouter`/`1inch` 解码器在 `pending_swaps.py` 中是用于 calldata 匹配模式的模板。
- **内存池可见性取决于您的RPC提供商。** 不同的提供商看到的公共内存池份额不同。原始工具输出中的 `hashes_seen` / `hashes_resolved` 让您了解提供商显示的流量有多少。
- **免费层 `eth_getLogs` 限制使 `check_confirmed_swaps_on_pool` 变慢** 在免费的Alchemy计划上(以10个区块的块状调用)。对于偶尔的诊断使用来说足够好;不是为高频 polling 而设计的。
- **不支持Arbitrum内存池** ,结构上 — 没有公共内存池可供监视。
## License
MIT