npm package: @iflow-mcp/tavily-mcp-loadbalancer
Description: Load-balanced Tavily MCP server with API key pool management
Latest version: 2.1.0

# Tavily MCP Load Balancer

[![Docker Hub](https://img.shields.io/docker/pulls/yatotm1994/tavily-mcp-loadbalancer?style=flat-square)](https://hub.docker.com/r/yatotm1994/tavily-mcp-loadbalancer)
[![Docker Image Size](https://img.shields.io/docker/image-size/yatotm1994/tavily-mcp-loadbalancer?style=flat-square)](https://hub.docker.com/r/yatotm1994/tavily-mcp-loadbalancer)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

**Language / 语言**: [English](./README_EN.md) | [中文](./README.md)

一个支持多API密钥负载均衡的Tavily MCP服务器，同时提供SSE和streamableHTTP接口，可以自动轮询使用多个API密钥，提供高可用性和更高的请求限制。

<details>
<summary>📋 更新日志</summary>


### v2.2.0 (2025-08-15)
- 🧬 多架构镜像：发布 linux/amd64 与 linux/arm64 双平台镜像；`latest` 已指向 `2.2.0`

### v2.1.0 (2025-08-14)
- 🌐 **streamableHTTP支持**: 新增HTTP POST /mcp端点，支持直接MCP请求-响应模式
- 🔄 **多协议兼容**: 同时支持SSE和streamableHTTP，满足不同客户端需求
- 📝 **文档更新**: 添加streamableHTTP接口使用说明和示例

### v2.0.0 (2025-08-12)
- 🔄 **架构重构**: 从supergateway依赖改为原生SSE实现
- 🛠️ **工具更新**: 同步最新Tavily MCP工具集，新增tavily-crawl和tavily-map
- 📊 **监控增强**: 添加详细的API密钥使用日志和轮询状态
- 🔒 **安全改进**: 增强响应数据清理和字符编码处理
- 📝 **文档重写**: 完全重写README，优化项目结构

### v1.0.0 (2025-08-05)
- 🚀 **初始版本**: 基于supergateway的Tavily MCP负载均衡器
- 🔄 **负载均衡**: 实现多API密钥轮询机制
- 🛡️ **故障转移**: 自动禁用失效密钥功能

</details>

## ✨ 功能特性

- 🔄 **智能负载均衡**: 自动轮询多个API密钥，提升并发能力
- 🛡️ **自动故障转移**: 智能检测并禁用失效密钥
- 🌐 **多协议支持**: 同时支持SSE和streamableHTTP接口
- 🧬 **多架构镜像**: 同一镜像同时支持 linux/amd64 与 linux/arm64
- 🛠️ **完整工具集**: 支持搜索、提取、爬虫、地图等全套Tavily工具
- 📊 **实时监控**: 详细的密钥使用日志和性能统计
- 🔒 **数据安全**: 自动清理和验证响应数据
- ⚡ **高性能**: 基于TypeScript和现代Node.js架构

## 🚀 快速开始

### Docker 部署（推荐）

```bash
# 使用 Docker Hub 镜像快速启动（自动匹配本机架构，支持 amd64/arm64）
docker run -d \
  --name tavily-mcp-lb \
  -p 60002:60002 \
  -e TAVILY_API_KEYS="your-key1,your-key2,your-key3" \
  yatotm1994/tavily-mcp-loadbalancer:latest
```

### 本地开发

```bash
# 1. 克隆并安装
git clone https://github.com/yatotm/tavily-mcp-loadbalancer.git
cd tavily-mcp-loadbalancer
npm install

# 2. 配置环境变量
cp .env.example .env
# 编辑 .env 文件，添加你的 API 密钥

# 3. 启动服务
npm run build-and-start
```

**服务启动后访问：**
- SSE接口: `http://localhost:60002/sse`
- streamableHTTP接口: `http://localhost:60002/mcp`
- 健康检查: `http://localhost:60002/health`

<details>
<summary>📦 更多部署方式</summary>

#### Docker Compose 部署

```bash
# 1. 克隆项目
git clone https://github.com/yatotm/tavily-mcp-loadbalancer.git
cd tavily-mcp-loadbalancer

# 2. 配置环境变量
cp .env.example .env
# 编辑 .env 文件

# 3. 启动服务
docker-compose up -d

# 4. 查看日志
docker-compose logs -f
```

#### 自定义 Docker 构建

```bash
# 构建镜像
docker build -t tavily-mcp-loadbalancer .

# 运行容器
docker run -d \
  --name tavily-mcp-lb \
  -p 60002:60002 \
  -e TAVILY_API_KEYS="your-key1,your-key2,your-key3" \
  tavily-mcp-loadbalancer
```

#### 开发模式

```bash
# 开发模式运行（热重载）
npm run dev

# 分步执行
npm run build
npm run start-gateway

# 使用脚本启动
./start.sh
```

</details>



## 🛠️ 可用工具

本服务器提供5个Tavily工具，支持搜索、内容提取、网站爬虫等功能：

| 工具名称 | 功能描述 | 主要参数 |
|---------|---------|---------|
| `search` / `tavily-search` | 网络搜索 | query, max_results, search_depth |
| `tavily-extract` | 网页内容提取 | urls, extract_depth, format |
| `tavily-crawl` | 网站爬虫 | url, max_depth, limit |
| `tavily-map` | 网站地图生成 | url, max_depth, max_breadth |

<details>
<summary>📖 详细工具文档</summary>

### 接口说明

**SSE接口**: `http://localhost:60002/sse`
**消息接口**: `http://localhost:60002/message`
**streamableHTTP接口**: `http://localhost:60002/mcp`
**健康检查**: `http://localhost:60002/health`

#### streamableHTTP使用示例

```bash
# 初始化连接
curl -X POST http://localhost:60002/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2024-11-05",
      "capabilities": {},
      "clientInfo": {"name": "test-client", "version": "1.0.0"}
    }
  }'

# 获取工具列表
curl -X POST http://localhost:60002/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc": "2.0", "id": 2, "method": "tools/list"}'

# 调用搜索工具
curl -X POST http://localhost:60002/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "search",
      "arguments": {
        "query": "OpenAI GPT-4",
        "max_results": 3
      }
    }
  }'
```

### 工具参数详解

#### 1. search / tavily-search - 网络搜索
```json
{
  "name": "search",
  "arguments": {
    "query": "OpenAI GPT-4",
    "search_depth": "basic",
    "topic": "general",
    "max_results": 10,
    "start_date": "2024-01-01",
    "end_date": "2024-12-31",
    "country": "US",
    "include_favicon": false
  }
}
```

#### 2. tavily-extract - 网页内容提取
```json
{
  "name": "tavily-extract",
  "arguments": {
    "urls": ["https://example.com/article"],
    "extract_depth": "basic",
    "format": "markdown",
    "include_favicon": false
  }
}
```

#### 3. tavily-crawl - 网站爬虫
```json
{
  "name": "tavily-crawl",
  "arguments": {
    "url": "https://example.com",
    "max_depth": 2,
    "max_breadth": 20,
    "limit": 50,
    "instructions": "Focus on technical content",
    "select_paths": ["/docs", "/api"],
    "select_domains": ["example.com"],
    "allow_external": false,
    "categories": ["technology"],
    "extract_depth": "basic",
    "format": "markdown",
    "include_favicon": false
  }
}
```

#### 4. tavily-map - 网站地图生成
```json
{
  "name": "tavily-map",
  "arguments": {
    "url": "https://example.com",
    "max_depth": 1,
    "max_breadth": 20,
    "limit": 50,
    "instructions": "Map the main structure",
    "select_paths": ["/"],
    "select_domains": ["example.com"],
    "allow_external": false,
    "categories": ["general"]
  }
}
```

### 直接MCP使用

```bash
# 直接使用MCP协议（stdio）
node dist/index.js
```

</details>

## 📊 监控和测试

### 快速测试

```bash
# 测试服务器状态
./manage.sh stats

# 测试所有工具
./manage.sh test

# 批量测试API密钥
./manage.sh weather
```

<details>
<summary>🔧 详细测试和监控</summary>

### 管理脚本

```bash
# 测试服务器连接状态
./manage.sh stats

# 测试所有工具功能
./manage.sh test

# 批量测试天气搜索（测试所有API密钥）
./manage.sh weather

# 显示帮助信息
./manage.sh help
```

### Node.js 测试脚本

```bash
# 测试服务器连接
node check_stats_direct.cjs

# 运行工具测试
node test_tools_direct.cjs

# 批量天气搜索测试
node test_weather_search.cjs

# 测试SSE连接和数据安全性
node test_sse_validation.cjs
```

### 监控输出示例

#### 服务器状态检查
```
✅ 连接成功
📊 Tavily MCP 负载均衡器状态:
✅ 搜索功能正常
搜索结果长度: 2847 字符
```

#### API密钥轮询日志
```
[INFO] Using API key: tvly-dev-T... (Key 1/10)
[INFO] API key tvly-dev-T... request successful
[INFO] Using API key: tvly-dev-Y... (Key 2/10)
[INFO] API key tvly-dev-Y... request successful
```

</details>



## ⚙️ 配置

### 环境变量

| 变量名 | 描述 | 默认值 |
|--------|------|---------|
| `TAVILY_API_KEYS` | API密钥列表（逗号分隔） | 必填 |
| `TAVILY_API_KEY` | 单个API密钥 | 可选 |
| `SUPERGATEWAY_PORT` | 服务端口 | 60002 |

### 配置示例

```bash
# .env 文件
TAVILY_API_KEYS=tvly-dev-key1,tvly-dev-key2,tvly-dev-key3
SUPERGATEWAY_PORT=60002
```

<details>
<summary>🔧 高级配置</summary>

### Docker 环境变量

```bash
# Docker 运行时设置
docker run -e "TAVILY_API_KEYS=key1,key2,key3" \
           -e "SUPERGATEWAY_PORT=60002" \
           yatotm1994/tavily-mcp-loadbalancer:latest
```

### 开发环境配置

```bash
# 开发环境变量
export TAVILY_API_KEYS="tvly-dev-key1,tvly-dev-key2"
export SUPERGATEWAY_PORT=60002

# 或使用 .env 文件
cp .env.example .env
# 编辑 .env 文件
```

### SSE连接测试

验证SSE连接和数据安全性：

```bash
# 运行SSE连接测试
node test_sse_validation.cjs
```

测试内容：
- ✅ SSE连接建立和会话管理
- ✅ JSON-RPC消息发送和接收
- ✅ 响应数据安全性验证
- ✅ 控制字符和特殊字符处理
- ✅ 大数据响应处理
- ✅ 错误处理和日志记录

</details>





## 🔧 故障排除

### 常见问题

| 问题 | 解决方案 |
|------|---------|
| 无可用API密钥 | 检查 `TAVILY_API_KEYS` 环境变量 |
| 连接超时 | 检查网络和防火墙设置 |
| 端口被占用 | 使用 `lsof -i :60002` 检查端口 |
| SSE连接失败 | 运行 `node test_sse_validation.cjs` |

### 快速诊断

```bash
# 检查服务状态
curl http://localhost:60002/health

# 测试连接
node check_stats_direct.cjs

# 查看日志
docker logs tavily-mcp-lb
```

<details>
<summary>🔍 详细故障排除</summary>

### 本地运行问题

1. **No available API keys**
   - 检查环境变量：`echo $TAVILY_API_KEYS`
   - 确保密钥格式正确（以`tvly-`开头）
   - 使用 `node check_stats_direct.cjs` 测试连接

2. **API密钥错误或被禁用**
   - 查看服务器日志中的错误信息
   - 使用 `./manage.sh weather` 批量测试所有密钥
   - 检查密钥配额是否用完

3. **连接超时或网络问题**
   - 检查网络连接和防火墙设置
   - 确认Tavily API服务是否正常
   - 尝试减少并发请求数量

4. **SSE连接问题**
   - 使用 `node test_sse_validation.cjs` 测试SSE连接
   - 检查端口60002是否被占用：`lsof -i :60002`
   - 确认服务器已正常启动

### Docker 相关问题

| 问题 | 解决方案 |
|------|---------|
| 构建失败 | `docker system prune -f` 清理缓存 |
| 容器启动失败 | `docker logs tavily-mcp-lb` 查看日志 |
| 环境变量无效 | 检查 `.env` 文件格式 |
| 健康检查失败 | `curl http://localhost:60002/health` |

### Docker 调试命令

```bash
# 查看容器日志
docker logs -f tavily-mcp-lb

# 进入容器调试
docker exec -it tavily-mcp-lb sh

# 检查环境变量
docker exec tavily-mcp-lb env | grep TAVILY
```

</details>





## 📄 许可证

MIT License

---

**⭐ 如果这个项目对你有帮助，请给个Star！**