Grafana MCP Server
공식Grafana 인스턴스에서 대시보드를 검색하고, 인시던트를 조사하며, 데이터 소스를 쿼리합니다.
문서
Grafana MCP 서버
Grafana를 위한 모델 컨텍스트 프로토콜 (MCP) 서버입니다.
이 서버는 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 서버에서 사용할 수 있습니다. 이 목록은 정보 제공 목적으로만 제공되며 로드맵이나 향후 기능에 대한 약속을 나타내지 않습니다.
대시보드
- 대시보드 검색: 제목이나 기타 메타데이터로 대시보드를 찾습니다.
- UID로 대시보드 가져오기: 고유 식별자를 사용하여 전체 대시보드 세부 정보를 검색합니다. 경고: 대용량 대시보드는 상당한 컨텍스트 창 공간을 소비할 수 있습니다.
- 대시보드 요약 가져오기: 전체 JSON 없이 제목, 패널 수, 패널 유형, 변수, 메타데이터를 포함한 대시보드의 간략한 개요를 가져와 컨텍스트 창 사용을 최소화합니다.
- 대시보드 속성 가져오기: JSONPath 표현식(예:
$.title,$.panels[*].title)을 사용하여 대시보드의 특정 부분을 추출하여 필요한 데이터만 가져오고 컨텍스트 창 소비를 줄입니다. - 대시보드 업데이트 또는 생성: 기존 대시보드를 수정하거나 새 대시보드를 만듭니다. 경고: 전체 대시보드 JSON이 필요하며 이는 많은 양의 컨텍스트 창 공간을 소비할 수 있습니다.
- 대시보드 패치: 전체 JSON 없이 대시보드에 특정 변경 사항을 적용하여 대상 수정 시 컨텍스트 창 사용을 크게 줄입니다.
- 패널 쿼리 및 데이터소스 정보 가져오기: 대시보드의 모든 패널에서 제목, 쿼리 문자열, 데이터소스 정보(UID 및 유형 포함, 가능한 경우)를 가져옵니다.
패널 쿼리 실행
참고: 패널 쿼리 실행 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
runpanelquery를--enabled-tools플래그에 추가하세요.
- 패널 쿼리 실행: 사용자 지정 시간 범위와 변수 재정의를 사용하여 대시보드 패널의 쿼리를 실행합니다.
컨텍스트 창 관리
대시보드 도구에는 이제 컨텍스트 창 사용을 효과적으로 관리하기 위한 여러 전략이 포함되어 있습니다(이슈 #101):
- 대시보드 개요 및 수정 계획에는
get_dashboard_summary사용 - 대시보드의 특정 부분만 필요할 때는 JSONPath와 함께
get_dashboard_property사용 - 전체 대시보드 JSON이 특별히 필요하지 않은 경우
get_dashboard_by_uid사용 피하기
데이터소스
- 데이터소스 정보 나열 및 가져오기: 구성된 모든 데이터소스를 보고 각각에 대한 자세한 정보를 검색합니다.
- 지원되는 데이터소스 유형: Prometheus, Loki, ClickHouse, CloudWatch, Elasticsearch, OpenSearch, Snowflake, Athena.
쿼리 예제
참고: 쿼리 예제 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
examples을--enabled-tools플래그에 추가하세요.
- 쿼리 예제 가져오기: 쿼리 구문을 배우기 위해 다양한 데이터소스 유형에 대한 예제 쿼리를 검색합니다.
Prometheus 쿼리
- Prometheus 쿼리: Prometheus 데이터소스에 대해 PromQL 쿼리(인스턴트 및 범위 메트릭 쿼리 모두 지원)를 실행합니다.
- Prometheus 메타데이터 쿼리: Prometheus 데이터소스에서 메트릭 메타데이터, 메트릭 이름, 레이블 이름, 레이블 값을 검색합니다.
- 히스토그램 백분위수 쿼리: histogram_quantile을 사용하여 히스토그램 백분위수 값(p50, p90, p95, p99)을 계산합니다.
Loki 쿼리
- Loki 로그 및 메트릭 쿼리: Loki 데이터소스에 대해 LogQL을 사용하여 로그 쿼리와 메트릭 쿼리를 모두 실행합니다.
- Loki 메타데이터 쿼리: Loki 데이터소스에서 레이블 이름, 레이블 값, 스트림 통계를 검색합니다.
- Loki 패턴 쿼리: Loki가 감지한 로그 패턴을 검색하여 일반적인 로그 구조와 이상 징후를 식별합니다.
InfluxDB 쿼리
참고: InfluxDB 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
influxdb를--enabled-tools플래그에 추가하세요.
- InfluxDB 쿼리: InfluxQL(v1.x) 또는 Flux(v2.x)를 사용하여 InfluxDB 데이터소스에 대해 쿼리를 실행합니다. 방언은 데이터소스 구성에서 추론되거나
dialect매개변수를 통해 명시적으로 설정할 수 있습니다.
ClickHouse 쿼리
참고: ClickHouse 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
clickhouse를--enabled-tools플래그에 추가하세요.
- ClickHouse 테이블 나열: 행 수와 크기와 함께 ClickHouse 데이터베이스의 모든 테이블을 나열합니다.
- 테이블 스키마 설명: ClickHouse 테이블의 열 이름, 유형, 메타데이터를 가져옵니다.
- ClickHouse 쿼리: Grafana 매크로 및 변수 대체 지원을 통해 SQL 쿼리를 실행합니다.
CloudWatch 쿼리
참고: CloudWatch 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
cloudwatch를--enabled-tools플래그에 추가하세요.
- CloudWatch 네임스페이스 나열: 사용 가능한 AWS CloudWatch 네임스페이스를 검색합니다.
- CloudWatch 메트릭 나열: 특정 네임스페이스에서 사용 가능한 메트릭을 나열합니다.
- CloudWatch 차원 나열: 메트릭 쿼리 필터링을 위한 차원을 가져옵니다.
- CloudWatch 쿼리: 시간 범위 지원을 통해 CloudWatch 메트릭 쿼리를 실행합니다.
Graphite 쿼리
참고: Graphite 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
graphite을--enabled-tools플래그에 추가하세요.
- Graphite 쿼리: Graphite 데이터소스에 대해 Graphite 렌더 API 쿼리를 실행합니다.
- Graphite 메트릭 나열: Graphite 메트릭 경로를 탐색하고 검색합니다.
- Graphite 태그 나열: 사용 가능한 Graphite 태그와 태그 값을 나열합니다.
- Graphite 밀도 쿼리: 주어진 패턴에 대한 Graphite 메트릭 밀도를 쿼리합니다.
Athena 쿼리
참고: Athena 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
athena을--enabled-tools플래그에 추가하세요.
- Athena 카탈로그 나열: 사용 가능한 데이터 카탈로그(예: AwsDataCatalog, Iceberg 커넥터)를 검색합니다.
- Athena 데이터베이스 나열: Athena 카탈로그의 데이터베이스를 나열합니다.
- Athena 테이블 나열: Athena 데이터베이스의 테이블을 나열합니다.
- Athena 테이블 설명: Athena 테이블의 열 이름을 가져옵니다.
- Athena 쿼리: 매크로 대체, 제한 적용, 템플릿 변수 지원을 통해 Grafana를 통해 Amazon Athena에 대해 SQL 쿼리를 실행합니다.
Snowflake 쿼리
참고: Snowflake 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
snowflake을--enabled-tools플래그에 추가하세요.
쿼리는 Grafana의 Snowflake 데이터소스(Grafana Enterprise 플러그인 grafana-snowflake-datasource)를 통해 전달되므로 인증은 Grafana의 데이터소스 구성에 의해 처리됩니다. 자격 증명은 MCP 서버에 절대 표시되지 않습니다. 이는 ClickHouse 도구에 사용된 것과 동일한 모델입니다.
- Snowflake 테이블 나열:
INFORMATION_SCHEMA.TABLES을 통해 테이블(데이터베이스, 스키마, 종류, 행 수, 크기 포함)을 검색합니다. 선택적 데이터베이스/스키마 필터. - 테이블 스키마 설명: Snowflake 테이블의 열 이름, 데이터 유형, null 허용 여부, 기본값, 주석을 가져옵니다.
- Snowflake 쿼리: 매크로 및 변수 대체 지원을 통해 SQL 쿼리를 실행합니다. 로그 및 추적을 위한 Snowflake의 이벤트 테이블(예:
SNOWFLAKE.TELEMETRY.EVENTS) 또는 모든 사용자 테이블을 쿼리하는 데 유용합니다.- 지원되는 매크로:
$__timeFilter(column),$__timeFrom,$__timeTo,$__from,$__to(Unix ms),$__interval(초),$__interval_ms, 템플릿 변수 대체를 위한${varname}.
- 지원되는 매크로:
Elasticsearch/OpenSearch 쿼리
참고: Elasticsearch/OpenSearch 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
elasticsearch을--enabled-tools플래그에 추가하세요.
- Elasticsearch/OpenSearch 쿼리: Lucene 쿼리 구문 또는 Elasticsearch Query DSL을 사용하여 Elasticsearch 또는 OpenSearch 데이터소스에 대해 검색 쿼리를 실행합니다. 시간 범위별 필터링과 로그, 메트릭 또는 모든 인덱싱된 데이터 검색을 지원합니다. 인덱스, ID, 소스 필드, 선택적 관련성 점수와 함께 문서를 반환합니다.
Quickwit 쿼리
참고: Quickwit 도구는 기본적으로 비활성화되어 있습니다. 활성화하려면
quickwit를--enabled-tools플래그에 추가하세요.
- Quickwit 쿼리: Lucene 쿼리 구문 또는 부분 Elasticsearch 호환 Query DSL을 사용하여 Quickwit 데이터소스에 대해 검색 쿼리를 실행합니다. 시간 범위별 필터링과 로그 또는 기타 인덱싱된 문서 검색을 지원합니다. 인덱스, ID, 소스 필드, 선택적 관련성 점수와 함께 문서를 반환합니다.
인시던트
- 인시던트 검색, 생성 및 업데이트: Grafana Incident에서 인시던트 검색, 생성, 활동 추가를 포함한 인시던트를 관리합니다.
Sift 조사
- Sift 조사 나열: 제한 매개변수를 지원하여 Sift 조사 목록을 검색합니다.
- Sift 조사 가져오기: UUID로 특정 Sift 조사의 세부 정보를 검색합니다.
- Sift 분석 가져오기: Sift 조사에서 특정 분석을 검색합니다.
- 로그에서 오류 패턴 찾기: Sift를 사용하여 Loki 로그에서 증가된 오류 패턴을 감지합니다.
- 느린 요청 찾기: 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 역할을 나열합니다.
- 역할 세부 정보 가져오기: UID로 특정 Grafana 역할에 대한 세부 정보를 가져옵니다.
- 역할에 대한 할당 나열: 역할에 할당된 모든 사용자, 팀, 서비스 계정을 나열합니다.
- 사용자에 대한 역할 나열: 하나 이상의 사용자에게 할당된 모든 역할을 나열합니다.
- 팀에 대한 역할 나열: 하나 이상의 팀에 할당된 모든 역할을 나열합니다.
- 리소스에 대한 권한 나열: 특정 리소스(대시보드, 데이터소스, 폴더 등)에 대해 정의된 모든 권한을 나열합니다.
- Grafana 리소스 설명: 리소스 유형에 대해 사용 가능한 권한 및 할당 기능을 나열합니다.
탐색
- 딥링크 생성: LLM URL 추측에 의존하지 않고 Grafana 리소스에 대한 정확한 딥링크 URL을 생성합니다.
- 대시보드 링크: UID를 사용하여 대시보드로 바로 연결되는 링크 생성 (예:
http://localhost:3000/d/dashboard-uid) - 패널 링크: viewPanel 매개변수를 사용하여 대시보드 내 특정 패널로 연결되는 링크 생성 (예:
http://localhost:3000/d/dashboard-uid?viewPanel=5) - 탐색 링크: 사전 구성된 데이터 소스로 Grafana 탐색 링크 생성 (예:
http://localhost:3000/explore?left={"datasource":"prometheus-uid"}) - 시간 범위 지원: 링크에 시간 범위 매개변수 추가 (
from=now-1h&to=now) - 사용자 지정 매개변수: 대시보드 변수 또는 새로 고침 간격과 같은 추가 쿼리 매개변수 포함
- 대시보드 링크: UID를 사용하여 대시보드로 바로 연결되는 링크 생성 (예:
주석
- 주석 가져오기: 필터로 주석을 쿼리합니다. 시간 범위, 대시보드 UID, 태그, 일치 모드를 지원합니다.
- 주석 생성: 대시보드 또는 패널에 새 주석을 생성합니다.
- Graphite 주석 생성: Graphite 형식을 사용하여 주석 생성 (
what,when,tags,data). - 주석 업데이트: 기존 주석의 모든 필드를 교체합니다 (전체 업데이트).
- 주석 패치: 주석의 특정 필드만 업데이트합니다 (부분 업데이트).
- 주석 태그 가져오기: 선택적 필터링으로 사용 가능한 주석 태그를 나열합니다.
스냅샷
- 스냅샷 나열: 선택적 쿼리 및 제한 필터로 대시보드 스냅샷을 나열합니다.
- 스냅샷 가져오기: 스냅샷 키로 스냅샷 메타데이터 및 대시보드 페이로드를 검색합니다.
- 스냅샷 생성: 전체 대시보드 페이로드에서 대시보드 스냅샷을 생성하며, 선택적 만료 및 외부 스냅샷 옵션을 제공합니다.
- 스냅샷 삭제: 스냅샷 키로 스냅샷을 삭제합니다.
렌더링
- 패널 또는 대시보드 이미지 가져오기: Grafana 대시보드 패널 또는 전체 대시보드를 PNG 이미지로 렌더링합니다. 보고서, 알림 또는 프레젠테이션에 사용할 수 있도록 이미지를 base64 인코딩 데이터로 반환합니다. 치수, 시간 범위, 테마, 배율 및 대시보드 변수 사용자 지정을 지원합니다. 또한 선택적
provisioningPreview매개변수를 통해 프로비저닝 리포지토리 브랜치(예: git-sync PR 미리보기)에서 아직 적용되지 않은 대시보드 렌더링을 지원합니다.- 참고: Grafana Image Renderer 서비스가 설치 및 구성되어 있어야 합니다.
프로비저닝
- 프로비저닝 리포지토리 나열: 이 Grafana 인스턴스에 구성된 프로비저닝 리포지토리(예: git-sync 소스)를 나열하여 각 리포지토리의 슬러그와 소스 URL, 브랜치, 경로, 동기화 상태 및 상태를 반환합니다.
- 프로비저닝 파일 유효성 검사: 지정된 브랜치 또는 커밋에서 프로비저닝 리포지토리의 파일을 Dry-run 적용합니다. 수락 여부, 리소스 작업(생성/업데이트), 대상 리소스 유형 및 구조화된 유효성 검사 오류를 반환합니다. 이는 Grafana의 PR 댓글 작성기가 사용하는 것과 동일한 승인 표면입니다.
도구 목록은 구성 가능하므로 MCP 클라이언트에서 사용할 도구를 선택할 수 있습니다.
특정 기능을 사용하지 않거나 컨텍스트 창을 너무 많이 차지하지 않도록 하려는 경우에 유용합니다.
도구 범주를 비활성화하려면 서버를 시작할 때 --disable-<category> 플래그를 사용하십시오. 예를 들어,
OnCall 도구를 비활성화하려면 --disable-oncall를 사용하고, 탐색 딥링크 생성을 비활성화하려면 --disable-navigation을 사용하십시오.
RBAC 권한
각 도구가 제대로 작동하려면 특정 RBAC 권한이 필요합니다. MCP 서버용 서비스 계정을 생성할 때 사용하려는 도구에 따라 필요한 권한이 있는지 확인하십시오. 나열된 권한은 최소 필수 작업입니다. 사용 사례에 따라 적절한 범위(예: datasources:*, dashboards:*, folders:*)도 필요할 수 있습니다.
팁: Grafana RBAC에 익숙하지 않거나 여러 세분화된 범위를 구성하는 대신 더 빠르고 간단한 설정을 원하는 경우, 서비스 계정에 Editor와 같은 내장 역할을 할당할 수 있습니다. Editor 역할은 대부분의 MCP 서버 작업을 허용하는 광범위한 읽기/쓰기 액세스 권한을 부여합니다. 수동으로 적용된 범위보다 덜 세분화되어(따라서 덜 제한적임) 편의성이 엄격한 최소 권한 액세스보다 중요한 경우에만 사용하십시오.
참고: Grafana Incident 및 Sift 도구는 세분화된 RBAC 권한 대신 기본 Grafana 역할을 사용합니다.
- 뷰어 역할: 읽기 전용 작업(인시던트 나열, 조사 가져오기)에 필요
- 편집자 역할: 쓰기 작업(인시던트 생성, 조사 수정)에 필요
Grafana RBAC에 대한 자세한 내용은 공식 문서를 참조하십시오.
RBAC 범위
범위는 권한이 적용되는 특정 리소스를 정의합니다. 각 작업에는 적절한 권한과 범위 조합이 모두 필요합니다.
일반적인 범위 패턴:
-
광범위한 액세스: 조직 전체 액세스를 위해
*와일드카드 사용datasources:*- 모든 데이터 소스에 대한 액세스dashboards:*- 모든 대시보드에 대한 액세스folders:*- 모든 폴더에 대한 액세스teams:*- 모든 팀에 대한 액세스
-
제한된 액세스: 특정 UID 또는 ID를 사용하여 개별 리소스에 대한 액세스 제한
datasources:uid:prometheus-uid- 특정 Prometheus 데이터 소스에만 액세스dashboards:uid:abc123- UID가abc123인 대시보드에만 액세스folders:uid:xyz789- UID가xyz789인 폴더에만 액세스teams:id:5- ID가5인 팀에만 액세스global.users:id:123- ID가123인 사용자에게만 액세스
예시:
-
전체 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 | 인시던트 | Grafana Incident의 인시던트 나열 | 뷰어 역할 | N/A |
create_incident | 인시던트 | Grafana Incident에서 인시던트 생성 | 편집자 역할 | N/A |
add_activity_to_incident | 인시던트 | Grafana Incident의 인시던트에 활동 항목 추가 | 편집자 역할 | N/A |
get_incident | 인시던트 | ID로 단일 인시던트 가져오기 | 뷰어 역할 | N/A |
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 | 설정 | 승인된 레이블을 적용하는 Alloy loki.process 스니펫 생성 | N/A | N/A |
query_influxdb | InfluxDB | InfluxQL (v1) 또는 Flux (v2)를 사용하여 InfluxDB 쿼리 | 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_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* | Lucene 구문 또는 Query DSL을 사용하여 Elasticsearch 또는 OpenSearch 쿼리 | datasources:query | datasources:uid:datasource-uid |
query_quickwit | Quickwit* | Lucene 구문 또는 Query DSL을 사용하여 Quickwit 쿼리 | datasources:query | datasources:uid:quickwit-uid |
list_snowflake_tables | Snowflake* | INFORMATION_SCHEMA를 통해 Snowflake 데이터베이스/스키마 내 테이블 목록 조회 | datasources:query | datasources:uid:* |
describe_snowflake_table | Snowflake* | 테이블 스키마 조회 (열 유형, null 허용 여부, 기본값, 주석) | datasources:query | datasources:uid:* |
query_snowflake | Snowflake* | 매크로/변수 치환을 통한 SQL 쿼리 실행 | datasources:query | datasources:uid:* |
alerting_manage_rules | 알림 | 알림 규칙 관리 (목록 조회, 가져오기, 버전, 생성, 업데이트, 삭제) | alert.rules:read + alert.rules:write (변경 시) | folders:* 또는 folders:uid:alerts-folder |
alerting_manage_routing | 알림 | 알림 정책, 연락처, 시간 간격 관리 | 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 | ID로 Grafana OnCall의 특정 알림 그룹 조회 | grafana-oncall-app.alert-groups:read | 플러그인별 범위 |
get_sift_investigation | Sift | UUID로 기존 Sift 조사 검색 | 뷰어 역할 | 해당 없음 |
get_sift_analysis | Sift | Sift 조사에서 특정 분석 검색 | 뷰어 역할 | 해당 없음 |
list_sift_investigations | Sift | 선택적 제한을 사용하여 Sift 조사 목록 검색 | 뷰어 역할 | 해당 없음 |
find_error_pattern_logs | Sift | Loki 로그에서 상승된 오류 패턴을 찾습니다. | 편집자 역할 | 해당 없음 |
find_slow_requests | Sift | 관련 tempo 데이터 소스에서 느린 요청을 찾습니다. | 편집자 역할 | 해당 없음 |
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 | 지정된 엔티티에 대한 어설션 요약 조회 | 플러그인별 권한 | 플러그인별 범위 |
generate_deeplink | 탐색 | Grafana 리소스에 대한 정확한 딥링크 URL 생성 | 없음 (읽기 전용 URL 생성) | 해당 없음 |
get_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 | 프로비저닝 | 소스 URL, 브랜치, 동기화 상태 및 상태와 함께 프로비저닝 리포지토리(예: git-sync 소스) 목록 조회 | provisioning.repositories:read | 해당 없음 |
* 기본적으로 비활성화되어 있습니다. 활성화하려면 --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 서버의 엔드포인트 경로 - 기본값:/
디버그 및 로깅:
--debug: 상세 HTTP 요청/응답 로깅을 위한 디버그 모드 활성화--log-level: 로그 레벨 (debug,info,warn,error) - 기본값:info
관측 가능성:
--metrics:/metrics에서 Prometheus 메트릭 엔드포인트 활성화--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,athena,clickhouse,cloudwatch,elasticsearch,examples,graphite,quickwit,runpanelquery,snowflake을 제외한 모든 카테고리. 비활성화된 카테고리를 활성화하려면 목록에 추가하세요 (예:"search,datasource,...,snowflake")--max-loki-log-limit:query_loki_logs호출당 반환되는 최대 로그 줄 수 - 기본값:100. 참고: 잘림 감지를 허용하려면 Loki의 서버 측max_entries_limit_per_query보다 최소 1 적게 설정하세요 (도구는 더 많은 데이터가 있는지 감지하기 위해 내부적으로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: 프로비저닝 도구 비활성화
읽기 전용 모드
--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
모든 읽기 작업은 계속 사용할 수 있으므로 대시보드 쿼리, PromQL/LogQL 쿼리 실행, 리소스 나열 및 데이터 검색이 가능합니다.
클라이언트 TLS 구성 (Grafana 연결용):
--tls-cert-file: 클라이언트 인증을 위한 TLS 인증서 파일 경로--tls-key-file: 클라이언트 인증을 위한 TLS 개인 키 파일 경로--tls-ca-file: 서버 확인을 위한 TLS CA 인증서 파일 경로--tls-skip-verify: TLS 인증서 확인 건너뛰기 (안전하지 않음)
서버 TLS 구성 (streamable-http 전송만 해당):
--server.tls-cert-file: 서버 HTTPS를 위한 TLS 인증서 파일 경로--server.tls-key-file: 서버 HTTPS를 위한 TLS 개인 키 파일 경로
사용법
이 MCP 서버는 로컬 Grafana 인스턴스 및 Grafana Cloud 모두에서 작동합니다. Grafana Cloud의 경우 아래 구성 예제에서 http://localhost:3000 대신 인스턴스 URL(예: https://myinstance.grafana.net)을 사용하세요.
-
서비스 계정 토큰 인증을 사용하는 경우, 사용하려는 도구를 사용할 수 있는 충분한 권한을 가진 서비스 계정을 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분 이내) 제자리에서 업데이트됩니다. 토큰 값에 키가 지정된 요청별 클라이언트 캐시와 결합하면, 순환된 토큰이 투명하게 새 클라이언트를 생성하여 파드 재시작이나 다운타임 없이 작동합니다:
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을 숫자 조직 ID로 설정 - HTTP 헤더: SSE 또는 streamable HTTP 전송 사용 시
X-Grafana-Org-Id설정 (헤더가 환경 변수보다 우선하므로 기본 조직을 설정할 수도 있습니다).
조직 ID가 제공되면 MCP 서버는 Grafana에 대한 모든 요청에 X-Grafana-Org-Id 헤더를 설정하여 지정된 조직 컨텍스트 내에서 작업이 수행되도록 합니다.
조직 ID 사용 예제:
{
"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 헤더
GRAFANA_EXTRA_HEADERS 환경 변수를 사용하여 모든 Grafana API 요청에 임의의 HTTP 헤더를 추가할 수 있습니다. 값은 헤더 이름을 값에 매핑하는 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를 처리하는 게이트웨이 또는 리버스 프록시(예: OIDC가 있는 AWS ALB) 뒤에서 실행되는 경우, 각 사용자의 세션 쿠키가 Grafana에 도달하여 요청을 인증된 사용자와 연결할 수 있어야 합니다. GRAFANA_FORWARD_HEADERS 환경 변수는 수신 HTTP 요청에서 모든 발신 Grafana API 요청으로 복사할 헤더 이름의 쉼표로 구분된 허용 목록을 지정하여 이를 가능하게 합니다.
이는 SSE(-t sse) 또는 streamable-http(-t streamable-http) 전송을 사용할 때만 적용됩니다. stdio 모드에서는 효과가 없습니다.
예제: 세션 쿠키 전달
{
"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 Hub에서 사전 빌드된 Docker 이미지를 사용합니다.
중요: Docker 이미지의 진입점은 기본적으로 SSE 모드에서 MCP 서버를 실행하도록 구성되어 있지만, 대부분의 사용자는 Claude Desktop과 같은 AI 어시스턴트와의 직접 통합을 위해 STDIO 모드를 사용하려고 합니다:
- 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 모드: 이 모드에서는 서버가 클라이언트가 연결하는 HTTP 서버로 실행됩니다.
-p플래그를 사용하여 포트 8000을 노출해야 합니다:
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- Streamable HTTP 모드: 이 모드에서는 서버가 여러 클라이언트 연결을 처리할 수 있는 독립 프로세스로 작동합니다.
-p플래그를 사용하여 포트 8000을 노출해야 합니다: 이 모드의 경우-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-http서버 TLS 인증서를 사용하는 HTTPS streamable HTTP 모드의 경우:
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 - STDIO 모드: stdio 모드의 경우
-
바이너리 다운로드: 릴리스 페이지에서 최신 릴리스의
mcp-grafana을 다운로드하여$PATH에 배치합니다. -
소스에서 빌드: Go 도구 체인이 설치되어 있는 경우
GOBIN환경 변수를 사용하여 바이너리를 설치할 디렉터리를 지정하여 소스에서 빌드하고 설치할 수도 있습니다. 이 또한$PATH에 있어야 합니다.GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/cmd/mcp-grafana@latest -
Helm을 사용하여 Kubernetes에 배포: Grafana helm-charts 저장소의 Helm 차트를 사용합니다.
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" } } } }
참고: Claude Desktop에서
Error: spawn mcp-grafana ENOENT가 표시되면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인수는 Docker 이미지의 기본 SSE 모드를 재정의하므로 여기서 필수적입니다.
원격 MCP 서버와 함께 VSCode 사용
VSCode를 사용하고 SSE 모드(전송을 재정의하지 않고 Docker 이미지를 사용할 때 기본값)에서 MCP 서버를 실행하는 경우 .vscode/settings.json에 다음이 포함되어 있는지 확인하세요:
"mcp": {
"servers": {
"grafana": {
"type": "sse",
"url": "http://localhost:8000/sse"
}
}
}
HTTPS 스트리밍 가능 HTTP 모드에서 서버 TLS 인증서 사용 시:
"mcp": {
"servers": {
"grafana": {
"type": "sse",
"url": "https://localhost:8443/sse"
}
}
}
디버그 모드
명령어에 -debug 플래그를 추가하여 Grafana 전송에 대한 디버그 모드를 활성화할 수 있습니다. 이렇게 하면 MCP 서버와 Grafana API 간의 HTTP 요청 및 응답에 대한 상세 로깅이 제공되어 문제 해결에 도움이 됩니다.
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>"
}
}
}
}
참고: 표준 구성과 마찬가지로, Docker 이미지에서 기본 SSE 모드를 재정의하려면
-t stdio인수가 필요합니다.
TLS 구성
Grafana 인스턴스가 mTLS 뒤에 있거나 사용자 지정 TLS 인증서가 필요한 경우, 사용자 지정 인증서를 사용하도록 MCP 서버를 구성할 수 있습니다. 서버는 다음 TLS 구성 옵션을 지원합니다:
--tls-cert-file: 클라이언트 인증용 TLS 인증서 파일 경로--tls-key-file: 클라이언트 인증용 TLS 개인 키 파일 경로--tls-ca-file: 서버 검증용 TLS CA 인증서 파일 경로--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 구성은 다음을 포함하여 MCP 서버에서 사용하는 모든 HTTP 클라이언트에 적용됩니다:
- 기본 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
사용자 지정 CA 인증서만 사용:
./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)
자체 HTTP 서버 연결 시 URL 유효성 검사:
라이브러리 사용자가 mcp-grafana의 컨텍스트 함수를 자체 http.Server에 연결할 때, 잘못된 X-Grafana-URL 헤더를 400 Bad Request로 거부하려면 ValidateGrafanaURLMiddleware을 설치하세요 (바이너리 동작과 일치):
mux.Handle(path, mcpgrafana.ValidateGrafanaURLMiddleware(yourMCPHandler))
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)
두 패턴 모두 ValidateGrafanaURL을 단일 검증기로 공유합니다.
서버 TLS 구성 (스트리밍 가능 HTTP 전송 전용)
스트리밍 가능 HTTP 전송(-t streamable-http) 사용 시, HTTP 대신 HTTPS를 제공하도록 MCP 서버를 구성할 수 있습니다. 이는 MCP 클라이언트와 서버 자체 간의 연결을 보호해야 할 때 유용합니다.
서버는 스트리밍 가능 HTTP 전송에 대해 다음 TLS 구성 옵션을 지원합니다:
--server.tls-cert-file: 서버 HTTPS용 TLS 인증서 파일 경로 (TLS에 필수)--server.tls-key-file: 서버 HTTPS용 TLS 개인 키 파일 경로 (TLS에 필수)
참고: 이 플래그는 위에 문서화된 클라이언트 TLS 플래그와 완전히 별개입니다. 클라이언트 TLS 플래그는 MCP 서버가 Grafana에 연결하는 방식을 구성하는 반면, 이 서버 TLS 플래그는 스트리밍 가능 HTTP 전송 사용 시 클라이언트가 MCP 서버에 연결하는 방식을 구성합니다.
HTTPS 스트리밍 가능 HTTP 서버 예시:
./mcp-grafana \
-t streamable-http \
--server.tls-cert-file /path/to/server.crt \
--server.tls-key-file /path/to/server.key \
-addr :8443
이렇게 하면 HTTPS 포트 8443에서 MCP 서버가 시작됩니다. 그러면 클라이언트는 http://localhost:8000/ 대신 https://localhost:8443/에 연결합니다.
서버 TLS 사용 Docker 예시:
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) 또는 스트리밍 가능 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 또는 스트리밍 가능 HTTP 전송 사용 시에만 사용할 수 있습니다. stdio 전송(-t stdio) 사용 시에는 HTTP 서버를 노출하지 않으므로 사용할 수 없습니다.
관측 가능성
MCP 서버는 OTel MCP 시맨틱 규칙에 따라 Prometheus 메트릭, OpenTelemetry 분산 추적 및 OpenTelemetry 로그 내보내기를 지원합니다. 추적 및 로그 내보내기는 표준 OTEL_* 환경 변수를 통해 구성되며 모든 전송에서 작동합니다.
참고: mcp-grafana는 현재 추적과 로그 모두에 대해 OTLP/gRPC 전송만 지원합니다. OTEL_EXPORTER_OTLP_PROTOCOL (및 그 변형인 _TRACES_PROTOCOL / _LOGS_PROTOCOL)은 적용되지 않으며, gRPC가 항상 사용됩니다.
메트릭
SSE 또는 스트리밍 가능 HTTP 전송 사용 시, --metrics 플래그로 Prometheus 메트릭을 활성화합니다:
# 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 또는 스트리밍 가능 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 | 요청 실패 시 오류 값 (최선의 컨텍스트; 내용은 업스트림 오류 래핑에 의해 제어됨) |
error.type | 제한된 카디널리티 오류 분류 (타입이 없는 오류의 경우 _OTHER) |
느린 요청 로깅은 stdio를 포함한 모든 전송에서 작동하며 --metrics이 필요하지 않습니다. 0의 기본 임계값은 이를 완전히 비활성화합니다. 프록시된 도구는 tools/call을 통해 흐르며 자동으로 포함됩니다.
추적
분산 추적은 표준 OTEL_* 환경 변수를 통해 구성되며 --metrics 플래그와 독립적으로 작동합니다. OTEL_EXPORTER_OTLP_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와 같은 속성을 포함합니다. 서버는 또한 도구 호출 요청의 _meta 필드에서 W3C 추적 컨텍스트 전파를 지원합니다.
로그
OTEL_EXPORTER_OTLP_ENDPOINT (또는 신호별 OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)이 설정되면 — 추적을 활성화하는 동일한 트리거 — 서버는 기존의 일반 텍스트 stderr 출력 외에도 OTLP/gRPC를 통해 구조화된 로그를 내보냅니다. otelslog 브리지는 활성 스팬의 trace_id 및 span_id을 자동으로 연결하므로, 로그 레코드는 서버가 이미 내보내는 추적과 상관 관계를 갖습니다.
OTLP 로깅이 활성화된 경우에도 stderr 로깅은 변경되지 않습니다. 원하는 경우 컨테이너 로그에 의존하거나 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). 로그는 OTEL_EXPORTER_OTLP_LOGS_ENDPOINT (또는 일반 OTEL_EXPORTER_OTLP_ENDPOINT)를 원격 gRPC 엔드포인트로 지정하고 위의 추적 예시와 같이 OTEL_EXPORTER_OTLP_LOGS_HEADERS (또는 OTEL_EXPORTER_OTLP_HEADERS)을 통해 인증을 제공함으로써 OTLP/gRPC를 허용하는 모든 관리형 백엔드(예: Grafana Cloud)로 직접 전송할 수 있습니다. 로컬 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 전송에서도 내보내지므로, IDE 클라이언트가 호출하는 로컬 mcp-grafana 인스턴스의 로그를 쉽게 중앙 집중화할 수 있습니다.
메트릭, 추적 및 로그가 포함된 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"}
이는 일반적으로 9.0 이전의 Grafana 버전을 사용하고 있음을 나타냅니다. /datasources/uid/{uid} API 엔드포인트는 Grafana 9.0에서 도입되었으며, 이전 버전에서는 데이터 소스 작업이 실패합니다.
해결책: 이 문제를 해결하려면 Grafana 인스턴스를 9.0 이상으로 업그레이드하세요.
개발
기여를 환영합니다! 제안이나 개선 사항이 있으면 이슈를 열거나 풀 리퀘스트를 제출해 주세요.
이 프로젝트는 Go로 작성되었습니다. 플랫폼에 맞는 지침에 따라 Go를 설치하세요.
로컬 개발을 위해 STDIO 모드(로컬 개발 기본값)로 서버를 실행하려면 다음을 사용하세요:
make run
SSE 모드로 로컬에서 서버를 실행하려면 다음을 사용하세요:
go run ./cmd/mcp-grafana --transport sse
사용자 지정 빌드 Docker 이미지 내에서 SSE 전송을 사용하여 서버를 실행할 수도 있습니다. 게시된 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에 따라 라이선스가 부여됩니다.