Skip to main content
Glama
README.md
# MCP WebSearch

MCP-сервер для Claude Code: веб-поиск через Perplexity Sonar и генерация изображений — всё одним ключом OpenRouter.

Написан под одну задачу: **не давать агенту случайно потратить лишнее**. Дорогая модель поиска не является дефолтом, а у генерации картинок есть отдельный тул для расчёта цены до вызова.

## Установка

```bash
git clone git@github.com:DrSeedon/mcp-websearch.git ~/.claude/mcp-servers/websearch
cd ~/.claude/mcp-servers/websearch
npm install
cp .env.example .env   # и вписать свой ключ
```

Регистрация в Claude Code:

```bash
claude mcp add websearch node ~/.claude/mcp-servers/websearch/index.js \
  -e OPENROUTER_API_KEY=sk-or-v1-...
```

Требуется Node 18+ (используется нативный `fetch` и ESM).

## Переменные окружения

| Переменная | Обязательна | Назначение |
|---|---|---|
| `OPENROUTER_API_KEY` | да | Ключ OpenRouter. Проверяется при старте |
| `HTTPS_PROXY` / `HTTP_PROXY` | нет | Прокси, если прямой доступ к `openrouter.ai` закрыт |

Ключ читается только из окружения — в коде его нет и быть не должно.

## Тулы

### `search`
Веб-поиск через Perplexity Sonar. Возвращает ответ, источники и стоимость запроса.

| Модель | Цена | Когда |
|---|--:|---|
| `sonar` | ~$0.006 | **Дефолт.** Факты, документация, обычный ресёрч |
| `sonar-pro-search` | ~$0.03 | Только если `sonar` уже не справился с ТЕМ ЖЕ вопросом |

Других search-моделей нет — список закрыт на уровне кода.

**Почему это важно:** разница в цене пятикратная. Если сделать дорогую модель дефолтом, агент будет вызывать её не думая. Проверено на живой установке: 171 запрос из 425 ушёл по дорогому тарифу просто потому, что модель не указывали явно.

### `generate_image`
Генерация изображений. Поддерживает референсные картинки на вход и соотношения сторон от `21:9` до `9:16`.

| Модель | Назначение |
|---|---|
| `nano-banana` | Дефолт, хорошее качество |
| `nano-banana-lite` | Бюджетный вариант |
| `riverflow-fast` / `riverflow-pro` / `riverflow-max` | Альтернативный движок, от быстрого к качественному |
| `seedream` | Ещё один вариант стиля |

### `generate_image_cost`
Считает стоимость генерации **до** вызова. Нужен, чтобы выбор модели был осознанным, а не «взял первую из списка».

## Логи

`requests.log` (в `.gitignore`) — JSONL, по строке на вызов: `[iso] tool: {json}`.

- `search` — запрос, полный ответ, источники, модель, токены, стоимость
- `generate_image` — промпт, пути сохранения, размер, референсы; base64 в лог не пишется
- рядом с картинкой в `generated/` кладётся `.json` с тем же промптом и метаданными

## Что не коммитится

`.env`, `requests.log`, `generated/` (архив сгенерированных картинок), `node_modules/`. Логи и картинки содержат историю запросов — это приватные данные, им не место в репозитории.