Вы платите $200 в месяц за Claude Max. Открываете Claude Code, просите агента поискать документацию — и получаете API Error: Rate limit reached. Не первый раз, не десятый. Просто отказ. На GitHub по этому багу открыто больше дюжины issue — и ни один не закрыт. А если вы на API — ваш поисковый запрос стоит $0.01. Каждый. Я нашёл способ обойти оба ограничения за 10 минут.

Оглавление

  1. Боль, которую знает каждый пользователь Claude Code

  2. Как Anthropic зарабатывает на веб-поиске

  3. Решение: SearXNG через MCP

  4. Как работает SearXNG под капотом

  5. Что означает «запросы не покидают машину»

  6. Установка за 10 минут

  7. Итого

Боль, которую знает каждый пользователь Claude Code

Если вы работаете с Claude Code каждый день, вы наверняка видели это сообщение:

API Error: Rate limit reached

Это не теоретический сценарий. Это происходит прямо сейчас, при написании этой статьи. Я попросил Claude Code найти информацию через встроенный WebSearch — и получил отказ:

WebSearch("SearXNG metasearch engine setup guide 2026")
→ API Error: Rate limit reached

На GitHub у Claude Code открыты десятки issue с этой проблемой:

  • #27074: WebSearch "Rate limit reached" occurs only with Claude subscription, works fine with API key

  • #29579: API Error: Rate limit reached despite Claude Max subscription and only 16% usage

  • #22876: Rate limit 429 errors despite dashboard showing available quota

  • #27008: пользователь на плане за $200/мес — лимит при первом же вопросе, дашборд показывает 0% использования

Один разработчик из issue #27074 описал ситуацию так: WebSearch tool consistently returns API Error: Rate limit reached for every query when using a Claude (Max) subscription. The same queries work perfectly when using an API key. This has been ongoing for the past 3 days.

Три дня. Три рабочих дня без веб-поиска. На пла��е за $200 в месяц.

При этом Anthropic не публикует конкретные лимиты — описывая их как «бюджет на диалоги», который зависит от модели, длины контекста и используемых фич. Это как платить за безлимитный интернет и узнать, что «безлимит» — это 5 ГБ, но точную цифру вам не скажут.

Как Anthropic зарабатывает на веб-поиске

Давайте разберём, что стоит за встроенным WebSearch.

Согласно официальной документации: $10 за 1000 поисков. Это $0.01 за каждый запрос, плюс стандартная стоимость токенов за обработку результатов.

Казалось бы, цент — это ничего. Но в реальности агент, решающий задачу, может делать 5–15 поисков за один тёрн. Исследуете незнакомую технологию? 50+ поисков за сессию. Целый рабочий день с Claude Code — легко 100–200 поисков. Это $1–2 в день только на search fee.

На Reddit пользователи делятся счетами:

  • «I burned through ~$2000 in API credits over 2 weeks» (r/ClaudeAI)

  • «Hit 330M input tokens in the first two weeks» (r/ClaudeCode)

  • «$30–50 a day for me with Sonnet» (r/ClaudeCode)

  • «Total costs with API: $12k approx per month» (r/ClaudeCode)

А вот что на самом деле делает WebSearch за ваши деньги: отправляет ваш запрос в поисковую инфраструктуру Anthropic. Не в Google напрямую — а через их серверы. Вы платите не за поиск (поиск в Google бесплатен), а за посредника.

Подождите. Поиск в Google бесплатен. DuckDuckGo — бесплатен. Brave Search — бесплатен. Вы каждый день ищете в браузере и не платите ни копейки. Но когда то же самое делает Claude Code — это стоит $0.01 за запрос. Потому что запрос проходит через платный API Anthropic.

Решение: SearXNG через MCP

А что если Claude Code будет искать напрямую — как вы ищете в браузере? Без посредника, бесплатно, без лимитов?

Именно это делает связка SearXNG + MCP. Вот что происходит при том же запросе через SearXNG вместо WebSearch:

searxng_web_search("SearXNG metasearch engine setup guide 2026")
→ 23 результата за 3.6 секунды
  Движки: Google (1.3s), DuckDuckGo (2.0s), Brave (2.1s), Wikipedia (3.6s)
  Score: от 0.05 до 2.5
  Стоимость: $0.00

Тот же запрос. Тот же Claude Code. Разница: один вернул ошибку, второй — 23 результата. Один стоит денег, второй бесплатен.

Model Context Protocol (MCP) — открытый стандарт, созданный самой Anthropic, для подключения внешних инструментов к Claude. Claude Code использует MCP-инструменты так же, как встроенные — разницы в UX нет. Но бэкенд можно выбрать любой.

Claude Code → MCP-клиент (JSON-RPC 2.0, stdio)
                 ↓
         MCP-сервер (mcp-searxng, Node.js процесс)
                 ↓
         HTTP GET http://localhost:8888/search?q=...&format=json
                 ↓
         SearXNG (localhost, Docker)
                 ↓ (параллельно, в отдельных потоках)
    ┌────────────┼────────────┬────────────┬────────────┐
  Google     DuckDuckGo     Brave     Wikipedia    Wikidata
    └────────────┼─���──────────┴────────────┴────────────┘
                 ↓
         Агрегация, дедупликация, скоринг
                 ↓
         JSON-ответ → обратно по цепочке → Claude Code

MCP-сервер — обычный Node.js-процесс. Общается с Claude Code через stdin/stdout. Никаких API-ключей, никакого сетевого оверхеда.

Как работает SearXNG под капотом

SearXNG (25 500+ звёзд на GitHub) — open-source метапоисковик. У него нет собственного индекса. Он делает ровно то, что вы делаете руками: отправляет запрос в Google, DuckDuckGo, Brave и ещё ~245 движков, собирает результаты и отдаёт вам.

Разберём по шагам, что происходит внутри при каждом запросе. Исходный код — на GitHub, всё можно проверить.

Параллельные запросы в потоках

SearXNG не ходит в движки последовательно — он стреляет во все одновременно. Каждый движок — отдельный поток:

# searx/search/__init__.py
for engine_name, query, request_params in requests:
    th = threading.Thread(
        target=PROCESSORS[engine_name].search,
        args=(query, request_params, self.result_container, ...),
    )
    th.start()

Потоки идентифицируются по UUID. Главный поток ждёт завершения каждого с таймаутом. Не успел — движок помечается как unresponsive. Вот реальные данные с моего инстанса (из заголовка Server-Timing):

Google:      1.27 сек
DuckDuckGo:  1.96 сек
Wikidata:    2.01 сек
Brave:       2.09 сек
Wikipedia:   3.58 сек  ← bottleneck
────────────────────
Итого:       3.58 сек  (= время самого медленного движка)

Что SearXNG отправляет поисковикам

Каждый запрос формируется в OnlineProcessor.get_params() (searx/search/processors/online.py):

headers["User-Agent"] = gen_useragent()      # случайный Firefox
headers["Accept-Encoding"] = "gzip, deflate"
headers["Cache-Control"] = "no-cache"
headers["DNT"] = "1"                         # Do Not Track
headers["Connection"] = "keep-alive"
cookies = {}                                 # всегда пустые

User-Agent генерируется случайно из пула (searx/data/useragents.json):

{
  "os": ["Windows NT 10.0; Win64; x64", "X11; Linux x86_64"],
  "ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
  "versions": ["148.0", "147.0"]
}

Каждый запрос выглядит как новый пользователь с новым Firefox. Плюс SearXNG перемешивает TLS-шифры (shuffle_ciphers()), чтобы защитить от TLS-фингерпринтинга.

Дедупликация и скоринг

Результаты из всех движков собираются в потокобезопасный ResultContainer (searx/results.py).

Если один URL пришёл из Google и DuckDuckGo — результаты мержатся: берётся более длинный content, HTTPS предпочитается HTTP.

Скоринг простой и прозрачный:

score = 0
for position in result['positions']:
    score += weight / position

Результат на 1-й позиции в трёх движках: 1/1 + 1/1 + 1/1 = 3.0. На 10-й позиции в одном: 1/10 = 0.1. Чем больше движков подтвердили результат и чем выше позиция — тем выше score.

Что означает «запросы не покидают машину»

Это не маркетинговый слоган, а архитектурное свойство. Разберём каждый слой:

Данные

MCP-сервер

SearXNG

Google, DuckDuckGo и др.

Текст запроса

Да (stdin)

Да (localhost HTTP)

Да

IP пользователя

N/A (stdio)

127.0.0.1

IP вашей машины (не Anthropic)

User-Agent

Нет

Нет

Случайный Firefox

Cookies

Нет

Нет

Пустые

Referer

Нет

Нет

Нет

TLS fingerprint

N/A

N/A

Рандомизирован

Логирование

Нет (stateless)

Нет (по умолчанию)

Их дело

Сравните с WebSearch: ваш запрос уходит на серверы Anthropic → их инфраструктура ищет → результаты возвращаются. Anthropic видит каждый ваш поисковый запрос. С SearXNG запрос идёт localhost → ваш IP → поисковики. Anthropic не участвует.

MCP-сервер (mcp-searxng) — Node.js-процесс на вашей машине, общается с Claude Code через stdin/stdout. Никакой сети. SearXNG — Flask-приложение за granian (ASGI-сервер) в Docker. Не логирует запросы (debug: false). Не ведёт сессий. Stateless.

Поисковики видят ваш IP (как если бы вы сами зашли в Google), но с рандомным User-Agent, пустыми cookies и заголовком DNT. Для Google каждый ваш запрос выглядит как новый человек с нового компьютера.

Если нужна ещё более сильная анонимность — SearXNG поддерживает маршрутизацию через прокси и Tor (outgoing.using_tor_proxy: true). Но для разработческого использования это избыточно.

Установка за 10 минут

Шаг 1. SearXNG в Docker

mkdir -p ~/.searxng
# ~/.searxng/settings.yml
use_default_settings: true

search:
  formats:
    - html
    - json    # обязательно для MCP

server:
  secret_key: "сгенерируйте-случайную-строку"
  limiter: false

outgoing:
  request_timeout: 10.0

Важно: json в search.formats — обязательное условие. Без него MCP-сервер не получит результаты.

docker run -d \
  --name searxng \
  --restart unless-stopped \
  -p 8888:8080 \
  -v ~/.searxng/settings.yml:/etc/searxng/settings.yml:rw \
  searxng/searxng:latest

Проверяем:

curl -s "http://localhost:8888/search?q=hello&format=json" | python3 -m json.tool | head -10

Шаг 2. MCP-сервер

Создайте ~/.mcp.json:

{
  "mcpServers": {
    "searxng": {
      "command": "npx",
      "args": ["-y", "mcp-searxng"],
      "env": {
        "SEARXNG_URL": "http://localhost:8888"
      }
    }
  }
}

Альтернатива на Python: uvx mcp-searxng (SecretiveShell/MCP-searxng).

Шаг 3. Говорим Claude использовать SearXNG

Добавьте в ~/.claude/CLAUDE.md:

## Web Search
- Always prefer the SearXNG MCP tool (`searxng_web_search`) over the built-in `WebSearch` tool
- Use `web_url_read` from SearXNG MCP for reading web page content

Перезапустите Claude Code. Готово.

Проверяем

Попросите Claude Code что-нибудь поискать. Если он использует mcp__searxng__searxng_web_search вместо WebSearch — всё работает.

WebSearch

SearXNG

Per-search fee

$0.01

$0

50 запросов/день × 30 дней

$15/мес

$0

Rate limits

не опубликованы, ломаются

нет

Bedrock/Vertex

нет

да

Кто видит ваши запросы

Anthropic

только вы

Итого

Веб-поиск — это commodity. Он бесплатен в браузере и должен быть бесплатен для AI-агента. Anthropic берёт $0.01 за каждый поисковый запрос не потому, что поиск стоит столько, а потому что может.

SearXNG + MCP — это 10 минут настройки, которые:

  • Убирают $15–30/мес per-search fee

  • Убирают rate limits — никаких API Error: Rate limit reached

  • Убирают посредника — ваши запросы идут напрямую к поисковикам

  • Дают прозрачностьServer-Timing показывает, какие движки отвечали и сколько времени это заняло

Всё, что нужно: Docker-контейнер с SearXNG, npm-пакет mcp-searxng, одна строчка в CLAUDE.md. Поиск работает лучше (23 результата из 5 движков vs один источник у Anthropic), стоит $0 и не падает с rate limit.


Если хотите обсудить настройку, поделиться своим опытом оптимизации Claude Code или есть вопросы по интеграции — пишите в контакты профиля.

Ссылки:


Если статья была полезна, ставьте плюс и подписывайтесь.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Как вы решаете проблему веб-поиска в Claude Code?
14.29%Использую встроенный WebSearch, проблем не замечал2
7.14%Ловлю Rate limit, терплю1
14.29%Уже настроил SearXNG / другой MCP-поиск2
21.43%Использую Claude Code без веб-поиска вообще3
42.86%Не пользуюсь Claude Code6
Проголосовали 14 пользователей. Воздержались 4 пользователя.