<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vaclovas</id>
	<title>Svacer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://svacer.ispras.ru/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vaclovas"/>
	<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Special:Contributions/Vaclovas"/>
	<updated>2026-07-08T11:51:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3574</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3574"/>
		<updated>2026-05-26T21:12:08Z</updated>

		<summary type="html">&lt;p&gt;Vaclovas: /* Установка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
&lt;br /&gt;
Svacer MCP может быть подключён к любому серверу Svacer версии 12 и выше. В данном разделе описывается установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
  git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/vaclovas/svacermcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd svacermcp&lt;br /&gt;
  python3 -m venv .venv&lt;br /&gt;
  source .venv/bin/activate       # Windows: .venv\Scripts\activate&lt;br /&gt;
  pip install -e .&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[Help:13-alpha MCP#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; сервера).&lt;br /&gt;
# Сохранить — инструменты появятся в чате.&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[Help:13-alpha MCP#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Снимок&lt;br /&gt;
!Дата&lt;br /&gt;
!Всего&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>Vaclovas</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3572</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3572"/>
		<updated>2026-05-26T10:38:06Z</updated>

		<summary type="html">&lt;p&gt;Vaclovas: /* Установка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
&lt;br /&gt;
Svacer MCP может быть подключён к любому серверу Svacer версии 12 и выше. В данном разделе описывается установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/vaclovas/svacermcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd svacermcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;python3 -m venv .venv&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[Help:13-alpha MCP#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; сервера).&lt;br /&gt;
# Сохранить — инструменты появятся в чате.&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[Help:13-alpha MCP#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Снимок&lt;br /&gt;
!Дата&lt;br /&gt;
!Всего&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>Vaclovas</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3571</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3571"/>
		<updated>2026-05-26T10:31:53Z</updated>

		<summary type="html">&lt;p&gt;Vaclovas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
&lt;br /&gt;
Svacer MCP может быть подключён к любому серверу Svacer версии 12 и выше. В данном разделе описывается установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/vaclovas/svacermcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd svacermcp&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;python3 -m venv .venv&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.venv/bin/pip install -e .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 .venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[Help:13-alpha MCP#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; сервера).&lt;br /&gt;
# Сохранить — инструменты появятся в чате.&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[Help:13-alpha MCP#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Снимок&lt;br /&gt;
!Дата&lt;br /&gt;
!Всего&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>Vaclovas</name></author>
	</entry>
	<entry>
		<id>https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3570</id>
		<title>Help:13-alpha MCP</title>
		<link rel="alternate" type="text/html" href="https://svacer.ispras.ru/mediawiki/index.php?title=Help:13-alpha_MCP&amp;diff=3570"/>
		<updated>2026-05-26T10:29:45Z</updated>

		<summary type="html">&lt;p&gt;Vaclovas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Архитектура ==&lt;br /&gt;
[https://modelcontextprotocol.io/docs/getting-started/intro MCP] — открытый стандарт, через который LLM-клиенты (Claude Desktop, Cursor, VS Code, OpenWebUI и др.) вызывают внешние инструменты. &lt;br /&gt;
Svacer MCP соединяет одно с другим: 8 инструментов поверх публичного REST API Svacer, которые LLM выбирает и вызывает в ответ на обычный текстовый запрос. Вместо ручной последовательности «открыть UI, найти проект, выбрать снимок, применить фильтр» достаточно сформулировать вопрос в чате, например, «сколько критических предупреждений в последнем снимке bash?», и получить ответ. Необходимые вызовы инструментов модель выполняет самостоятельно.&lt;br /&gt;
&lt;br /&gt;
[[File:Архитектура MCP.png|thumb|none|x800px|alt=architectureMCP|Архитектура MCP-сервера]]&lt;br /&gt;
&lt;br /&gt;
Поток запроса: LLM-клиент отправляет MCP-вызов через STDIO или Streamable HTTP → &amp;lt;code&amp;gt;server.py&amp;lt;/code&amp;gt; передаёт его в выбранный инструмент из &amp;lt;code&amp;gt;tools/&amp;lt;/code&amp;gt; → инструмент проверяет параметры и обращается к &amp;lt;code&amp;gt;api_client.py&amp;lt;/code&amp;gt; → клиент получает JWT от &amp;lt;code&amp;gt;auth.py&amp;lt;/code&amp;gt; (модуль автоматически обновляет токен по истечении срока действия или при ответе 401) → запрос отправляется в Svacer REST API.&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
&lt;br /&gt;
Svacer MCP может быть подключён к любому серверу Svacer версии 12 и выше. В данном разделе описывается установка Svacer MCP, подключение клиентов и конфигурация.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://gitlab.ispras.ru/vaclovas/svacermcp.git&amp;lt;/nowiki&amp;gt; &amp;amp;&amp;amp; cd svacermcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;python3 -m venv .venv&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.venv/bin/pip install -e .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Требования ===&lt;br /&gt;
&lt;br /&gt;
* Python 3.10+&lt;br /&gt;
* Доступ к серверу Svacer: URL + логин/пароль&lt;br /&gt;
&lt;br /&gt;
=== Режим STDIO ===&lt;br /&gt;
Подходит для настольных клиентов: Claude Desktop, Claude Code, Cursor, VS Code.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 # Отредактировать .env — указать URL и учётные данные Svacer&lt;br /&gt;
 &lt;br /&gt;
 # Проверить запуск (сервер ожидает данные на stdin; для выхода — Ctrl+C)&lt;br /&gt;
 .venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
После &amp;lt;code&amp;gt;pip install -e .&amp;lt;/code&amp;gt; в окружении становится доступна команда &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; — её указывают в конфигурации клиентов ниже.&lt;br /&gt;
&lt;br /&gt;
=== Режим HTTP (Docker) ===&lt;br /&gt;
Подходит для веб-клиентов (OpenWebUI) и удалённого доступа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Требования:&#039;&#039;&#039; Docker, Docker Compose.&lt;br /&gt;
 cp .env.example .env&lt;br /&gt;
 &lt;br /&gt;
 # В .env обязательно задать SVACER_MCP_TOKEN — без него сервер не запускается&lt;br /&gt;
 echo &amp;quot;SVACER_MCP_TOKEN=$(openssl rand -hex 32)&amp;quot; &amp;gt;&amp;gt; .env&lt;br /&gt;
 &lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # MCP endpoint: &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Клиенты передают заголовок: Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внешний порт хоста задаётся переменной &amp;lt;code&amp;gt;MCP_PORT&amp;lt;/code&amp;gt; (по умолчанию &amp;lt;code&amp;gt;8002&amp;lt;/code&amp;gt;), внутри контейнера сервер всегда слушает порт &amp;lt;code&amp;gt;8000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Подключение клиентов ===&lt;br /&gt;
&lt;br /&gt;
==== Claude Desktop ====&lt;br /&gt;
Файл конфигурации: &amp;lt;code&amp;gt;~/.config/Claude/claude_desktop_config.json&amp;lt;/code&amp;gt; (Linux) или &amp;lt;code&amp;gt;%APPDATA%\Claude\claude_desktop_config.json&amp;lt;/code&amp;gt; (Windows).&lt;br /&gt;
&lt;br /&gt;
Укажите &#039;&#039;&#039;абсолютный путь&#039;&#039;&#039; к &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; из вашего venv (&amp;lt;code&amp;gt;which svacer-mcp&amp;lt;/code&amp;gt; в активированном venv или &amp;lt;code&amp;gt;/path/to/mcp/.venv/bin/svacer-mcp&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Claude Code ====&lt;br /&gt;
 claude mcp add svacer \&lt;br /&gt;
   -e SVACER_URL=&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt; \&lt;br /&gt;
   -e SVACER_LOGIN=your-login \&lt;br /&gt;
   -e SVACER_PASSWORD=your-password \&lt;br /&gt;
   -- /path/to/mcp/.venv/bin/svacer-mcp&lt;br /&gt;
&lt;br /&gt;
==== VS Code ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.vscode/mcp.json&amp;lt;/code&amp;gt; в корне рабочей директории:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;servers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Cursor ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.cursor/mcp.json&amp;lt;/code&amp;gt; в корне проекта или глобально:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;mcpServers&amp;quot;: {&lt;br /&gt;
     &amp;quot;svacer&amp;quot;: {&lt;br /&gt;
       &amp;quot;command&amp;quot;: &amp;quot;/path/to/mcp/.venv/bin/svacer-mcp&amp;quot;,&lt;br /&gt;
       &amp;quot;env&amp;quot;: {&lt;br /&gt;
         &amp;quot;SVACER_URL&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://your-svacer.example.com&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_LOGIN&amp;quot;: &amp;quot;your-login&amp;quot;,&lt;br /&gt;
         &amp;quot;SVACER_PASSWORD&amp;quot;: &amp;quot;your-password&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OpenWebUI ====&lt;br /&gt;
# Развернуть через Docker (см. [[Help:13-alpha MCP#Режим HTTP (Docker)|Режим HTTP]]).&lt;br /&gt;
# Открыть &#039;&#039;&#039;Settings → Tools&#039;&#039;&#039; (или &#039;&#039;&#039;Admin Panel → Settings → Tools&#039;&#039;&#039;).&lt;br /&gt;
# Добавить сервер:&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI работает на хосте, снаружи Docker.&lt;br /&gt;
#* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://svacer-mcp:8000/mcp&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — если OpenWebUI развёрнут в той же compose-сети, что и &amp;lt;code&amp;gt;svacer-mcp&amp;lt;/code&amp;gt; (имя берётся из &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; → service name, порт 8000 — внутренний порт контейнера).&lt;br /&gt;
# Тип подключения: &#039;&#039;&#039;MCP (Streamable HTTP)&#039;&#039;&#039;.&lt;br /&gt;
# В настройках инструмента указать заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt; (значение — то же, что в &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; сервера).&lt;br /&gt;
# Сохранить — инструменты появятся в чате.&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Переменная&lt;br /&gt;
!По умолчанию&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|URL сервера Svacer&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_LOGIN&lt;br /&gt;
|admin&lt;br /&gt;
|Логин&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_PASSWORD&lt;br /&gt;
|admin&lt;br /&gt;
|Пароль&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TIMEOUT&lt;br /&gt;
|30&lt;br /&gt;
|Тайм-аут HTTP-запросов к Svacer, секунды&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TRANSPORT&lt;br /&gt;
|stdio&lt;br /&gt;
|Режим транспорта: &amp;lt;code&amp;gt;stdio&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_HTTP_PORT&lt;br /&gt;
|8000&lt;br /&gt;
|TCP-порт сервера в режиме HTTP (внутри контейнера)&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_TOKEN&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Bearer-токен для клиентов &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt;. Обязателен при &amp;lt;code&amp;gt;SVACER_TRANSPORT=http&amp;lt;/code&amp;gt;, в режиме STDIO игнорируется. Генерация: &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_MCP_RESOURCE_URL&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;http://localhost&amp;lt;/nowiki&amp;gt;:&amp;lt;HTTP_PORT&amp;gt;&lt;br /&gt;
|Публичный URL MCP-сервера для заголовка &amp;lt;code&amp;gt;WWW-Authenticate&amp;lt;/code&amp;gt; (&amp;lt;nowiki&amp;gt;RFC 9728&amp;lt;/nowiki&amp;gt;). Задаётся при работе за обратным прокси&lt;br /&gt;
|-&lt;br /&gt;
|SVACER_TOOLS&lt;br /&gt;
|&#039;&#039;(не задано)&#039;&#039;&lt;br /&gt;
|Список инструментов через запятую. Если не задано, регистрируются все 8&lt;br /&gt;
|-&lt;br /&gt;
|MCP_PORT&lt;br /&gt;
|8002&lt;br /&gt;
|Внешний порт хоста при запуске через &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (отображается на внутренний &amp;lt;code&amp;gt;SVACER_HTTP_PORT&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
Переменные читаются из &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; или из окружения. Для STDIO-клиентов их можно указать в секции &amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; конфигурации клиента.&lt;br /&gt;
&lt;br /&gt;
==== Ограничение набора инструментов ====&lt;br /&gt;
Чтобы запустить сервер с подмножеством инструментов (например, для уменьшения объёма контекста у модели или разграничения доступа), задайте &amp;lt;code&amp;gt;SVACER_TOOLS&amp;lt;/code&amp;gt;:&lt;br /&gt;
 SVACER_TOOLS=get_projects,get_snapshots,get_markers&lt;br /&gt;
Допустимые имена: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_stats&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_project_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_advanced_file_preview&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_diff&amp;lt;/code&amp;gt;. Неизвестное имя в списке приводит к ошибке при запуске. Если переменная пустая или не задана, регистрируются все 8 инструментов.&lt;br /&gt;
&lt;br /&gt;
==== Несколько экземпляров сервера ====&lt;br /&gt;
Параллельный запуск нескольких MCP-серверов поддерживается без ограничений.&lt;br /&gt;
&lt;br /&gt;
* В режиме STDIO каждая запись в конфигурации клиента описывает отдельный процесс — несколько подключений к разным экземплярам Svacer задаются простым перечислением.&lt;br /&gt;
* В режиме HTTP запускаются независимые контейнеры на разных хост-портах: например, &amp;lt;code&amp;gt;MCP_PORT=8002&amp;lt;/code&amp;gt; для одного экземпляра и &amp;lt;code&amp;gt;MCP_PORT=8003&amp;lt;/code&amp;gt; для другого. Для каждого контейнера задаётся собственный &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Безопасность ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;STDIO&#039;&#039;&#039;: сервер не открывает сетевых портов и обменивается данными через стандартные потоки ввода/вывода процесса.&lt;br /&gt;
* &#039;&#039;&#039;Streamable HTTP&#039;&#039;&#039;: эндпоинт &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; требует заголовок &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;SVACER_MCP_TOKEN&amp;gt;&amp;lt;/code&amp;gt;. Запросы без токена или с неверным значением получают ответ &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; и заголовок &amp;lt;code&amp;gt;WWW-Authenticate: Bearer ...&amp;lt;/code&amp;gt;. Токен является разделяемым секретом и не заменяет TLS, а дополняет его: при работе за обратным прокси необходимо использовать HTTPS, а сам токен передавать только по защищённому каналу.&lt;br /&gt;
* Без &amp;lt;code&amp;gt;SVACER_MCP_TOKEN&amp;lt;/code&amp;gt; HTTP-сервер не запускается.&lt;br /&gt;
* Учётные данные &amp;lt;code&amp;gt;admin/admin&amp;lt;/code&amp;gt; предназначены только для тестового стенда. В рабочем окружении необходимо задать собственные логин и пароль через переменные окружения.&lt;br /&gt;
* Файл &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; не должен добавляться в систему контроля версий.&lt;br /&gt;
&lt;br /&gt;
==== Передача токена клиентом ====&lt;br /&gt;
Большинство HTTP-клиентов MCP (OpenWebUI и др.) позволяют задать произвольный заголовок &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; в настройках инструмента — указывается значение &amp;lt;code&amp;gt;Bearer &amp;lt;токен&amp;gt;&amp;lt;/code&amp;gt;. Для ручной проверки:&lt;br /&gt;
 curl -H &amp;quot;Authorization: Bearer $SVACER_MCP_TOKEN&amp;quot; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Content-Type: application/json&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -H &#039;Accept: application/json, text/event-stream&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;initialize&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;protocolVersion&amp;quot;:&amp;quot;2025-11-25&amp;quot;,&amp;quot;capabilities&amp;quot;:{},&amp;quot;clientInfo&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;curl&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;0&amp;quot;}}}&#039; \&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    &amp;lt;nowiki&amp;gt;http://localhost:8002/mcp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
Справочник по 8 инструментам Svacer MCP. Типичный порядок вызовов: &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt; → любой из аналитических инструментов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Инструмент&lt;br /&gt;
!Назначение&lt;br /&gt;
|-&lt;br /&gt;
|get_projects&lt;br /&gt;
|Список проектов с ветками — точка входа&lt;br /&gt;
|-&lt;br /&gt;
|get_snapshots&lt;br /&gt;
|Снимки конкретной ветки, от нового к старому&lt;br /&gt;
|-&lt;br /&gt;
|get_project_stats&lt;br /&gt;
|Агрегированные метрики снимка: severity / review / checker&lt;br /&gt;
|-&lt;br /&gt;
|get_markers&lt;br /&gt;
|Компактный список маркеров с серверной фильтрацией&lt;br /&gt;
|-&lt;br /&gt;
|get_warnings&lt;br /&gt;
|Полные предупреждения с трассами и историей разметки&lt;br /&gt;
|-&lt;br /&gt;
|get_diff&lt;br /&gt;
|Сравнение двух снимков: new / missing / modified / matched&lt;br /&gt;
|-&lt;br /&gt;
|get_advanced_file_preview&lt;br /&gt;
|Фрагмент исходного кода вокруг строки&lt;br /&gt;
|-&lt;br /&gt;
|get_project_groups&lt;br /&gt;
|Группа проектов по имени или UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== get_projects ===&lt;br /&gt;
Список всех проектов с ветками. Точка входа: с этого вызова начинается практически любой сценарий — он возвращает &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;, необходимые для последующих запросов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметров нет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_projects()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;project_id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
     &amp;quot;project_name&amp;quot;: &amp;quot;bash&amp;quot;,&lt;br /&gt;
     &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.122456Z&amp;quot;,&lt;br /&gt;
     &amp;quot;created_by&amp;quot;: &amp;quot;admin&amp;quot;,&lt;br /&gt;
     &amp;quot;branches&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
         &amp;quot;branch_id&amp;quot;: &amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
         &amp;quot;branch_name&amp;quot;: &amp;quot;master&amp;quot;,&lt;br /&gt;
         &amp;quot;created&amp;quot;: &amp;quot;2021-12-13T13:22:42.394812Z&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_snapshots ===&lt;br /&gt;
Список снимков для конкретной ветки проекта, от нового к старому.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|name_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока или regex для фильтра по имени снимка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_snapshots(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 [&lt;br /&gt;
   {&lt;br /&gt;
     &amp;quot;snapshot_id&amp;quot;: &amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Snapshot 2020-03-25 09:09:41 +0300&amp;quot;,&lt;br /&gt;
     &amp;quot;import_time&amp;quot;: &amp;quot;2020-03-25T09:09:41.837296Z&amp;quot;,&lt;br /&gt;
     &amp;quot;commit_hash&amp;quot;: null,&lt;br /&gt;
     &amp;quot;markers_count&amp;quot;: 297,&lt;br /&gt;
     &amp;quot;link&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://svacer-demo.ispras.ru/&amp;lt;/nowiki&amp;gt;...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 ]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_stats ===&lt;br /&gt;
Агрегированные метрики по снимку: общее количество предупреждений, распределение по критичности, по статусу разметки, по детекторам. Наиболее быстрый способ получить общую картину по проекту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_stats(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_warnings&amp;quot;: 771,&lt;br /&gt;
   &amp;quot;by_severity&amp;quot;: {&lt;br /&gt;
     &amp;quot;Critical&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Major&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Unspecified&amp;quot;: 769&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_review_status&amp;quot;: {&lt;br /&gt;
     &amp;quot;Confirmed&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;False Positive&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Undecided&amp;quot;: 767,&lt;br /&gt;
     &amp;quot;Unclear&amp;quot;: 1,&lt;br /&gt;
     &amp;quot;Won&#039;t fix&amp;quot;: 1&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;by_checker&amp;quot;: {&lt;br /&gt;
     &amp;quot;PROC_USE.VULNERABLE&amp;quot;: 337,&lt;br /&gt;
     &amp;quot;UNUSED_FUNC_RES.REWRITE.MINOR&amp;quot;: 44,&lt;br /&gt;
     &amp;quot;UNREACHABLE_CODE&amp;quot;: 28,&lt;br /&gt;
     &amp;quot;DEREF_AFTER_NULL.EX&amp;quot;: 27,&lt;br /&gt;
     &amp;quot;NULL_AFTER_DEREF&amp;quot;: 27&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_markers ===&lt;br /&gt;
Компактный список маркеров с серверной фильтрацией. Основной инструмент для перечисления и обзора: его следует предпочитать &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;, когда не требуются развёрнутые поля — трассы и история разметки.&lt;br /&gt;
&lt;br /&gt;
По умолчанию ответ ограничен 30 маркерами и содержит компактный набор полей. Подробнее об ограничении объёма см. раздел [[Help:13-alpha MCP#Про объём ответа|Про объём ответа]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt; применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора (&amp;lt;code&amp;gt;DEREF_AFTER_NULL&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы маркеров&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю изменений разметки&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии к маркеру&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра из веб-интерфейса Svacer&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров в ответе (по умолчанию 30). Значение 0 снимает ограничение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Список разрешённых полей маркера верхнего уровня. По умолчанию — компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt;. Значение &amp;lt;code&amp;gt;[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает все поля коннектора (&amp;lt;code&amp;gt;id, warnClass, file, line, msg, tool, function, mtid, review&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены). Допустим и произвольный список, например &amp;lt;code&amp;gt;[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_markers(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 341,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 30,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;warnClass&amp;quot;: [&amp;quot;PROC_USE.VULNERABLE&amp;quot;]},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;e05bb35b-a95e-4eb2-85ae-3101b788f07d&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;PROC_USE.VULNERABLE.TEMP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/lib/sh/tmpfile.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 160,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Use of vulnerable function &#039;mktemp&#039; at tmpfile.c:160. ...&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;sh_mktmpname&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: null&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; отражает количество маркеров, удовлетворяющих фильтру до применения ограничения; &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt; — количество маркеров, фактически содержащихся в &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; следует либо сузить фильтры (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;), либо передать &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; для получения полного списка. Поля &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; возвращаются только при &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_warnings ===&lt;br /&gt;
Полные предупреждения с детальной разметкой. Ответ значительно объёмнее, чем у &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, поэтому инструмент следует использовать только тогда, когда нужны поля, отсутствующие в компактной форме: &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Лимит по умолчанию — 30; при включённых &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt; он автоматически снижается до 8, поскольку такие предупреждения существенно объёмнее.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|project_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|branch_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_projects&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Из &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|severity&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Critical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Major&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Minor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt;. Фильтр по &amp;lt;code&amp;gt;review.severity&amp;lt;/code&amp;gt;, применяется на стороне коннектора&lt;br /&gt;
|-&lt;br /&gt;
|review&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|&amp;lt;code&amp;gt;Confirmed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Won&#039;t fix&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False Positive&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Unclear&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|warnClass&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Идентификатор детектора&lt;br /&gt;
|-&lt;br /&gt;
|file&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|Подстрока пути к файлу&lt;br /&gt;
|-&lt;br /&gt;
|traces&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить трассы. Активирует режим расширенных полей (лимит по умолчанию — 8)&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить метаданные детектора (CWE, описание)&lt;br /&gt;
|-&lt;br /&gt;
|review_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить историю разметки. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|comment_history&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Включить комментарии. Режим расширенных полей&lt;br /&gt;
|-&lt;br /&gt;
|custom_filter&lt;br /&gt;
|string&lt;br /&gt;
|нет&lt;br /&gt;
|Имя или идентификатор сохранённого фильтра&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество предупреждений в ответе. По умолчанию — 30, в режиме расширенных полей — 8. Значение 0 снимает ограничение. Явно заданное &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; отменяет автоматическое снижение&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_warnings(&lt;br /&gt;
   project_id=&amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;,&lt;br /&gt;
   branch_id=&amp;quot;77f66b9e-0453-4ae9-a187-88950b4c4bc4&amp;quot;,&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   severity=[&amp;quot;Critical&amp;quot;],&lt;br /&gt;
   review_history=True,&lt;br /&gt;
   traces=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;total_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;returned_count&amp;quot;: 1,&lt;br /&gt;
   &amp;quot;truncated&amp;quot;: false,&lt;br /&gt;
   &amp;quot;filters_applied&amp;quot;: {&amp;quot;severity&amp;quot;: [&amp;quot;Critical&amp;quot;], &amp;quot;traces&amp;quot;: true, &amp;quot;review_history&amp;quot;: true},&lt;br /&gt;
   &amp;quot;warnings&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;a3f21c90-1d4e-4b82-9f63-7c8e5d2a1b09&amp;quot;,&lt;br /&gt;
       &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;,&lt;br /&gt;
       &amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
       &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
       &amp;quot;msg&amp;quot;: &amp;quot;Possible null pointer dereference of &#039;l&#039; after loop exit.&amp;quot;,&lt;br /&gt;
       &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;,&lt;br /&gt;
       &amp;quot;review&amp;quot;: {&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;severity&amp;quot;: &amp;quot;Critical&amp;quot;},&lt;br /&gt;
       &amp;quot;review_history&amp;quot;: [{&amp;quot;status&amp;quot;: &amp;quot;Confirmed&amp;quot;, &amp;quot;changed_by&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;changed_at&amp;quot;: &amp;quot;2021-12-13T14:00:00Z&amp;quot;}],&lt;br /&gt;
       &amp;quot;traces&amp;quot;: [{&amp;quot;file&amp;quot;: &amp;quot;/.build/execute_cmd.c&amp;quot;, &amp;quot;line&amp;quot;: 3320, &amp;quot;msg&amp;quot;: &amp;quot;Loop starts here; &#039;l&#039; may exhaust the list.&amp;quot;}]&lt;br /&gt;
     }&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_diff ===&lt;br /&gt;
Сравнение двух снимков. Категории располагаются под ключом &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt; (появилось в новом снимке), &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt; (исчезло из нового), &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt; (тот же идентификатор, изменился контекст), &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt; (совпало в обоих). Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно UUID снимков.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|base_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|Старый снимок&lt;br /&gt;
|-&lt;br /&gt;
|head_snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|нет&lt;br /&gt;
|Новый снимок; если не указан, сравнение выполняется с предыдущим по времени&lt;br /&gt;
|-&lt;br /&gt;
|level&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|0 — только статистика; 1 — статистика и идентификаторы маркеров; 2 — полные маркеры по категориям&lt;br /&gt;
|-&lt;br /&gt;
|checker_info&lt;br /&gt;
|bool&lt;br /&gt;
|нет&lt;br /&gt;
|Метаданные детекторов для маркеров (только при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Максимальное количество маркеров &#039;&#039;&#039;на каждую категорию&#039;&#039;&#039; при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;. По умолчанию — 20, значение 0 снимает ограничение. Параметр игнорируется при &amp;lt;code&amp;gt;level &amp;lt; 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|fields&lt;br /&gt;
|string[]&lt;br /&gt;
|нет&lt;br /&gt;
|См. описание в &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Применяется к маркерам внутри категорий при &amp;lt;code&amp;gt;level &amp;gt;= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 get_diff(&lt;br /&gt;
   base_snapshot_id=&amp;quot;72b3df7b-c15a-4e3d-8f92-a041dc6e5b87&amp;quot;,&lt;br /&gt;
   head_snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   level=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&lt;br /&gt;
     &amp;quot;context1&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-20 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;context2&amp;quot;: {&amp;quot;projectName&amp;quot;: &amp;quot;paho.mqtt.c&amp;quot;, &amp;quot;snapshotName&amp;quot;: &amp;quot;Snapshot 2020-03-25 ...&amp;quot;},&lt;br /&gt;
     &amp;quot;scope&amp;quot;: [&amp;quot;NEW&amp;quot;, &amp;quot;MISSING&amp;quot;, &amp;quot;MATCHED&amp;quot;, &amp;quot;MODIFIED&amp;quot;],&lt;br /&gt;
     &amp;quot;new&amp;quot;: 9,&lt;br /&gt;
     &amp;quot;missing&amp;quot;: 12,&lt;br /&gt;
     &amp;quot;modified&amp;quot;: 98,&lt;br /&gt;
     &amp;quot;matched&amp;quot;: 187&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ (&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt;)&#039;&#039;&#039; — каждая категория внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; оформляется и ограничивается независимо:&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;stats&amp;quot;: {&amp;quot;new&amp;quot;: 50, &amp;quot;missing&amp;quot;: 5, &amp;quot;modified&amp;quot;: 0, &amp;quot;matched&amp;quot;: 187},&lt;br /&gt;
   &amp;quot;markers&amp;quot;: {&lt;br /&gt;
     &amp;quot;new_markers&amp;quot;: {&lt;br /&gt;
       &amp;quot;total_count&amp;quot;: 50,&lt;br /&gt;
       &amp;quot;returned_count&amp;quot;: 20,&lt;br /&gt;
       &amp;quot;truncated&amp;quot;: true,&lt;br /&gt;
       &amp;quot;markers&amp;quot;: [&lt;br /&gt;
         {&amp;quot;id&amp;quot;: &amp;quot;a3f21c90-...&amp;quot;, &amp;quot;warnClass&amp;quot;: &amp;quot;DEREF_AFTER_NULL.LOOP&amp;quot;, &amp;quot;file&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;line&amp;quot;: 3327, &amp;quot;msg&amp;quot;: &amp;quot;...&amp;quot;, &amp;quot;function&amp;quot;: &amp;quot;select_query&amp;quot;, &amp;quot;review&amp;quot;: null}&lt;br /&gt;
       ]&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;missing_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 5, &amp;quot;returned_count&amp;quot;: 5, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: [...]},&lt;br /&gt;
     &amp;quot;modified_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 0, &amp;quot;returned_count&amp;quot;: 0, &amp;quot;truncated&amp;quot;: false, &amp;quot;markers&amp;quot;: []},&lt;br /&gt;
     &amp;quot;matched_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: 187, &amp;quot;returned_count&amp;quot;: 20, &amp;quot;truncated&amp;quot;: true, &amp;quot;markers&amp;quot;: [...]}&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;, либо запросить нужные идентификаторы отдельным вызовом &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;. Маркеры внутри категорий проходят ту же компактную обработку, что и в &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;: значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; возвращает фиксированный набор полей коннектора, а не произвольные «сырые» поля API.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_advanced_file_preview ===&lt;br /&gt;
Фрагмент исходного кода из снимка вокруг указанной строки. Параметры &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt; не требуются — достаточно идентификатора снимка и пути к файлу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|snapshot_id&lt;br /&gt;
|string (UUID)&lt;br /&gt;
|да&lt;br /&gt;
|UUID снимка&lt;br /&gt;
|-&lt;br /&gt;
|file_path&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Путь к файлу в том виде, в котором его возвращают &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|line&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Центральная строка, нумерация с 1 (по умолчанию 1)&lt;br /&gt;
|-&lt;br /&gt;
|before&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк до центральной (по умолчанию 0)&lt;br /&gt;
|-&lt;br /&gt;
|after&lt;br /&gt;
|int&lt;br /&gt;
|нет&lt;br /&gt;
|Количество строк после центральной (по умолчанию 99999 — до конца файла)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_advanced_file_preview(&lt;br /&gt;
   snapshot_id=&amp;quot;b42cb563-86f4-4f96-900a-7782163327c9&amp;quot;,&lt;br /&gt;
   file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;,&lt;br /&gt;
   line=3327,&lt;br /&gt;
   before=10,&lt;br /&gt;
   after=10&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;line&amp;quot;: 3327,&lt;br /&gt;
   &amp;quot;content&amp;quot;: &amp;quot;      for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)\n\t;\n      return (l-&amp;gt;word-&amp;gt;word);\n&amp;quot;,&lt;br /&gt;
   &amp;quot;total_lines&amp;quot;: 6082&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== get_project_groups ===&lt;br /&gt;
Получить группу проектов по имени или UUID. Группы объединяют проекты в логические блоки — например, по команде или продукту.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параметры.&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Имя&lt;br /&gt;
!Тип&lt;br /&gt;
!Обязательный&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|name_or_id&lt;br /&gt;
|string&lt;br /&gt;
|да&lt;br /&gt;
|Имя группы или её UUID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вызов:&#039;&#039;&#039;&lt;br /&gt;
 get_project_groups(name_or_id=&amp;quot;Linux Tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ:&#039;&#039;&#039;&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;project_group_id&amp;quot;: &amp;quot;c4f8a2d1-3b7e-4f90-82ac-1d5e8f2b6c04&amp;quot;,&lt;br /&gt;
   &amp;quot;project_group_name&amp;quot;: &amp;quot;Linux Tools&amp;quot;,&lt;br /&gt;
   &amp;quot;projects&amp;quot;: [&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;91630e84-db2f-4d8c-8716-68b7fdf17a66&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;bash&amp;quot;},&lt;br /&gt;
     {&amp;quot;id&amp;quot;: &amp;quot;d3a17f52-...&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;coreutils&amp;quot;}&lt;br /&gt;
   ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;projects[].id&amp;lt;/code&amp;gt; — это &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt;, который далее передаётся в &amp;lt;code&amp;gt;get_snapshots&amp;lt;/code&amp;gt;. Группы и проекты — разные сущности; идентификатор группы и идентификатор проекта не взаимозаменяемы.&lt;br /&gt;
&lt;br /&gt;
== Примеры сценариев ==&lt;br /&gt;
Приведённые ниже запросы выполнены на демонстрационном стенде &amp;lt;code&amp;gt;svacer-demo.ispras.ru&amp;lt;/code&amp;gt; с использованием OpenWebUI и модели &amp;lt;code&amp;gt;qwen3-coder:30b&amp;lt;/code&amp;gt;. В любом другом MCP-клиенте с моделью достаточной мощности порядок вызовов будет аналогичным.&lt;br /&gt;
&lt;br /&gt;
=== Про объём ответа ===&lt;br /&gt;
&amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; по умолчанию ограничивают объём ответа, чтобы не перегружать контекст модели:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; — 30 маркеров по умолчанию. Если у &amp;lt;code&amp;gt;get_warnings&amp;lt;/code&amp;gt; включены &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;comment_history&amp;lt;/code&amp;gt;, лимит снижается до 8, поскольку такие маркеры значительно объёмнее.&lt;br /&gt;
* &amp;lt;code&amp;gt;get_diff(level=2)&amp;lt;/code&amp;gt; — 20 маркеров на каждую категорию внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
В ответе присутствуют поля &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;returned_count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;truncated&amp;lt;/code&amp;gt;. При &amp;lt;code&amp;gt;truncated: true&amp;lt;/code&amp;gt; есть два варианта действий: сузить фильтр (&amp;lt;code&amp;gt;severity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;warnClass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;) либо явно увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; (значение &amp;lt;code&amp;gt;limit=0&amp;lt;/code&amp;gt; полностью снимает ограничение).&lt;br /&gt;
&lt;br /&gt;
Поле &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; определяет, какие ключи маркера возвращаются. По умолчанию применяется компактный набор &amp;lt;code&amp;gt;id, warnClass, file, line, msg, function, review&amp;lt;/code&amp;gt; (а также &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;checkerInfo&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;review_history&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;, если они запрошены логическими флагами и пришли с сервера). Для полного маркера со всеми служебными ключами — &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt;. Для произвольной выборки — список полей верхнего уровня, например &amp;lt;code&amp;gt;fields=[&amp;quot;id&amp;quot;,&amp;quot;warnClass&amp;quot;]&amp;lt;/code&amp;gt;. Поле &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; — объект &amp;lt;code&amp;gt;{status, severity, action}&amp;lt;/code&amp;gt;; вложенные ключи в &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; не поддерживаются, поэтому объект &amp;lt;code&amp;gt;review&amp;lt;/code&amp;gt; запрашивается целиком.&lt;br /&gt;
&lt;br /&gt;
=== Перечислить все проекты ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие проекты есть в Svacer?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В Svacer доступно 6 проектов: bash, openssl, paho.mqtt.c, coturn, zstd, darpa. У каждого — одна ветка &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Посмотреть снимки проекта ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Какие снимки есть у paho.mqtt.c? Самый свежий когда?&amp;lt;/blockquote&amp;gt;&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; — найти &amp;lt;code&amp;gt;project_id&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;branch_id&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id=..., branch_id=...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;У paho.mqtt.c 3 снимка. Самый свежий — «Snapshot 2020-03-25 09:09:41 +0300» (297 маркеров). Предыдущий — 20 марта (306 маркеров).&amp;lt;/blockquote&amp;gt;Поле &amp;lt;code&amp;gt;commit_hash&amp;lt;/code&amp;gt; может принимать значение &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, если проект не сохраняет хэш коммита в &amp;lt;code&amp;gt;custom_properties&amp;lt;/code&amp;gt;. Имена снимков произвольны: одни проекты записывают в имя дату, другие — коммит, третьи — свободный текст.&lt;br /&gt;
&lt;br /&gt;
=== Сводка по проекту ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Что в bash в последнем снимке? Сколько всего предупреждений, есть ли критические, какие топ-детекторы?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots(project_id, branch_id)&amp;lt;/code&amp;gt; — взять последний снимок&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats(project_id, branch_id, snapshot_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В последнем снимке bash содержится 771 предупреждение:&lt;br /&gt;
&lt;br /&gt;
* Критических: 1 (Confirmed)&lt;br /&gt;
* Major: 1 (Won&#039;t fix)&lt;br /&gt;
* Остальные: 769 (Unspecified — не размечались)&lt;br /&gt;
&lt;br /&gt;
Топ-детекторы по количеству:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;PROC_USE.VULNERABLE&amp;lt;/code&amp;gt; — 337&lt;br /&gt;
# &amp;lt;code&amp;gt;UNUSED_FUNC_RES.REWRITE.MINOR&amp;lt;/code&amp;gt; — 44&lt;br /&gt;
# &amp;lt;code&amp;gt;UNREACHABLE_CODE&amp;lt;/code&amp;gt; — 28&lt;br /&gt;
# &amp;lt;code&amp;gt;DEREF_AFTER_NULL.EX&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
# &amp;lt;code&amp;gt;NULL_AFTER_DEREF&amp;lt;/code&amp;gt; — 27&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Unspecified&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;by_severity&amp;lt;/code&amp;gt; — маркеры без ручной разметки, а не «низкий приоритет». Поле &amp;lt;code&amp;gt;by_checker&amp;lt;/code&amp;gt; не сортируется, на большом снимке оно может содержать более 100 ключей — чтобы получить именно топ-N, следует явно сформулировать запрос: «топ-5 детекторов».&lt;br /&gt;
&lt;br /&gt;
=== Тренд по нескольким снимкам ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Как у openssl менялось число предупреждений за последние пять снимков? Покажи таблицей.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — взять список&lt;br /&gt;
# &amp;lt;code&amp;gt;get_project_stats()&amp;lt;/code&amp;gt; × 5 — по каждому из последних пяти снимков&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Снимок&lt;br /&gt;
!Дата&lt;br /&gt;
!Всего&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:49&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:29&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 05:08&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:48&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|-&lt;br /&gt;
|2020-04-30 04:22&lt;br /&gt;
|30.04.2020&lt;br /&gt;
|1252&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На демонстрационном стенде указанные пять снимков openssl импортированы с интервалом в 20 минут одного дня и полностью идентичны — поэтому динамика отсутствует. На реальном проекте с историей релизов значения будут изменяться.&lt;br /&gt;
&lt;br /&gt;
=== Найти срабатывания конкретного детектора ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Где в bash срабатывает PROC_USE.VULNERABLE? Покажи список — файл, строка, что именно ругается. Достаточно первых десяти.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/tmpfile.c:160&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;mktemp()&amp;lt;/code&amp;gt;, race condition. Рекомендуется &amp;lt;code&amp;gt;mkstemp()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/shell.c:151&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;, значение может быть подменено.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/shell.c:415&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/readline/complete.c:1516&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;getenv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;/.build/lib/sh/eaccess.c:115&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;strcat()&amp;lt;/code&amp;gt;, рекомендуется &amp;lt;code&amp;gt;strncat()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Фильтр &amp;lt;code&amp;gt;warnClass=[&amp;quot;PROC_USE.VULNERABLE&amp;quot;]&amp;lt;/code&amp;gt; охватывает все подклассы: &amp;lt;code&amp;gt;PROC_USE.VULNERABLE.TEMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.GETENV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.STRCAT&amp;lt;/code&amp;gt; и т. д. — всего 341 маркер. Несколько значений в одном параметре трактуются как логическое «ИЛИ»: &amp;lt;code&amp;gt;severity=[&amp;quot;Critical&amp;quot;,&amp;quot;Major&amp;quot;]&amp;lt;/code&amp;gt; возвращает маркеры обеих категорий.&lt;br /&gt;
&lt;br /&gt;
В ответе будет &amp;lt;code&amp;gt;total_count: 341, returned_count: 30, truncated: true&amp;lt;/code&amp;gt; — это ожидаемое поведение. Модель видит общий объём по &amp;lt;code&amp;gt;total_count&amp;lt;/code&amp;gt; и при необходимости сужает запрос или вызывает &amp;lt;code&amp;gt;get_markers(..., limit=0)&amp;lt;/code&amp;gt;, чтобы получить полный список.&lt;br /&gt;
&lt;br /&gt;
=== Сравнить два снимка ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Возьми два последних снимка paho.mqtt.c — что между ними изменилось? Сколько новых предупреждений, сколько починили?&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — два последних&lt;br /&gt;
# &amp;lt;code&amp;gt;get_diff(base_snapshot_id=&amp;quot;72b3df7b-...&amp;quot;, head_snapshot_id=&amp;quot;b42cb563-...&amp;quot;, level=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Между двумя последними снимками paho.mqtt.c:&lt;br /&gt;
&lt;br /&gt;
* Новых: 12&lt;br /&gt;
* Удалённых: 13&lt;br /&gt;
* Изменённых: 99&lt;br /&gt;
* Совпадающих: 185&lt;br /&gt;
&lt;br /&gt;
Удалено несколько больше, чем добавлено — общая картина практически не изменилась.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Категория &amp;lt;code&amp;gt;modified&amp;lt;/code&amp;gt; — маркер, присутствующий в обоих снимках, у которого изменилось окружение (номер строки, контекст функции). Это не новая ошибка. На больших проектах рекомендуется начинать с &amp;lt;code&amp;gt;level=0&amp;lt;/code&amp;gt; для получения статистики, при необходимости использовать &amp;lt;code&amp;gt;level=1&amp;lt;/code&amp;gt; (только идентификаторы маркеров) и затем точечно вызывать &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; с нужными фильтрами.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;level=2&amp;lt;/code&amp;gt; возвращает полные маркеры по категориям, причём каждая категория по умолчанию ограничена 20 маркерами. Категории располагаются внутри &amp;lt;code&amp;gt;markers&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;new_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;missing_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modified_markers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;matched_markers&amp;lt;/code&amp;gt;. Структура ответа в JSON: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;markers&amp;quot;: {&amp;quot;new_markers&amp;quot;: {&amp;quot;total_count&amp;quot;: N, &amp;quot;returned_count&amp;quot;: ..., &amp;quot;truncated&amp;quot;: ..., &amp;quot;markers&amp;quot;: [...]}, ...}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Если требуется полное содержимое категории, следует увеличить &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; или выполнить отдельный вызов &amp;lt;code&amp;gt;get_markers&amp;lt;/code&amp;gt; по нужным идентификаторам.&lt;br /&gt;
&lt;br /&gt;
=== Разобрать конкретное предупреждение ===&lt;br /&gt;
&amp;lt;blockquote&amp;gt;В bash есть один подтверждённый критикал — что-то про разыменование указателя. Покажи код вокруг этого места и объясни в чём проблема.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Цепочка вызовов:&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_projects()&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;get_snapshots()&amp;lt;/code&amp;gt; — найти снимок bash&lt;br /&gt;
# &amp;lt;code&amp;gt;get_markers(severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;get_advanced_file_preview(file_path=&amp;quot;/.build/execute_cmd.c&amp;quot;, line=3327, before=10, after=10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответ модели:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Маркер &amp;lt;code&amp;gt;DEREF_AFTER_NULL.LOOP&amp;lt;/code&amp;gt; в функции &amp;lt;code&amp;gt;select_query()&amp;lt;/code&amp;gt;, строка 3327:&lt;br /&gt;
 &amp;lt;code&amp;gt;for (l = list; l &amp;amp;&amp;amp; --reply; l = l-&amp;gt;next)&lt;br /&gt;
 &lt;br /&gt;
 ;&lt;br /&gt;
 &lt;br /&gt;
return (l-&amp;gt;word-&amp;gt;word);  /* l может быть NULL после выхода из цикла */&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если список заканчивается раньше, чем &amp;lt;code&amp;gt;reply&amp;lt;/code&amp;gt; обнуляется, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; станет &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; на последнем &amp;lt;code&amp;gt;l-&amp;gt;next&amp;lt;/code&amp;gt;, и следующий &amp;lt;code&amp;gt;l-&amp;gt;word-&amp;gt;word&amp;lt;/code&amp;gt; — разыменование нулевого указателя.&amp;lt;/blockquote&amp;gt;&amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; должен точно совпадать со значением, возвращённым маркером, включая ведущий префикс &amp;lt;code&amp;gt;/.build/...&amp;lt;/code&amp;gt;. Это путь внутри сборочной директории Svacer, а не путь в исходном репозитории; соответствие в репозитории определяется по имени файла.&lt;br /&gt;
&lt;br /&gt;
Для одиночной разметки удобно сразу запрашивать полный маркер с трассами: &amp;lt;code&amp;gt;get_markers(..., severity=[&amp;quot;Critical&amp;quot;], review=[&amp;quot;Confirmed&amp;quot;], traces=True, checker_info=True)&amp;lt;/code&amp;gt;. Флаги &amp;lt;code&amp;gt;traces&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;checker_info&amp;lt;/code&amp;gt; указывают серверу включить соответствующие поля в ответ; в выдаче они сохраняются и при значении &amp;lt;code&amp;gt;fields&amp;lt;/code&amp;gt; по умолчанию. Значение &amp;lt;code&amp;gt;fields=[&amp;quot;*&amp;quot;]&amp;lt;/code&amp;gt; требуется лишь в том случае, когда дополнительно нужны &amp;lt;code&amp;gt;tool&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mtid&amp;lt;/code&amp;gt; — служебные ключи, исключённые из компактного набора.&lt;/div&gt;</summary>
		<author><name>Vaclovas</name></author>
	</entry>
</feed>