Grafana MCP Server
oficialPesquise dashboards, investigue incidentes e consulte fontes de dados em sua instância do Grafana
Documentação
Servidor MCP do Grafana
Um servidor Model Context Protocol (MCP) para o Grafana.
Ele fornece acesso à sua instância do Grafana e ao ecossistema ao redor.
Início Rápido
Requer uv. Adicione o seguinte à configuração do seu cliente MCP (ex.: Claude Desktop, Cursor):
{
"mcpServers": {
"grafana": {
"command": "uvx",
"args": ["mcp-grafana"],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
}
}
}
}
Para o Grafana Cloud, substitua GRAFANA_URL pela URL da sua instância (ex.: https://myinstance.grafana.net). Consulte Uso para mais opções de instalação, incluindo Docker, binário e Helm.
Requisitos
- Grafana versão 9.0 ou posterior é necessário para funcionalidade completa. Alguns recursos, especialmente operações relacionadas a fontes de dados, podem não funcionar corretamente com versões anteriores devido à ausência de endpoints da API.
Funcionalidades
As seguintes funcionalidades estão atualmente disponíveis no servidor MCP. Esta lista é apenas para fins informativos e não representa um roteiro ou compromisso com funcionalidades futuras.
Dashboards
- Pesquisar dashboards: Encontre dashboards por título ou outros metadados
- Obter dashboard por UID: Recupere detalhes completos do dashboard usando seu identificador único. Aviso: Dashboards grandes podem consumir um espaço significativo da janela de contexto.
- Obter resumo do dashboard: Obtenha uma visão geral compacta de um dashboard, incluindo título, contagem de painéis, tipos de painéis, variáveis e metadados, sem o JSON completo para minimizar o uso da janela de contexto
- Obter propriedade do dashboard: Extraia partes específicas de um dashboard usando expressões JSONPath (ex.:
$.title,$.panels[*].title) para buscar apenas os dados necessários e reduzir o consumo da janela de contexto - Atualizar ou criar um dashboard: Modifique dashboards existentes ou crie novos. Aviso: Requer o JSON completo do dashboard, o que pode consumir grandes quantidades de espaço da janela de contexto.
- Aplicar patch no dashboard: Aplique alterações específicas a um dashboard sem exigir o JSON completo, reduzindo significativamente o uso da janela de contexto para modificações direcionadas
- Obter consultas do painel e informações da fonte de dados: Obtenha o título, a string de consulta e as informações da fonte de dados (incluindo UID e tipo, se disponíveis) de cada painel em um dashboard
Executar Consulta do Painel
Nota: As ferramentas de execução de consulta do painel estão desabilitadas por padrão. Para habilitá-las, adicione
runpanelqueryà sua flag--enabled-tools.
- Executar consulta do painel: Execute a consulta de um painel do dashboard com intervalos de tempo personalizados e substituições de variáveis.
Gerenciamento da Janela de Contexto
As ferramentas de dashboard agora incluem várias estratégias para gerenciar o uso da janela de contexto de forma eficaz (issue #101):
- Use
get_dashboard_summarypara visão geral do dashboard e planejamento de modificações - Use
get_dashboard_propertycom JSONPath quando precisar apenas de partes específicas do dashboard - Evite
get_dashboard_by_uida menos que você precise especificamente do JSON completo do dashboard
Fontes de Dados
- Listar e obter informações da fonte de dados: Visualize todas as fontes de dados configuradas e recupere informações detalhadas sobre cada uma.
- Tipos de fonte de dados suportados: Prometheus, Loki, ClickHouse, CloudWatch, Elasticsearch, OpenSearch, Snowflake, Athena.
Exemplos de Consulta
Nota: As ferramentas de exemplos de consulta estão desabilitadas por padrão. Para habilitá-las, adicione
examplesà sua flag--enabled-tools.
- Obter exemplos de consulta: Recupere consultas de exemplo para diferentes tipos de fonte de dados para aprender a sintaxe de consulta.
Consultas ao Prometheus
- Consultar Prometheus: Execute consultas PromQL (suporta consultas de métrica instantâneas e de intervalo) em fontes de dados do Prometheus.
- Consultar metadados do Prometheus: Recupere metadados de métricas, nomes de métricas, nomes de rótulos e valores de rótulos de fontes de dados do Prometheus.
- Consultar percentis de histograma: Calcule valores de percentil de histograma (p50, p90, p95, p99) usando histogram_quantile.
Consultas ao Loki
- Consultar logs e métricas do Loki: Execute consultas de log e consultas de métrica usando LogQL em fontes de dados do Loki.
- Consultar metadados do Loki: Recupere nomes de rótulos, valores de rótulos e estatísticas de fluxo de fontes de dados do Loki.
- Consultar padrões do Loki: Recupere padrões de log detectados pelo Loki para identificar estruturas de log comuns e anomalias.
Consultas ao InfluxDB
Nota: As ferramentas do InfluxDB estão desabilitadas por padrão. Para habilitá-las, adicione
influxdbà sua flag--enabled-tools.
- Consultar InfluxDB: Execute consultas em fontes de dados do InfluxDB usando InfluxQL (v1.x) ou Flux (v2.x). O dialeto é inferido da configuração da fonte de dados ou pode ser definido explicitamente através do parâmetro
dialect.
Consultas ao ClickHouse
Nota: As ferramentas do ClickHouse estão desabilitadas por padrão. Para habilitá-las, adicione
clickhouseà sua flag--enabled-tools.
- Listar tabelas do ClickHouse: Liste todas as tabelas em um banco de dados ClickHouse com contagens de linhas e tamanhos.
- Descrever esquema da tabela: Obtenha nomes de colunas, tipos e metadados para uma tabela do ClickHouse.
- Consultar ClickHouse: Execute consultas SQL com suporte a macros do Grafana e substituição de variáveis.
Consultas ao CloudWatch
Nota: As ferramentas do CloudWatch estão desabilitadas por padrão. Para habilitá-las, adicione
cloudwatchà sua flag--enabled-tools.
- Listar namespaces do CloudWatch: Descubra namespaces disponíveis do AWS CloudWatch.
- Listar métricas do CloudWatch: Liste métricas disponíveis em um namespace específico.
- Listar dimensões do CloudWatch: Obtenha dimensões para filtrar consultas de métrica.
- Consultar CloudWatch: Execute consultas de métrica do CloudWatch com suporte a intervalo de tempo.
Consultas ao Graphite
Nota: As ferramentas do Graphite estão desabilitadas por padrão. Para habilitá-las, adicione
graphiteà sua flag--enabled-tools.
- Consultar Graphite: Execute consultas da API de renderização do Graphite em uma fonte de dados do Graphite.
- Listar métricas do Graphite: Navegue e descubra caminhos de métricas do Graphite.
- Listar tags do Graphite: Liste tags e valores de tags disponíveis do Graphite.
- Consultar densidade do Graphite: Consulte a densidade de métricas do Graphite para um determinado padrão.
Consultas ao Athena
Nota: As ferramentas do Athena estão desabilitadas por padrão. Para habilitá-las, adicione
athenaà sua flag--enabled-tools.
- Listar catálogos do Athena: Descubra catálogos de dados disponíveis (ex.: AwsDataCatalog, conectores Iceberg).
- Listar bancos de dados do Athena: Liste bancos de dados em um catálogo do Athena.
- Listar tabelas do Athena: Liste tabelas em um banco de dados do Athena.
- Descrever tabela do Athena: Obtenha nomes de colunas para uma tabela do Athena.
- Consultar Athena: Execute consultas SQL no Amazon Athena via Grafana com substituição de macros, imposição de limites e suporte a variáveis de template.
Consultas ao Snowflake
Nota: As ferramentas do Snowflake estão desabilitadas por padrão. Para habilitá-las, adicione
snowflakeà sua flag--enabled-tools.
As consultas passam pela fonte de dados Snowflake do Grafana (plugin Grafana Enterprise grafana-snowflake-datasource), então a autenticação é tratada pela configuração da fonte de dados no Grafana — as credenciais nunca são vistas pelo servidor MCP. Este é o mesmo modelo usado para as ferramentas do ClickHouse.
- Listar tabelas do Snowflake: Descubra tabelas (com banco de dados, esquema, tipo, contagem de linhas e tamanho) via
INFORMATION_SCHEMA.TABLES. Filtros opcionais de banco de dados/esquema. - Descrever esquema da tabela: Obtenha nomes de colunas, tipos de dados, nulabilidade, padrões e comentários para uma tabela do Snowflake.
- Consultar Snowflake: Execute consultas SQL com suporte a macros e substituição de variáveis. Útil para consultar tabelas de eventos do Snowflake (ex.:
SNOWFLAKE.TELEMETRY.EVENTS) para logs e rastros, ou qualquer tabela de usuário.- Macros suportadas:
$__timeFilter(column),$__timeFrom,$__timeTo,$__from,$__to(Unix ms),$__interval(segundos),$__interval_mse${varname}para substituição de variáveis de template.
- Macros suportadas:
Consultas ao Elasticsearch/OpenSearch
Nota: As ferramentas do Elasticsearch/OpenSearch estão desabilitadas por padrão. Para habilitá-las, adicione
elasticsearchà sua flag--enabled-tools.
- Consultar Elasticsearch/OpenSearch: Execute consultas de pesquisa em fontes de dados do Elasticsearch ou OpenSearch usando a sintaxe de consulta Lucene ou Elasticsearch Query DSL. Suporta filtragem por intervalo de tempo e recuperação de logs, métricas ou quaisquer dados indexados. Retorna documentos com seu índice, ID, campos de origem e pontuação de relevância opcional.
Consultas ao Quickwit
Nota: As ferramentas do Quickwit estão desabilitadas por padrão. Para habilitá-las, adicione
quickwità sua flag--enabled-tools.
- Consultar Quickwit: Execute consultas de pesquisa em fontes de dados do Quickwit usando a sintaxe de consulta Lucene ou Query DSL parcial compatível com Elasticsearch. Suporta filtragem por intervalo de tempo e recuperação de logs ou outros documentos indexados. Retorna documentos com seu índice, ID, campos de origem e pontuação de relevância opcional.
Incidentes
- Pesquisar, criar e atualizar incidentes: Gerencie incidentes no Grafana Incident, incluindo pesquisa, criação e adição de atividades a incidentes.
Investigações do Sift
- Listar investigações do Sift: Recupere uma lista de investigações do Sift, com suporte a um parâmetro de limite.
- Obter investigação do Sift: Recupere detalhes de uma investigação específica do Sift pelo seu UUID.
- Obter análises do Sift: Recupere uma análise específica de uma investigação do Sift.
- Encontrar padrões de erro em logs: Detecte padrões de erro elevados em logs do Loki usando o Sift.
- Encontrar requisições lentas: Detecte requisições lentas usando o Sift (Tempo).
Alertas
- Listar e obter informações de regras de alerta: Visualize regras de alerta e seus status (disparando/normal/erro/etc.) no Grafana. Suporta regras gerenciadas pelo Grafana e regras gerenciadas por fontes de dados do Prometheus ou Loki.
- Criar e atualizar regras de alerta: Crie novas regras de alerta ou modifique as existentes.
- Excluir regras de alerta: Remova regras de alerta pelo UID.
- Gerenciar roteamento de alertas: Visualize políticas de notificação, pontos de contato e intervalos de tempo. Suporta pontos de contato gerenciados pelo Grafana e receptores de fontes de dados externas do Alertmanager (Prometheus Alertmanager, Mimir, Cortex).
Grafana OnCall
- Listar e gerenciar escalas: Visualize e gerencie escalas de plantão no Grafana OnCall.
- Obter detalhes do turno: Recupere informações detalhadas sobre turnos de plantão específicos.
- Obter usuários de plantão atuais: Veja quais usuários estão atualmente de plantão para uma escala.
- Listar equipes e usuários: Visualize todas as equipes e usuários do OnCall.
- Listar grupos de alerta: Visualize e filtre grupos de alerta do Grafana OnCall por vários critérios, incluindo estado, integração, rótulos e intervalo de tempo.
- Obter detalhes do grupo de alerta: Recupere informações detalhadas sobre um grupo de alerta específico pelo seu ID.
Administração
Nota: As ferramentas de administração estão desabilitadas por padrão. Para habilitá-las, inclua
adminna sua flag--enabled-tools.
- Listar equipes: Visualize todas as equipes configuradas no Grafana.
- Listar usuários: Visualize todos os usuários em uma organização no Grafana.
- Listar todas as funções: Liste todas as funções do Grafana, com um filtro opcional para funções delegáveis.
- Obter detalhes da função: Obtenha detalhes de uma função específica do Grafana pelo UID.
- Listar atribuições para uma função: Liste todos os usuários, equipes e contas de serviço atribuídos a uma função.
- Listar funções para usuários: Liste todas as funções atribuídas a um ou mais usuários.
- Listar funções para equipes: Liste todas as funções atribuídas a uma ou mais equipes.
- Listar permissões para um recurso: Liste todas as permissões definidas para um recurso específico (dashboard, fonte de dados, pasta, etc.).
- Descrever um recurso do Grafana: Liste permissões disponíveis e capacidades de atribuição para um tipo de recurso.
Navegação
- Gerar deeplinks: Crie URLs de deeplink precisas para recursos do Grafana em vez de depender de suposições de URL do LLM.
- Links de dashboard: Gere links diretos para dashboards usando seu UID (ex.,
http://localhost:3000/d/dashboard-uid) - Links de painel: Crie links para painéis específicos dentro de dashboards com o parâmetro viewPanel (ex.,
http://localhost:3000/d/dashboard-uid?viewPanel=5) - Links do Explore: Gere links para o Grafana Explore com fontes de dados pré-configuradas (ex.,
http://localhost:3000/explore?left={"datasource":"prometheus-uid"}) - Suporte a intervalo de tempo: Adicione parâmetros de intervalo de tempo aos links (
from=now-1h&to=now) - Parâmetros personalizados: Inclua parâmetros de consulta adicionais, como variáveis de dashboard ou intervalos de atualização
- Links de dashboard: Gere links diretos para dashboards usando seu UID (ex.,
Anotações
- Obter Anotações: Consulte anotações com filtros. Suporta intervalo de tempo, UID do dashboard, tags e modo de correspondência.
- Criar Anotação: Crie uma nova anotação em um dashboard ou painel.
- Criar Anotação Graphite: Crie anotações usando o formato Graphite (
what,when,tags,data). - Atualizar Anotação: Substitua todos os campos de uma anotação existente (atualização completa).
- Corrigir Anotação: Atualize apenas campos específicos de uma anotação (atualização parcial).
- Obter Tags de Anotação: Liste as tags de anotação disponíveis com filtragem opcional.
Snapshots
- Listar snapshots: Liste snapshots de dashboard com filtros opcionais de consulta e limite.
- Obter snapshot: Recupere metadados do snapshot e o payload do dashboard pela chave do snapshot.
- Criar snapshot: Crie um snapshot de dashboard a partir de um payload completo de dashboard, com opções de expiração e snapshot externo.
- Excluir snapshot: Exclua um snapshot pela chave do snapshot.
Renderização
- Obter imagem de painel ou dashboard: Renderize um painel de dashboard do Grafana ou um dashboard completo como uma imagem PNG. Retorna a imagem como dados codificados em base64 para uso em relatórios, alertas ou apresentações. Suporta personalização de dimensões, intervalo de tempo, tema, escala e variáveis de dashboard. Também suporta a renderização de dashboards ainda não aplicados de um branch de repositório de provisionamento (ex., uma prévia de PR de git-sync) por meio do parâmetro opcional
provisioningPreview.- Nota: Requer que o serviço Grafana Image Renderer esteja instalado e configurado.
Provisionamento
- Listar repositórios de provisionamento: Liste os repositórios de provisionamento configurados para esta instância do Grafana (ex., fontes de git-sync), retornando o slug de cada repositório junto com sua URL de origem, branch, caminho, estado de sincronização e integridade.
- Validar arquivo de provisionamento: Aplique de forma simulada (dry-run) um arquivo de um repositório de provisionamento em um determinado branch ou commit. Retorna se seria aceito, a ação no recurso (criar/atualizar), o tipo de recurso de destino e quaisquer erros de validação estruturados — a mesma superfície de admissão que o comentarista de PR do Grafana usa.
A lista de ferramentas é configurável, para que você possa escolher quais ferramentas deseja disponibilizar para o cliente MCP.
Isso é útil se você não usa determinada funcionalidade ou se não deseja ocupar muito da janela de contexto.
Para desabilitar uma categoria de ferramentas, use a flag --disable-<category> ao iniciar o servidor. Por exemplo, para desabilitar
as ferramentas OnCall, use --disable-oncall, ou para desabilitar a geração de deeplinks de navegação, use --disable-navigation.
Permissões RBAC
Cada ferramenta requer permissões RBAC específicas para funcionar corretamente. Ao criar uma conta de serviço para o servidor MCP, certifique-se de que ela tenha as permissões necessárias com base nas ferramentas que você planeja usar. As permissões listadas são as ações mínimas necessárias - você também pode precisar de escopos apropriados (ex., datasources:*, dashboards:*, folders:*) dependendo do seu caso de uso.
Dica: Se você não está familiarizado com o RBAC do Grafana ou deseja uma configuração mais rápida e simples em vez de configurar muitos escopos granulares, você pode atribuir uma função integrada, como Editor, à conta de serviço. A função Editor concede amplo acesso de leitura/gravação que permitirá a maioria das operações do servidor MCP; ela é menos granular (e, portanto, menos restritiva) do que escopos aplicados manualmente, portanto, use-a apenas quando a conveniência for mais importante do que o acesso estrito de privilégio mínimo.
Nota: As ferramentas Grafana Incident e Sift usam funções básicas do Grafana em vez de permissões RBAC refinadas:
- Função Viewer: Necessária para operações somente leitura (listar incidentes, obter investigações)
- Função Editor: Necessária para operações de gravação (criar incidentes, modificar investigações)
Para obter mais informações sobre o RBAC do Grafana, consulte a documentação oficial.
Escopos RBAC
Os escopos definem os recursos específicos aos quais as permissões se aplicam. Cada ação requer a combinação apropriada de permissão e escopo.
Padrões Comuns de Escopo:
-
Acesso amplo: Use curingas
*para acesso em toda a organizaçãodatasources:*- Acesso a todas as fontes de dadosdashboards:*- Acesso a todos os dashboardsfolders:*- Acesso a todas as pastasteams:*- Acesso a todas as equipes
-
Acesso limitado: Use UIDs ou IDs específicos para restringir o acesso a recursos individuais
datasources:uid:prometheus-uid- Acesso apenas a uma fonte de dados Prometheus específicadashboards:uid:abc123- Acesso apenas ao dashboard com UIDabc123folders:uid:xyz789- Acesso apenas à pasta com UIDxyz789teams:id:5- Acesso apenas à equipe com ID5global.users:id:123- Acesso apenas ao usuário com ID123
Exemplos:
-
Acesso total ao servidor MCP: Conceda permissões amplas para todas as ferramentas
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) -
Acesso limitado a fontes de dados: Consulte apenas instâncias específicas do Prometheus e Loki
datasources:uid:prometheus-prod (datasources:query) datasources:uid:loki-prod (datasources:query) -
Acesso específico a dashboards: Leia apenas dashboards específicos
dashboards:uid:monitoring-dashboard (dashboards:read) dashboards:uid:alerts-dashboard (dashboards:read)
Ferramentas
| Ferramenta | Categoria | Descrição | Permissões RBAC Necessárias | Escopos Necessários |
|---|---|---|---|---|
list_teams | Admin | Listar todas as equipes | teams:read | teams:* ou teams:id:1 |
list_users_by_org | Admin | Listar todos os usuários em uma organização | users:read | global.users:* ou global.users:id:123 |
list_all_roles | Admin | Listar todas as funções do Grafana | roles:read | roles:* |
get_role_details | Admin | Obter detalhes de uma função do Grafana | roles:read | roles:uid:editor |
get_role_assignments | Admin | Listar atribuições para uma função | roles:read | roles:uid:editor |
list_user_roles | Admin | Listar funções para usuários | roles:read | global.users:id:123 |
list_team_roles | Admin | Listar funções para equipes | roles:read | teams:id:7 |
get_resource_permissions | Admin | Listar permissões para um recurso | permissions:read | dashboards:uid:abcd1234 |
get_resource_description | Admin | Descrever um tipo de recurso do Grafana | permissions:read | dashboards:* |
search_dashboards | Pesquisa | Pesquisar dashboards | dashboards:read | dashboards:* ou dashboards:uid:abc123 |
get_dashboard_by_uid | Dashboard | Obter um dashboard por uid | dashboards:read | dashboards:uid:abc123 |
update_dashboard | Dashboard | Atualizar ou criar um novo dashboard | dashboards:create, dashboards:write | dashboards:*, folders:* ou folders:uid:xyz789 |
get_dashboard_panel_queries | Dashboard | Obter título do painel, consultas, UID e tipo da fonte de dados de um dashboard | dashboards:read | dashboards:uid:abc123 |
run_panel_query | RunPanelQuery* | Executar uma ou mais consultas de painel do dashboard | dashboards:read, datasources:query | dashboards:uid:*, datasources:uid:* |
get_dashboard_property | Dashboard | Extrair partes específicas de um dashboard usando expressões JSONPath | dashboards:read | dashboards:uid:abc123 |
get_dashboard_summary | Dashboard | Obter um resumo compacto de um dashboard sem o JSON completo | dashboards:read | dashboards:uid:abc123 |
list_datasources | Fontes de dados | Listar fontes de dados | datasources:read | datasources:* |
get_datasource | Fontes de dados | Obter uma fonte de dados por UID ou nome | datasources:read | datasources:uid:prometheus-uid |
get_query_examples | Exemplos* | Obter consultas de exemplo para um tipo de fonte de dados | datasources:read | datasources:* |
query_prometheus | Prometheus | Executar uma consulta em uma fonte de dados Prometheus | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_metadata | Prometheus | Listar metadados de métricas | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_metric_names | Prometheus | Listar nomes de métricas disponíveis | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_names | Prometheus | Listar nomes de rótulos que correspondem a um seletor | datasources:query | datasources:uid:prometheus-uid |
list_prometheus_label_values | Prometheus | Listar valores para um rótulo específico | datasources:query | datasources:uid:prometheus-uid |
query_prometheus_histogram | Prometheus | Calcular valores de percentil de histograma | datasources:query | datasources:uid:prometheus-uid |
list_incidents | Incidente | Listar incidentes no Grafana Incident | Função de Visualizador | N/A |
create_incident | Incidente | Criar um incidente no Grafana Incident | Função de Editor | N/A |
add_activity_to_incident | Incidente | Adicionar um item de atividade a um incidente no Grafana Incident | Função de Editor | N/A |
get_incident | Incidente | Obter um único incidente por ID | Função de Visualizador | N/A |
query_loki_logs | Loki | Consultar e recuperar logs usando LogQL (consultas de log ou métricas) | datasources:query | datasources:uid:loki-uid |
list_loki_label_names | Loki | Listar todos os nomes de rótulos disponíveis nos logs | datasources:query | datasources:uid:loki-uid |
list_loki_label_values | Loki | Listar valores para um rótulo de log específico | datasources:query | datasources:uid:loki-uid |
query_loki_stats | Loki | Obter estatísticas sobre fluxos de log | datasources:query | datasources:uid:loki-uid |
query_loki_patterns | Loki | Consultar padrões de log detectados para identificar estruturas comuns | datasources:query | datasources:uid:loki-uid |
analyze_loki_labels | Loki | Auditar uma estratégia de rótulos do Loki (ao vivo ou estática) e, opcionalmente, diagnosticar o desempenho da consulta | datasources:query | datasources:uid:loki-uid |
suggest_loki_alloy_label_config | Configuração | Gerar um trecho do Alloy loki.process que impõe rótulos aprovados | N/A | N/A |
query_influxdb | InfluxDB | Consultar o InfluxDB usando InfluxQL (v1) ou Flux (v2) | datasources:query | datasources:uid:influxdb-uid |
list_clickhouse_tables | ClickHouse* | Listar tabelas em um banco de dados ClickHouse | datasources:query | datasources:uid:* |
describe_clickhouse_table | ClickHouse* | Obter esquema da tabela com tipos de coluna | datasources:query | datasources:uid:* |
query_clickhouse | ClickHouse* | Executar consultas SQL com substituição de macro | datasources:query | datasources:uid:* |
list_cloudwatch_namespaces | CloudWatch* | Listar namespaces AWS CloudWatch disponíveis | datasources:query | datasources:uid:* |
list_cloudwatch_metrics | CloudWatch* | Listar métricas em um namespace | datasources:query | datasources:uid:* |
list_cloudwatch_dimensions | CloudWatch* | Listar dimensões para uma métrica | datasources:query | datasources:uid:* |
query_cloudwatch | CloudWatch* | Executar consultas de métricas do CloudWatch | datasources:query | datasources:uid:* |
list_athena_catalogs | Athena* | Listar catálogos de dados disponíveis do Athena | datasources:query | datasources:uid:* |
list_athena_databases | Athena* | Listar bancos de dados em um catálogo do Athena | datasources:query | datasources:uid:* |
list_athena_tables | Athena* | Listar tabelas em um banco de dados do Athena | datasources:query | datasources:uid:* |
describe_athena_table | Athena* | Obter nomes de colunas para uma tabela do Athena | datasources:query | datasources:uid:* |
query_athena | Athena* | Executar consultas SQL com substituição de macros | datasources:query | datasources:uid:* |
query_elasticsearch | Elasticsearch/OpenSearch* | Consultar Elasticsearch ou OpenSearch usando sintaxe Lucene ou Query DSL | datasources:query | datasources:uid:datasource-uid |
query_quickwit | Quickwit* | Consultar Quickwit usando sintaxe Lucene ou Query DSL | datasources:query | datasources:uid:quickwit-uid |
list_snowflake_tables | Snowflake* | Listar tabelas em um banco de dados/esquema do Snowflake via INFORMATION_SCHEMA | datasources:query | datasources:uid:* |
describe_snowflake_table | Snowflake* | Obter esquema da tabela (tipos de coluna, nulabilidade, padrões, comentários) | datasources:query | datasources:uid:* |
query_snowflake | Snowflake* | Executar consultas SQL com substituição de macros/variáveis | datasources:query | datasources:uid:* |
alerting_manage_rules | Alertas | Gerenciar regras de alerta (listar, obter, versões, criar, atualizar, excluir) | alert.rules:read + alert.rules:write para mutações | folders:* ou folders:uid:alerts-folder |
alerting_manage_routing | Alertas | Gerenciar políticas de notificação, pontos de contato e intervalos de tempo | alert.notifications:read | Escopo global |
list_oncall_schedules | OnCall | Listar agendas do Grafana OnCall | grafana-oncall-app.schedules:read | Escopos específicos do plugin |
get_oncall_shift | OnCall | Obter detalhes de um turno específico do OnCall | grafana-oncall-app.schedules:read | Escopos específicos do plugin |
get_current_oncall_users | OnCall | Obter usuários atualmente de plantão para uma agenda específica | grafana-oncall-app.schedules:read | Escopos específicos do plugin |
list_oncall_teams | OnCall | Listar equipes do Grafana OnCall | grafana-oncall-app.user-settings:read | Escopos específicos do plugin |
list_oncall_users | OnCall | Listar usuários do Grafana OnCall | grafana-oncall-app.user-settings:read | Escopos específicos do plugin |
list_alert_groups | OnCall | Listar grupos de alertas do Grafana OnCall com opções de filtro | grafana-oncall-app.alert-groups:read | Escopos específicos do plugin |
get_alert_group | OnCall | Obter um grupo de alertas específico do Grafana OnCall pelo seu ID | grafana-oncall-app.alert-groups:read | Escopos específicos do plugin |
get_sift_investigation | Sift | Recuperar uma investigação existente do Sift pelo seu UUID | Função de Visualizador | N/A |
get_sift_analysis | Sift | Recuperar uma análise específica de uma investigação do Sift | Função de Visualizador | N/A |
list_sift_investigations | Sift | Recuperar uma lista de investigações do Sift com um limite opcional | Função de Visualizador | N/A |
find_error_pattern_logs | Sift | Encontra padrões elevados de erro nos logs do Loki. | Função de Editor | N/A |
find_slow_requests | Sift | Encontra requisições lentas das fontes de dados relevantes do tempo. | Função de Editor | N/A |
list_pyroscope_label_names | Pyroscope | Listar nomes de rótulos que correspondem a um seletor | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_label_values | Pyroscope | Listar valores de rótulos que correspondem a um seletor para um nome de rótulo | datasources:query | datasources:uid:pyroscope-uid |
list_pyroscope_profile_types | Pyroscope | Listar tipos de perfil disponíveis | datasources:query | datasources:uid:pyroscope-uid |
query_pyroscope | Pyroscope | Consultar perfis, métricas ou ambos do Pyroscope | datasources:query | datasources:uid:pyroscope-uid |
get_assertions | Asserts | Obter resumo de asserção para uma determinada entidade | Permissões específicas do plugin | Escopos específicos do plugin |
generate_deeplink | Navegação | Gerar URLs de deep link precisas para recursos do Grafana | Nenhuma (geração de URL somente leitura) | N/A |
get_annotations | Anotações | Buscar anotações com filtros | annotations:read | annotations:* ou annotations:id:123 |
create_annotation | Anotações | Criar uma nova anotação (formato padrão ou Graphite) | annotations:write | annotations:* |
update_annotation | Anotações | Atualizar campos específicos de uma anotação (atualização parcial) | annotations:write | annotations:* |
get_annotation_tags | Anotações | Listar tags de anotação com filtragem opcional | annotations:read | annotations:* |
list_snapshots | Snapshot | Listar snapshots de dashboard com filtros opcionais de consulta e limite | dashboards:read | dashboards:* ou dashboards:uid:abc123 |
get_snapshot | Snapshot | Obter metadados do snapshot e payload do dashboard pela chave do snapshot | dashboards:read | dashboards:* ou dashboards:uid:abc123 |
create_snapshot | Snapshot | Criar um snapshot de dashboard a partir de um payload completo do dashboard | dashboards:write | dashboards:* ou dashboards:uid:abc123 |
delete_snapshot | Snapshot | Excluir um snapshot de dashboard pela chave do snapshot | dashboards:write | dashboards:* ou dashboards:uid:abc123 |
get_panel_image | Renderização | Renderizar um dashboard ou painel armazenado — ou uma prévia de provisionamento de um branch de repositório — como uma imagem PNG | dashboards:read | dashboards:uid:abc123 |
list_provisioning_repositories | Provisionamento | Listar repositórios de provisionamento (ex.: fontes git-sync) com sua URL de origem, branch, estado de sincronização e saúde | provisioning.repositories:read | N/A |
validate_provisioning_file | Provisionamento | Aplica um arquivo de um repositório de provisionamento em modo de simulação e relata erros de validação de admissão | provisioning.repositories:read | N/A |
* Desabilitado por padrão. Adicione a categoria a --enabled-tools para habilitar. |
Referência de Flags CLI
O binário mcp-grafana suporta várias flags de linha de comando para configuração:
Opções de Transporte:
-t, --transport: Tipo de transporte (stdio,sseoustreamable-http) - padrão:stdio--address: O host e a porta para o servidor SSE/streamable-http - padrão:localhost:8000--base-path: Caminho base para o servidor SSE/streamable-http--endpoint-path: Caminho do endpoint para o servidor streamable-http - padrão:/
Depuração e Logging:
--debug: Habilita o modo de depuração para logging detalhado de requisições/respostas HTTP--log-level: Nível de log (debug,info,warn,error) - padrão:info
Observabilidade:
--metrics: Habilita o endpoint de métricas do Prometheus em/metrics--metrics-address: Endereço separado para o servidor de métricas (ex.::9090). Se vazio, as métricas são servidas no servidor principal--slow-request-threshold: Registra um evento quando qualquer requisição MCP (invocação de ferramenta, listagem, leitura de recurso, etc.) demorar mais que esta duração. Aceita strings de duração do Go (ex.:500ms,5s). O padrão0desabilita o logging de requisições lentas. Veja a seção Logging de requisições lentas.--slow-request-log-level: Nível de log para eventos de requisição lenta (infoouwarn) - padrão:warn.
Gerenciamento de Sessão:
--session-idle-timeout-minutes: Tempo limite de inatividade da sessão em minutos. Sessões sem atividade por esta duração são automaticamente removidas - padrão:30. Defina como0para desabilitar a remoção de sessões. Relevante apenas para os transportes SSE e streamable-http.
Configuração de Ferramentas:
--enabled-tools: Lista separada por vírgulas de categorias habilitadas - padrão: todas as categorias, excetoadmin,athena,clickhouse,cloudwatch,elasticsearch,examples,graphite,quickwit,runpanelqueryesnowflake. Para habilitar categorias desabilitadas, adicione-as à lista (ex.:"search,datasource,...,snowflake")--max-loki-log-limit: Número máximo de linhas de log retornadas por chamadaquery_loki_logs- padrão:100. Nota: Defina este valor pelo menos 1 abaixo domax_entries_limit_per_querydo lado do servidor Loki para permitir a detecção de truncamento (a ferramenta solicitalimit+1internamente para detectar se há mais dados).--disable-search: Desabilita ferramentas de busca--disable-datasource: Desabilita ferramentas de fonte de dados--disable-incident: Desabilita ferramentas de incidentes--disable-prometheus: Desabilita ferramentas do Prometheus--disable-write: Desabilita ferramentas de escrita (operações de criação/atualização)--disable-loki: Desabilita ferramentas do Loki--disable-elasticsearch: Desabilita ferramentas do Elasticsearch e OpenSearch--disable-quickwit: Desabilita ferramentas do Quickwit--disable-influxdb: Desabilita ferramentas do InfluxDB--disable-alerting: Desabilita ferramentas de alertas--disable-dashboard: Desabilita ferramentas de dashboard--disable-oncall: Desabilita ferramentas do OnCall--disable-asserts: Desabilita ferramentas de asserts--disable-sift: Desabilita ferramentas do Sift--disable-admin: Desabilita ferramentas de administração--disable-pyroscope: Desabilita ferramentas do Pyroscope--disable-navigation: Desabilita ferramentas de navegação--disable-rendering: Desabilita ferramentas de renderização (exportação de imagem de painel/dashboard)--disable-snapshot: Desabilita ferramentas de snapshot--disable-cloudwatch: Desabilita ferramentas do CloudWatch--disable-examples: Desabilita ferramentas de exemplos de consulta--disable-clickhouse: Desabilita ferramentas do ClickHouse--disable-snowflake: Desabilita ferramentas do Snowflake--disable-runpanelquery: Desabilita ferramentas de execução de consulta de painel--disable-graphite: Desabilita ferramentas do Graphite--disable-athena: Desabilita ferramentas do Athena--disable-provisioning: Desabilita ferramentas de provisionamento
Modo Somente Leitura
A flag --disable-write fornece uma maneira de executar o servidor MCP em modo somente leitura, prevenindo quaisquer operações de escrita na sua instância do Grafana. Isso é útil para cenários onde você deseja fornecer acesso seguro e somente leitura, como:
- Usar contas de serviço com permissões limitadas de somente leitura
- Fornecer a assistentes de IA dados de observabilidade sem capacidades de modificação
- Executar em ambientes de produção onde o acesso de escrita deve ser restrito
- Cenários de teste e desenvolvimento onde você deseja prevenir modificações acidentais
Quando --disable-write está habilitado, as seguintes operações de escrita são desabilitadas:
Ferramentas de Dashboard:
update_dashboard
Ferramentas de Pasta:
create_folder
Ferramentas de Incidentes:
create_incidentadd_activity_to_incident
Ferramentas de Alertas:
alerting_manage_rules(operações de criar, atualizar, excluir)
Ferramentas de Anotação:
create_annotationupdate_annotation
Ferramentas do Sift:
find_error_pattern_logs(cria investigações)find_slow_requests(cria investigações)
Ferramentas de Snapshot:
create_snapshotdelete_snapshot
Todas as operações de leitura permanecem disponíveis, permitindo consultar dashboards, executar consultas PromQL/LogQL, listar recursos e recuperar dados.
Configuração TLS do Cliente (para conexões com o Grafana):
--tls-cert-file: Caminho para o arquivo de certificado TLS para autenticação do cliente--tls-key-file: Caminho para o arquivo de chave privada TLS para autenticação do cliente--tls-ca-file: Caminho para o arquivo de certificado CA TLS para verificação do servidor--tls-skip-verify: Ignorar a verificação do certificado TLS (inseguro)
Configuração TLS do Servidor (apenas transporte streamable-http):
--server.tls-cert-file: Caminho para o arquivo de certificado TLS para HTTPS do servidor--server.tls-key-file: Caminho para o arquivo de chave privada TLS para HTTPS do servidor
Uso
Este servidor MCP funciona tanto com instâncias locais do Grafana quanto com o Grafana Cloud. Para o Grafana Cloud, use a URL da sua instância (ex.: https://myinstance.grafana.net) em vez de http://localhost:3000 nos exemplos de configuração abaixo.
-
Se estiver usando autenticação por token de conta de serviço, crie uma conta de serviço no Grafana com permissões suficientes para usar as ferramentas desejadas, gere um token de conta de serviço e copie-o para a área de transferência para uso no arquivo de configuração. Siga a documentação de conta de serviço do Grafana para obter detalhes sobre como criar tokens de conta de serviço. Dica: Se você não se sentir confortável configurando escopos RBAC refinados, uma opção mais simples (mas menos restritiva) é atribuir a função integrada
Editorà conta de serviço. Isso concede acesso amplo de leitura/escrita que cobre a maioria das operações do servidor MCP — use quando a conveniência superar os requisitos estritos de privilégio mínimo.Nota: A variável de ambiente
GRAFANA_API_KEYestá obsoleta e será removida em uma versão futura. Por favor, migre para usarGRAFANA_SERVICE_ACCOUNT_TOKEN. O nome da variável antiga continuará funcionando para compatibilidade retroativa, mas exibirá avisos de depreciação.
Lendo o token da conta de serviço de um arquivo
Em vez de passar o token inline via GRAFANA_SERVICE_ACCOUNT_TOKEN, você pode apontar GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE para um caminho de arquivo que contenha o token. O arquivo é lido novamente a cada requisição, então tokens rotacionados são capturados automaticamente sem reiniciar o servidor.
Isso é particularmente útil no Kubernetes, onde um Secret montado como volume é atualizado no local quando o Secret subjacente muda (normalmente em ~1 minuto). Combinado com o cache de cliente por requisição — que é indexado pelo valor do token — um token rotacionado produz transparentemente um novo cliente sem reinicialização do pod e sem tempo de inatividade:
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
Espaços em branco ao redor (incluindo uma nova linha final) são removidos do conteúdo do arquivo. Se ambos GRAFANA_SERVICE_ACCOUNT_TOKEN e GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE estiverem definidos, o token inline tem precedência.
Suporte a Múltiplas Organizações
Você pode especificar com qual organização interagir usando:
- Variável de ambiente: Defina
GRAFANA_ORG_IDcom o ID numérico da organização - Cabeçalho HTTP: Defina
X-Grafana-Org-Idao usar os transportes SSE ou HTTP streamable (o cabeçalho tem precedência sobre a variável de ambiente - o que significa que você também pode definir uma organização padrão).
Quando um ID de organização é fornecido, o servidor MCP definirá o cabeçalho X-Grafana-Org-Id em todas as requisições para o Grafana, garantindo que as operações sejam realizadas dentro do contexto da organização especificada.
Exemplo com ID de organização:
{
"mcpServers": {
"grafana": {
"command": "mcp-grafana",
"args": [],
"env": {
"GRAFANA_URL": "http://localhost:3000",
"GRAFANA_USERNAME": "<your username>",
"GRAFANA_PASSWORD": "<your password>",
"GRAFANA_ORG_ID": "2"
}
}
}
}
Cabeçalhos HTTP Personalizados
Você pode adicionar cabeçalhos HTTP arbitrários a todas as requisições da API do Grafana usando a variável de ambiente GRAFANA_EXTRA_HEADERS. O valor deve ser um objeto JSON mapeando nomes de cabeçalho para valores.
Exemplo com cabeçalhos personalizados:
{
"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\"}"
}
}
}
}
Encaminhando Cabeçalhos do Cliente (Apenas SSE/Streamable-HTTP)
Quando o servidor MCP é executado atrás de um gateway ou proxy reverso que lida com SSO (ex.: um ALB da AWS com OIDC), o cookie de sessão de cada usuário deve chegar ao Grafana para que ele possa associar a requisição ao usuário autenticado. A variável de ambiente GRAFANA_FORWARD_HEADERS habilita isso especificando uma lista de permissões separada por vírgulas de nomes de cabeçalho para copiar da requisição HTTP de entrada para cada requisição de saída da API do Grafana.
Isso se aplica apenas ao usar os transportes SSE (-t sse) ou streamable-http (-t streamable-http). Não tem efeito no modo stdio.
Exemplo: encaminhar o cookie de sessão
{
"env": {
"GRAFANA_URL": "https://grafana.internal",
"GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
"GRAFANA_FORWARD_HEADERS": "Cookie"
}
}
Você pode encaminhar vários cabeçalhos separando-os por vírgulas:
GRAFANA_FORWARD_HEADERS=Cookie,X-Session-Id
Os cabeçalhos encaminhados são mesclados com quaisquer cabeçalhos definidos em GRAFANA_EXTRA_HEADERS. Se um nome de cabeçalho aparecer em ambos, o valor da requisição de entrada tem precedência para essa requisição.
-
Você tem várias opções para instalar
mcp-grafana:-
uvx (recomendado): Se você tiver o uv instalado, nenhuma configuração extra é necessária —
uvxbaixará e executará automaticamente o servidor:uvx mcp-grafana -
Imagem Docker: Use a imagem Docker pré-construída do Docker Hub.
Importante: O ponto de entrada da imagem Docker está configurado para executar o servidor MCP no modo SSE por padrão, mas a maioria dos usuários desejará usar o modo STDIO para integração direta com assistentes de IA como o Claude Desktop:
- Modo STDIO: Para o modo stdio, você deve sobrescrever explicitamente o padrão com
-t stdioe incluir a flag-ipara manter o stdin aberto:
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- Modo SSE: Neste modo, o servidor é executado como um servidor HTTP ao qual os clientes se conectam. Você deve expor a porta 8000 usando a flag
-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> grafana/mcp-grafana- Modo HTTP Streamable: Neste modo, o servidor opera como um processo independente que pode lidar com múltiplas conexões de clientes. Você deve expor a porta 8000 usando a flag
-p: Para este modo, você deve sobrescrever explicitamente o padrão com-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> grafana/mcp-grafana -t streamable-httpPara o modo HTTPS streamable HTTP com certificados TLS do servidor:
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> \ grafana/mcp-grafana \ -t streamable-http \ -addr :8443 \ --server.tls-cert-file /certs/server.crt \ --server.tls-key-file /certs/server.key - Modo STDIO: Para o modo stdio, você deve sobrescrever explicitamente o padrão com
-
Baixar binário: Baixe a versão mais recente do
mcp-grafanada página de releases e coloque-o no seu$PATH. -
Compilar a partir do código fonte: Se você tiver uma toolchain Go instalada, também pode compilar e instalar a partir do código fonte, usando a variável de ambiente
GOBINpara especificar o diretório onde o binário deve ser instalado. Isso também deve estar no seu$PATH.GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/cmd/mcp-grafana@latest -
Implantar no Kubernetes usando Helm: use o Helm chart do repositório 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
-
-
Adicione a configuração do servidor ao seu arquivo de configuração do cliente. Por exemplo, para o Claude Desktop:
Se estiver usando uvx:
{ "mcpServers": { "grafana": { "command": "uvx", "args": ["mcp-grafana"], "env": { "GRAFANA_URL": "http://localhost:3000", "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>" } } } }Se estiver usando o binário:
{ "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" } } } }
Nota: se você vir
Error: spawn mcp-grafana ENOENTno Claude Desktop, você precisa especificar o caminho completo paramcp-grafana.
Se estiver usando 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"
}
}
}
}
Nota: O argumento
-t stdioé essencial aqui porque sobrescreve o modo SSE padrão na imagem Docker.
Usando VSCode com servidor MCP remoto
Se você estiver usando o VSCode e executando o servidor MCP no modo SSE (que é o padrão ao usar a imagem Docker sem sobrescrever o transporte), certifique-se de que seu .vscode/settings.json inclua o seguinte:
"mcp": {
"servers": {
"grafana": {
"type": "sse",
"url": "http://localhost:8000/sse"
}
}
}
Para o modo HTTP streamable com HTTPS usando certificados TLS do servidor:
"mcp": {
"servers": {
"grafana": {
"type": "sse",
"url": "https://localhost:8443/sse"
}
}
}
Modo Debug
Você pode ativar o modo debug para o transporte do Grafana adicionando a flag -debug ao comando. Isso fornecerá logs detalhados das requisições e respostas HTTP entre o servidor MCP e a API do Grafana, o que pode ser útil para solução de problemas.
Para usar o modo debug com a configuração do Claude Desktop, atualize sua configuração da seguinte forma:
Se estiver usando o binário:
{
"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>"
}
}
}
}
Se estiver usando 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>"
}
}
}
}
Nota: Assim como na configuração padrão, o argumento
-t stdioé necessário para sobrescrever o modo SSE padrão na imagem Docker.
Configuração TLS
Se sua instância do Grafana estiver atrás de mTLS ou exigir certificados TLS personalizados, você pode configurar o servidor MCP para usar certificados personalizados. O servidor suporta as seguintes opções de configuração TLS:
--tls-cert-file: Caminho para o arquivo de certificado TLS para autenticação do cliente--tls-key-file: Caminho para o arquivo de chave privada TLS para autenticação do cliente--tls-ca-file: Caminho para o arquivo de certificado CA TLS para verificação do servidor--tls-skip-verify: Ignorar a verificação do certificado TLS (inseguro, use apenas para testes)
Exemplo com autenticação de certificado de cliente:
{
"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>"
}
}
}
}
Exemplo com 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>"
}
}
}
}
A configuração TLS é aplicada a todos os clientes HTTP usados pelo servidor MCP, incluindo:
- O cliente principal da OpenAPI do Grafana
- Clientes de fonte de dados Prometheus
- Clientes de fonte de dados Loki
- Clientes de gerenciamento de incidentes
- Clientes de investigação Sift
- Clientes de alertas
- Clientes Asserts
Exemplos de uso direto via CLI:
Para testes com certificados autoassinados:
./mcp-grafana --tls-skip-verify -debug
Com autenticação de certificado de cliente:
./mcp-grafana \
--tls-cert-file /path/to/client.crt \
--tls-key-file /path/to/client.key \
--tls-ca-file /path/to/ca.crt \
-debug
Apenas com certificado CA personalizado:
./mcp-grafana --tls-ca-file /path/to/ca.crt
Uso programático:
Se você estiver usando esta biblioteca de forma programática, também pode criar funções de contexto com TLS habilitado:
// 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)
Validação de URL ao configurar seu próprio servidor HTTP:
Quando consumidores da biblioteca integram as funções de contexto do mcp-grafana em seu próprio http.Server, instale ValidateGrafanaURLMiddleware para rejeitar cabeçalhos X-Grafana-URL malformados com 400 Bad Request (comportamento equivalente ao binário):
mux.Handle(path, mcpgrafana.ValidateGrafanaURLMiddleware(yourMCPHandler))
Ao chamar NewGrafanaClient diretamente (stdio ou construção programática), pré-valide URLs não confiáveis para evitar um pânico alcançável:
if err := mcpgrafana.ValidateGrafanaURL(urlFromHeader); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
client := mcpgrafana.NewGrafanaClient(ctx, urlFromHeader, apiKey, nil)
Ambos os padrões compartilham ValidateGrafanaURL como o validador único.
Configuração TLS do Servidor (Apenas Transporte HTTP Streamable)
Ao usar o transporte HTTP streamable (-t streamable-http), você pode configurar o servidor MCP para servir HTTPS em vez de HTTP. Isso é útil quando você precisa proteger a conexão entre seu cliente MCP e o próprio servidor.
O servidor suporta as seguintes opções de configuração TLS para o transporte HTTP streamable:
--server.tls-cert-file: Caminho para o arquivo de certificado TLS para HTTPS do servidor (obrigatório para TLS)--server.tls-key-file: Caminho para o arquivo de chave privada TLS para HTTPS do servidor (obrigatório para TLS)
Nota: Essas flags são completamente separadas das flags TLS de cliente documentadas acima. As flags TLS de cliente configuram como o servidor MCP se conecta ao Grafana, enquanto essas flags TLS de servidor configuram como os clientes se conectam ao servidor MCP ao usar o transporte HTTP streamable.
Exemplo com servidor HTTP streamable HTTPS:
./mcp-grafana \
-t streamable-http \
--server.tls-cert-file /path/to/server.crt \
--server.tls-key-file /path/to/server.key \
-addr :8443
Isso iniciaria o servidor MCP na porta HTTPS 8443. Os clientes então se conectariam a https://localhost:8443/ em vez de http://localhost:8000/.
Exemplo Docker com TLS do servidor:
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
Endpoint de Health Check
Ao usar os transportes SSE (-t sse) ou HTTP streamable (-t streamable-http), o servidor MCP expõe um endpoint de health check em /healthz. Este endpoint pode ser usado por balanceadores de carga, sistemas de monitoramento ou plataformas de orquestração para verificar se o servidor está em execução e aceitando conexões.
Endpoint: GET /healthz
Resposta:
- Código de Status:
200 OK - Corpo:
ok
Exemplo de uso:
# For streamable HTTP or SSE transport on default port
curl http://localhost:8000/healthz
# With custom address
curl http://localhost:9090/healthz
Nota: O endpoint de health check está disponível apenas ao usar os transportes SSE ou HTTP streamable. Ele não está disponível ao usar o transporte stdio (-t stdio), pois o stdio não expõe um servidor HTTP.
Observabilidade
O servidor MCP suporta métricas Prometheus, tracing distribuído OpenTelemetry e exportação de logs OpenTelemetry, seguindo as convenções semânticas OTel MCP. Tracing e exportação de logs são configurados via variáveis de ambiente padrão OTEL_* e funcionam com qualquer transporte.
Nota: O mcp-grafana atualmente suporta apenas o transporte OTLP/gRPC para traces e logs. OTEL_EXPORTER_OTLP_PROTOCOL (e suas variantes _TRACES_PROTOCOL / _LOGS_PROTOCOL) não são considerados — gRPC é usado independentemente.
Métricas
Ao usar os transportes SSE ou HTTP streamable, habilite as métricas Prometheus com a flag --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
Métricas Disponíveis:
| Métrica | Tipo | Descrição |
|---|---|---|
mcp_server_operation_duration_seconds | Histograma | Duração das operações MCP (labels: mcp_method_name, gen_ai_tool_name, error_type, network_transport, mcp_protocol_version) |
mcp_server_session_duration_seconds | Histograma | Duração das sessões do cliente MCP (labels: network_transport, mcp_protocol_version) |
http_server_request_duration_seconds | Histograma | Duração das requisições do servidor HTTP (do otelhttp) |
Nota: As métricas estão disponíveis apenas ao usar os transportes SSE ou HTTP streamable. Elas não estão disponíveis com o transporte stdio.
Log de requisições lentas
A flag --slow-request-threshold emite um evento de log estruturado sempre que uma requisição MCP (invocação de ferramenta, listagem, leitura de recurso, etc.) excede a duração fornecida. É útil para diagnosticar consultas e chamadas de ferramentas lentas sem se afogar no log de debug completo.
# 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
O evento de log carrega estes atributos estruturados:
| Atributo | Descrição |
|---|---|
mcp.method | O método MCP (ex.: tools/call, tools/list, resources/read) |
duration | Duração observada da requisição |
threshold | Limite configurado |
tool | Nome da ferramenta (presente apenas para métodos tools/call) |
error | Valor do erro, quando a requisição falhou (contexto de melhor esforço; o conteúdo é controlado pelo encapsulamento de erro upstream) |
error.type | Classificação de erro de cardinalidade limitada (_OTHER para erros não tipados) |
O log de requisições lentas funciona em todos os transportes (incluindo stdio) e não requer --metrics. O limite padrão de 0 o desativa completamente. Ferramentas proxy passam por tools/call e são cobertas automaticamente.
Tracing
O tracing distribuído é configurado via variáveis de ambiente padrão OTEL_* e funciona independentemente da flag --metrics. Quando OTEL_EXPORTER_OTLP_ENDPOINT está definida, o servidor exporta traces via 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
Os spans de chamada de ferramenta seguem a nomenclatura semconv (tools/call <tool_name>) e incluem atributos como gen_ai.tool.name, mcp.method.name e mcp.session.id. O servidor também suporta propagação de contexto de trace W3C a partir do campo _meta das requisições de chamada de ferramenta.
Logs
Quando OTEL_EXPORTER_OTLP_ENDPOINT (ou o específico de sinal OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) está definido — o mesmo gatilho que habilita o tracing — o servidor também exporta logs estruturados via OTLP/gRPC, além da saída stderr de texto simples existente. A ponte otelslog anexa automaticamente trace_id e span_id do span ativo, para que os registros de log se correlacionem com os traces que o servidor já emite.
O log via stderr permanece inalterado quando o log OTLP está habilitado; você pode continuar a confiar nos logs do contêiner ou redirecionar o stderr para /dev/null se preferir.
# 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
O transporte é OTLP/gRPC (porta padrão 4317). Os logs podem ser enviados diretamente para qualquer backend gerenciado que aceite OTLP/gRPC — por exemplo, Grafana Cloud — apontando OTEL_EXPORTER_OTLP_LOGS_ENDPOINT (ou o genérico OTEL_EXPORTER_OTLP_ENDPOINT) para o endpoint gRPC remoto e fornecendo autenticação via OTEL_EXPORTER_OTLP_LOGS_HEADERS (ou OTEL_EXPORTER_OTLP_HEADERS), espelhando o exemplo de tracing acima. Um coletor OTel local é opcional — útil para fan-out, agrupamento ou roteamento multi-backend, mas não obrigatório.
As variantes específicas de sinal 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 e OTEL_EXPORTER_OTLP_LOGS_COMPRESSION são consideradas e sobrescrevem suas contrapartes genéricas OTEL_EXPORTER_OTLP_* — veja a especificação do exportador OTel para a lista completa e regras de precedência.
Se o coletor configurado estiver inacessível, os registros de log são armazenados em buffer na memória (fila padrão: 2048) e os registros mais antigos são descartados quando a fila enche. O processo continua sem bloquear o serviço. Configure um coletor OTel local se precisar de buffer sem perdas durante interrupções.
Os logs também são exportados sob o transporte stdio, o que facilita a centralização de logs de instâncias locais do mcp-grafana invocadas por clientes IDE.
Exemplo Docker com métricas, tracing e logs:
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
Solução de Problemas
Compatibilidade de Versão do Grafana
Se você encontrar o seguinte erro ao usar ferramentas relacionadas a fontes de dados:
get datasource by uid : [GET /datasources/uid/{uid}][400] getDataSourceByUidBadRequest {"message":"id is invalid"}
Isso normalmente indica que você está usando uma versão do Grafana anterior à 9.0. O endpoint da API /datasources/uid/{uid} foi introduzido no Grafana 9.0, e as operações de fonte de dados falharão em versões anteriores.
Solução: Atualize sua instância do Grafana para a versão 9.0 ou posterior para resolver este problema.
Desenvolvimento
Contribuições são bem-vindas! Por favor, abra uma issue ou envie um pull request se tiver alguma sugestão ou melhoria.
Este projeto é escrito em Go. Instale o Go seguindo as instruções para sua plataforma.
Para executar o servidor localmente no modo STDIO (que é o padrão para desenvolvimento local), use:
make run
Para executar o servidor localmente no modo SSE, use:
go run ./cmd/mcp-grafana --transport sse
Você também pode executar o servidor usando o transporte SSE dentro de uma imagem Docker personalizada. Assim como a imagem Docker publicada, o entrypoint desta imagem personalizada usa o modo SSE por padrão. Para construir a imagem, use:
make build-image
E para executar a imagem no modo SSE (o padrão), use:
docker run -it --rm -p 8000:8000 mcp-grafana:latest
Se precisar executá-la no modo STDIO, sobrescreva a configuração de transporte:
docker run -it --rm mcp-grafana:latest -t stdio
Testes
Existem três tipos de testes disponíveis:
- Testes Unitários (sem dependências externas necessárias):
make test-unit
Você também pode executar testes unitários com:
make test
- Testes de Integração (requer que os contêineres Docker estejam em execução):
make test-integration
- Testes em Nuvem (requer instância e credenciais do Grafana Cloud):
make test-cloud
Nota: Os testes em nuvem são configurados automaticamente no CI. Para desenvolvimento local, você precisará configurar sua própria instância e credenciais do Grafana Cloud.
Testes de integração mais abrangentes exigirão uma instância do Grafana em execução localmente na porta 3000; você pode iniciar uma com Docker Compose:
docker-compose up -d
Os testes de integração podem ser executados com:
make test-all
Se você estiver adicionando mais ferramentas, por favor, adicione testes de integração para elas. Os testes existentes devem ser um bom ponto de partida.
Linting
Para executar o lint no código, execute:
make lint
Isso inclui um linter personalizado que verifica vírgulas não escapadas nas tags struct jsonschema. As vírgulas nos campos description devem ser escapadas com \\, para evitar truncamento silencioso. Você pode executar apenas este linter com:
make lint-jsonschema
Veja a documentação do Linter JSONSchema para mais detalhes.
Licença
Este projeto está licenciado sob a Licença Apache, Versão 2.0.