Grafana
официальныйПоиск дашбордов, расследование инцидентов и выполнение запросов к источникам данных в вашем экземпляре Grafana
Что можно делать с Grafana MCP?
- Поиск и просмотр дашбордов — Используйте
search_dashboardsиget_dashboard_summaryдля поиска дашбордов и получения компактных обзоров без полного JSON. - Запросы к Prometheus и Loki — Выполняйте запросы PromQL и LogQL к вашим источникам данных, включая метаданные и процентили гистограмм.
- Управление оповещениями — Список, создание, обновление и удаление правил оповещений, а также просмотр политик уведомлений и контактных точек.
- Создание глубоких ссылок — Создавайте точные URL-адреса для дашбордов, панелей и Explore с временными диапазонами с помощью инструментов навигации.
- Выполнение запросов панелей — Выполняйте запрос панели дашборда с пользовательскими временными диапазонами и переменными с помощью
run_panel_query.
Документация
MCP-сервер Grafana
MCP-сервер для Grafana, реализующий Model Context Protocol.
Он предоставляет доступ к вашему экземпляру Grafana и окружающей экосистеме.
Быстрый старт
Требуется uv. Добавьте следующее в конфигурацию вашего MCP-клиента (например, Claude Desktop, Cursor):
{
"mcpServers": {
"grafana": {
"command": "uvx",
"args": ["mcp-grafana"],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}
Для Grafana Cloud замените GRAFANA_URL на URL вашего экземпляра (например, https://myinstance.grafana.net). Дополнительные варианты установки, включая Docker, бинарный файл и Helm, см. в разделе Использование.
Требования
- Требуется Grafana версии 9.0 или новее для полной функциональности. Некоторые функции, особенно операции, связанные с источниками данных, могут некорректно работать с более ранними версиями из-за отсутствующих конечных точек API.
Возможности
Следующие возможности в настоящее время доступны в MCP-сервере. Этот список приведён только в информационных целях и не является дорожной картой или обязательством по реализации будущих функций.
Панели (Dashboards)
- Поиск панелей: поиск панелей по названию или другим метаданным
- Получить панель по UID: получение полных сведений о панели по её уникальному идентификатору. Предупреждение: большие панели могут занимать значительный объём контекстного окна.
- Получить сводку по панели: получение компактного обзора панели, включая название, количество панелей, типы панелей, переменные и метаданные, без полного JSON, чтобы минимизировать использование контекстного окна
- Получить свойство панели: извлечение отдельных частей панели с помощью выражений JSONPath (например,
$.title,$.panels[*].title), чтобы получать только нужные данные и снижать потребление контекстного окна - Обновить или создать панель: изменение существующих панелей или создание новых. Предупреждение: требуется полный JSON панели, который может занимать большой объём контекстного окна.
- Частичное обновление панели: внесение точечных изменений в панель без необходимости полного JSON, что значительно снижает использование контекстного окна при целевых правках
- Получить запросы панелей и информацию об источниках данных: получение названия, строки запроса и информации об источнике данных (включая UID и тип, если доступны) для каждой панели в дашборде
Выполнение запроса панели
Примечание: инструменты выполнения запросов панелей отключены по умолчанию. Чтобы включить их, добавьте
runpanelqueryв ваш флаг--enabled-tools.
- Выполнить запрос панели: выполнение запроса панели дашборда с пользовательскими временными диапазонами и переопределениями переменных.
Управление контекстным окном
Инструменты для работы с панелями теперь включают несколько стратегий для эффективного управления использованием контекстного окна (issue #101):
- Используйте
get_dashboard_summaryдля обзора панели и планирования изменений - Используйте
get_dashboard_propertyс JSONPath, когда нужны только отдельные части панели - Избегайте
get_dashboard_by_uid, если вам не нужен полный JSON панели
Источники данных
- Перечислить и получить информацию об источниках данных: просмотр всех настроенных источников данных и получение подробной информации о каждом из них.
- Поддерживаемые типы источников данных: Prometheus, Loki, ClickHouse, CloudWatch, Elasticsearch, OpenSearch, Snowflake, Athena.
Примеры запросов
Примечание: инструменты примеров запросов отключены по умолчанию. Чтобы включить их, добавьте
examplesв ваш флаг--enabled-tools.
- Получить примеры запросов: получение примеров запросов для различных типов источников данных, чтобы изучить синтаксис запросов.
Запросы к Prometheus
- Запрос к Prometheus: выполнение запросов PromQL (поддерживаются как мгновенные, так и диапазонные запросы метрик) к источникам данных Prometheus.
- Запрос метаданных Prometheus: получение метаданных метрик, имён метрик, имён меток и значений меток из источников данных Prometheus.
- Запрос процентилей гистограммы: вычисление значений процентилей гистограммы (p50, p90, p95, p99) с помощью histogram_quantile.
Запросы к Loki
- Запрос логов и метрик Loki: выполнение как запросов логов, так и запросов метрик с использованием LogQL к источникам данных Loki.
- Запрос метаданных Loki: получение имён меток, значений меток и статистики потоков из источников данных Loki.
- Запрос паттернов Loki: получение паттернов логов, обнаруженных Loki, для выявления типовых структур логов и аномалий.
Запросы к InfluxDB
Примечание: инструменты InfluxDB отключены по умолчанию. Чтобы включить их, добавьте
influxdbв ваш флаг--enabled-tools.
- Запрос к InfluxDB: выполнение запросов к источникам данных InfluxDB с использованием InfluxQL (v1.x) или Flux (v2.x). Диалект определяется автоматически из конфигурации источника данных или может быть задан явно через параметр
dialect.
Запросы к ClickHouse
Примечание: инструменты ClickHouse отключены по умолчанию. Чтобы включить их, добавьте
clickhouseв ваш флаг--enabled-tools.
- Перечислить таблицы ClickHouse: список всех таблиц в базе данных ClickHouse с количеством строк и размерами.
- Описать схему таблицы: получение имён столбцов, типов и метаданных для таблицы ClickHouse.
- Запрос к ClickHouse: выполнение SQL-запросов с поддержкой макросов Grafana и подстановки переменных.
Запросы к CloudWatch
Примечание: инструменты CloudWatch отключены по умолчанию. Чтобы включить их, добавьте
cloudwatchв ваш флаг--enabled-tools.
- Перечислить пространства имён CloudWatch: обнаружение доступных пространств имён AWS CloudWatch.
- Перечислить метрики CloudWatch: список метрик, доступных в конкретном пространстве имён.
- Перечислить измерения CloudWatch: получение измерений для фильтрации запросов метрик.
- Запрос к CloudWatch: выполнение запросов метрик CloudWatch с поддержкой временных диапазонов.
Запросы к Graphite
Примечание: инструменты Graphite отключены по умолчанию. Чтобы включить их, добавьте
graphiteв ваш флаг--enabled-tools.
- Запрос к Graphite: выполнение запросов к Graphite render API для источника данных Graphite.
- Перечислить метрики Graphite: просмотр и обнаружение путей метрик Graphite.
- Перечислить теги Graphite: список доступных тегов Graphite и значений тегов.
- Запрос плотности Graphite: запрос плотности метрик Graphite для заданного шаблона.
Запросы к Athena
Примечание: инструменты Athena отключены по умолчанию. Чтобы включить их, добавьте
athenaв ваш флаг--enabled-tools.
- Перечислить каталоги Athena: обнаружение доступных каталогов данных (например, AwsDataCatalog, коннекторы Iceberg).
- Перечислить базы данных Athena: список баз данных в каталоге Athena.
- Перечислить таблицы Athena: список таблиц в базе данных Athena.
- Описать таблицу Athena: получение имён столбцов для таблицы Athena.
- Запрос к Athena: выполнение SQL-запросов к Amazon Athena через Grafana с подстановкой макросов, ограничением количества результатов и поддержкой переменных шаблонов.
Запросы к Snowflake
Примечание: инструменты Snowflake отключены по умолчанию. Чтобы включить их, добавьте
snowflakeв ваш флаг--enabled-tools.
Запросы выполняются через источник данных Snowflake в Grafana (плагин Grafana Enterprise grafana-snowflake-datasource), поэтому аутентификация обрабатывается конфигурацией источника данных в Grafana — учётные данные никогда не видны MCP-серверу. Это та же модель, что используется для инструментов ClickHouse.
- Перечислить таблицы Snowflake: обнаружение таблиц (с базой данных, схемой, типом, количеством строк и размером) через
INFORMATION_SCHEMA.TABLES. Доступны необязательные фильтры по базе данных/схеме. - Описать схему таблицы: получение имён столбцов, типов данных, допустимости NULL, значений по умолчанию и комментариев для таблицы Snowflake.
- Запрос к Snowflake: выполнение SQL-запросов с поддержкой макросов и подстановки переменных. Полезно для запросов к таблицам событий Snowflake (например,
SNOWFLAKE.TELEMETRY.EVENTS) для логов и трейсов, а также к любым пользовательским таблицам.- Поддерживаемые макросы:
$__timeFilter(column),$__timeFrom,$__timeTo,$__from,$__to(мс Unix),$__interval(секунды),$__interval_msи${varname}для подстановки переменных шаблонов.
- Поддерживаемые макросы:
Запросы к Elasticsearch/OpenSearch
Примечание: инструменты Elasticsearch/OpenSearch отключены по умолчанию. Чтобы включить их, добавьте
elasticsearchв ваш флаг--enabled-tools.
- Запрос к Elasticsearch/OpenSearch: выполнение поисковых запросов к источникам данных Elasticsearch или OpenSearch с использованием синтаксиса запросов Lucene или Elasticsearch Query DSL. Поддерживается фильтрация по временному диапазону и получение логов, метрик или любых индексированных данных. Возвращает документы с их индексом, ID, полями источника и необязательной оценкой релевантности.
Запросы к Quickwit
Примечание: инструменты Quickwit отключены по умолчанию. Чтобы включить их, добавьте
quickwitв ваш флаг--enabled-tools.
- Запрос к Quickwit: выполнение поисковых запросов к источникам данных Quickwit с использованием синтаксиса запросов Lucene или частично совместимого с Elasticsearch Query DSL. Поддерживается фильтрация по временному диапазону и получение логов или других индексированных документов. Возвращает документы с их индексом, ID, полями источника и необязательной оценкой релевантности.
Наблюдаемость агентов
Примечание: инструменты наблюдаемости агентов отключены по умолчанию и работают только в Grafana Cloud. Чтобы включить их, добавьте
agento11yв ваш флаг--enabled-tools.
- Список и поиск диалогов: список недавних LLM-диалогов или их поиск с помощью выражения фильтра (модель, провайдер, агент, статус, тип ошибки, результаты оценки и другое) за временной диапазон. Результаты поиска включают количество ошибок, сводки оценок, сводки результатов оценки и ID трейсов.
- Получить сведения о диалоге: получение одного диалога со всеми его генерациями, включая промпты и выходные данные.
- Получить сведения о генерации и оценки: получение одной генерации по ID и её оценок (оценщик, ключ оценки, значение, пройдено, пояснение).
- Чтение каталога агентов: список агентов, отправляющих телеметрию, получение полной версии одного агента (полный системный промпт, каждый инструмент с его JSON-схемой и модели, на которых он работал), просмотр истории версий агента и сравнение агрегированных оценок по версиям. Эффективные версии — это хэши
sha256:, на которые никогда не влияет изменение инструмента; для агента, не сообщающего собственную версию, хэшируется системный промпт, поэтому правка промпта создаёт новую версию. Строки каталога и версий содержатtoken_estimate, который стоит проверить перед получением полного промпта. - Просмотр оценщиков и шаблонов: чтение оценщиков, от которых получена оценка, шаблонов, на основе которых они созданы, а также провайдеров и моделей-судей, доступных оценщикам на основе LLM. При включённых инструментах записи также можно создавать, клонировать, тестировать и удалять оценщиков.
- Просмотр правил оценки и защитных правил: чтение асинхронных правил оценки, связывающих оценщиков с производственным трафиком, и защитных правил (hook rules), которые выполняются встроенно и могут предупреждать или запрещать. При включённых инструментах записи также можно создавать, обновлять, просматривать и удалять их. Записи и непостоянные операции
preview_ruleиtest_evaluatorтребуют разрешенияgrafana-agento11y-app.eval:write, предоставляемого ролью Agento11y Admin. - Управление сохранёнными диалогами и коллекциями: чтение сохранённых диалогов (закладок, которые дают диалогу стабильный ID, имя и теги) и коллекций, которые их группируют, включая количество участников каждой коллекции и коллекции, встроенные в каждую строку сохранённого диалога. При включённых инструментах записи также можно добавлять диалог в закладки, создавать и редактировать коллекции, добавлять и удалять участников. Эти записи требуют того же разрешения
grafana-agento11y-app.eval:write. - Чтение и редактирование тестовых наборов: список версионированных тестовых наборов, на которых выполняются офлайн-эксперименты, чтение одного набора с полной историей версий и постраничный просмотр тестовых случаев версии. При включённых инструментах записи также можно создать набор, переименовать или изменить его теги, открыть черновую версию, опубликовать её, а также записать или удалить её тестовые случаи. Опубликованная версия заморожена, поэтому правка означает открытие нового черновика. Эти записи требуют
grafana-agento11y-app.eval:write. - Чтение офлайн-экспериментов: список прогонов оценки по тестовому набору и чтение одного из них с основным показателем прохождения, стоимостью и общим количеством токенов. Детализация через отчёт по каждому тестовому случаю до испытаний, их оценок с пояснением каждого судьи и метаданных артефактов. При включённых инструментах записи также можно переименовать или изменить теги эксперимента и отменить выполняющийся, для чего требуется
grafana-agento11y-app.eval:write. Эксперименты создаются SDK-раннерами, а не этим инструментом.
Grafana Assistant
Примечание: Инструменты ассистента по умолчанию отключены и требуют установки плагина Grafana Assistant (
grafana-assistant-app) на целевой экземпляр Grafana. Они также являются инструментами записи (ассистент может изменять состояние стека), поэтому они пропускаются, когда установлен--disable-write. Чтобы включить их, добавьтеassistantк вашему флагу--enabled-tools.
- Запрос к ассистенту: Отправьте запрос на естественном языке в Grafana Assistant и дождитесь полного текстового ответа. Ассистент может использовать инструменты, метрики, логи и другой контекст стека — шире, чем выполнение одного изолированного запроса к источнику данных. Передайте возвращённый
contextIdобратно в последующем вызове, чтобы продолжить тот же разговор. Сложные задачи могут занять несколько минут; вызов блокируется до завершения ответа или истечения времени ожидания запроса (5 минут).
Инциденты
- Поиск, создание и обновление инцидентов: Управление инцидентами в Grafana Incident, включая поиск, создание и добавление действий к инцидентам.
Расследования Sift
- Список расследований Sift: Получение списка расследований Sift с поддержкой параметра ограничения количества.
- Получение расследования Sift: Получение деталей конкретного расследования Sift по его UUID.
- Получение анализов Sift: Получение конкретного анализа из расследования Sift.
- Поиск шаблонов ошибок в журналах: Обнаружение повышенных шаблонов ошибок в журналах Loki с помощью Sift.
- Поиск медленных запросов: Обнаружение медленных запросов с помощью Sift (Tempo).
Оповещения
- Список и получение информации о правилах оповещения: Просмотр правил оповещения и их статусов (срабатывание/норма/ошибка и т. д.) в Grafana. Поддерживает правила, управляемые Grafana, и правила, управляемые источниками данных Prometheus или Loki.
- Создание и обновление правил оповещения: Создание новых правил оповещения или изменение существующих.
- Удаление правил оповещения: Удаление правил оповещения по UID.
- Управление маршрутизацией оповещений: Просмотр политик уведомлений, контактных точек и временных интервалов. Поддерживает контактные точки, управляемые Grafana, и получателей из внешних источников данных Alertmanager (Prometheus Alertmanager, Mimir, Cortex).
Grafana OnCall
- Список и управление расписаниями: Просмотр и управление расписаниями дежурств в Grafana OnCall.
- Получение деталей смены: Получение подробной информации о конкретных дежурных сменах.
- Получение текущих дежурных: Просмотр пользователей, которые в данный момент дежурят по расписанию.
- Список команд и пользователей: Просмотр всех команд и пользователей OnCall.
- Список групп оповещений: Просмотр и фильтрация групп оповещений из Grafana OnCall по различным критериям, включая состояние, интеграцию, метки и временной диапазон.
- Получение деталей группы оповещений: Получение подробной информации о конкретной группе оповещений по её ID.
Администрирование
Примечание: Инструменты администрирования по умолчанию отключены. Чтобы включить их, добавьте
adminв ваш флаг--enabled-tools.
- Список команд: Просмотр всех настроенных команд в Grafana.
- Список пользователей: Просмотр всех пользователей в организации в Grafana.
- Список всех ролей: Перечисление всех ролей Grafana с необязательным фильтром для делегируемых ролей.
- Получение деталей роли: Получение деталей конкретной роли Grafana по UID.
- Список назначений для роли: Перечисление всех пользователей, команд и сервисных аккаунтов, назначенных на роль.
- Список ролей для пользователей: Перечисление всех ролей, назначенных одному или нескольким пользователям.
- Список ролей для команд: Перечисление всех ролей, назначенных одной или нескольким командам.
- Список разрешений для ресурса: Перечисление всех разрешений, определённых для конкретного ресурса (панель мониторинга, источник данных, папка и т. д.).
- Описание ресурса Grafana: Перечисление доступных разрешений и возможностей назначения для типа ресурса.
Навигация
- Генерация глубоких ссылок: Создание точных URL-адресов глубоких ссылок для ресурсов Grafana вместо использования предположений LLM по URL-адресам.
- Ссылки на панели мониторинга: Генерация прямых ссылок на панели мониторинга по их UID (например,
http://localhost:3000/d/dashboard-uid) - Ссылки на панели: Создание ссылок на конкретные панели внутри панелей мониторинга с параметром viewPanel (например,
http://localhost:3000/d/dashboard-uid?viewPanel=5) - Ссылки для Explore: Генерация ссылок на Grafana Explore с предварительно настроенными источниками данных (например,
http://localhost:3000/explore?left={"datasource":"prometheus-uid"}) - Поддержка временного диапазона: Добавление параметров временного диапазона к ссылкам (
from=now-1h&to=now) - Пользовательские параметры: Включение дополнительных параметров запроса, таких как переменные панели мониторинга или интервалы обновления
- Ссылки на панели мониторинга: Генерация прямых ссылок на панели мониторинга по их UID (например,
Аннотации
- Получение аннотаций: Запрос аннотаций с фильтрами. Поддерживает временной диапазон, UID панели мониторинга, теги и режим соответствия.
- Создание аннотации: Создание новой аннотации на панели мониторинга или панели.
- Создание аннотации Graphite: Создание аннотаций в формате Graphite (
what,when,tags,data). - Обновление аннотации: Замена всех полей существующей аннотации (полное обновление).
- Частичное обновление аннотации: Обновление только определённых полей аннотации (частичное обновление).
- Получение тегов аннотаций: Перечисление доступных тегов аннотаций с необязательной фильтрацией.
Снимки
- Список снимков: Перечисление снимков панелей мониторинга с необязательными фильтрами запроса и ограничения.
- Получение снимка: Получение метаданных снимка и полезной нагрузки панели мониторинга по ключу снимка.
- Создание снимка: Создание снимка панели мониторинга из полной полезной нагрузки панели мониторинга с необязательными параметрами срока действия и внешнего снимка.
- Удаление снимка: Удаление снимка по ключу снимка.
Рендеринг
- Получение изображения панели или панели мониторинга: Рендеринг панели панели мониторинга Grafana или всей панели мониторинга в виде изображения PNG. Возвращает изображение в виде данных в кодировке base64 для использования в отчётах, оповещениях или презентациях. Поддерживает настройку размеров, временного диапазона, темы, масштаба и переменных панели мониторинга. Также поддерживает рендеринг ещё не применённых панелей мониторинга из ветки репозитория подготовки (например, предварительный просмотр PR в git-sync) через необязательный параметр
provisioningPreview.- Примечание: Требуется установка и настройка сервиса Grafana Image Renderer.
Провижининг
- Список репозиториев подготовки: Перечисление репозиториев подготовки, настроенных для этого экземпляра Grafana (например, источников git-sync), с возвратом слага каждого репозитория вместе с его исходным URL, веткой, путём, состоянием синхронизации и статусом здоровья.
- Проверка файла подготовки: Сухой запуск применения файла из репозитория подготовки в указанной ветке или коммите. Возвращает, будет ли он принят, действие ресурса (создание/обновление), целевой тип ресурса и любые структурированные ошибки проверки — та же поверхность допуска, которую использует комментатор PR в Grafana.
Список инструментов настраивается, поэтому вы можете выбрать, какие инструменты вы хотите сделать доступными для MCP-клиента.
Это полезно, если вы не используете определённые функции или не хотите занимать слишком много контекстного окна.
Чтобы отключить категорию инструментов, используйте флаг --disable-<category> при запуске сервера. Например, чтобы отключить
инструменты OnCall, используйте --disable-oncall, или чтобы отключить генерацию глубоких ссылок навигации, используйте --disable-navigation.
Разрешения RBAC
Каждый инструмент требует определённых разрешений RBAC для правильной работы. При создании сервисного аккаунта для MCP-сервера убедитесь, что у него есть необходимые разрешения в зависимости от того, какие инструменты вы планируете использовать. Перечисленные разрешения — это минимально необходимые действия; вам также могут понадобиться соответствующие области действия (например, datasources:*, dashboards:*, folders:*) в зависимости от вашего сценария использования.
Совет: Если вы не знакомы с RBAC в Grafana или хотите более быструю и простую настройку вместо настройки множества детальных областей действия, вы можете назначить встроенную роль, такую как Editor, сервисному аккаунту. Роль Editor предоставляет широкий доступ на чтение/запись, который позволит выполнять большинство операций MCP-сервера; она менее детализирована (и, следовательно, менее ограничивающая), чем области действия, применяемые вручную, поэтому используйте её только тогда, когда удобство важнее строгого принципа минимальных привилегий.
Примечание: Инструменты Grafana Incident и Sift используют базовые роли Grafana вместо детализированных разрешений RBAC:
- Роль Viewer: Требуется для операций только для чтения (список инцидентов, получение расследований)
- Роль Editor: Требуется для операций записи (создание инцидентов, изменение расследований)
Для получения дополнительной информации о RBAC в Grafana см. официальную документацию.
Области действия RBAC
Области действия определяют конкретные ресурсы, к которым применяются разрешения. Каждое действие требует комбинации соответствующего разрешения и области действия.
Распространённые шаблоны областей действия:
-
Широкий доступ: Используйте подстановочные знаки
*для доступа на уровне организацииdatasources:*— доступ ко всем источникам данныхdashboards:*— доступ ко всем панелям мониторингаfolders:*— доступ ко всем папкамteams:*— доступ ко всем командам
-
Ограниченный доступ: Используйте конкретные UID или ID для ограничения доступа к отдельным ресурсам
datasources:uid:prometheus-uid— доступ только к конкретному источнику данных Prometheusdashboards:uid:abc123— доступ только к панели мониторинга с UIDabc123folders:uid:xyz789— доступ только к папке с UIDxyz789teams:id:5— доступ только к команде с ID5global.users:id:123— доступ только к пользователю с ID123
Примеры:
-
Полный доступ к MCP-серверу: Предоставление широких разрешений для всех инструментов
datasources:* (datasources:read, datasources:query) dashboards:* (dashboards:read, dashboards:create, dashboards:write) folders:* (for dashboard creation and alert rules) teams:* (teams:read) global.users:* (users:read) -
Ограниченный доступ к источникам данных: Только запросы к конкретным экземплярам Prometheus и Loki
datasources:uid:prometheus-prod (datasources:query) datasources:uid:loki-prod (datasources:query) -
Доступ к конкретной панели мониторинга: Чтение только определённых панелей мониторинга
dashboards:uid:monitoring-dashboard (dashboards:read) dashboards:uid:alerts-dashboard (dashboards:read)
Инструменты
| Инструмент | Категория | Описание | Требуемые разрешения RBAC | Требуемые области |
|---|---|---|---|---|
list_teams | Администрирование | Перечислить все команды | teams:read | teams:* или teams:id:1 |
list_users_by_org | Администрирование | Перечислить всех пользователей организации | users:read | global.users:* или global.users:id:123 |
list_all_roles | Администрирование | Перечислить все роли Grafana | roles:read | roles:* |
get_role_details | Администрирование | Получить сведения о роли Grafana | roles:read | roles:uid:editor |
get_role_assignments | Администрирование | Перечислить назначения для роли | roles:read | roles:uid:editor |
list_user_roles | Администрирование | Перечислить роли для пользователей | roles:read | global.users:id:123 |
list_team_roles | Администрирование | Перечислить роли для команд | roles:read | teams:id:7 |
get_resource_permissions | Администрирование | Перечислить разрешения для ресурса | permissions:read | dashboards:uid:abcd1234 |
get_resource_description | Администрирование | Описать тип ресурса Grafana | permissions:read | dashboards:* |
search_dashboards | Поиск | Искать дашборды | dashboards:read | dashboards:* или dashboards:uid:abc123 |
get_dashboard_by_uid | Дашборды | Получить дашборд по uid | dashboards:read | dashboards:uid:abc123 |
update_dashboard | Дашборды | Обновить или создать новый дашборд | dashboards:create, dashboards:write | dashboards:*, folders:* или folders:uid:xyz789 |
get_dashboard_panel_queries | Дашборды | Получить заголовок панели, запросы, UID источника данных и тип из дашборда | dashboards:read | dashboards:uid:abc123 |
run_panel_query | RunPanelQuery* | Выполнить один или несколько запросов панелей дашборда | dashboards:read, datasources:query | dashboards:uid:*, datasources:uid:* |
get_dashboard_property | Дашборды | Извлечь отдельные части дашборда с помощью выражений JSONPath | dashboards:read | dashboards:uid:abc123 |
get_dashboard_summary | Дашборды | Получить компактную сводку дашборда без полного JSON | dashboards:read | dashboards:uid:abc123 |
list_datasources | Источники данных | Перечислить источники данных | datasources:read | datasources:* |
get_datasource | Источники данных | Получить источник данных по UID или имени | datasources:read | datasources:uid:prometheus-uid |
get_query_examples | Примеры* | Получить примеры запросов для типа источника данных | datasources:read | datasources:* |
query_prometheus | Prometheus | Выполнить запрос к источнику данных Prometheus | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_metadata | Prometheus | Перечислить метаданные метрик | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_names | Prometheus | Перечислить доступные имена метрик | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_names | Prometheus | Перечислить имена меток, соответствующих селектору | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_values | Prometheus | Перечислить значения для конкретной метки | datasources:query | datasources:uid:prometheus-uid |
query_prometheus_histogram | Prometheus | Рассчитать значения процентилей гистограммы | datasources:query | datasources:uid:prometheus-uid |
list_incidents | Incident | Перечислить инциденты в Grafana Incident | Роль просмотра | Н/Д |
create_incident | Incident | Создать инцидент в Grafana Incident | Роль редактора | Н/Д |
add_activity_to_incident | Incident | Добавить элемент активности в инцидент в Grafana Incident | Роль редактора | Н/Д |
get_incident | Incident | Получить один инцидент по ID | Роль просмотра | Н/Д |
query_loki_logs | Loki | Запросить и получить логи с помощью LogQL (запросы логов или метрик) | datasources:query | datasources:uid:loki-uid |
list_loki_label_names | Loki | Перечислить все доступные имена меток в логах | datasources:query | datasources:uid:loki-uid |
list_loki_label_values | Loki | Перечислить значения для конкретной метки лога | datasources:query | datasources:uid:loki-uid |
query_loki_stats | Loki | Получить статистику о потоках логов | datasources:query | datasources:uid:loki-uid |
query_loki_patterns | Loki | Выполнить запрос обнаруженных шаблонов логов для выявления общих структур | datasources:query | datasources:uid:loki-uid |
analyze_loki_labels | Loki | Проверить стратегию меток Loki (динамическую или статическую) и при необходимости диагностировать производительность запросов | datasources:query | datasources:uid:loki-uid |
suggest_loki_alloy_label_config | Config | Сгенерировать фрагмент loki.process Alloy, обеспечивающий соблюдение утверждённых меток | Н/Д | Н/Д |
query_influxdb | InfluxDB | Запросить InfluxDB с помощью InfluxQL (v1) или Flux (v2) | datasources:query | datasources:uid:influxdb-uid |
list_clickhouse_tables | ClickHouse* | Перечислить таблицы в базе данных ClickHouse | datasources:query | datasources:uid:* |
describe_clickhouse_table | ClickHouse* | Получить схему таблицы с типами столбцов | datasources:query | datasources:uid:* |
query_clickhouse | ClickHouse* | Выполнить SQL-запросы с подстановкой макросов | datasources:query | datasources:uid:* |
list_cloudwatch_namespaces | CloudWatch* | Перечислить доступные пространства имён AWS CloudWatch | datasources:query | datasources:uid:* |
list_cloudwatch_metrics | CloudWatch* | Список метрик в пространстве имён | datasources:query | datasources:uid:* |
list_cloudwatch_dimensions | CloudWatch* | Список измерений для метрики | datasources:query | datasources:uid:* |
query_cloudwatch | CloudWatch* | Выполнение запросов к метрикам CloudWatch | datasources:query | datasources:uid:* |
list_athena_catalogs | Athena* | Список доступных каталогов данных Athena | datasources:query | datasources:uid:* |
list_athena_databases | Athena* | Список баз данных в каталоге Athena | datasources:query | datasources:uid:* |
list_athena_tables | Athena* | Список таблиц в базе данных Athena | datasources:query | datasources:uid:* |
describe_athena_table | Athena* | Получение имён столбцов для таблицы Athena | datasources:query | datasources:uid:* |
query_athena | Athena* | Выполнение SQL-запросов с подстановкой макросов | datasources:query | datasources:uid:* |
query_elasticsearch | Elasticsearch/OpenSearch* | Запрос к Elasticsearch или OpenSearch с использованием синтаксиса Lucene или Query DSL | datasources:query | datasources:uid:datasource-uid |
query_quickwit | Quickwit* | Запрос к Quickwit с использованием синтаксиса Lucene или Query DSL | datasources:query | datasources:uid:quickwit-uid |
list_snowflake_tables | Snowflake* | Список таблиц в базе данных/схеме Snowflake через INFORMATION_SCHEMA | datasources:query | datasources:uid:* |
describe_snowflake_table | Snowflake* | Получение схемы таблицы (типы столбцов, допустимость NULL, значения по умолчанию, комментарии) | datasources:query | datasources:uid:* |
query_snowflake | Snowflake* | Выполнение SQL-запросов с подстановкой макросов/переменных | datasources:query | datasources:uid:* |
alerting_manage_rules | Alerting | Управление правилами оповещений (список, получение, версии, создание, обновление, удаление) | alert.rules:read + alert.rules:write для изменений | folders:* или folders:uid:alerts-folder |
alerting_manage_routing | Alerting | Управление политиками уведомлений, контактными точками и временными интервалами | alert.notifications:read | Глобальная область видимости |
list_oncall_schedules | OnCall | Список расписаний из Grafana OnCall | grafana-oncall-app.schedules:read | Области видимости, специфичные для плагина |
get_oncall_shift | OnCall | Получение подробной информации о конкретной смене OnCall | grafana-oncall-app.schedules:read | Области видимости, специфичные для плагина |
get_current_oncall_users | OnCall | Получение пользователей, находящихся на дежурстве для конкретного расписания | grafana-oncall-app.schedules:read | Области видимости, специфичные для плагина |
list_oncall_teams | OnCall | Список команд из Grafana OnCall | grafana-oncall-app.user-settings:read | Области видимости, специфичные для плагина |
list_oncall_users | OnCall | Список пользователей из Grafana OnCall | grafana-oncall-app.user-settings:read | Области видимости, специфичные для плагина |
list_alert_groups | OnCall | Список групп алертов из Grafana OnCall с параметрами фильтрации | grafana-oncall-app.alert-groups:read | Области видимости, специфичные для плагина |
get_alert_group | OnCall | Получение конкретной группы алертов из Grafana OnCall по её идентификатору | grafana-oncall-app.alert-groups:read | Области видимости, специфичные для плагина |
get_sift_investigation | Sift | Получение существующего расследования Sift по его UUID | Роль Viewer | Не применимо |
get_sift_analysis | Sift | Получение конкретного анализа из расследования Sift | Роль Viewer | Не применимо |
list_sift_investigations | Sift | Получение списка расследований Sift с необязательным ограничением | Роль Viewer | Не применимо |
find_error_pattern_logs | Sift | Поиск повышенных паттернов ошибок в журналах Loki. | Роль Editor | Не применимо |
find_slow_requests | Sift | Поиск медленных запросов в соответствующих источниках данных tempo. | Роль Editor | Не применимо |
list_pyroscope_label_names | Pyroscope | Список имён меток, соответствующих селектору | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_label_values | Pyroscope | Список значений меток, соответствующих селектору для имени метки | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_profile_types | Pyroscope | Список доступных типов профилей | datasources:query | datasources:uid:pyroscope-uid |
query_pyroscope | Pyroscope | Запрос профилей, метрик или того и другого из Pyroscope | datasources:query | datasources:uid:pyroscope-uid |
get_assertions | Asserts | Получение сводки утверждений для заданной сущности | Разрешения, специфичные для плагина | Области видимости, специфичные для плагина |
agento11y_manage_conversations | Agent Observability* | Список, поиск и получение LLM-диалогов из Grafana Agent Observability | grafana-agento11y-app.conversations:read | Не применимо |
agento11y_manage_generations | Agent Observability* | Получение деталей генерации LLM и оценок из Grafana Agent Observability | grafana-agento11y-app.data:read | Не применимо |
agento11y_manage_agents | Agent Observability* | Чтение каталога агентов: список агентов, полная версия одного агента, история версий и агрегированные оценки по версиям | grafana-agento11y-app.data:read | Не применимо |
agento11y_manage_evaluators | Agent Observability* | Управление оценщиками, шаблонами оценщиков и каталогом судей (список, получение, upsert, форк, тест, удаление) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write для изменений и тестов | Не применимо |
agento11y_manage_eval_rules | Agent Observability* | Управление правилами оценки и защитными механизмами (список, получение, создание, обновление, предпросмотр, удаление) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write для изменений и предпросмотров | Не применимо |
agento11y_manage_eval_collections | Agent Observability* | Управление сохранёнными диалогами и коллекциями, которые их группируют (список, получение, сохранение, создание, обновление, удаление, добавление и удаление участников) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write для изменений | Не применимо |
agento11y_manage_experiments | Agent Observability* | Чтение офлайн-экспериментов, их испытаний, оценок, метаданных артефактов и фильтров; обновление и отмена эксперимента | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write для изменений | Не применимо |
agento11y_manage_test_suites | Agent Observability* | Управление тестовыми наборами, используемыми офлайн-экспериментами, их версиями и тестовыми случаями (список, получение, создание, обновление, черновик, публикация, upsert, удаление) | grafana-agento11y-app.data:read + grafana-agento11y-app.eval:write для изменений | Не применимо |
ask_assistant | Assistant* | Отправка запроса в Grafana Assistant и получение полного текстового ответа (многосессионный режим через contextId) | Разрешения, специфичные для плагина | Области видимости, специфичные для плагина |
generate_deeplink | Navigation | Генерация точных deep-link URL для ресурсов Grafana | Нет (только генерация URL на чтение) | Не применимо |
get_annotations | Annotations | Получение аннотаций с фильтрами | annotations:read | annotations:* или annotations:id:123 |
create_annotation | Аннотации | Создать новую аннотацию (стандартный формат или формат Graphite) | annotations:write | annotations:* |
update_annotation | Аннотации | Обновить определенные поля аннотации (частичное обновление) | annotations:write | annotations:* |
get_annotation_tags | Аннотации | Список тегов аннотаций с необязательной фильтрацией | annotations:read | annotations:* |
list_snapshots | Снимок | Список снимков дашбордов с необязательными фильтрами запроса и лимита | dashboards:read | dashboards:* или dashboards:uid:abc123 |
get_snapshot | Снимок | Получить метаданные снимка и полезную нагрузку дашборда по ключу снимка | dashboards:read | dashboards:* или dashboards:uid:abc123 |
create_snapshot | Снимок | Создать снимок дашборда из полной полезной нагрузки дашборда | dashboards:write | dashboards:* или dashboards:uid:abc123 |
delete_snapshot | Снимок | Удалить снимок дашборда по ключу снимка | dashboards:write | dashboards:* или dashboards:uid:abc123 |
get_panel_image | Рендеринг | Рендерить сохраненный дашборд или панель — или предварительный просмотр провижининга из ветки репозитория — в виде PNG-изображения | dashboards:read | dashboards:uid:abc123 |
list_provisioning_repositories | Провижининг | Список репозиториев провижининга (например, источников git-sync) с их URL-адресом источника, веткой, состоянием синхронизации и работоспособностью | provisioning.repositories:read | N/A |
validate_provisioning_file | Провижининг | Применить файл из репозитория провижининга в режиме пробного запуска и сообщить об ошибках проверки допуска | provisioning.repositories:read | N/A |
- Отключено по умолчанию. Добавьте категорию в
--enabled-tools, чтобы включить.*
Справочник флагов CLI
Бинарный файл mcp-grafana поддерживает различные флаги командной строки для настройки:
Параметры транспорта:
-t, --transport: Тип транспорта (stdio,sseилиstreamable-http) — по умолчанию:stdio--address: Хост и порт для SSE/streamable-http сервера — по умолчанию:localhost:8000--base-path: Базовый путь для SSE/streamable-http сервера--endpoint-path: Путь конечной точки для streamable-http сервера — по умолчанию:/mcp--server-name: Имя сервера, используемое в рукопожатии MCP и OTelservice.name— по умолчанию:mcp-grafana. Переопределяет переменную окруженияGRAFANA_MCP_SERVER_NAME
Безопасность HTTP-транспорта (только SSE / streamable-http):
Проверка Host/Origin применяется на каждом маршруте слушателя — /sse, /mcp, /healthz и /metrics — поэтому браузер с DNS-ребinding не может получить доступ ни к одному из них. Stdio-транспорт не затрагивается.
--allowed-hosts: Разделённый запятыми список разрешённых значений заголовкаHost. По умолчанию используются варианты loopback для--address(например,localhost:8000,127.0.0.1:8000,[::1]:8000). Значение, которое преобразуется в пустое (не задано,,,,и т. д.), также возвращается к значениям по умолчанию, чтобы опечатка не могла незаметно отключить проверку. Запросы с заголовкомHostвне списка разрешённых отклоняются с кодом403. Передайте*, чтобы отключить проверку — это безопасно только при работе за доверенным обратным прокси, который перезаписываетHost, или в изолированной сети. K8shttpGetпробы и внешние/metricsсборы метрик потребуют либо явного имени хоста в этом списке,*, либоtcpSocketпробы / отдельного порта метрик (--metrics-address).--allowed-origins: Разделённый запятыми список разрешённых значений заголовкаOrigin. По умолчанию пусто — любой запрос, содержащий заголовокOrigin, отклоняется (браузеры всегда отправляют его для межсайтовых запросов, и ни один браузер не должен вызывать этот сервер напрямую). Укажите явный список, чтобы разрешить браузерным клиентам, или*, чтобы отключить проверку.
Аутентификация вызывающего (только SSE / streamable-http):
При необходимости требуйте от MCP-клиентов аутентификацию на сервере. Это отдельно от учётных данных, которые сервер использует для доступа к Grafana. Stdio не затрагивается.
--server-auth-token: Bearer-токен, который вызывающие должны отправлять какAuthorization: Bearer <token>. Возвращается к переменной окруженияMCP_GRAFANA_SERVER_TOKEN. Если задан, запросы без действительного токена отклоняются с кодом401до выполнения любых инструментов. Предпочтительнее использовать переменную окружения, чтобы секрет не был виден в аргументах процесса.
Аутентификация вызывающего применяется только когда задан --server-auth-token. Когда он не задан и сервер привязывается к адресу, отличному от loopback, сервер запускается, но регистрирует ошибку безопасности — выводится на уровне журнала error, чтобы не скрываться уровнем --log-level (loopback и stdio не затрагиваются); в будущем крупном релизе это станет ошибкой запуска. Используйте TLS (или терминацию TLS) всякий раз, когда аутентификация вызывающего включена на адресе, отличном от loopback. Когда аутентификация вызывающего включена, проверенный заголовок Authorization удаляется до того, как запросы достигнут Grafana; комбинация --server-auth-token с GRAFANA_FORWARD_HEADERS=Authorization отклоняется при запуске.
Отладка и журналирование:
--debug: Включить режим отладки для подробного журналирования HTTP-запросов/ответов--log-level: Уровень журнала (debug,info,warn,error) — по умолчанию:info
Параметры клиента Grafana:
--grafana-timeout: Лимит времени для запросов, выполняемых клиентом Grafana. Принимает строки длительности Go (например,10s,500ms) — по умолчанию:10s--include-args-in-spans: Включать аргументы вызовов инструментов в спаны OpenTelemetry. Включайте только в непроизводственных средах или когда известно, что аргументы не содержат PII — по умолчанию:false
Наблюдаемость:
--metrics: Включить конечную точку метрик Prometheus на/metrics--metrics-address: Отдельный адрес для сервера метрик (например,:9090). Если пусто, метрики обслуживаются на основном сервере--slow-request-threshold: Регистрировать событие, когда любой MCP-запрос (вызов инструмента, список, чтение ресурса и т. д.) занимает дольше этого времени. Принимает строки длительности Go (например,500ms,5s). По умолчанию0отключает журналирование медленных запросов. См. раздел Журналирование медленных запросов.--slow-request-log-level: Уровень журнала для событий медленных запросов (infoилиwarn) — по умолчанию:warn.
Управление сессиями:
--session-idle-timeout-minutes: Тайм-аут бездействия сессии в минутах. Сессии без активности в течение этого времени автоматически удаляются — по умолчанию:30. Установите0, чтобы отключить удаление сессий. Актуально только для SSE и streamable-http транспортов.
Конфигурация инструментов:
--enabled-tools: Разделённый запятыми список включённых категорий — по умолчанию: все категории, кромеadmin,agento11y,assistant,athena,clickhouse,cloudwatch,elasticsearch,examples,graphite,quickwit,runpanelqueryиsnowflake. Чтобы включить отключённые категории, добавьте их в список (например,"search,datasource,...,snowflake")--max-loki-log-limit: Максимальное количество строк журнала, возвращаемых за один вызовquery_loki_logs— по умолчанию:100. Примечание: Установите это значение минимум на 1 ниже серверногоmax_entries_limit_per_queryLoki, чтобы обеспечить обнаружение усечения (инструмент внутренне запрашиваетlimit+1, чтобы определить, существуют ли дополнительные данные).--disable-search: Отключить инструменты поиска--disable-datasource: Отключить инструменты источников данных--disable-incident: Отключить инструменты инцидентов--disable-prometheus: Отключить инструменты Prometheus--disable-write: Отключить инструменты записи (операции создания/обновления)--disable-loki: Отключить инструменты Loki--disable-elasticsearch: Отключить инструменты Elasticsearch и OpenSearch--disable-quickwit: Отключить инструменты Quickwit--disable-influxdb: Отключить инструменты InfluxDB--disable-alerting: Отключить инструменты оповещения--disable-dashboard: Отключить инструменты панелей--disable-oncall: Отключить инструменты OnCall--disable-asserts: Отключить инструменты Asserts--disable-sift: Отключить инструменты Sift--disable-admin: Отключить инструменты администрирования--disable-pyroscope: Отключить инструменты Pyroscope--disable-navigation: Отключить инструменты навигации--disable-rendering: Отключить инструменты рендеринга (экспорт изображений панелей/панелей)--disable-snapshot: Отключить инструменты снимков--disable-cloudwatch: Отключить инструменты CloudWatch--disable-examples: Отключить инструменты примеров запросов--disable-clickhouse: Отключить инструменты ClickHouse--disable-snowflake: Отключить инструменты Snowflake--disable-runpanelquery: Отключить инструменты выполнения запросов панелей--disable-graphite: Отключить инструменты Graphite--disable-athena: Отключить инструменты Athena--disable-provisioning: Отключить инструменты подготовки (provisioning)--disable-agento11y: Отключить инструменты наблюдаемости агента (Agent Observability)--disable-assistant: Отключить инструменты Grafana Assistant
Режим только для чтения
Флаг --disable-write предоставляет способ запуска MCP-сервера в режиме только для чтения, предотвращая любые операции записи в ваш экземпляр Grafana. Это полезно в сценариях, где требуется предоставить безопасный доступ только для чтения, например:
- Использование сервисных учётных записей с ограниченными правами только для чтения
- Предоставление AI-ассистентам данных наблюдаемости без возможности изменения
- Работа в производственных средах, где доступ на запись должен быть ограничен
- Сценарии тестирования и разработки, где нужно предотвратить случайные изменения
Когда --disable-write включён, следующие операции записи отключаются:
Инструменты панелей:
update_dashboard
Инструменты папок:
create_folder
Инструменты инцидентов:
create_incidentadd_activity_to_incident
Инструменты оповещения:
alerting_manage_rules(операции создания, обновления, удаления)
Инструменты аннотаций:
create_annotationupdate_annotation
Инструменты Sift:
find_error_pattern_logs(создаёт расследования)find_slow_requests(создаёт расследования)
Инструменты снимков:
create_snapshotdelete_snapshot
Инструменты наблюдаемости агента (Agent Observability):
agento11y_manage_evaluators(операции upsert, delete, fork, test evaluator)agento11y_manage_eval_rules(операции создания, обновления, удаления, предпросмотра правил и guard)agento11y_manage_eval_collections(сохранение и удаление сохранённых бесед; создание, обновление, удаление коллекций; добавление и удаление участников коллекций)agento11y_manage_experiments(операции обновления и отмены экспериментов)agento11y_manage_test_suites(создание и обновление тестовых наборов; создание и публикация версий; upsert и удаление тестовых случаев)
Все операции чтения остаются доступными, что позволяет запрашивать панели, выполнять запросы PromQL/LogQL, перечислять ресурсы и получать данные.
Конфигурация TLS клиента (для подключений к Grafana):
--tls-cert-file: Путь к файлу TLS-сертификата для аутентификации клиента--tls-key-file: Путь к файлу TLS-приватного ключа для аутентификации клиента--tls-ca-file: Путь к файлу CA-сертификата TLS для проверки сервера--tls-skip-verify: Пропустить проверку TLS-сертификата (небезопасно)
Конфигурация TLS сервера (только transport streamable-http):
--server.tls-cert-file: Путь к файлу TLS-сертификата для HTTPS сервера--server.tls-key-file: Путь к файлу TLS-приватного ключа для HTTPS сервера
Использование
Этот MCP-сервер работает как с локальными экземплярами Grafana, так и с Grafana Cloud. Для Grafana Cloud используйте URL вашего экземпляра (например, https://myinstance.grafana.net) вместо http://localhost:3000 в примерах конфигурации ниже.
-
Если вы используете аутентификацию через токен сервисной учётной записи, создайте сервисную учётную запись в Grafana с достаточными правами для использования нужных инструментов, сгенерируйте токен сервисной учётной записи и скопируйте его в буфер обмена для использования в файле конфигурации. Следуйте документации Grafana по сервисным учётным записям для получения подробной информации о создании токенов сервисных учётных записей. Совет: Если вам неудобно настраивать детальные RBAC-области, более простой (но менее ограничивающий) вариант — назначить сервисной учётной записи встроенную роль
Editor. Это предоставляет широкий доступ на чтение/запись, который покрывает большинство операций MCP-сервера — используйте её, когда удобство важнее строгих требований минимальных привилегий.Примечание: Переменная окружения
GRAFANA_API_KEYустарела и будет удалена в будущей версии. Перейдите на использованиеGRAFANA_SERVICE_ACCOUNT_TOKEN. Старое имя переменной продолжит работать для обратной совместимости, но будет показывать предупреждения об устаревании.
Чтение токена сервисной учётной записи из файла
Вместо передачи токена инлайн через GRAFANA_SERVICE_ACCOUNT_TOKEN, вы можете указать GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE на путь к файлу, содержащему токен. Файл читается заново при каждом запросе, поэтому ротированные токены подхватываются автоматически без перезапуска сервера.
Это особенно полезно в Kubernetes, где Secret, смонтированный как том, обновляется на месте при изменении базового Secret (обычно в течение ~1 минуты). В сочетании с клиентским кэшем на каждый запрос — который использует значение токена как ключ — ротированный токен прозрачно создаёт нового клиента без перезапуска pod и без простоев:
env:
- name: GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE
value: /var/run/secrets/grafana/token
volumeMounts:
- name: grafana-token
mountPath: /var/run/secrets/grafana
readOnly: true
volumes:
- name: grafana-token
secret:
secretName: grafana-mcp-token
Окружающие пробелы (включая завершающий перевод строки) обрезаются из содержимого файла. Если заданы и GRAFANA_SERVICE_ACCOUNT_TOKEN, и GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE, инлайн-токен имеет приоритет.
Поддержка нескольких организаций
Вы можете указать, с какой организацией взаимодействовать, используя либо:
- Переменную окружения: Установите
GRAFANA_ORG_IDв числовой идентификатор организации - HTTP-заголовок: Установите
X-Grafana-Org-Idпри использовании SSE или streamable HTTP транспортов (заголовок имеет приоритет над переменной окружения — это также позволяет задать организацию по умолчанию).
Когда указан идентификатор организации, MCP-сервер будет устанавливать заголовок X-Grafana-Org-Id на все запросы к Grafana, обеспечивая выполнение операций в контексте указанной организации.
Пример с идентификатором организации:
{
"mcpServers": {
"grafana": {
"command": "mcp-grafana",
"args": [],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_USERNAME": "<your username>",
"GRAFANA_PASSWORD": "<your password>",
"GRAFANA_ORG_ID": "2"
}
}
}
}
Настраиваемые HTTP-заголовки
Вы можете добавлять произвольные HTTP-заголовки ко всем запросам к API Grafana, используя переменную окружения GRAFANA_EXTRA_HEADERS. Значение должно быть JSON-объектом, сопоставляющим имена заголовков со значениями.
Пример с пользовательскими заголовками:
{
"mcpServers": {
"grafana": {
"command": "mcp-grafana",
"args": [],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
"GRAFANA_EXTRA_HEADERS": "{\"X-Custom-Header\": \"custom-value\", \"X-Tenant-ID\": \"tenant-123\"}"
}
}
}
}
Пересылка заголовков от клиента (только SSE/Streamable-HTTP)
Когда MCP-сервер работает за шлюзом или обратным прокси, который обрабатывает SSO (например, AWS ALB с OIDC), файл cookie сеанса каждого пользователя должен достигать Grafana, чтобы она могла связать запрос с аутентифицированным пользователем. Переменная окружения GRAFANA_FORWARD_HEADERS включает это, задавая разделённый запятыми список разрешённых имён заголовков для копирования из входящего HTTP-запроса в каждый исходящий запрос к API Grafana.
Это применимо только при использовании транспортов SSE (-t sse) или streamable-http (-t streamable-http). В режиме stdio это не действует.
Пример: пересылка файла cookie сеанса
{
"env": {
"GRAFANA_URL": "https://grafana.internal",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
"GRAFANA_FORWARD_HEADERS": "Cookie"
}
}
Вы можете пересылать несколько заголовков, разделяя их запятыми:
GRAFANA_FORWARD_HEADERS=Cookie,X-Session-Id
Пересылаемые заголовки объединяются с любыми заголовками, определёнными в GRAFANA_EXTRA_HEADERS. Если имя заголовка встречается в обоих местах, значение из входящего запроса имеет приоритет для этого запроса.
-
У вас есть несколько вариантов установки
mcp-grafana:-
uvx (рекомендуется): Если у вас установлен uv, дополнительная настройка не требуется —
uvxавтоматически загрузит и запустит сервер:uvx mcp-grafana -
Образ Docker: Используйте готовый образ Docker из Docker Hub.
Важно: Точка входа образа Docker настроена на запуск MCP-сервера в режиме SSE по умолчанию, но большинство пользователей захотят использовать режим STDIO для прямой интеграции с ИИ-ассистентами, такими как Claude Desktop:
- Режим STDIO: Для режима stdio вы должны явно переопределить значение по умолчанию с помощью
-t stdioи включить флаг-i, чтобы оставить stdin открытым:
docker pull grafana/mcp-grafana # For local Grafana: docker run --rm -i -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> grafana/mcp-grafana -t stdio # For Grafana Cloud: docker run --rm -i -e GRAFANA_URL=https://myinstance.grafana.net -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> grafana/mcp-grafana -t stdioПримечание — защита сетевых режимов: В режимах SSE и streamable-http контейнер привязывается к не-loopback адресу (
0.0.0.0:8000). Без токена вызывающего сервер запускается, но регистрирует ошибку безопасности (на уровне журналаerror, поэтому она не скрывается параметром--log-level; и в будущем крупном релизе он откажется запускаться). УстановитеMCP_GRAFANA_SERVER_TOKEN, чтобы требоватьAuthorization: Bearer <token>от клиентов (рекомендуется). Режим STDIO не затрагивается. См. Аутентификация вызывающего.- Режим SSE: В этом режиме сервер работает как HTTP-сервер, к которому подключаются клиенты. Вы должны открыть порт 8000 с помощью флага
-p:
docker pull grafana/mcp-grafana docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> grafana/mcp-grafana- Режим Streamable HTTP: В этом режиме сервер работает как независимый процесс, который может обрабатывать несколько клиентских подключений. Вы должны открыть порт 8000 с помощью флага
-p: Для этого режима вы должны явно переопределить значение по умолчанию с помощью-t streamable-http
docker pull grafana/mcp-grafana docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> grafana/mcp-grafana -t streamable-httpДля режима HTTPS streamable HTTP с сертификатами TLS сервера:
docker pull grafana/mcp-grafana docker run --rm -p 8443:8443 \ -v /path/to/certs:/certs:ro \ -e GRAFANA_URL=http://localhost:3000 \ -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> \ -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> \ grafana/mcp-grafana \ -t streamable-http \ -addr :8443 \ --server.tls-cert-file /certs/server.crt \ --server.tls-key-file /certs/server.key - Режим STDIO: Для режима stdio вы должны явно переопределить значение по умолчанию с помощью
-
Скачать бинарный файл: Скачайте последний релиз
mcp-grafanaсо страницы релизов и поместите его в ваш$PATH. -
Сборка из исходников: Если у вас установлен инструментарий Go, вы также можете собрать и установить его из исходников, используя переменную окружения
GOBINдля указания каталога, куда должен быть установлен бинарный файл. Он также должен находиться в вашем$PATH.GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/cmd/mcp-grafana@latest -
Развертывание в Kubernetes с помощью Helm: используйте Helm-чарт из репозитория Grafana helm-charts
helm repo add grafana https://grafana.github.io/helm-charts helm install --set grafana.apiKey=<Grafana_ApiKey> --set grafana.url=<GrafanaUrl> my-release grafana/grafana-mcp
-
-
Добавьте конфигурацию сервера в файл конфигурации вашего клиента. Например, для Claude Desktop:
Если используется uvx:
{ "mcpServers": { "grafana": { "command": "uvx", "args": ["mcp-grafana"], "env": { "GRAFANA_URL": "http://localhost:3000", "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>" } } } }Если используется бинарный файл:
{ "mcpServers": { "grafana": { "command": "mcp-grafana", "args": [], "env": { "GRAFANA_URL": "http://localhost:3000", // Or "https://myinstance.grafana.net" for Grafana Cloud "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>", // If using username/password authentication "GRAFANA_USERNAME": "<your username>", "GRAFANA_PASSWORD": "<your password>", // Optional: specify organization ID for multi-org support "GRAFANA_ORG_ID": "1" } } } }
Примечание: если вы видите
Error: spawn mcp-grafana ENOENTв Claude Desktop, вам нужно указать полный путь кmcp-grafana.
Если используется Docker:
{
"mcpServers": {
"grafana": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"GRAFANA_URL",
"-e",
"GRAFANA_SERVICE_ACCOUNT_TOKEN",
"grafana/mcp-grafana",
"-t",
"stdio"
],
"env": {
"GRAFANA_URL": "http://localhost:3000", // Or "https://myinstance.grafana.net" for Grafana Cloud
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>",
// If using username/password authentication
"GRAFANA_USERNAME": "<your username>",
"GRAFANA_PASSWORD": "<your password>",
// Optional: specify organization ID for multi-org support
"GRAFANA_ORG_ID": "1"
}
}
}
}
Примечание: Аргумент
-t stdioздесь важен, потому что он переопределяет режим SSE по умолчанию в образе Docker.
Использование VSCode с удалённым MCP-сервером
Если вы используете VSCode и запускаете MCP-сервер в режиме SSE (который используется по умолчанию при использовании образа Docker без переопределения транспорта), убедитесь, что ваш .vscode/settings.json включает следующее:
"mcp": {
"servers": {
"grafana": {
"type": "sse",
"url": "http://localhost:8000/sse"
}
}
}
Для режима HTTPS streamable HTTP с сертификатами TLS сервера:
"mcp": {
"servers": {
"grafana": {
"type": "sse",
"url": "https://localhost:8443/sse"
}
}
}
Режим отладки
Вы можете включить режим отладки для транспорта Grafana, добавив флаг -debug в команду. Это обеспечит подробное журналирование HTTP-запросов и ответов между MCP-сервером и API Grafana, что может быть полезно для устранения неполадок.
Чтобы использовать режим отладки с конфигурацией Claude Desktop, обновите конфигурацию следующим образом:
Если используется бинарный файл:
{
"mcpServers": {
"grafana": {
"command": "mcp-grafana",
"args": ["-debug"],
"env": {
"GRAFANA_URL": "http://localhost:3000", // Or "https://myinstance.grafana.net" for Grafana Cloud
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}
Если используется Docker:
{
"mcpServers": {
"grafana": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"GRAFANA_URL",
"-e",
"GRAFANA_SERVICE_ACCOUNT_TOKEN",
"grafana/mcp-grafana",
"-t",
"stdio",
"-debug"
],
"env": {
"GRAFANA_URL": "http://localhost:3000", // Or "https://myinstance.grafana.net" for Grafana Cloud
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}
Примечание: Как и в стандартной конфигурации, аргумент
-t stdioтребуется для переопределения режима SSE по умолчанию в образе Docker.
Конфигурация TLS
Если ваш экземпляр Grafana находится за mTLS или требует пользовательских сертификатов TLS, вы можете настроить MCP-сервер на использование пользовательских сертификатов. Сервер поддерживает следующие параметры конфигурации TLS:
--tls-cert-file: Путь к файлу сертификата TLS для аутентификации клиента--tls-key-file: Путь к файлу закрытого ключа TLS для аутентификации клиента--tls-ca-file: Путь к файлу сертификата ЦС TLS для проверки сервера--tls-skip-verify: Пропустить проверку сертификата TLS (небезопасно, используйте только для тестирования)
Пример с аутентификацией по клиентскому сертификату:
{
"mcpServers": {
"grafana": {
"command": "mcp-grafana",
"args": [
"--tls-cert-file",
"/path/to/client.crt",
"--tls-key-file",
"/path/to/client.key",
"--tls-ca-file",
"/path/to/ca.crt"
],
"env": {
"GRAFANA_URL": "https://secure-grafana.example.com",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}
Пример с Docker:
{
"mcpServers": {
"grafana": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-v",
"/path/to/certs:/certs:ro",
"-e",
"GRAFANA_URL",
"-e",
"GRAFANA_SERVICE_ACCOUNT_TOKEN",
"grafana/mcp-grafana",
"-t",
"stdio",
"--tls-cert-file",
"/certs/client.crt",
"--tls-key-file",
"/certs/client.key",
"--tls-ca-file",
"/certs/ca.crt"
],
"env": {
"GRAFANA_URL": "https://secure-grafana.example.com",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}
Конфигурация TLS применяется ко всем HTTP-клиентам, используемым MCP-сервером, включая:
- Основной клиент Grafana OpenAPI
- Клиенты источников данных Prometheus
- Клиенты источников данных Loki
- Клиенты управления инцидентами
- Клиенты расследований Sift
- Клиенты оповещений
- Клиенты Asserts
Примеры прямого использования CLI:
Для тестирования с самоподписанными сертификатами:
./mcp-grafana --tls-skip-verify -debug
С аутентификацией по клиентскому сертификату:
./mcp-grafana \
--tls-cert-file /path/to/client.crt \
--tls-key-file /path/to/client.key \
--tls-ca-file /path/to/ca.crt \
-debug
Только с пользовательским сертификатом ЦС:
./mcp-grafana --tls-ca-file /path/to/ca.crt
Программное использование:
Если вы используете эту библиотеку программно, вы также можете создавать функции контекста с поддержкой TLS:
// Using struct literals
tlsConfig := &mcpgrafana.TLSConfig{
CertFile: "/path/to/client.crt",
KeyFile: "/path/to/client.key",
CAFile: "/path/to/ca.crt",
}
grafanaConfig := mcpgrafana.GrafanaConfig{
Debug: true,
TLSConfig: tlsConfig,
}
contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)
// Or inline
grafanaConfig := mcpgrafana.GrafanaConfig{
Debug: true,
TLSConfig: &mcpgrafana.TLSConfig{
CertFile: "/path/to/client.crt",
KeyFile: "/path/to/client.key",
CAFile: "/path/to/ca.crt",
},
}
contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)
Проверка URL:
При прямом вызове NewGrafanaClient (stdio или программное создание) предварительно проверяйте URL, чтобы избежать достижимой паники:
if err := mcpgrafana.ValidateGrafanaURL(urlFromHeader); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
client := mcpgrafana.NewGrafanaClient(ctx, urlFromHeader, apiKey, nil)
Конфигурация TLS сервера (только для транспорта Streamable HTTP)
При использовании транспорта streamable HTTP (-t streamable-http) вы можете настроить MCP-сервер на обслуживание HTTPS вместо HTTP. Это полезно, когда вам нужно защитить соединение между вашим MCP-клиентом и самим сервером.
Сервер поддерживает следующие параметры конфигурации TLS для транспорта streamable HTTP:
--server.tls-cert-file: Путь к файлу сертификата TLS для HTTPS сервера (обязательно для TLS)--server.tls-key-file: Путь к файлу закрытого ключа TLS для HTTPS сервера (обязательно для TLS)
Примечание: Эти флаги полностью отделены от флагов TLS клиента, описанных выше. Флаги TLS клиента настраивают, как MCP-сервер подключается к Grafana, в то время как эти флаги TLS сервера настраивают, как клиенты подключаются к MCP-серверу при использовании транспорта streamable HTTP.
Пример с HTTPS streamable HTTP сервером:
./mcp-grafana \
-t streamable-http \
--server.tls-cert-file /path/to/server.crt \
--server.tls-key-file /path/to/server.key \
-addr :8443
Это запустит MCP-сервер на HTTPS-порту 8443. Клиенты затем будут подключаться к https://localhost:8443/ вместо http://localhost:8000/.
Пример Docker с TLS сервера:
docker run --rm -p 8443:8443 \
-v /path/to/certs:/certs:ro \
-e GRAFANA_URL=http://localhost:3000 \
-e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> \
grafana/mcp-grafana \
-t streamable-http \
-addr :8443 \
--server.tls-cert-file /certs/server.crt \
--server.tls-key-file /certs/server.key
Конечная точка проверки работоспособности
При использовании транспортов SSE (-t sse) или streamable HTTP (-t streamable-http) MCP-сервер предоставляет конечную точку проверки работоспособности по адресу /healthz. Эта конечная точка может использоваться балансировщиками нагрузки, системами мониторинга или платформами оркестрации для проверки того, что сервер работает и принимает соединения.
Конечная точка: GET /healthz
Ответ:
- Код состояния:
200 OK - Тело:
ok
Пример использования:
# For streamable HTTP or SSE transport on default port
curl http://localhost:8000/healthz
# With custom address
curl http://localhost:9090/healthz
Примечание: Конечная точка проверки работоспособности доступна только при использовании транспортов SSE или streamable HTTP. Она недоступна при использовании транспорта stdio (-t stdio), так как stdio не предоставляет HTTP-сервер.
Наблюдаемость
MCP-сервер поддерживает метрики Prometheus, распределённую трассировку OpenTelemetry и экспорт журналов OpenTelemetry, следуя семантическим соглашениям OTel MCP. Трассировка и экспорт журналов настраиваются через стандартные переменные окружения OTEL_* и работают с любым транспортом.
Примечание: mcp-grafana в настоящее время поддерживает только транспорт OTLP/gRPC как для трассировок, так и для журналов. OTEL_EXPORTER_OTLP_PROTOCOL (и его варианты _TRACES_PROTOCOL / _LOGS_PROTOCOL) не учитываются — gRPC используется в любом случае.
Метрики
При использовании транспортов SSE или streamable HTTP включите метрики Prometheus с помощью флага --metrics:
# Metrics served on the main server at /metrics
./mcp-grafana -t streamable-http --metrics
# Metrics served on a separate address
./mcp-grafana -t streamable-http --metrics --metrics-address :9090
Доступные метрики:
| Метрика | Тип | Описание |
|---|---|---|
mcp_server_operation_duration_seconds | Гистограмма | Длительность операций MCP (метки: mcp_method_name, gen_ai_tool_name, error_type, network_transport, mcp_protocol_version) |
mcp_server_session_duration_seconds | Гистограмма | Длительность сеансов MCP-клиента (метки: network_transport, mcp_protocol_version) |
http_server_request_duration_seconds | Гистограмма | Длительность HTTP-запросов сервера (из otelhttp) |
Примечание: Метрики доступны только при использовании транспортов SSE или streamable HTTP. Они недоступны с транспортом stdio.
Журналирование медленных запросов
Флаг --slow-request-threshold генерирует структурированное событие журнала всякий раз, когда запрос MCP (вызов инструмента, список, чтение ресурса и т. д.) превышает заданную длительность. Это полезно для диагностики медленных запросов и вызовов инструментов, не утопая в полном журнале отладки.
# Warn on any request slower than 500ms (works on all transports)
./mcp-grafana -t streamable-http --slow-request-threshold 500ms
# Same thing on stdio (the feature is transport-agnostic, unlike --metrics)
./mcp-grafana -t stdio --slow-request-threshold 500ms
# Log at INFO level instead of WARN (useful during investigation)
./mcp-grafana -t streamable-http --slow-request-threshold 500ms --slow-request-log-level info
Событие журнала содержит следующие структурированные атрибуты:
| Атрибут | Описание |
|---|---|
mcp.method | Метод MCP (например, tools/call, tools/list, resources/read) |
duration | Наблюдаемая длительность запроса |
threshold | Настроенный порог |
tool | Имя инструмента (присутствует только для методов tools/call) |
error | Значение ошибки, когда запрос не удался (контекст best-effort; содержимое контролируется обёрткой ошибок вышестоящего уровня) |
error.type | Классификация ошибок с ограниченной мощностью (_OTHER для нетипизированных ошибок) |
Журналирование медленных запросов работает на всех транспортах (включая stdio) и не требует --metrics. Порог по умолчанию 0 полностью отключает его. Проксируемые инструменты проходят через tools/call и покрываются автоматически.
Трассировка
Распределённая трассировка настраивается через стандартные переменные окружения OTEL_* и работает независимо от флага --metrics. Когда установлен OTEL_EXPORTER_OTLP_ENDPOINT (или специфичный для сигнала OTEL_EXPORTER_OTLP_TRACES_ENDPOINT), сервер экспортирует трассировки через OTLP/gRPC:
# Send traces to a local Tempo instance
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \
OTEL_EXPORTER_OTLP_INSECURE=true \
./mcp-grafana -t streamable-http
# Send traces to Grafana Cloud with authentication
OTEL_EXPORTER_OTLP_ENDPOINT=https://tempo-us-central1.grafana.net:443 \
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic ..." \
./mcp-grafana -t streamable-http
Спаны вызовов инструментов следуют именованию semconv (tools/call <tool_name>) и включают такие атрибуты, как gen_ai.tool.name, mcp.method.name и mcp.session.id. Сервер также поддерживает распространение контекста трассировки W3C из поля _meta запросов вызова инструментов.
Журналы
Когда установлен OTEL_EXPORTER_OTLP_ENDPOINT (или специфичный для сигнала OTEL_EXPORTER_OTLP_LOGS_ENDPOINT), сервер также экспортирует структурированные журналы через OTLP/gRPC в дополнение к существующему выводу в stderr в виде обычного текста. Мост otelslog автоматически прикрепляет trace_id и span_id из активного спана, поэтому записи журналов коррелируют с трассировками, которые сервер уже отправляет.
Трассировки и журналы разрешают свои конечные точки независимо, поэтому два сигнала могут быть включены отдельно: установка только OTEL_EXPORTER_OTLP_TRACES_ENDPOINT включает трассировку без экспорта журналов, установка только OTEL_EXPORTER_OTLP_LOGS_ENDPOINT включает экспорт журналов без трассировки, а общий OTEL_EXPORTER_OTLP_ENDPOINT включает оба.
Если вы используете общий OTEL_EXPORTER_OTLP_ENDPOINT, но хотите отключить экспорт журналов (например, ваш бэкенд не поддерживает LogsService), установите:
OTEL_LOGS_EXPORTER=none
Это предотвращает создание сервером экспортера журналов OTLP независимо от конфигурации конечной точки, избегая ошибок, подобных unknown service opentelemetry.proto.collector.logs.v1.LogsService.
Логирование в stderr не изменяется при включенном логировании OTLP; вы можете по-прежнему полагаться на логи контейнера или перенаправлять stderr в /dev/null, если предпочитаете.
# Send both logs and traces to a local OTel collector
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \
OTEL_EXPORTER_OTLP_INSECURE=true \
./mcp-grafana -t streamable-http
Транспорт — OTLP/gRPC (порт по умолчанию 4317). Журналы можно отправлять напрямую в любой управляемый бэкенд, принимающий OTLP/gRPC — например, Grafana Cloud — указав OTEL_EXPORTER_OTLP_LOGS_ENDPOINT (или общий OTEL_EXPORTER_OTLP_ENDPOINT) на удаленную gRPC-конечную точку и предоставив аутентификацию через OTEL_EXPORTER_OTLP_LOGS_HEADERS (или OTEL_EXPORTER_OTLP_HEADERS), как в примере с трассировкой выше. Локальный коллектор OTel необязателен — полезен для разветвления, пакетной обработки или маршрутизации на несколько бэкендов, но не требуется.
Специфичные для сигналов варианты OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_INSECURE, OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT и OTEL_EXPORTER_OTLP_LOGS_COMPRESSION учитываются и переопределяют свои общие аналоги OTEL_EXPORTER_OTLP_* — см. спецификацию экспортера OTel для полного списка и правил приоритета.
Если настроенный коллектор недоступен, записи журналов буферизуются в памяти (очередь по умолчанию: 2048), и при заполнении очереди самые старые записи отбрасываются. Процесс продолжает работу, не блокируя сервис. Настройте локальный коллектор OTel, если вам нужна буферизация без потерь во время сбоев.
Журналы также экспортируются через транспорт stdio, что упрощает централизацию журналов из локальных экземпляров mcp-grafana, вызываемых IDE-клиентами.
Пример Docker с метриками, трассировкой и журналами:
docker run --rm -p 8000:8000 \
-e GRAFANA_URL=http://localhost:3000 \
-e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your token> \
-e OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4317 \
-e OTEL_EXPORTER_OTLP_INSECURE=true \
grafana/mcp-grafana \
-t streamable-http --metrics
Устранение неполадок
Совместимость версий Grafana
Если вы столкнулись со следующей ошибкой при использовании инструментов, связанных с источниками данных:
get datasource by uid : [GET /datasources/uid/{uid}][400] getDataSourceByUidBadRequest {"message":"id is invalid"}
Это обычно указывает на то, что вы используете версию Grafana ниже 9.0. Конечная точка API /datasources/uid/{uid} была введена в Grafana 9.0, и операции с источниками данных будут завершаться ошибкой на более ранних версиях.
Решение: Обновите ваш экземпляр Grafana до версии 9.0 или новее, чтобы решить эту проблему.
Разработка
Вклад приветствуется! Пожалуйста, откройте issue или отправьте pull request, если у вас есть предложения или улучшения.
Этот проект написан на Go. Установите Go, следуя инструкциям для вашей платформы.
Чтобы запустить сервер локально в режиме STDIO (который используется по умолчанию для локальной разработки), используйте:
make run
Чтобы запустить сервер локально в режиме SSE, используйте:
go run ./cmd/mcp-grafana --transport sse
Вы также можете запустить сервер с использованием транспорта SSE внутри пользовательского Docker-образа. Как и опубликованный Docker-образ, точка входа этого пользовательского образа по умолчанию использует режим SSE. Чтобы собрать образ, используйте:
make build-image
И чтобы запустить образ в режиме SSE (по умолчанию), используйте:
docker run -it --rm -p 8000:8000 mcp-grafana:latest
Если вам нужно запустить его в режиме STDIO, переопределите настройку транспорта:
docker run -it --rm mcp-grafana:latest -t stdio
Тестирование
Доступны три типа тестов:
- Модульные тесты (не требуют внешних зависимостей):
make test-unit
Вы также можете запустить модульные тесты с помощью:
make test
- Интеграционные тесты (требуют запущенных docker-контейнеров):
make test-integration
- Облачные тесты (требуют облачного экземпляра Grafana и учетных данных):
make test-cloud
Примечание: Облачные тесты автоматически настраиваются в CI. Для локальной разработки вам потребуется настроить собственный экземпляр Grafana Cloud и учетные данные.
Более комплексные интеграционные тесты потребуют запущенного локально экземпляра Grafana на порту 3000; вы можете запустить его с помощью Docker Compose:
docker-compose up -d
Интеграционные тесты можно запустить с помощью:
make test-all
Если вы добавляете новые инструменты, пожалуйста, добавьте для них интеграционные тесты. Существующие тесты должны стать хорошей отправной точкой.
Линтинг
Чтобы проверить код, выполните:
make lint
Это включает пользовательский линтер, который проверяет неэкранированные запятые в тегах структур jsonschema. Запятые в полях description должны быть экранированы с помощью \\,, чтобы предотвратить незаметное усечение. Вы можете запустить только этот линтер с помощью:
make lint-jsonschema
См. документацию линтера JSONSchema для получения дополнительных сведений.
Лицензия
Этот проект лицензирован в соответствии с Apache License, Version 2.0.