Last9 MCP Server
официальныйБесшовно переносите контекст реальной производственной среды — логи, метрики и трейсы — в ваше локальное окружение, чтобы быстрее автоматически исправлять код.
Документация
Last9 MCP Server

Ваш ИИ-агент не знает, что сломалось в продакшене. Это исправляет ситуацию.
Last9 MCP Server подключает Claude, Cursor, Windsurf и любого другого ИИ-ассистента с поддержкой MCP напрямую к вашим производственным данным наблюдаемости — логам, метрикам, трассировкам, исключениям, запросам к базам данных, оповещениям и развертываниям. Агент перестает гадать и начинает считывать реальные сигналы.
Начало работы за 30 секунд (Облачное решение)
Никаких бинарников для установки. Никаких токенов для управления. Один URL, OAuth в вашем браузере — и готово.
Найдите ярлык вашей организации в вашем URL Last9: app.last9.io/<org_slug>/...
Claude Code
claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp
Введите /mcp, выберите last9, пройдите аутентификацию. Вот и всё.
Cursor
Settings > MCP > Add New MCP Server:
{
"mcpServers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Нажмите Connect, завершите OAuth.
VS Code
Требуется версия 1.99+. Откройте Command Palette → MCP: Add Server, вставьте URL, пройдите аутентификацию.
Или напрямую в settings.json:
{
"mcp": {
"servers": {
"last9": {
"type": "http",
"url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
}
Windsurf
Settings > Cascade > Open MCP Marketplace > значок шестеренки (mcp_config.json):
{
"mcpServers": {
"last9": {
"serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
}
}
}
Claude Web/Desktop
Settings > Connectors > Add custom connector. Назовите его last9, вставьте URL, пройдите аутентификацию.
Требуется административный доступ к вашей организации Claude.
Самостоятельное развертывание (STDIO)
Используйте этот способ, если ваш MCP-клиент не поддерживает транспорт HTTP или если вам нужен локально работающий сервер.
Установка
Homebrew:
brew install last9/tap/last9-mcp
NPM:
npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest
Бинарные релизы (Windows / ручная установка):
Скачайте с GitHub Releases:
| Платформа | Архив |
|---|---|
| Windows (x64) | last9-mcp-server_Windows_x86_64.zip |
| Windows (ARM64) | last9-mcp-server_Windows_arm64.zip |
| Linux (x64) | last9-mcp-server_Linux_x86_64.tar.gz |
| Linux (ARM64) | last9-mcp-server_Linux_arm64.tar.gz |
| macOS (x64) | last9-mcp-server_Darwin_x86_64.tar.gz |
| macOS (ARM64) | last9-mcp-server_Darwin_arm64.tar.gz |
Получение Refresh Token
Только администраторы могут создавать токены.
- Перейдите в API Access
- Нажмите Generate Token с правами на запись
- Скопируйте его
Конфигурация клиента
Homebrew:
{
"mcpServers": {
"last9": {
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
NPM:
{
"mcpServers": {
"last9": {
"command": "npx",
"args": ["-y", "@last9/mcp-server@latest"],
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
Куда это вставить:
| Клиент | Расположение |
|---|---|
| Claude Web/Desktop | Settings > Developer > Edit Config (claude_desktop_config.json) |
| Cursor | Settings > Cursor Settings > MCP > Add New Global MCP Server |
| Windsurf | Settings > Cascade > MCP Marketplace > значок шестеренки (mcp_config.json) |
| VS Code | Оберните в { "mcp": { "servers": { ... } } } в settings.json — подробнее |
Конфигурация VS Code STDIO
{
"mcp": {
"servers": {
"last9": {
"type": "stdio",
"command": "/opt/homebrew/bin/last9-mcp",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
}
Для NPM: используйте "command": "npx" и добавьте "args": ["-y", "@last9/mcp-server@latest"].
Windows
После скачивания с GitHub Releases распакуйте архив и укажите полный путь:
{
"mcpServers": {
"last9": {
"command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
"env": {
"LAST9_REFRESH_TOKEN": "<your_refresh_token>"
}
}
}
}
Путь через NPM проще в Windows — не нужно управлять путями.
Переменные окружения
| Переменная | По умолчанию | Описание |
|---|---|---|
LAST9_REFRESH_TOKEN | (обязательно) | Refresh token из API Access |
LAST9_DATASOURCE | по умолчанию для организации | Имя источника данных/кластера — полезно, если у вас несколько кластеров Levitate |
LAST9_API_HOST | app.last9.io | Переопределить хост API |
LAST9_MAX_GET_LOGS_ENTRIES | 5000 | Максимальное количество записей для фрагментированных запросов get_logs |
LAST9_DEBUG_CHUNKING | false | Установите true, чтобы логировать детали планирования фрагментов для get_logs, get_service_logs, get_traces |
LAST9_DISABLE_TELEMETRY | true | Установите false, чтобы включить внутреннюю трассировку OTel |
OTEL_SDK_DISABLED | — | Стандартная переменная окружения OTel. Переопределяет LAST9_DISABLE_TELEMETRY |
OTEL_EXPORTER_OTLP_ENDPOINT | — | Эндпоинт коллектора OTLP (только если телеметрия включена) |
OTEL_EXPORTER_OTLP_HEADERS | — | Заголовки аутентификации OTLP (только если телеметрия включена) |
Что он умеет
Состояние сервисов
get_service_summary— Пропускная способность, частота ошибок, p95 время отклика по всем сервисамget_service_environments— Доступные окружения для ваших сервисов. Запустите это первым — другим инструментам APM нуженenvотсюдаget_service_performance_details— Полная разбивка: пропускная способность, частота ошибок, p50/p90/p95/среднее/макс, apdex, доступностьget_service_operations_summary— Операции, сгруппированные по HTTP-эндпоинтам, вызовам БД, обмену сообщениями, HTTP-клиентамget_service_dependency_graph— Карта зависимостей с пропускной способностью, задержкой и частотой ошибок для upstream/downstream/инфраструктурыget_exceptions— Серверные исключения с фильтрами по сервису и спанам
Наблюдаемость баз данных
Четыре инструмента, которые напрямую работают с производительностью вашей базы данных, извлекая данные из спанов трассировки OpenTelemetry. Дополнительная инструментация не требуется, если вы уже используете OTel.
get_databases— Обнаружение всех баз данных в вашей инфраструктуре: тип БД, хост, пропускная способность (запросов/мин), p95 задержка, частота ошибок, количество зависимых сервисовget_database_slow_queries— Фактически самые медленные выполнения запросов, упорядоченные по длительности, с идентификаторами трассировки для детального изучения полных трассировокget_database_queries— Шаблоны запросов и агрегаты: как часто выполняется запрос, средняя/p95 длительность, частота ошибокget_database_server_metrics— Серверные метрики с самого хоста БД (ЦП, соединения, частота попаданий в буфер — зависит от вашей СУБД)
Поддерживает PostgreSQL, MySQL, MongoDB, Redis, Aerospike и любые другие системы, передающие OTel трассировки с атрибутом db_system.
Prometheus / PromQL
prometheus_range_query— Запросы диапазона PromQL по любой метрикеprometheus_instant_query— Мгновенные запросы; используйте функции свертки, такие какavg_over_time,sum_over_timeprometheus_label_values— Значения меток для заданного рядаprometheus_labels— Все метки, доступные для ряда
Направьте их на другой источник данных/кластер, отличный от используемого по умолчанию, установив LAST9_DATASOURCE.
Логи
get_logs— Полные JSON-запросы к конвейеру логов (агрегации, фильтры, извлечение полей)get_service_logs— Необработанные строки логов для сервиса, с возможностью фильтрации по серьезности и содержимому телаget_log_attributes— Глобальный каталог атрибутов в схеме логов за временной интервалget_log_attributes_for_pipeline— Поля логов, фактически присутствующие для выполняющегося конвейера (ограниченное обнаружение), каждое с точнымfilter_fieldget_drop_rules— Правила отбрасывания логов из Last9 Control Planeadd_drop_rule— Создать новое правило отбрасывания для сокращения объема логов на источнике
Трассировки
get_traces— JSON-запросы к конвейеру трассировок для широкого поиска и агрегацийget_service_traces— Трассировки по точному идентификатору трассировки или имени сервиса. Используйте это, когда у вас есть идентификатор трассировки — это быстрееget_trace_attributes— Глобальный каталог атрибутов в схеме трассировокget_trace_attributes_for_pipeline— Атрибуты, фактически присутствующие для выполняющегося конвейера (ограниченное обнаружение), каждый с точнымfilter_fieldget_trace_attribute_values— Уникальные значения для атрибута трассировки, опционально ограниченные конвейером
События изменений и оповещения
get_change_events— Развертывания, изменения конфигурации, откаты. Сопоставляйте инциденты с тем, что изменилосьget_alert_config— Конфигурации правил оповещения — с возможностью поиска по имени, серьезности, типу, тегамget_alerts— Текущие активные оповещения за временной интервалget_alert_rule_state— Историческое состояние срабатывания (1/0) для каждого правила оповещения за временной диапазон, сгруппированное поrule_id. Фильтруется по группе оповещений, имени правила, фильтрам меток и состоянию.get_notification_channels— Настроенные каналы уведомлений (Slack, PagerDuty, email и т.д.)
Пользовательские дашборды
list_dashboards— Все пользовательские дашборды в вашей организации: идентификаторы, имена и метаданныеget_dashboard— Полное определение дашборда по идентификатору, включая панели и запросыcreate_dashboard— Создать новый пользовательский дашборд с панелями, запросами и метаданнымиupdate_dashboard— Обновить существующий дашборд по идентификатору (системные дашборды только для чтения вернут ошибку)delete_dashboard— Удалить пользовательский дашборд по идентификатору
Нечеткое разрешение имен
did_you_mean— Когда агент не уверен в имени сущности, этот инструмент возвращает ближайшие совпадения из вашего каталога (сервисы, окружения, хосты, базы данных, развертывания/пространства имен K8s, задания). До 3 предложений с оценками сходства. Сервер вызывает это автоматически перед большинством инструментов, когда поиск по имени возвращает пустой результат.
Как это работает
Прямые ссылки в каждом ответе. Каждый инструмент возвращает поле deep_link — прямой URL в дашборд Last9 для этого конкретного запроса и временного диапазона. Агент может передать вам ссылку; вы нажимаете на нее; вы на месте.
Живое кэширование атрибутов. При запуске сервер извлекает фактические имена атрибутов логов и трассировок из ваших данных и встраивает их в описания инструментов. Это означает, что ИИ-ассистент знает, какие поля существуют в вашей схеме, а не просто общий список. Кэш обновляется каждые 2 часа.
Фрагментированные большие результаты. get_logs и get_traces обрабатывают большие наборы результатов путем фрагментации, а не усечения. Лимит по умолчанию составляет 5000 записей для логов; настраивается через LAST9_MAX_GET_LOGS_ENTRIES.
Разработка
Режим HTTP, тестирование curl, сборка из исходников
Запуск в режиме HTTP
export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server
Сервер запускается на http://localhost:8080/mcp.
Тестирование с помощью curl
MCP Streamable HTTP требует сначала рукопожатия инициализации. Не устанавливайте Mcp-Session-Id при первом запросе.
# Step 1: Initialize
SESSION_ID=$(curl -si -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {"name": "curl-test", "version": "1.0"}
}
}' | grep -i "^Mcp-Session-Id:" | awk '{print $2}' | tr -d '\r')
echo "Session: $SESSION_ID"
# Step 2: Send initialized notification
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc": "2.0", "method": "notifications/initialized", "params": {}}'
# Step 3: List tools
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}'
# Step 4: Call a tool
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_service_logs",
"arguments": {
"service": "your-service-name",
"lookback_minutes": 30,
"limit": 10
}
}
}'
Сборка из исходников
git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server
LAST9_HTTP=true предназначен для локальной разработки. Для реального использования проще размещенная конечная точка HTTP.
Справочник инструментов
Все параметры, стандарты ввода времени и детали
Ввод времени
- Абсолютное время (
start_time_iso/end_time_isoилиtime_iso) имеет приоритет надlookback_minutes. - Для относительных окон: используйте
lookback_minutes. - Для абсолютных окон: используйте RFC3339/ISO8601 —
2026-02-09T15:04:05Z. - Устаревший
YYYY-MM-DD HH:MM:SSпринимается только для совместимости.
get_exceptions
limit(целое число, необязательно): Максимальное количество исключений. По умолчанию: 20.lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно): Абсолютный временной диапазон.service_name(строка, необязательно): Фильтр по сервису.span_name(строка, необязательно): Фильтр по имени спана.deployment_environment(строка, необязательно): Фильтр по окружению.
get_service_summary
start_time_iso/end_time_iso(строка, необязательно)env(строка, необязательно): По умолчаниюprod.
get_service_environments
start_time_iso/end_time_iso(строка, необязательно)
Всем остальным инструментам APM требуется значение
env. Используйте"", если этот инструмент возвращает пустой результат.
get_service_performance_details
service_name(строка, обязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)env(строка, необязательно): По умолчаниюprod.
get_service_operations_summary
service_name(строка, обязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)env(строка, необязательно): По умолчаниюprod.
get_service_dependency_graph
service_name(строка, необязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)env(строка, необязательно): По умолчаниюprod.
get_databases
env(строка, необязательно): Фильтр по окружению. По умолчанию: all.lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)
get_database_slow_queries
db_system(строка, необязательно): например,postgresql,mysql,mongodb,redis.host(строка, необязательно): Хост базы данных (net_peer_name).service_name(строка, необязательно): Имя вызывающего сервиса.env(строка, необязательно)min_duration_ms(число с плавающей точкой, необязательно): Минимальная длительность запроса в мс.lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)limit(целое число, необязательно): По умолчанию: 20.
get_database_queries
db_system(строка, необязательно)host(строка, необязательно)service_name(строка, необязательно)env(строка, необязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)limit(целое число, необязательно): По умолчанию: 20.
get_database_server_metrics
db_system(строка, обязательно): например,postgresql,mysql,mongodb,redis,aerospike.host(строка, необязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.start_time_iso/end_time_iso(строка, необязательно)
prometheus_range_query
query(строка, обязательно): PromQL-запрос.start_time_iso/end_time_iso(строка, необязательно): По умолчанию последние 60 мин.lookback_minutes(число с плавающей точкой, необязательно): По умолчанию: 60.
prometheus_instant_query
query(строка, обязательно)time_iso(строка, необязательно): По умолчанию сейчас.lookback_minutes(число с плавающей точкой, необязательно)
prometheus_label_values
match_query(строка, необязательно): PromQL-фильтр.label(строка, обязательно): Имя метки.start_time_iso/end_time_iso(строка, необязательно)
prometheus_labels
match_query(строка, необязательно): PromQL-фильтр.start_time_iso/end_time_iso(строка, необязательно)
get_logs
logjson_query(массив, обязательно): JSON-запрос конвейера.lookback_minutes(целое число, необязательно): По умолчанию: 5.start_time_iso/end_time_iso(строка, необязательно)limit(целое число, необязательно): Серверное значение по умолчанию: 5000.index(строка, необязательно):physical_index:<name>илиrehydration_index:<block_name>.
Для инвентаризации сервисов на основе логов сначала запросите physical_index_service_count:
sum by (name, service_name, env) (physical_index_service_count{destination="logs"})
Используйте service_name как ServiceName, env как окружение, если оно указано, и name как имя физического индекса. Если name="default", опустите index; для нестандартного физического индекса, выбранного пользователем, передайте index: "physical_index:<name>". Если серверная часть отклоняет явную фильтрацию по физическому индексу, повторите попытку без index и сообщите, что явная фильтрация по физическому индексу недоступна для этой серверной части.
get_service_logs
service(строка, обязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.limit(целое число, необязательно): По умолчанию: 20.env(строка, необязательно)severity_filters(массив, необязательно): например,["error", "warn"]. Логика ИЛИ.body_filters(массив, необязательно): например,["timeout", "failed"]. Логика ИЛИ.start_time_iso/end_time_iso(строка, необязательно)index(строка, необязательно)
Несколько типов фильтров объединяются через И. Каждый массив внутри использует ИЛИ.
Сначала используйте get_logs для получения общих агрегированных подсчетов; используйте get_service_logs только после сужения до сервиса/окружения/индекса и небольшого набора образцов.
get_log_attributes
lookback_minutes(целое число, необязательно): По умолчанию: 15.start_time_iso/end_time_iso(строка, необязательно)region(строка, необязательно)index(строка, необязательно)
get_log_attributes_for_pipeline
pipeline(массив, обязательно): Предыдущие этапы фильтрации для ограничения области обнаружения, например,[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(целое число, необязательно): По умолчанию: 15.start_time_iso/end_time_iso(строка, необязательно)region(строка, необязательно)index(строка, необязательно)
get_drop_rules
Без параметров.
add_drop_rule
name(строка, обязательно)filters(массив, обязательно): Каждый фильтр:key,value,operator(equals/not_equals),conjunction(and).
get_traces
Используйте для широкого поиска и агрегаций. Для точного поиска по идентификатору трассировки используйте get_service_traces.
tracejson_query(массив, обязательно)start_time_iso/end_time_iso(строка, необязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.limit(целое число, необязательно): По умолчанию: 5000.
get_service_traces
Требуется ровно один из trace_id или service_name.
trace_id(строка, необязательно): Период поиска по умолчанию: 72 часа.service_name(строка, необязательно): Период поиска по умолчанию: 60 мин.lookback_minutes(целое число, необязательно)start_time_iso/end_time_iso(строка, необязательно)limit(целое число, необязательно): По умолчанию: 10.env(строка, необязательно)
get_trace_attributes
lookback_minutes(целое число, необязательно): По умолчанию: 15.start_time_iso/end_time_iso(строка, необязательно)region(строка, необязательно)
get_trace_attributes_for_pipeline
pipeline(массив, обязательно): Предыдущие этапы фильтрации для ограничения области обнаружения, например,[{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].lookback_minutes(целое число, необязательно): По умолчанию: 15.start_time_iso/end_time_iso(строка, необязательно)region(строка, необязательно)
get_trace_attribute_values
tag_name(строка, обязательно): Имя атрибута изget_trace_attributes(например,resource_departmentилиattributes['http.method']).pipeline(массив, необязательно): Предыдущие этапы фильтрации для ограничения значений; опустите для глобальных значений.region(строка, необязательно)
get_change_events
start_time_iso/end_time_iso(строка, необязательно)lookback_minutes(целое число, необязательно): По умолчанию: 60.service(строка, необязательно)environment(строка, необязательно)event_name(строка, необязательно): Сначала вызовите без этого, чтобы получитьavailable_event_names.
get_alert_config
search_term(строка, необязательно): Свободный текстовый поиск по имени, группе, источнику данных, тегам.rule_name(строка, необязательно)severity(строка, необязательно)rule_type(строка, необязательно):staticилиanomaly.alert_group_name/alert_group_type/data_source_name(строка, необязательно)tags(массив, необязательно): Должны совпадать все (логика И).
get_alerts
time_iso(строка, необязательно): Время оценки в формате RFC3339.window(целое число, необязательно): Период поиска в секундах. По умолчанию: 900. Диапазон: 60–86400.lookback_minutes(целое число, необязательно): Диапазон: 1–1440.
get_alert_rule_state
start_time(целое число, обязательно): Начало диапазона в Unix epoch (включительно).end_time(целое число, обязательно): Конец диапазона в Unix epoch (включительно).step(целое число, обязательно): Разрешение в секундах между выборками. Количество выборок((end_time - start_time) / step + 1)ограничено 100.alert_group_id(строка, необязательно): Фильтр по идентификатору группы оповещений.rule_name(строка, необязательно): Regex-фильтр по имени правила.alert_group_name(строка, необязательно): Regex-фильтр по имени группы оповещений.label_filters(строка, необязательно): Разделенные запятыми фильтры метокkey=value.state(строка, необязательно): Фильтр по состоянию (например,firing).
Возвращает JSON-карту rule_id -> [{timestamp, is_firing}]. Временная метка, в которой правило отсутствует в ответе от источника, сообщается как is_firing=0 — это означает «не наблюдалось как активное», а не подтвержденное нормальное состояние.
get_notification_channels
Без параметров. Возвращает все настроенные каналы уведомлений (Slack, PagerDuty, email, вебхуки и т. д.).
did_you_mean
query(строка, обязательно): Имя для поиска — частичное, с опечаткой или сокращенное.type(строка, необязательно): Ограничить типом сущности:service,environment,host,database,k8s_deployment,k8s_namespace,job.
Возвращает до 3 ближайших совпадений с оценками сходства. Используйте это перед любым вызовом инструмента, где имя сущности неопределенно. Если предыдущий вызов вернул пустые результаты, попробуйте это перед повторной попыткой.
list_dashboards
Без параметров. Возвращает все пользовательские дашборды в организации в виде JSON-массива с id, name и метаданными.
get_dashboard
id(строка, обязательно): UUID дашборда.region(строка, необязательно): Регион для заполнения запросов панелей. По умолчанию соответствует региону настроенного источника данных.
create_dashboard
dashboard(объект, обязательно): Определение дашборда сnameиpanels[]. Каждая панель требуетname,version,layout(x,y,w,h),visualization.typeиqueries[].metadata(объект, необязательно): Метаданные дашборда — поля_categoryи_type(например,{"_category":"custom","_type":"metrics"}).
update_dashboard
id(строка, обязательно): UUID дашборда для обновления.dashboard(объект, обязательно): Полное тело дашборда для замены (такая же структура, как при создании).metadata(объект, необязательно): Метаданные для замены. Системные дашборды только для чтения возвращают ошибку 403.
delete_dashboard
id(строка, обязательно): UUID дашборда для удаления. Системные дашборды только для чтения не могут быть удалены.
Тестирование
См. TESTING.md для настройки и инструкций по интеграционному тестированию.
