На этой странице

MCP-сервер

Model Context Protocol (MCP) - открытый стандарт для подключения инструментов к ИИ-агентам. Через MCP-сервер srezai.ru агент получает поиск и исследования как встроенные инструменты, без ручной интеграции REST.

Эндпоинт

Сервер работает по транспорту Streamable HTTP на едином адресе. Авторизация - тем же ключом srz_live_…, что и REST:

POSThttps://srezai.ru/api/mcp

Подключение

Добавьте srezai.ru в конфигурацию MCP-клиента, указав ваш API-ключ в заголовке Authorization:

json
{
  "mcpServers": {
    "srezai": {
      "url": "https://srezai.ru/api/mcp",
      "headers": {
        "Authorization": "Bearer srz_live_ВАШ_КЛЮЧ"
      }
    }
  }
}

Формат ключа и правила безопасности - в разделе Аутентификация.

OAuth для Claude и ChatGPT

Каталоги Claude Connectors и ChatGPT Apps принимают только серверы с OAuth-входом, поэтому у MCP есть второй, равноправный способ авторизации. Клиент, который его поддерживает, не просит у человека ключ: он находит метаданные сервера, уводит в наш вход (Logto) и возвращается с токеном. Статические ключи srz_live_… при этом продолжают работать - OAuth ничего не отключает.

  • Метаданные авторизации: https://srezai.ru/.well-known/oauth-authorization-server
  • Метаданные ресурса: https://srezai.ru/.well-known/oauth-protected-resource
  • Регистрация клиента: POST https://srezai.ru/oauth/register (Dynamic Client Registration, RFC 7591)
  • Токены: POST https://srezai.ru/oauth/token - authorization code + PKCE S256, есть refresh

Scope один - mcp; токен действует час, refresh - 30 дней. Лимиты, тариф и списание те же, что у ключа: это один и тот же аккаунт. Отозвать доступ можно в кабинете - удалением ключа или сменой пароля в Logto.

DeepSeek Harness

DSH собирается из профилей: базовые слои плагинов плюс ваш слой правок. MCP-сервер подключается одной записью в патч-слой профиля - файл ~/.dsh/profiles/<профиль>/cordis.patch.yml, где <профиль> - тот, который вы запускаете (web, tui, headless). Базовый cordis.yml править не нужно, он пуст по замыслу.

yaml
- insert:
    - id: mcp-srezai
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: srezai
        transport: streamable-http
        url: https://srezai.ru/api/mcp
        headers:
          Authorization: Bearer srz_live_ВАШ_КЛЮЧ

Пакет моста (@deepseek-ai/dsh-mcp-client) уже входит в поставку DSH - ставить отдельно нечего. После правки соединение перечитывается на живую, а если профиль не подхватил патч - перезапустите его: dsh --profile web. Инструменты появятся у модели под именами mcp__srezai__web_search, mcp__srezai__read_url и остальными: пространство имён - это serverName из записи. Пошаговая инструкция со скриншотом конфига - в разделе DeepSeek Harness.

Мост понимает и локальный запуск: вместо transport: streamable-http укажите transport: stdio с command: npx и args: ['-y', 'srezai-mcp']. Для нашего сервера это не требуется - он отвечает по HTTP.

Если клиент не умеет HTTP

Часть клиентов подключает MCP-серверы только запуском процесса. Для них есть пакет srezai-mcp: он поднимается локально и пересылает вызовы на тот же эндпоинт. Ставить отдельно не нужно, npx скачает его сам:

json
{
  "mcpServers": {
    "srezai": {
      "command": "npx",
      "args": ["-y", "srezai-mcp"],
      "env": { "SREZAI_API_KEY": "srz_live_ВАШ_КЛЮЧ" }
    }
  }
}

Инструменты и их параметры пакет запрашивает у сервера, а не хранит в себе, поэтому новые появляются без обновления версии. Нужен Node 18+. Исходники - srezai-mcp на GitHub, зеркало - на GitVerse.

Открытый код

Мост открыт под лицензией MIT - его можно прочитать целиком перед тем, как отдавать ему ключ. Кода немного: приём строки JSON-RPC из stdin, пересылка на /api/mcp с вашим ключом и вывод ответа в stdout. Список инструментов и цены живут на сервере, поэтому в пакете их нет.

  • github.com/srezai-team/srezai-mcp-web-search - основной репозиторий, там же релизы и теги версий.
  • gitverse.ru/a1_ai_a4b/srezai-mcp - зеркало для тех, кому GitHub недоступен или неудобен. Обновляется вслед за основным; PR принимаются только на GitHub, иначе истории разъедутся.

Доступные инструменты

  • web_search - веб-поиск с категориями и фильтрами. Параметры: query (обязателен), category, timeRange, language, num, excerpts (подтянуть реальный текст топ-страниц), includeDomains / excludeDomains (искать только на указанных сайтах или исключить их, до 10 доменов). Та же логика, что и у /api/v1/search.
  • image_search - поиск изображений. Параметры: query (обязателен), timeRange, safe. См. /api/v1/media.
  • read_url - текст страницы в чистом markdown. Параметры: url (обязателен), maxChars (200-50000), offset (продолжить чтение длинной страницы), engine (auto по умолчанию), fresh (минуя кеш). Не влезло в maxChars - в конце ответа готовое значение offset для следующего вызова, так что документ любого объёма читается по частям под ваш контекст. Скриншот не делает - дешевле и быстрее fetch_page. См. /api/v1/read.
  • read_urls - то же чтение для пачки ссылок. Параметры: urls (обязателен, 1-5 адресов; на платном тарифе до 10), maxChars, engine, fresh. Страницы читаются параллельно, упавшая ссылка не отменяет остальные, каждая тарифицируется как отдельное чтение. offset здесь нет намеренно: он был бы общим на весь батч - продолжение адресуется на read_url. См. Несколько страниц за раз.
  • yt_srt - текст ролика YouTube: ручные субтитры или автоматические, без скачивания видео. Параметры: videos (обязателен, 1-5 ссылок или 11-символьных id), languages (по умолчанию ["ru", "en"], ручная дорожка предпочтительнее авто), timestamps, from / to (окно в секундах), maxChars, speakers (разметка по говорящим: реплики «Спикер 1/2» с таймкодами; по смыслу реплик, а не по голосу; 15 кредитов за ролик, только с ключом), maxChars до 200000. По каждому ролику вернёт название, канал, длительность, дату, язык, вид дорожки и текст; если субтитров нужного языка нет - список доступных. Длинный ролик приходит целиком: окна сервиса склеиваются внутри одного вызова, а если текста больше 200 000 символов, в ответе есть сводка «Не влезло в лимит» и from по каждому ролику. Кроме текста в ответе есть structuredContent с полями videos[].window (from, truncated, nextFrom) и stats (credits, ok, requested) - цифры не нужно выскребать из фраз. 1 кредит за ролик, у которого текст получен; с speakers: true - 15 кредитов за ролик; неудачи не списываются.
  • fetch_page - скриншот и структура страницы. Параметры: url (обязателен), maxChars (сколько символов текста вернуть, 200-50000). Открывает страницу в браузере и возвращает скриншот картинкой (её видит vision-модель), ссылку на полноразмерный PNG и текст в markdown. См. /api/v1/fetch.
  • extract - структурированные данные со страницы по вашей JSON Schema. Параметры: url или urls (1-5 ссылок, на платном тарифе до 10; одна схема на все), schema (обязателен), instruction, engine. Возвращает только описанные схемой поля; чего на странице нет - null. См. /api/v1/extract.
  • verify_claim - проверка утверждения по источникам. Параметры: claim (обязателен, до 500 символов), maxSources (2-5), timeRange, language, query. Сам ищет источники, читает их и возвращает вердикт с дословными цитатами; цитата, не найденная в тексте страницы, отбрасывается вместе с доводом. Вердикты mixed и unverified - нормальный результат, а не ошибка. См. /api/v1/verify.
  • answer_search - полный RAG-цикл с семантическим ранжированием. Параметры: query (обязателен), depth (fast / balanced / deep), language. Поиск → BGE-reranker отбирает топ по релевантности → чтение страниц → синтез ответа. Возвращает готовый ответ с указанием relevance каждого источника (0-1). См. Answer Search.
  • deep_research - агентное исследование. Параметр: query (обязателен). Синхронный вызов на 10 сек - 2 мин. См. DeepResearch.
  • get_usage - остаток на счёте, расход суточной квоты, burst-лимит и цены инструментов в кредитах. Без параметров. Вызов бесплатный и квоту не расходует, поэтому агент может спросить остаток даже упёршись в лимит. REST-аналога нет: в REST то же самое приходит в заголовках X-RateLimit-*.

Настройки заголовками

То, что не хочется повторять в каждом вызове, можно задать один раз в HTTP-заголовках подключения (их ставит конфигурация MCP-клиента). Любой аргумент вызова перекрывает заголовок - так можно разово отступить от настройки соединения. Сейчас заголовки понимает yt_srt; у остальных инструментов параметры остаются в вызове.

  • X-Srezai-Options: {"maxChars":200000,"timestamps":true,"credits":"off","format":"json"} - все настройки одним JSON, если клиент позволяет добавить только один заголовок.
  • X-Srezai-Max-Chars: 200000 - сколько символов текста просить на ролик (200-200000). Длинный ролик собирается из окон автоматически.
  • X-Srezai-Timestamps: true - всегда присылать фрагменты с таймкодами.
  • X-Srezai-Speakers: true - всегда размечать по говорящим (помните: 15 кредитов за ролик и нужен ключ).
  • X-Srezai-Credits: off - не печатать в тексте строку «Списано кредитов». Сама цифра остаётся в structuredContent.stats.credits: модели она в рабочем контексте не мешает, а биллинг и отчёты её видят. По умолчанию строка печатается, как раньше.
  • X-Srezai-Format: json - вернуть весь ответ одним JSON вместо markdown: те же поля, что в REST, включая текст, сегменты или реплики и stats. Удобно, когда ответ разбирает программа, а не человек.

Проверка: список инструментов

Убедиться, что сервер отвечает и ключ принят, можно вызовом tools/list по JSON-RPC 2.0. Заголовок Accept обязателен - сервер отвечает потоком text/event-stream:

bash
curl -X POST https://srezai.ru/api/mcp \
  -H "Authorization: Bearer srz_live_ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'