Grafana

ทางการ

ค้นหาแดชบอร์ด ตรวจสอบเหตุการณ์ และสอบถามแหล่งข้อมูลในอินสแตนซ์ Grafana ของคุณ

คุณทำอะไรได้บ้างด้วย Grafana MCP?

  • ค้นหาและตรวจสอบแดชบอร์ด — ค้นหาแดชบอร์ดตามชื่อ โฟลเดอร์ แท็ก หรือสถานะรายการโปรด และดึงข้อมูลสรุปแบบย่อหรือพร็อพเพอร์ตีที่ต้องการ แทนการดึง JSON ทั้งหมด
  • คิวรี Prometheus และ Loki — เรียกใช้คิวรีเมตริก PromQL และคิวรีล็อกหรือเมตริก LogQL พร้อมดึงข้อมูลเมตาของเมตริก ค่าเลเบล และรูปแบบล็อกที่ตรวจพบ
  • เรียกใช้ SQL และคิวรีแหล่งข้อมูลอื่น — เรียกใช้ SQL กับ ClickHouse, Snowflake, Athena, MySQL, PostgreSQL, MSSQL และ BigQuery หรือคิวรี InfluxDB, CloudWatch, Graphite และ Elasticsearch
  • จัดการการแจ้งเตือน — แสดงรายการกฎการแจ้งเตือนและสถานะการทำงาน สร้างหรืออัปเดตกฎ และตรวจสอบนโยบายการแจ้งเตือน จุดติดต่อ และช่วงเวลา
  • จัดการเหตุการณ์และเวรรับแจ้งเหตุ — ค้นหาและสร้างระเบียน Grafana Incident รวมถึงดูตารางเวร กะ ผู้ใช้ที่กำลังเข้าเวร และกลุ่มการแจ้งเตือนของ OnCall
  • เรนเดอร์พาเนลและแดชบอร์ด — สร้างภาพ PNG ของแดชบอร์ดหรือพาเนล โดยกำหนดขนาด ช่วงเวลา ธีม และตัวแปรเองได้สำหรับรายงาน

เอกสาร

Grafana MCP server

Unit Tests Integration Tests E2E Tests Go Reference MCP Catalog

เซิร์ฟเวอร์ Model Context Protocol (MCP) สำหรับ Grafana

ช่วยให้เข้าถึงอินสแตนซ์ Grafana และระบบนิเวศโดยรอบได้

เริ่มต้นอย่างรวดเร็ว

ต้องใช้ uv เพิ่มรายการต่อไปนี้ในการกำหนดค่า MCP client ของคุณ (เช่น 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, binary และ Helm

ข้อกำหนด

  • ต้องใช้ Grafana เวอร์ชัน 9.0 ขึ้นไป เพื่อให้ใช้งานฟังก์ชันได้ครบถ้วน ฟีเจอร์บางอย่าง โดยเฉพาะการดำเนินการที่เกี่ยวข้องกับ datasource อาจทำงานไม่ถูกต้องในเวอร์ชันก่อนหน้า เนื่องจากไม่มี API endpoint ที่จำเป็น

ฟีเจอร์

ขณะนี้เซิร์ฟเวอร์ MCP มีฟีเจอร์ต่อไปนี้ รายการนี้มีไว้เพื่อให้ข้อมูลเท่านั้น และไม่ได้แสดงถึงแผนงานหรือคำมั่นว่าจะเพิ่มฟีเจอร์ในอนาคต

แดชบอร์ด

  • ค้นหาแดชบอร์ด: ค้นหาแดชบอร์ดตามชื่อเรื่อง, folder UID, tag หรือสถานะรายการโปรด
  • รับแดชบอร์ดตาม UID: ดึงรายละเอียดแดชบอร์ดทั้งหมดโดยใช้ตัวระบุเฉพาะ ส่ง version เพิ่มเติมเพื่อโหลด snapshot ที่บันทึกไว้แทนแดชบอร์ดปัจจุบัน คำเตือน: แดชบอร์ดขนาดใหญ่อาจใช้พื้นที่ context window มาก
  • แสดงรายการเวอร์ชันของแดชบอร์ด: แสดงเวอร์ชันที่บันทึกไว้ของแดชบอร์ดในรูปแบบ metadata แบบย่อ (หมายเลขเวอร์ชัน ผู้เขียน เวลา และข้อความบันทึก)
  • รับสรุปแดชบอร์ด: รับภาพรวมแบบย่อของแดชบอร์ด ซึ่งรวมถึงชื่อเรื่อง จำนวน panel ประเภท panel ตัวแปร และ metadata โดยไม่ต้องดึง JSON ทั้งหมด เพื่อลดการใช้ context window
  • รับพร็อพเพอร์ตีของแดชบอร์ด: ดึงส่วนที่ต้องการของแดชบอร์ดโดยใช้ JSONPath expressions (เช่น $.title, $.panels[*].title) เพื่อดึงเฉพาะข้อมูลที่จำเป็นและลดการใช้ context window
  • อัปเดตหรือสร้างแดชบอร์ด: แก้ไขแดชบอร์ดที่มีอยู่หรือสร้างแดชบอร์ดใหม่ คำเตือน: ต้องใช้ JSON ของแดชบอร์ดทั้งหมด ซึ่งอาจใช้พื้นที่ context window มาก
  • แพตช์แดชบอร์ด: ใช้การเปลี่ยนแปลงเฉพาะกับแดชบอร์ดโดยไม่ต้องใช้ JSON ทั้งหมด ช่วยลดการใช้ context window ได้อย่างมากสำหรับการแก้ไขแบบเจาะจง
  • รับคิวรีของ panel และข้อมูล datasource: รับชื่อเรื่อง สตริงคิวรี และข้อมูล datasource (รวมถึง UID และประเภท หากมี) จากทุก panel ในแดชบอร์ด

เรียกใช้คิวรีของ Panel

หมายเหตุ: เครื่องมือเรียกใช้คิวรีของ panel ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม runpanelquery ในแฟล็ก --enabled-tools

  • เรียกใช้คิวรีของ panel: เรียกใช้คิวรีของ panel ในแดชบอร์ดโดยกำหนดช่วงเวลาและค่าแทนตัวแปรเอง Infinity panels จะทำงานเมื่อคิวรีใช้ parser backend หรือ jq-backend (คิวรี Google Sheets ใช้ parser เหล่านี้เสมอ); parser เริ่มต้น simple และ parser UQL กับ GROQ ใช้ได้เฉพาะในเบราว์เซอร์ Neo4j panels บนปลั๊กอิน kniepdennis-neo4j-datasource จะเรียกใช้คิวรี Cypher ผ่านปลั๊กอิน ซึ่งเปิดเซสชันแบบอ่านอย่างเดียว Elasticsearch panels จะแทนค่าตัวแปรในคิวรี Lucene ด้วยรูปแบบ lucene เช่นเดียวกับ Grafana และ auto date histograms จะใช้ช่วงเวลาเดียวกับ $__interval

การจัดการ Context Window

ขณะนี้เครื่องมือแดชบอร์ดมีหลายวิธีในการจัดการการใช้ context window อย่างมีประสิทธิภาพ (issue #101):

  • ใช้ get_dashboard_summary เพื่อดูภาพรวมแดชบอร์ดและวางแผนการแก้ไข
  • ใช้ get_dashboard_property ร่วมกับ JSONPath เมื่อคุณต้องการเฉพาะบางส่วนของแดชบอร์ด
  • หลีกเลี่ยง get_dashboard_by_uid เว้นแต่คุณต้องการ JSON ของแดชบอร์ดทั้งหมดโดยเฉพาะ

Datasource

  • แสดงรายการและดึงข้อมูล datasource: ดู datasource ที่กำหนดค่าไว้ทั้งหมดและดึงข้อมูลโดยละเอียดของแต่ละรายการ
    • ประเภท datasource ที่รองรับ: Prometheus, Loki, ClickHouse, CloudWatch, Elasticsearch, OpenSearch, Snowflake, Athena
  • ทรัพยากร datasource: datasource แต่ละรายการที่คุณเข้าถึงได้จะแสดงเป็น MCP resource ที่ grafana://datasources/{uid} ด้วย คุณจึงแนบรายการดังกล่าวเข้ากับบทสนทนาได้โดยตรง (เช่น ใช้ @ ใน Claude Code) แทนที่จะให้โมเดลค้นหาเอง ฟีเจอร์นี้จะถูกปิดใช้งานพร้อมกับเครื่องมือ datasource

ตัวอย่างคิวรี

หมายเหตุ: เครื่องมือตัวอย่างคิวรี ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม examples ในแฟล็ก --enabled-tools

  • รับตัวอย่างคิวรี: ดึงตัวอย่างคิวรีสำหรับ datasource ประเภทต่างๆ เพื่อเรียนรู้ไวยากรณ์ของคิวรี

การคิวรี Prometheus

  • คิวรี Prometheus: เรียกใช้คิวรี PromQL กับ datasource ของ Prometheus (รองรับทั้งคิวรีเมตริกแบบ instant และแบบ range)
  • คิวรี metadata ของ Prometheus: ดึง metadata ของเมตริก ชื่อเมตริก ชื่อ label และค่าของ label จาก datasource ของ Prometheus
  • คิวรีเปอร์เซ็นไทล์ของ histogram: คำนวณค่าเปอร์เซ็นไทล์ของ histogram (p50, p90, p95, p99) โดยใช้ histogram_quantile

การคิวรี Loki

  • คิวรี log และเมตริกของ Loki: เรียกใช้ทั้งคิวรี log และคิวรีเมตริกด้วย LogQL กับ datasource ของ Loki
  • คิวรี metadata ของ Loki: ดึงชื่อ label ค่าของ label และสถิติของ stream จาก datasource ของ Loki
  • คิวรีรูปแบบของ Loki: ดึงรูปแบบ log ที่ Loki ตรวจพบ เพื่อระบุโครงสร้าง log ที่พบบ่อยและความผิดปกติ

การคิวรี InfluxDB

หมายเหตุ: เครื่องมือ InfluxDB ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม influxdb ในแฟล็ก --enabled-tools

  • คิวรี InfluxDB: เรียกใช้คิวรีกับ datasource ของ InfluxDB โดยใช้ InfluxQL (v1.x) หรือ Flux (v2.x) ระบบจะอนุมาน dialect จากการกำหนดค่า datasource หรือกำหนดอย่างชัดเจนผ่านพารามิเตอร์ dialect ได้

การคิวรี SQL Datasource

หมายเหตุ: เครื่องมือ SQL ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม sql ในแฟล็ก --enabled-tools นอกจากนี้ยังใช้ชื่อแทนเพื่อความเข้ากันได้ย้อนหลัง clickhouse, snowflake และ athena ได้

เครื่องมือ SQL แบบรวมรองรับ ClickHouse, Snowflake, Athena, MySQL, PostgreSQL, MSSQL และ BigQuery ผ่านชุดเครื่องมือเดียว คิวรีจะทำงานผ่านปลั๊กอิน datasource ของ Grafana ดังนั้นการยืนยันตัวตนจึงจัดการผ่านการกำหนดค่า datasource — ข้อมูลรับรองจะไม่ถูกส่งให้เซิร์ฟเวอร์ MCP

  • แสดงรายการฐานข้อมูล/สคีมา/แค็ตตาล็อก: ค้นหาหน่วยการจัดระเบียบของ SQL datasource สำหรับ Athena ให้ละ catalog ไว้เพื่อแสดงรายการ catalog หรือส่ง catalog เพื่อแสดงรายการฐานข้อมูล
  • แสดงรายการตาราง: แสดงรายการตารางในฐานข้อมูลหรือสคีมา พร้อม metadata (จำนวนแถวและขนาด หากมี)
  • อธิบายสคีมาของตาราง: รับชื่อคอลัมน์ ประเภท การอนุญาตให้เป็นค่าว่าง ค่าเริ่มต้น และความคิดเห็น
  • คิวรี SQL: เรียกใช้คิวรี SQL พร้อมการแทนที่ macro เฉพาะ datasource ($__timeFilter(col), $__from/$__to, $__interval, ${varname}), การบังคับใช้ขีดจำกัดโดยอัตโนมัติ และการรองรับ template variable

สำหรับ BigQuery ให้กำหนดค่าปลั๊กอิน grafana-bigquery-datasource ใน Grafana การค้นหาข้อมูลใช้ database สำหรับโปรเจกต์ และ schema สำหรับ dataset หากไม่ระบุ database โปรเจกต์จะใช้ค่าเริ่มต้นจาก datasource defaultProject จากนั้นจึงใช้ endpoint /defaultProjects ของปลั๊กอิน (รวมถึงการค้นหาโปรเจกต์ GCE) ระบบจะดึง metadata ผ่าน API เท่านั้น โดยไม่ใช้ query jobs หรือสแกนตาราง ทั้งนี้จะรวมคำอธิบายคอลัมน์และประเภทข้อมูลแบบซ้อน แต่ปลั๊กอินจะไม่ส่งคำอธิบาย/ประเภทของตาราง การอนุญาตให้คอลัมน์เป็นค่าว่าง และค่าเริ่มต้น

คิวรี BigQuery ต้องอ้างอิงตารางแบบระบุครบถ้วน เช่น `my-project.my_dataset.fct_events` and use the datasource's billing project. Optional location defaults to datasource processingLocation. Use ${name:sqlstring} สำหรับตัวแปรสตริงที่ escape แล้ว ขีดจำกัดจำนวนแถวไม่ได้จำกัดจำนวนไบต์ที่สแกนหรือค่าใช้จ่ายในการคิวรี

การคิวรี CloudWatch

หมายเหตุ: เครื่องมือ CloudWatch ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม cloudwatch ในแฟล็ก --enabled-tools

  • แสดงรายการ namespace ของ CloudWatch: ค้นหา namespace ของ AWS CloudWatch ที่พร้อมใช้งาน
  • แสดงรายการเมตริกของ CloudWatch: แสดงรายการเมตริกที่พร้อมใช้งานใน namespace ที่ระบุ
  • แสดงรายการ dimensions ของ CloudWatch: รับ dimensions สำหรับกรองคิวรีเมตริก
  • คิวรี CloudWatch: เรียกใช้คิวรีเมตริกของ CloudWatch โดยรองรับช่วงเวลา
  • แสดงรายการ log group ของ CloudWatch: ค้นหา log group โดยเลือกกรองตามคำนำหน้าชื่อได้
  • แสดงรายการฟิลด์ของ log group ใน CloudWatch: ค้นหาฟิลด์ที่มีใน log group
  • คิวรี CloudWatch Logs: เรียกใช้คิวรี CloudWatch Logs Insights กับ log group หนึ่งรายการหรือหลายรายการ

การคิวรี Google Cloud Logging

หมายเหตุ: เครื่องมือ Google Cloud Logging ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม cloudlogging ในแฟล็ก --enabled-tools ต้องใช้ ปลั๊กอิน Google Cloud Logging datasource (googlecloud-logging-datasource) เวอร์ชัน 1.8.0 ขึ้นไป ซึ่งต้องใช้ Grafana 11.2 ขึ้นไป ปลั๊กอินเวอร์ชันเก่าจะส่งคืนรูปแบบการตอบกลับที่แตกต่างกัน และ query_cloud_logging จะแสดงข้อผิดพลาดให้ทำการอัปเกรด

  • แสดงรายการโปรเจกต์ Cloud Logging: ค้นหา GCP project ID ที่ datasource สามารถอ่าน log ได้
  • แสดงรายการ bucket และ view ของ Cloud Logging: ค้นหา log bucket และ log view เพื่อกำหนดขอบเขตของคิวรี
  • คิวรี Cloud Logging: เรียกใช้ตัวกรองภาษาคิวรี Cloud Logging (เช่น resource.type="k8s_container" AND severity>=ERROR) พร้อมช่วงเวลาและขีดจำกัด โดยส่งคืนรายการ log เรียงจากใหม่ไปเก่า พร้อม severity, body, labels และ trace ID การยืนยันตัวตน GCP จัดการผ่านการกำหนดค่า datasource

การคิวรี Graphite

หมายเหตุ: เครื่องมือ Graphite ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม graphite ในแฟล็ก --enabled-tools

  • คิวรี Graphite: เรียกใช้คิวรี Graphite render API กับ datasource ของ Graphite
  • แสดงรายการเมตริก Graphite: เรียกดูและค้นหาเส้นทางเมตริกของ Graphite
  • แสดงรายการ tag ของ Graphite: แสดงรายการ tag และค่า tag ที่พร้อมใช้งานของ Graphite
  • คิวรีความหนาแน่นของ Graphite: คิวรีความหนาแน่นของเมตริก Graphite ตามรูปแบบที่กำหนด

การคิวรี Elasticsearch/OpenSearch

หมายเหตุ: เครื่องมือ Elasticsearch/OpenSearch ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม elasticsearch ในแฟล็ก --enabled-tools

  • คิวรี Elasticsearch/OpenSearch: เรียกใช้คิวรีค้นหากับ datasource ของ Elasticsearch หรือ OpenSearch โดยใช้ไวยากรณ์คิวรี Lucene หรือ Elasticsearch Query DSL รองรับการกรองตามช่วงเวลาและการดึง log เมตริก หรือข้อมูลที่จัดทำดัชนีไว้ โดยส่งคืนเอกสารพร้อม index, ID, ฟิลด์ source และคะแนนความเกี่ยวข้อง (หากมี)

การคิวรี Quickwit

หมายเหตุ: เครื่องมือ Quickwit ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้งาน ให้เพิ่ม quickwit ในแฟล็ก --enabled-tools

  • คิวรี Quickwit: เรียกใช้คิวรีค้นหากับ datasource ของ Quickwit โดยใช้ไวยากรณ์คิวรี Lucene หรือ Elasticsearch Query DSL ที่เข้ากันได้บางส่วน รองรับการกรองตามช่วงเวลาและการดึง log หรือเอกสารอื่นๆ ที่จัดทำดัชนีไว้ โดยส่งคืนเอกสารพร้อม index, ID, ฟิลด์ source และคะแนนความเกี่ยวข้อง (หากมี)

การสังเกตการณ์ Agent

หมายเหตุ: เครื่องมือ Agent Observability ปิดใช้งานโดยค่าเริ่มต้น และใช้งานได้เฉพาะใน Grafana Cloud หากต้องการเปิดใช้งาน ให้เพิ่ม agento11y ในแฟล็ก --enabled-tools

  • แสดงรายการและค้นหาการสนทนา: แสดงรายการการสนทนา LLM ล่าสุด หรือค้นหาด้วยนิพจน์ตัวกรอง (โมเดล ผู้ให้บริการ เอเจนต์ สถานะ ประเภทข้อผิดพลาด ผลการประเมิน และอื่น ๆ) ในช่วงเวลาที่กำหนด ผลการค้นหาประกอบด้วยจำนวนข้อผิดพลาด สรุปคะแนน สรุปผลการประเมิน และ trace ID
  • ดูรายละเอียดการสนทนา: ดึงข้อมูลการสนทนารายการเดียวพร้อม generations ทั้งหมด รวมถึงพรอมป์ต์และเอาต์พุต
  • ดูรายละเอียดและคะแนนของ generation: ดึง generation รายการเดียวตาม ID พร้อมคะแนนการประเมิน (ผู้ประเมิน คีย์คะแนน ค่า ผ่านหรือไม่ คำอธิบาย)
  • อ่านแค็ตตาล็อกเอเจนต์: แสดงรายการเอเจนต์ที่ส่ง telemetry ดึงข้อมูลเวอร์ชันของเอเจนต์หนึ่งรายการแบบเต็ม (system prompt ทั้งหมด เครื่องมือทุกตัวพร้อม JSON schema และโมเดลที่เอเจนต์ใช้) ไล่ดูประวัติเวอร์ชันของเอเจนต์ และเปรียบเทียบค่ารวมของคะแนนการประเมินในแต่ละเวอร์ชัน เวอร์ชันที่มีผลคือแฮช sha256: ซึ่งจะไม่เปลี่ยนเมื่อมีการเปลี่ยนเครื่องมือ สำหรับเอเจนต์ที่ไม่ได้รายงานเวอร์ชันของตนเอง ระบบจะแฮช system prompt ดังนั้นการแก้ไขพรอมป์ต์จะสร้างเวอร์ชันใหม่ แถวแค็ตตาล็อกและเวอร์ชันมี token_estimate ซึ่งควรตรวจสอบก่อนดึงพรอมป์ต์ฉบับเต็ม
  • ตรวจสอบผู้ประเมินและเทมเพลต: อ่านข้อมูลผู้ประเมินที่ใช้สร้างคะแนน เทมเพลตที่ใช้สร้างผู้ประเมิน และผู้ให้บริการกับโมเดลผู้ตัดสินที่มีให้ผู้ประเมินแบบ LLM-judge ใช้งาน เมื่อเปิดใช้เครื่องมือเขียนแล้ว ยังสามารถสร้าง แยกสาขา ทดสอบ และลบผู้ประเมินได้
  • ตรวจสอบกฎการประเมินและ guard: อ่านกฎการประเมินแบบอะซิงโครนัสที่ผูกผู้ประเมินเข้ากับทราฟฟิกจริง และ guard (กฎ hook) ที่ทำงานแบบ inline เพื่อแจ้งเตือนหรือปฏิเสธ เมื่อเปิดใช้เครื่องมือเขียนแล้ว ยังสามารถสร้าง อัปเดต ดูตัวอย่าง และลบรายการเหล่านี้ได้ การเขียนและการดำเนินการ preview_rule กับ test_evaluator ซึ่งไม่บันทึกข้อมูลถาวร ต้องใช้สิทธิ์ grafana-agento11y-app.eval:write ที่มอบให้โดยบทบาท Agento11y Admin
  • จัดการการสนทนาที่บันทึกไว้และคอลเลกชัน: อ่านการสนทนาที่บันทึกไว้ (บุ๊กมาร์กที่กำหนด ID ชื่อ และแท็กถาวรให้การสนทนา) และคอลเลกชันที่ใช้จัดกลุ่มการสนทนาเหล่านั้น รวมถึงจำนวนสมาชิกของแต่ละคอลเลกชันและคอลเลกชันที่ฝังอยู่ในทุกแถวของการสนทนาที่บันทึกไว้ เมื่อเปิดใช้เครื่องมือเขียนแล้ว ยังสามารถบุ๊กมาร์กการสนทนา สร้างและแก้ไขคอลเลกชัน รวมถึงเพิ่มหรือนำสมาชิกออกได้ การเขียนเหล่านี้ต้องใช้สิทธิ์ grafana-agento11y-app.eval:write เดียวกัน
  • อ่านและแก้ไขชุดทดสอบ: แสดงรายการชุดทดสอบที่มีการจัดการเวอร์ชัน ซึ่งใช้ในการทดลองแบบออฟไลน์ อ่านชุดทดสอบหนึ่งชุดพร้อมประวัติเวอร์ชันทั้งหมด และแบ่งหน้าเพื่อดูกรณีทดสอบของเวอร์ชันหนึ่ง เมื่อเปิดใช้เครื่องมือเขียนแล้ว ยังสามารถสร้างชุดทดสอบ เปลี่ยนชื่อหรือแท็ก เปิดเวอร์ชันฉบับร่าง เผยแพร่ และเขียนหรือลบกรณีทดสอบได้ เวอร์ชันที่เผยแพร่แล้วจะถูกตรึงไว้ ดังนั้นการแก้ไขจึงต้องเปิดฉบับร่างใหม่ การเขียนเหล่านี้ต้องใช้ grafana-agento11y-app.eval:write
  • อ่านการทดลองแบบออฟไลน์: แสดงรายการการประเมินที่รันกับชุดทดสอบ และอ่านรายการหนึ่งพร้อมอัตราผ่านโดยรวม ค่าใช้จ่าย และยอดรวมโทเค็น เจาะลึกรายงานรายกรณีทดสอบเพื่อดู trial คะแนนพร้อมคำอธิบายจากผู้ตัดสินแต่ละราย และข้อมูลเมตาของอาร์ติแฟกต์ เมื่อเปิดใช้เครื่องมือเขียนแล้ว ยังสามารถเปลี่ยนชื่อหรือแท็กการทดลอง และยกเลิกการทดลองที่กำลังทำงานได้ ซึ่งต้องใช้ grafana-agento11y-app.eval:write การทดลองสร้างโดย SDK runner ไม่ใช่เครื่องมือนี้

Grafana Assistant

หมายเหตุ: เครื่องมือ Assistant ปิดใช้งานโดยค่าเริ่มต้น และต้องติดตั้งปลั๊กอิน Grafana Assistant (grafana-assistant-app) ในอินสแตนซ์ Grafana เป้าหมาย นอกจากนี้ยังเป็น เครื่องมือเขียน (Assistant อาจเปลี่ยนแปลงสถานะของ stack) จึงจะถูกข้ามเมื่อกำหนด --disable-write หากต้องการเปิดใช้ ให้เพิ่ม assistant ในแฟล็ก --enabled-tools

  • ถาม Assistant: ส่งพรอมป์ต์ภาษาธรรมชาติไปยัง Grafana Assistant และรอคำตอบฉบับเต็มที่เป็นข้อความ Assistant อาจใช้เครื่องมือ เมตริก ล็อก และบริบทอื่น ๆ ของ stack ซึ่งครอบคลุมกว่าการเรียกใช้คิวรีแหล่งข้อมูลแบบแยกเดี่ยว ส่ง contextId ที่ได้รับกลับไปในการเรียกครั้งถัดไปเพื่อสนทนาต่อในบทสนทนาเดิม งานที่ซับซ้อนอาจใช้เวลาหลายนาที การเรียกจะรอจนกว่าจะตอบเสร็จหรือคำขอหมดเวลา (5 นาที)

Incidents

  • ค้นหา สร้าง และอัปเดต incidents: จัดการ incidents ใน Grafana Incident รวมถึงการค้นหา การสร้าง การเพิ่มกิจกรรม และการอ่านหรือตั้งค่าฟิลด์ที่กำหนดเอง
  • ทรัพยากร Incident: incidents ที่กำลังทำงานและเริ่มต้นภายใน 30 วันที่ผ่านมา จะแสดงเป็น MCP resources ที่ grafana://irm/incidents/{id} ด้วย คุณจึงแนบรายการใดรายการหนึ่งเข้ากับบทสนทนาได้โดยตรง (เช่น ใช้ @ ใน Claude Code) โดยจะปิดใช้งานพร้อมกับเครื่องมือ incident

Alerting

  • แสดงรายการและดึงข้อมูลกฎการแจ้งเตือน: ดูกฎการแจ้งเตือนและสถานะ (กำลังทำงาน/ปกติ/ข้อผิดพลาด/ฯลฯ) ใน Grafana รองรับทั้งกฎที่จัดการโดย Grafana และกฎที่จัดการโดยแหล่งข้อมูลจากแหล่งข้อมูล Prometheus หรือ Loki
  • สร้างและอัปเดตกฎการแจ้งเตือน: สร้างกฎการแจ้งเตือนใหม่หรือแก้ไขกฎที่มีอยู่
  • ลบกฎการแจ้งเตือน: นำกฎการแจ้งเตือนออกตาม UID
  • จัดการการกำหนดเส้นทางการแจ้งเตือน: ดูนโยบายการแจ้งเตือน จุดติดต่อ และช่วงเวลา รองรับทั้งจุดติดต่อที่จัดการโดย Grafana และ receiver จากแหล่งข้อมูล Alertmanager ภายนอก (Prometheus Alertmanager, Mimir, Cortex)

Grafana OnCall

  • แสดงรายการและจัดการตารางเวร: ดูและจัดการตารางเวรใน Grafana OnCall
  • ดูรายละเอียดกะ: ดึงข้อมูลโดยละเอียดเกี่ยวกับกะเวรที่ระบุ
  • ดูผู้ใช้ที่เข้าเวรปัจจุบัน: ดูว่าผู้ใช้รายใดกำลังเข้าเวรตามตาราง
  • แสดงรายการทีมและผู้ใช้: ดูทีมและผู้ใช้ OnCall ทั้งหมด
  • แสดงรายการกลุ่มการแจ้งเตือน: ดูและกรองกลุ่มการแจ้งเตือนจาก Grafana OnCall ตามเกณฑ์ต่าง ๆ รวมถึงสถานะ integration ป้ายกำกับ และช่วงเวลา
  • ดูรายละเอียดกลุ่มการแจ้งเตือน: ดึงข้อมูลโดยละเอียดเกี่ยวกับกลุ่มการแจ้งเตือนที่ระบุตาม ID

Admin

หมายเหตุ: เครื่องมือ Admin ปิดใช้งานโดยค่าเริ่มต้น หากต้องการเปิดใช้ ให้ใส่ admin ในแฟล็ก --enabled-tools

  • แสดงรายการทีม: ดูทีมทั้งหมดที่กำหนดค่าไว้ใน Grafana
  • แสดงรายการผู้ใช้: ดูผู้ใช้ทั้งหมดในองค์กรของ Grafana
  • แสดงรายการบทบาททั้งหมด: แสดงรายการบทบาท Grafana ทั้งหมด พร้อมตัวกรองเสริมสำหรับบทบาทที่มอบหมายต่อได้
  • ดูรายละเอียดบทบาท: ดูรายละเอียดของบทบาท Grafana ที่ระบุตาม UID
  • แสดงรายการการมอบหมายของบทบาท: แสดงรายการผู้ใช้ ทีม และ service account ทั้งหมดที่ได้รับมอบหมายบทบาท
  • แสดงรายการบทบาทของผู้ใช้: แสดงรายการบทบาททั้งหมดที่มอบหมายให้ผู้ใช้หนึ่งรายหรือหลายราย
  • แสดงรายการบทบาทของทีม: แสดงรายการบทบาททั้งหมดที่มอบหมายให้ทีมหนึ่งทีมหรือหลายทีม
  • แสดงรายการสิทธิ์ของทรัพยากร: แสดงรายการสิทธิ์ทั้งหมดที่กำหนดไว้สำหรับทรัพยากรที่ระบุ (dashboard, datasource, folder ฯลฯ)
  • อธิบายทรัพยากร Grafana: แสดงรายการสิทธิ์และความสามารถในการมอบหมายที่มีให้สำหรับประเภททรัพยากร

User

  • ข้อมูลผู้ใช้: ดูข้อมูลระบุตัวตน Grafana ปัจจุบัน ได้แก่ login, email, name, สถานะผู้ดูแลระบบ Grafana (server) องค์กรปัจจุบัน และองค์กรที่ข้อมูลรับรองเข้าถึงได้ (พร้อมบทบาท) ใช้เพื่อค้นหาค่า orgId ที่ถูกต้องสำหรับคำขอ หลายองค์กร

Navigation

  • สร้าง deeplink: สร้าง URL deeplink ที่ถูกต้องสำหรับทรัพยากร Grafana แทนการคาดเดา URL ด้วย LLM
    • ลิงก์ Dashboard: สร้างลิงก์โดยตรงไปยัง dashboard โดยใช้ UID (เช่น http://localhost:3000/d/dashboard-uid)
    • ลิงก์ Panel: สร้างลิงก์ไปยัง panel ที่ระบุภายใน dashboard โดยใช้พารามิเตอร์ viewPanel (เช่น http://localhost:3000/d/dashboard-uid?viewPanel=5)
    • ลิงก์ Explore: สร้างลิงก์ไปยัง Grafana Explore พร้อม datasource ที่กำหนดค่าไว้ล่วงหน้า (เช่น http://localhost:3000/explore?schemaVersion=1&panes={"a":{"datasource":"prometheus-uid"}}) Grafana เวอร์ชันต่ำกว่า 10.2 ไม่รองรับ panes ดังนั้นระบบจะสร้างรูปแบบเดิม ?left={...} สำหรับเวอร์ชันเหล่านั้นแทน
    • รองรับช่วงเวลา: เพิ่มพารามิเตอร์ช่วงเวลาในลิงก์ (from=now-1h&to=now)
    • พารามิเตอร์ที่กำหนดเอง: ใส่พารามิเตอร์คิวรีเพิ่มเติม เช่น ตัวแปร dashboard หรือช่วงเวลารีเฟรช

Annotations

  • ดึง Annotations: คิวรี annotations พร้อมตัวกรอง รองรับช่วงเวลา dashboard UID แท็ก และโหมดจับคู่
  • สร้าง Annotation: สร้าง annotation ใหม่บน dashboard หรือ panel
  • สร้าง Graphite Annotation: สร้าง annotations โดยใช้รูปแบบ Graphite (what, when, tags, data)
  • อัปเดต Annotation: แทนที่ทุกฟิลด์ของ annotation ที่มีอยู่ (อัปเดตทั้งหมด)
  • แพตช์ Annotation: อัปเดตเฉพาะฟิลด์ที่ระบุของ annotation (อัปเดตบางส่วน)
  • ลบ Annotation: ลบ annotation ตาม ID อย่างถาวร
  • ดึงแท็ก Annotation: แสดงรายการแท็ก annotation ที่มี พร้อมตัวกรองเสริม

Snapshots

  • แสดงรายการ snapshots: แสดงรายการ snapshots ของ dashboard พร้อมตัวกรองคิวรีและจำนวนสูงสุดที่เลือกได้
  • ดึง snapshot: ดึงข้อมูลเมตาและ payload ของ dashboard ตาม snapshot key
  • สร้าง snapshot: สร้าง snapshot ของ dashboard จาก payload ของ dashboard ฉบับเต็ม พร้อมตัวเลือกการหมดอายุและ snapshot ภายนอก
  • ลบ snapshot: ลบ snapshot ตาม snapshot key

Rendering

  • ดึงภาพ panel หรือ dashboard: เรนเดอร์ panel ของ Grafana dashboard หรือ dashboard ทั้งหมดเป็นภาพ PNG ส่งคืนภาพในรูปแบบข้อมูลที่เข้ารหัส base64 เพื่อใช้ในรายงาน การแจ้งเตือน หรืองานนำเสนอ ค่าเริ่มต้นคือ 1000×750 CSS pixels สำหรับ panel หรือ 1200×900 สำหรับ dashboard ทั้งหมด โดยทั้งคู่ใช้ scale 1 ส่วน Explore มีค่าเริ่มต้น 1000×1000 ที่ scale 1 ขนาดจะขึ้นอยู่กับขีดจำกัด viewport ของ image renderer รองรับการปรับขนาด ช่วงเวลา ธีม scale และตัวแปร dashboard นอกจากนี้ยังรองรับการเรนเดอร์ dashboard ที่ยังไม่ได้นำไปใช้จาก branch ของ provisioning repository (เช่น ตัวอย่าง PR จาก git-sync) ผ่านพารามิเตอร์ provisioningPreview ซึ่งเป็นตัวเลือกเสริม
    • หมายเหตุ: ต้องติดตั้งและกำหนดค่า service Grafana Image Renderer

Provisioning

  • แสดงรายการ provisioning repositories: แสดงรายการ provisioning repositories ที่กำหนดค่าไว้สำหรับอินสแตนซ์ Grafana นี้ (เช่น แหล่งข้อมูล git-sync) โดยส่งคืน slug ของแต่ละ repository พร้อม URL แหล่งที่มา branch path สถานะการซิงก์ และสถานะความสมบูรณ์
  • ตรวจสอบไฟล์ provisioning: ทดลองใช้ไฟล์จาก provisioning repository ที่ branch หรือ commit ที่ระบุ โดยไม่บันทึกการเปลี่ยนแปลง ส่งคืนว่าระบบจะยอมรับไฟล์หรือไม่ การดำเนินการกับทรัพยากร (สร้าง/อัปเดต) ประเภททรัพยากรเป้าหมาย และข้อผิดพลาดในการตรวจสอบแบบมีโครงสร้าง ซึ่งเป็นจุดตรวจสอบการรับทรัพยากรเดียวกับที่ PR commenter ของ Grafana ใช้

รายการเครื่องมือสามารถกำหนดค่าได้ คุณจึงเลือกเครื่องมือที่จะเปิดให้ MCP client ใช้งานได้ วิธีนี้มีประโยชน์หากคุณไม่ได้ใช้ฟังก์ชันบางอย่าง หรือไม่ต้องการใช้พื้นที่ context window มากเกินไป หากต้องการปิดใช้งานเครื่องมือหมวดหมู่หนึ่ง ให้ใช้แฟล็ก --disable-<category> เมื่อเริ่มเซิร์ฟเวอร์ ตัวอย่างเช่น หากต้องการปิดใช้งาน เครื่องมือ OnCall ให้ใช้ --disable-oncall หรือหากต้องการปิดการสร้าง deeplink สำหรับ navigation ให้ใช้ --disable-navigation

สิทธิ์ RBAC

เครื่องมือแต่ละรายการต้องใช้สิทธิ์ RBAC เฉพาะเพื่อให้ทำงานได้อย่างถูกต้อง เมื่อสร้าง service account สำหรับ MCP server โปรดตรวจสอบว่ามีสิทธิ์ที่จำเป็นตามเครื่องมือที่คุณวางแผนจะใช้ สิทธิ์ที่ระบุเป็นการดำเนินการขั้นต่ำที่จำเป็น และคุณอาจต้องใช้ scopes ที่เหมาะสมด้วย (เช่น datasources:*, dashboards:*, folders:*) ทั้งนี้ขึ้นอยู่กับกรณีใช้งานของคุณ

เคล็ดลับ: หากคุณไม่คุ้นเคยกับ Grafana RBAC หรือต้องการตั้งค่าที่รวดเร็วและง่ายกว่าแทนการกำหนด granular scopes จำนวนมาก คุณสามารถกำหนดบทบาทที่มีมาให้ เช่น Editor ให้กับ service account ได้ บทบาท Editor ให้สิทธิ์อ่าน/เขียนในวงกว้าง ซึ่งรองรับการทำงานส่วนใหญ่ของ MCP server แต่มีความละเอียดน้อยกว่า (จึงจำกัดน้อยกว่า) scopes ที่กำหนดเอง ดังนั้นควรใช้เมื่อความสะดวกสำคัญกว่าการจำกัดสิทธิ์ให้น้อยที่สุดอย่างเคร่งครัดเท่านั้น

หมายเหตุ: เครื่องมือ OnCall และเครื่องมืออื่น ๆ ที่ทำงานผ่านปลั๊กอินจะได้รับอนุญาตด้วย plugin actions เช่น grafana-irm-app.schedules:read บทบาท Viewer พื้นฐานมีสิทธิ์อ่าน ส่วน Editor มีสิทธิ์เขียน เครื่องมือ Incident ต้องใช้เพียง plugins.app:access เท่านั้น โดย IRM อนุญาตการดำเนินการ incident ตามบทบาทพื้นฐาน

การดำเนินการในรูปแบบ group/resource:verb เช่น dashboard.grafana.app/dashboards:get ใช้ได้เฉพาะกับ access token ที่ดำเนินการในนามผู้ใช้เท่านั้น service account ต้องใช้เพียงการดำเนินการอื่น ๆ ที่ระบุไว้

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Grafana RBAC ได้ที่ เอกสารอย่างเป็นทางการ

RBAC Scopes

ขอบเขตจะกำหนดทรัพยากรเฉพาะที่สิทธิ์มีผลบังคับใช้ แต่ละการดำเนินการต้องใช้ทั้งสิทธิ์และชุดขอบเขตที่เหมาะสม

รูปแบบขอบเขตที่พบบ่อย:

  • การเข้าถึงแบบกว้าง: ใช้ไวลด์การ์ด * เพื่อเข้าถึงทั่วทั้งองค์กร

    • 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_teamsAdmin*แสดงรายการทีมทั้งหมดteams:readteams:* or teams:id:1
list_users_by_orgAdmin*แสดงรายการผู้ใช้ในองค์กร พร้อมการค้นหาและการแบ่งหน้าorg.users:readglobal.users:* or global.users:id:123
list_all_rolesAdmin*แสดงรายการบทบาท Grafana ทั้งหมดroles:readroles:*
get_role_detailsAdmin*ดูรายละเอียดของบทบาท Grafanaroles:readroles:uid:editor
get_role_assignmentsAdmin*แสดงรายการการกำหนดสิทธิ์สำหรับบทบาทroles:read, teams.roles:read, users.roles:readroles:uid:editor
list_user_rolesAdmin*แสดงรายการบทบาทของผู้ใช้users.roles:readglobal.users:id:123
list_team_rolesAdmin*แสดงรายการบทบาทของทีมteams.roles:readteams:id:7
get_resource_permissionsAdmin*แสดงรายการสิทธิ์สำหรับทรัพยากรdashboards.permissions:read, datasources.permissions:read, folders.permissions:read, serviceaccounts.permissions:read, teams.permissions:read, users.permissions:readdashboards:uid:abcd1234
get_resource_descriptionAdmin*อธิบายประเภททรัพยากร Grafanadashboards.permissions:read, datasources.permissions:read, folders.permissions:read, serviceaccounts.permissions:read, teams.permissions:read, users.permissions:readdashboards:*
user_infoUserข้อมูลประจำตัว ความสามารถ และองค์กรที่เข้าถึงได้ในปัจจุบันNone—
search_dashboardsSearchค้นหาแดชบอร์ดด้วยคำค้นหา UID ของโฟลเดอร์ เส้นทางโฟลเดอร์ แท็ก หรือรายการโปรดdashboards:read, folders:readdashboards:* or dashboards:uid:abc123
search_foldersSearchค้นหาโฟลเดอร์ตามชื่อเรื่องfolders:readfolders:* or folders:uid:xyz789
get_dashboard_by_uidDashboardดูแดชบอร์ดตาม uid โดยเลือกดูเวอร์ชันที่บันทึกไว้ได้dashboard.grafana.app/dashboards:get, dashboards:read, dashboards:writedashboards:uid:abc123
list_dashboard_versionsDashboardแสดงรายการเวอร์ชันที่บันทึกไว้ของแดชบอร์ด (เวอร์ชัน ผู้เขียน เวลา ข้อความ)dashboards:read, dashboards:writedashboards:uid:abc123
update_dashboardDashboardอัปเดตหรือสร้างแดชบอร์ดใหม่dashboard.grafana.app/dashboards:create, dashboard.grafana.app/dashboards:get, dashboard.grafana.app/dashboards:update, dashboards:create, dashboards:read, dashboards:write, folders:readdashboards:*, folders:* or folders:uid:xyz789
get_dashboard_panel_queriesDashboardดูชื่อแผง คิวรี UID และประเภทของแหล่งข้อมูลจากแดชบอร์ดdashboard.grafana.app/dashboards:get, dashboards:readdashboards:uid:abc123
run_panel_queryRunPanelQuery*เรียกใช้คิวรีของแผงแดชบอร์ดหนึ่งรายการหรือหลายรายการdashboard.grafana.app/dashboards:get, dashboards:read, datasources:query, datasources:readdashboards:uid:*, datasources:uid:*
get_dashboard_propertyDashboardดึงส่วนที่ระบุของแดชบอร์ดโดยใช้นิพจน์ JSONPathdashboard.grafana.app/dashboards:get, dashboards:readdashboards:uid:abc123
get_dashboard_summaryDashboardดูสรุปแดชบอร์ดแบบย่อโดยไม่ต้องใช้ JSON ทั้งหมดdashboard.grafana.app/dashboards:get, dashboards:readdashboards:uid:abc123
create_folderDashboardสร้างโฟลเดอร์folders:create, folders:read, folders:writefolders:*
list_datasourcesDatasourcesแสดงรายการแหล่งข้อมูลdatasources:readdatasources:*
get_datasourceDatasourcesรับแหล่งข้อมูลตาม UID หรือชื่อdatasources:readdatasources:uid:prometheus-uid
check_datasources_healthDatasourcesตรวจสอบสถานะของแหล่งข้อมูลอย่างน้อยหนึ่งรายการdatasources:query, datasources:readdatasources:uid:*
create_datasourceDatasourcesสร้างแหล่งข้อมูลdatasources:create, datasources:readdatasources:*
update_datasourceDatasourcesอัปเดตแหล่งข้อมูลdatasources:read, datasources:writedatasources:* or datasources:uid:abc123
get_query_examplesExamples*รับตัวอย่างคิวรีสำหรับประเภทแหล่งข้อมูลNonedatasources:*
query_prometheusPrometheusคิวรีเมตริกด้วย PromQL โดยไม่ต้องเปิดแผนภูมิdatasources:query, datasources:readdatasources:uid:prometheus-uid
render_grafana_appRenderingเรียกใช้เครื่องมือคิวรีที่เปิดใช้งานและแสดงผลลัพธ์ใน Grafana App แบบอินเทอร์แอกทีฟdatasources:query, datasources:readdatasources:* or datasources:uid:<uid>
list_prometheus_metric_metadataPrometheusแสดงรายการข้อมูลเมตาของเมตริกdatasources:query, datasources:readdatasources:uid:prometheus-uid
list_prometheus_metric_namesPrometheusแสดงรายการชื่อเมตริกที่พร้อมใช้งานdatasources:query, datasources:readdatasources:uid:prometheus-uid
list_prometheus_label_namesPrometheusแสดงรายการชื่อเลเบลที่ตรงกับตัวเลือกdatasources:query, datasources:readdatasources:uid:prometheus-uid
list_prometheus_label_valuesPrometheusแสดงรายการค่าสำหรับเลเบลที่ระบุdatasources:query, datasources:readdatasources:uid:prometheus-uid
query_prometheus_histogramPrometheusคำนวณค่าเปอร์เซ็นไทล์ของฮิสโตแกรมdatasources:query, datasources:readdatasources:uid:prometheus-uid
list_incidentsIncidentแสดงรายการเหตุการณ์ใน Grafana Incident พร้อมค่าฟิลด์ที่กำหนดเอง (หากต้องการ)plugins.app:accessN/A
create_incidentIncidentสร้างเหตุการณ์ใน Grafana Incident พร้อมกำหนดฟิลด์ที่กำหนดเอง (หากต้องการ)plugins.app:accessN/A
add_activity_to_incidentIncidentเพิ่มรายการกิจกรรมในเหตุการณ์ใน Grafana Incidentplugins.app:accessN/A
update_incidentIncidentอัปเดตเหตุการณ์ใน Grafana Incident (สถานะ ความรุนแรง ชื่อเรื่อง หรือฟิลด์ที่กำหนดเอง)plugins.app:accessN/A
get_incidentIncidentรับเหตุการณ์รายการเดียวตาม ID รวมถึงฟิลด์ที่กำหนดเองplugins.app:accessN/A
list_incident_custom_fieldsIncidentแสดงรายการฟิลด์ที่กำหนดเองซึ่งกำหนดค่าสำหรับเหตุการณ์ พร้อมประเภทและตัวเลือกการเลือกplugins.app:accessN/A
query_loki_logsLokiคิวรีและดึงบันทึกโดยใช้ LogQL (คิวรีบันทึกหรือคิวรีเมตริก)datasources:query, datasources:readdatasources:uid:loki-uid
list_loki_label_namesLokiแสดงชื่อ label ทั้งหมดที่มีในบันทึกdatasources:query, datasources:readdatasources:uid:loki-uid
list_loki_label_valuesLokiแสดงค่าสำหรับ label ของบันทึกที่ระบุdatasources:query, datasources:readdatasources:uid:loki-uid
query_loki_statsLokiรับสถิติเกี่ยวกับสตรีมบันทึกdatasources:query, datasources:readdatasources:uid:loki-uid
query_loki_patternsLokiค้นหารูปแบบบันทึกที่ตรวจพบเพื่อระบุโครงสร้างที่พบบ่อยdatasources:query, datasources:readdatasources:uid:loki-uid
analyze_loki_labelsLokiตรวจสอบกลยุทธ์ label ของ Loki (แบบเรียลไทม์หรือแบบคงที่) และเลือกวินิจฉัยประสิทธิภาพการค้นหาได้datasources:query, datasources:readdatasources:uid:loki-uid
suggest_loki_alloy_label_configConfigสร้าง snippet ของ Alloy loki.process ที่บังคับใช้ label ที่ได้รับอนุมัติNoneN/A
query_influxdbInfluxDB*ค้นหา InfluxDB โดยใช้ InfluxQL (v1) หรือ Flux (v2)datasources:query, datasources:readdatasources:uid:influxdb-uid
list_sql_databasesSQL*แสดงฐานข้อมูล สคีมา หรือแค็ตตาล็อกจากแหล่งข้อมูล SQLdatasources:query, datasources:readdatasources:uid:*
list_sql_tablesSQL*แสดงตารางในแหล่งข้อมูล SQLdatasources:query, datasources:readdatasources:uid:*
describe_sql_tableSQL*รับสคีมาคอลัมน์ของตารางdatasources:query, datasources:readdatasources:uid:*
query_sqlSQL*เรียกใช้คำสั่ง SQL พร้อมการแทนที่มาโครdatasources:query, datasources:readdatasources:uid:*
list_cloudwatch_namespacesCloudWatch*แสดงเนมสเปซ AWS CloudWatch ที่พร้อมใช้งานdatasources:query, datasources:readdatasources:uid:*
list_cloudwatch_metricsCloudWatch*แสดงเมตริกในเนมสเปซdatasources:query, datasources:readdatasources:uid:*
list_cloudwatch_dimensionsCloudWatch*แสดงมิติข้อมูลของเมตริกdatasources:query, datasources:readdatasources:uid:*
list_cloudwatch_dimension_valuesCloudWatch*แสดงค่าสำหรับคีย์มิติข้อมูลdatasources:query, datasources:readdatasources:uid:*
query_cloudwatchCloudWatch*เรียกใช้คำค้นหาเมตริกของ CloudWatchdatasources:query, datasources:readdatasources:uid:*
list_cloudwatch_log_groupsCloudWatch*แสดงกลุ่มบันทึกของ CloudWatchdatasources:query, datasources:readdatasources:uid:*
list_cloudwatch_log_group_fieldsCloudWatch*แสดงฟิลด์ที่ค้นพบในกลุ่มบันทึกdatasources:query, datasources:readdatasources:uid:*
query_cloudwatch_logsCloudWatch*เรียกใช้คำค้นหา CloudWatch Logs Insightsdatasources:query, datasources:readdatasources:uid:*
list_cloud_logging_projectsCloud Logging*แสดงโปรเจ็กต์ GCP ที่แหล่งข้อมูล Google Cloud Logging สามารถอ่านได้datasources:query, datasources:readdatasources:uid:*
list_cloud_logging_bucketsCloud Logging*แสดงบัคเก็ตบันทึกในโปรเจ็กต์ GCPdatasources:query, datasources:readdatasources:uid:*
list_cloud_logging_viewsCloud Logging*แสดงรายการมุมมองบันทึกในบัคเก็ตบันทึกdatasources:query, datasources:readdatasources:uid:*
query_cloud_loggingCloud Logging*ค้นหาบันทึกด้วยภาษาคิวรี Cloud Loggingdatasources:query, datasources:readdatasources:uid:*
query_elasticsearchElasticsearch/OpenSearch*ค้นหา Elasticsearch หรือ OpenSearch โดยใช้ไวยากรณ์ Lucene หรือ Query DSLdatasources:query, datasources:readdatasources:uid:datasource-uid
query_quickwitQuickwit*ค้นหา Quickwit โดยใช้ไวยากรณ์ Lucene หรือ Query DSLdatasources:query, datasources:readdatasources:uid:quickwit-uid
alerting_rules_readAlertingแสดงรายการและตรวจสอบกฎการแจ้งเตือน (list, get, versions)alert.rules.external:read, alert.rules:read, datasources:read, folders:readfolders:* หรือ folders:uid:alerts-folder
alerting_rules_writeAlertingสร้าง อัปเดต และลบกฎที่จัดการโดย Grafana หรือสร้างกฎที่จัดการโดยแหล่งข้อมูลอย่างชัดเจนalert.provisioning.provenance:write, alert.rules.external:read, alert.rules.external:write, alert.rules:create, alert.rules:delete, alert.rules:read, alert.rules:write, datasources:read, folders:readfolders:* หรือ datasources:uid:<uid> สำหรับการสร้างภายนอก
alerting_manage_routingAlertingจัดการนโยบายการแจ้งเตือน จุดติดต่อ และช่วงเวลาalert.notifications.external:read, alert.notifications.receivers:read, alert.notifications.routes:read, alert.notifications.time-intervals:read, alert.notifications:read, datasources:query, datasources:read, notifications.alerting.grafana.app/routingtrees:getขอบเขตส่วนกลาง
alerting_routing_writeAlertingสร้างจุดติดต่อที่จัดการโดย Grafana เป็นค่าเริ่มต้น หรือสร้างตัวรับ Alertmanager ภายนอกอย่างชัดเจนalert.notifications.external:read, alert.notifications.external:write, alert.notifications.receivers:create, alert.provisioning.provenance:write, datasources:readส่วนกลาง หรือ datasources:uid:<uid> สำหรับการสร้างภายนอก
alerting_silences_readAlertingแสดงรายการและตรวจสอบการปิดเสียงการแจ้งเตือน (list, get)alert.instances:read, alert.silences:readขอบเขตส่วนกลาง
alerting_silences_writeAlertingสร้าง อัปเดต และทำให้การปิดเสียงการแจ้งเตือนหมดอายุalert.instances:create, alert.instances:read, alert.instances:write, alert.silences:create, alert.silences:read, alert.silences:writeขอบเขตส่วนกลาง
list_oncall_schedulesOnCallแสดงรายการกำหนดการจาก Grafana OnCallgrafana-irm-app.schedules:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
get_oncall_shiftOnCallดูรายละเอียดของเวร OnCall ที่ระบุgrafana-irm-app.schedules:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
get_current_oncall_usersOnCallดูผู้ใช้ที่กำลังเข้าเวรสำหรับกำหนดการที่ระบุgrafana-irm-app.schedules:read, grafana-irm-app.user-settings:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
list_oncall_teamsOnCallแสดงรายการทีมจาก Grafana OnCallgrafana-irm-app.user-settings:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
list_oncall_usersOnCallแสดงรายการผู้ใช้จาก Grafana OnCallgrafana-irm-app.user-settings:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
list_alert_groupsOnCallแสดงรายการกลุ่มการแจ้งเตือนจาก Grafana OnCall พร้อมตัวเลือกการกรองgrafana-irm-app.alert-groups:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
get_alert_groupOnCallดูกลุ่มการแจ้งเตือนที่ระบุจาก Grafana OnCall ด้วย IDgrafana-irm-app.alert-groups:read, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
update_alert_groupOnCallรับทราบ ยกเลิกการรับทราบ แก้ไข หรือยกเลิกการแก้ไขกลุ่มการแจ้งเตือนgrafana-irm-app.alert-groups:read, grafana-irm-app.alert-groups:write, plugins.app:accessขอบเขตเฉพาะปลั๊กอิน
list_pyroscope_label_namesPyroscopeแสดงรายการชื่อป้ายกำกับที่ตรงกับตัวเลือกdatasources:query, datasources:readdatasources:uid:pyroscope-uid
list_pyroscope_label_valuesPyroscopeแสดงรายการค่าป้ายกำกับที่ตรงกับตัวเลือกสำหรับชื่อป้ายกำกับdatasources:query, datasources:readdatasources:uid:pyroscope-uid
list_pyroscope_profile_typesPyroscopeแสดงรายการประเภทโปรไฟล์ที่พร้อมใช้งานdatasources:query, datasources:readdatasources:uid:pyroscope-uid
query_pyroscopePyroscopeค้นหาโปรไฟล์ เมตริก หรือทั้งสองอย่างจาก Pyroscopedatasources:query, datasources:readdatasources:uid:pyroscope-uid
get_assertionsการยืนยันรับสรุปการยืนยันสำหรับเอนทิตีที่ระบุplugins.app:accessขอบเขตเฉพาะของปลั๊กอิน
agento11y_manage_conversationsAgent Observability*แสดงรายการ ค้นหา และดึงบทสนทนา LLM จาก Grafana Agent Observabilitygrafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:accessไม่มี
agento11y_manage_generationsAgent Observability*ดึงรายละเอียดการสร้าง LLM และคะแนนการประเมินจาก Grafana Agent Observabilitygrafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:accessไม่มี
agento11y_manage_agentsAgent Observability*อ่านแค็ตตาล็อกเอเจนต์: แสดงรายการเอเจนต์ ดึงข้อมูลเวอร์ชันของเอเจนต์หนึ่งรายการทั้งหมด แสดงประวัติเวอร์ชัน และคะแนนรวมแยกตามเวอร์ชันgrafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:accessไม่มี
agento11y_manage_evaluatorsAgent Observability*จัดการตัวประเมิน เทมเพลตตัวประเมิน และแค็ตตาล็อกผู้ตัดสิน (แสดงรายการ ดึงข้อมูล เพิ่มหรืออัปเดต แยกสาขา ทดสอบ ลบ)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; เมื่อเปิดใช้การเขียน จะมี grafana-agento11y-app.eval:writeไม่มี
agento11y_manage_eval_rulesAgent Observability*จัดการกฎและตัวป้องกันการประเมิน (แสดงรายการ ดึงข้อมูล สร้าง อัปเดต ดูตัวอย่าง ลบ)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; เมื่อเปิดใช้การเขียน จะมี grafana-agento11y-app.eval:writeไม่มี
agento11y_manage_eval_collectionsAgent Observability*จัดการบทสนทนาที่บันทึกไว้และคอลเลกชันที่ใช้จัดกลุ่มบทสนทนาเหล่านั้น (แสดงรายการ ดึงข้อมูล บันทึก สร้าง อัปเดต ลบ เพิ่มและนำสมาชิกออก)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; เมื่อเปิดใช้การเขียน จะมี grafana-agento11y-app.eval:writeไม่มี
agento11y_manage_experimentsAgent Observability*อ่านการทดลองแบบออฟไลน์ การทดลองย่อย คะแนน ข้อมูลเมตาของอาร์ติแฟกต์ และแง่มุมตัวกรอง รวมถึงอัปเดตและยกเลิกการทดลองgrafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; เมื่อเปิดใช้การเขียน จะมี grafana-agento11y-app.eval:writeไม่มี
agento11y_manage_test_suitesAgent Observability*จัดการชุดทดสอบที่ใช้กับการทดลองแบบออฟไลน์ เวอร์ชันของชุดทดสอบ และกรณีทดสอบ (แสดงรายการ ดึงข้อมูล สร้าง อัปเดต ร่าง เผยแพร่ เพิ่มหรืออัปเดต ลบ)grafana-agento11y-app.conversations:read, grafana-agento11y-app.data:read, plugins.app:access; เมื่อเปิดใช้การเขียน จะมี grafana-agento11y-app.eval:writeไม่มี
ask_assistantAssistant*ส่งพรอมต์ไปยัง Grafana Assistant และส่งคืนคำตอบฉบับเต็ม (สนทนาหลายรอบผ่าน contextId)grafana-assistant-app.chats:access, plugins.app:accessขอบเขตเฉพาะของปลั๊กอิน
generate_deeplinkการนำทางสร้าง URL ลิงก์ตรงไปยังทรัพยากร Grafana ได้อย่างแม่นยำไม่มีไม่มี
get_annotationsคำอธิบายประกอบดึงคำอธิบายประกอบพร้อมตัวกรองannotations:readannotations:* หรือ annotations:id:123
create_annotationคำอธิบายประกอบสร้างคำอธิบายประกอบใหม่ (รูปแบบมาตรฐานหรือ Graphite)annotations:createannotations:*
update_annotationคำอธิบายประกอบอัปเดตฟิลด์ที่ระบุของคำอธิบายประกอบ (อัปเดตบางส่วน)annotations:read, annotations:writeannotations:*
delete_annotationคำอธิบายประกอบลบคำอธิบายประกอบตาม IDannotations:deleteannotations:*
get_annotation_tagsคำอธิบายประกอบแสดงรายการแท็กคำอธิบายประกอบ พร้อมตัวกรองเพิ่มเติมได้annotations:readannotations:*
list_snapshotsสแนปช็อตแสดงรายการสแนปช็อตแดชบอร์ด พร้อมตัวกรองการค้นหาและจำนวนสูงสุดเพิ่มเติมได้snapshots:readไม่มี
get_snapshotสแนปช็อตรับข้อมูลเมตาของสแนปช็อตและเพย์โหลดแดชบอร์ดตามคีย์สแนปช็อตไม่มีไม่มี
create_snapshotสแนปช็อตสร้างสแนปช็อตแดชบอร์ดจากเพย์โหลดแดชบอร์ดฉบับเต็มdashboards:read, snapshots:createdashboards:uid:abc123
delete_snapshotสแนปช็อตลบสแนปช็อตแดชบอร์ดตามคีย์สแนปช็อตdashboards:write, snapshots:deletedashboards:uid:abc123
get_panel_imageการเรนเดอร์เรนเดอร์แดชบอร์ดหรือพาเนลที่จัดเก็บไว้ ตัวอย่างการแสดงตัวอย่างการจัดเตรียม หรือมุมมอง Explore แบบเฉพาะกิจเป็นภาพ PNGdashboards:read, datasources:explore, datasources:query, datasources:read, provisioning.repositories:readdashboards:uid:abc123
list_provisioning_repositoriesการจัดเตรียมแสดงรายการที่เก็บการจัดเตรียม (เช่น แหล่งที่มาของ git-sync) พร้อม URL ต้นทาง สาขา สถานะการซิงก์ และสถานะความสมบูรณ์provisioning.grafana.app/repositories:list, provisioning.repositories:readไม่มี
validate_provisioning_fileการจัดเตรียมทดลองใช้ไฟล์จากที่เก็บการจัดเตรียมโดยไม่บันทึกการเปลี่ยนแปลง และรายงานข้อผิดพลาดในการตรวจสอบการอนุญาตให้ใช้งานdashboard.grafana.app/dashboards:get, dashboards:read, folder.grafana.app/folders:get, folders:read, provisioning.grafana.app/repositories:get, provisioning.repositories:readN/A
search_docsเอกสารค้นหาเอกสาร Grafana หรือแสดงรายการกลุ่มผลิตภัณฑ์ (ละเว้น query เพื่อแสดงรายการผลิตภัณฑ์)NoneN/A
get_docเอกสารดึงข้อมูลหน้าเอกสาร ตั้งค่า outline_only เพื่อดูหัวข้อ หรือ section เพื่อดึงข้อมูลตามขอบเขตที่กำหนดNoneN/A
search_tempo_tracesTempoค้นหา traces ด้วย TraceQLdatasources:query, datasources:readdatasources:uid:tempo-uid
query_tempo_metricsTempoคำนวณเมตริกจาก traces ด้วย TraceQLdatasources:query, datasources:readdatasources:uid:tempo-uid
get_tempo_traceTempoดึง trace ตาม IDdatasources:query, datasources:readdatasources:uid:tempo-uid
diff_tempo_tracesTempoเปรียบเทียบ traces สองรายการdatasources:query, datasources:readdatasources:uid:tempo-uid
list_tempo_attribute_namesTempoแสดงรายการชื่อแอตทริบิวต์ของ span และ resourcedatasources:query, datasources:readdatasources:uid:tempo-uid
list_tempo_attribute_valuesTempoแสดงรายการค่าสำหรับแอตทริบิวต์ของ tracedatasources:query, datasources:readdatasources:uid:tempo-uid
get_tempo_traceql_docsTempoดูเอกสาร TraceQLNoneN/A
query_graphiteGraphite*คิวรีเมตริก Graphitedatasources:query, datasources:readdatasources:uid:graphite-uid
query_graphite_densityGraphite*คิวรีความหนาแน่นของเมตริก Graphitedatasources:query, datasources:readdatasources:uid:graphite-uid
list_graphite_metricsGraphite*แสดงรายการเมตริก Graphitedatasources:query, datasources:readdatasources:uid:graphite-uid
list_graphite_tagsGraphite*แสดงรายการแท็ก Graphitedatasources:query, datasources:readdatasources:uid:graphite-uid
get_pluginปลั๊กอินดูปลั๊กอินที่ติดตั้งแล้วplugins.app:accessN/A
search_plugin_informationปลั๊กอินค้นหาแค็ตตาล็อกปลั๊กอิน grafana.comNoneN/A
install_pluginปลั๊กอินติดตั้งปลั๊กอินplugins:installN/A
grafana_api_requestAPIเรียกใช้ปลายทาง HTTP API ของ GrafanaNoneขึ้นอยู่กับปลายทาง
* ปิดใช้งานโดยค่าเริ่มต้น เพิ่มหมวดหมู่ลงใน --enabled-tools เพื่อเปิดใช้งาน

เครื่องมือ render_grafana_app แสดงเมตริกและ trace ในโฮสต์ MCP ที่เข้ากันได้ เมื่อเปิดใช้งานหมวดหมู่การแสดงผลและหมวดหมู่คิวรีที่เกี่ยวข้อง เครื่องมือคิวรีต้นทางจะแสดงข้อความและข้อมูลแบบมีโครงสร้างสำหรับการวิเคราะห์ ดู MCP Apps สำหรับการตั้งค่าและการฝังไลบรารี

ข้อมูลอ้างอิงแฟล็ก CLI

ไบนารี mcp-grafana รองรับแฟล็กบรรทัดคำสั่งหลายรายการสำหรับการกำหนดค่า:

ตัวเลือกการขนส่ง:

  • -t, --transport: ประเภทการขนส่ง (stdio, sse หรือ streamable-http) - ค่าเริ่มต้น: stdio
  • --address: โฮสต์และพอร์ตสำหรับเซิร์ฟเวอร์ SSE/streamable-http - ค่าเริ่มต้น: localhost:8000
  • --base-path: พาธฐานสำหรับเซิร์ฟเวอร์ SSE/streamable-http โดย /healthz และ /metrics จะให้บริการที่รูทของเซิร์ฟเวอร์เสมอ ไม่ใช่ภายใต้คำนำหน้านี้ — ทั้งสองเป็น endpoint ภายในสำหรับ probe และ scraper และการไม่วางไว้ใต้คำนำหน้าของแอปพลิเคชันช่วยให้เปิดเผย API ผ่าน reverse proxy ได้ง่ายขึ้น โดยไม่ต้องเปิดเผย endpoint เหล่านี้ด้วย
  • --endpoint-path: พาธ endpoint สำหรับเซิร์ฟเวอร์ streamable-http ซึ่งต่อท้าย --base-path - ค่าเริ่มต้น: /mcp
  • --sse-keepalive: ช่วงเวลาระหว่างคำขอ ping ที่ส่งไปยังไคลเอ็นต์ SSE แต่ละราย เพื่อไม่ให้ reverse proxy และ load balancer ปิด event stream ที่ไม่มีการใช้งาน (ซึ่งจะทำให้เซสชันสิ้นสุด) ตั้งค่าให้ต่ำกว่า idle timeout ของ proxy เช่น 30s เมื่ออยู่หลังค่าเริ่มต้น 60s ของ proxy-read-timeout ใน ingress-nginx ไคลเอ็นต์จะถูกตัดการเชื่อมต่อหลังจากไม่มีการตอบกลับ ping ติดต่อกัน 3 ครั้ง โดยแต่ละครั้งรอครึ่งหนึ่งของช่วงเวลา รองรับสตริงระยะเวลา Go โดยค่าต่ำสุดคือ 1s - ค่าเริ่มต้น: 0 (ปิดใช้งาน) ใช้กับ --transport sse เท่านั้น
  • --server-name: ชื่อเซิร์ฟเวอร์ที่ใช้ในการจับมือ MCP และ OTel service.name - ค่าเริ่มต้น: mcp-grafana ใช้แทนค่าตัวแปรสภาพแวดล้อม GRAFANA_MCP_SERVER_NAME
  • --instructions-append: ข้อความที่ต่อท้ายคำแนะนำของเซิร์ฟเวอร์ซึ่งส่งกลับไปยังไคลเอ็นต์ MCP เมื่อเริ่มต้น เพื่อให้ agent ทุกตัวที่เชื่อมต่อเห็นข้อความนี้

เมื่อ --address ใช้พอร์ต 0 ระบบปฏิบัติการจะจัดสรรพอร์ตว่าง และเซิร์ฟเวอร์จะเขียนที่อยู่ที่ผูกไว้ลงใน mcp-grafana-address ในไดเรกทอรีทำงานของเซิร์ฟเวอร์โดยทำแบบอะตอมมิก ไฟล์จะถูกสร้างด้วยโหมด 0600

[!NOTE] เมื่อใช้ SSE ส่วนหัวของแต่ละคำขอจะไม่ถูกส่งต่อไปยังการเรียกใช้เครื่องมือ: X-Grafana-Service-Account-Token / X-Grafana-API-Key, X-Grafana-Org-Id และส่วนหัวที่ระบุใน GRAFANA_FORWARD_HEADERS จะไม่มีผล การเรียกใช้เครื่องมือจะใช้ข้อมูลรับรองจากสภาพแวดล้อมของเซิร์ฟเวอร์ และการแทนค่าของ X-Grafana-URL จะไม่ทำงาน ใช้ streamable-http เมื่อผู้เรียกแต่ละรายต้องใช้ URL, ข้อมูลรับรอง หรือองค์กร Grafana ของตนเอง

ความปลอดภัยของการขนส่ง HTTP (ใช้กับ SSE / streamable-http เท่านั้น):

ระบบบังคับใช้การตรวจสอบ Host/Origin กับทุก route บนตัวรับฟัง MCP — /sse, /mcp และ /healthz / /metrics เมื่อใช้ตัวรับฟังเดียวกัน — เพื่อป้องกันไม่ให้เบราว์เซอร์ที่ถูกโจมตีด้วย DNS rebinding เข้าถึง route เหล่านี้ได้ การขนส่งแบบ stdio ไม่ได้รับผลกระทบ --healthz-address และ --metrics-address จะเริ่มตัวรับฟังแยกต่างหากซึ่งไม่มีการครอบด้วยการตรวจสอบนี้

  • --allowed-hosts: รายการอนุญาตของค่าในส่วนหัว Host โดยคั่นด้วยจุลภาค ค่าเริ่มต้นคือรูปแบบ loopback ของ --address (เช่น localhost:8000,127.0.0.1:8000,[::1]:8000) หากแยกวิเคราะห์ค่าแล้วได้ค่าว่าง (ไม่ได้ตั้งค่า, ,, , เป็นต้น) ระบบจะใช้ค่าเริ่มต้นเช่นกัน เพื่อป้องกันไม่ให้การพิมพ์ผิดปิดการตรวจสอบโดยไม่รู้ตัว คำขอที่มีส่วนหัว Host ซึ่งไม่อยู่ในรายการอนุญาตจะถูกปฏิเสธด้วย 403 ส่ง * เพื่อปิดการตรวจสอบ Host ซึ่งปลอดภัยเฉพาะเมื่อ reverse proxy ที่เชื่อถือได้ตรวจสอบ Host แล้วเท่านั้น probe ของ K8s httpGet และ scrape จากภายนอกของ /metrics ต้องใช้ชื่อโฮสต์ที่ระบุไว้อย่างชัดเจนในรายการนี้, *, probe แบบ tcpSocket หรือพอร์ตแยกต่างหาก (--healthz-address / --metrics-address)
  • --allowed-origins: รายการอนุญาตของค่าในส่วนหัว Origin โดยคั่นด้วยจุลภาค ค่าเริ่มต้นเป็นค่าว่าง — คำขอใดก็ตามที่มีส่วนหัว Origin จะถูกปฏิเสธ (เบราว์เซอร์จะส่งส่วนหัวนี้เสมอสำหรับคำขอข้าม origin และไม่ควรมีเบราว์เซอร์ใดเรียกเซิร์ฟเวอร์นี้โดยตรง) ตั้งค่าเป็นรายการที่ระบุชัดเจนเพื่ออนุญาตไคลเอ็นต์ที่ทำงานบนเบราว์เซอร์ หรือใช้ * เพื่อปิดการตรวจสอบ
  • --allow-grafana-url-override: เปิดใช้การเลือก X-Grafana-URL หากไม่ได้ตั้งค่า จะใช้ GRAFANA_ALLOW_URL_OVERRIDE โดยค่าเริ่มต้นปิดใช้งาน หากไม่มีรายการอนุญาต ผู้เรียกสามารถเลือก URL HTTP(S) ใดก็ได้ที่เซิร์ฟเวอร์เข้าถึงได้
  • --allowed-grafana-urls: รายการอนุญาต URL ฐานของ Grafana แบบตรงกันทุกประการสำหรับการแทนที่ URL โดยคั่นด้วยจุลภาคและไม่บังคับ หากไม่ได้ตั้งค่า จะใช้ GRAFANA_ALLOWED_URLS ต้องใช้ --allow-grafana-url-override; การระบุแฟล็กเป็นค่าว่างอย่างชัดเจนจะปิดใช้รายการที่สืบทอดมา

การตรวจสอบสิทธิ์ผู้เรียก (ใช้กับ SSE / streamable-http เท่านั้น):

เลือกกำหนดให้ไคลเอ็นต์ MCP ตรวจสอบสิทธิ์ กับเซิร์ฟเวอร์ ได้ ซึ่งแยกจากข้อมูลรับรองที่เซิร์ฟเวอร์ใช้เชื่อมต่อกับ Grafana การขนส่งแบบ stdio ไม่ได้รับผลกระทบ

  • --server-auth-token: โทเค็น Bearer ที่ผู้เรียกต้องส่งเป็น Authorization: Bearer <token> หากไม่ได้ตั้งค่า จะใช้ตัวแปรสภาพแวดล้อม MCP_GRAFANA_SERVER_TOKEN เมื่อตั้งค่าแล้ว คำขอที่ไม่มีโทเค็นที่ถูกต้องจะถูกปฏิเสธด้วย 401 ก่อนเรียกใช้เครื่องมือใดๆ ควรใช้ตัวแปรสภาพแวดล้อมเพื่อไม่ให้เห็นข้อมูลลับในอาร์กิวเมนต์ของโปรเซส

ระบบจะบังคับใช้การตรวจสอบสิทธิ์ผู้เรียกเฉพาะเมื่อตั้งค่า --server-auth-token เท่านั้น หากไม่ได้ตั้งค่าและเซิร์ฟเวอร์ผูกกับที่อยู่ที่ไม่ใช่ loopback เซิร์ฟเวอร์จะ เริ่มทำงานแต่บันทึกข้อผิดพลาดด้านความปลอดภัย — โดยบันทึกที่ระดับล็อก error เพื่อไม่ให้ --log-level ซ่อนไว้ (loopback และ stdio ไม่ได้รับผลกระทบ); รุ่นหลักในอนาคตจะเปลี่ยนให้กรณีนี้เป็นข้อผิดพลาดขณะเริ่มทำงาน ใช้ TLS (หรือการยุติ TLS) ทุกครั้งที่เปิดใช้การตรวจสอบสิทธิ์ผู้เรียกบนที่อยู่ที่ไม่ใช่ loopback เมื่อเปิดใช้การตรวจสอบสิทธิ์ผู้เรียก ส่วนหัว Authorization ที่ผ่านการตรวจสอบแล้วจะถูกนำออกก่อนส่งคำขอไปยัง Grafana และระบบจะปฏิเสธการใช้ --server-auth-token ร่วมกับ GRAFANA_FORWARD_HEADERS=Authorization ขณะเริ่มทำงาน

การแทนที่ URL ของ Grafana (ใช้กับ streamable-http เท่านั้น):

[!WARNING] การแทนที่ URL อนุญาตให้ผู้เรียก MCP เลือกปลายทาง HTTP(S) ขาออกได้ รายการอนุญาตช่วยจำกัด URL แต่ไม่ได้ตรวจสอบสิทธิ์ผู้เรียกหรือผูกโทเค็นกับปลายทาง

ติดตั้งใช้งานโดยมี proxy ที่ตรวจสอบสิทธิ์และอนุญาตแต่ละปลายทาง แทนที่ส่วนหัว URL และโทเค็นที่ไคลเอ็นต์ส่งมา และส่งโทเค็นที่ตรงกัน จำกัดการเข้าถึงเครือข่ายขาออกของเซิร์ฟเวอร์ให้เข้าถึงได้เฉพาะปลายทางที่อนุมัติ

หากไม่มีรายการอนุญาต โทเค็นคำขอปลอมอาจทำให้ส่งคำขอไปยังบริการ HTTP(S) ใดๆ ที่เข้าถึงได้ รวมถึงบริการภายในและบริการ metadata

ตั้งค่า GRAFANA_ALLOW_URL_OVERRIDE=true (หรือ --allow-grafana-url-override) เพื่อเปิดใช้การเลือกสำหรับ fleet ขนาดใหญ่ หากต้องการจำกัดปลายทาง ให้ตั้งค่า GRAFANA_ALLOWED_URLS=https://one.example.com,https://two.example.com/grafana (หรือ --allowed-grafana-urls) เพิ่มด้วย

ส่งส่วนหัวเหล่านี้ไปกับคำขอ MCP แต่ละรายการที่เลือกปลายทาง:

X-Grafana-URL: https://one.example.com
X-Grafana-Service-Account-Token: <token for one.example.com>

หากกำหนดค่า --server-auth-token ไว้ ให้ส่ง Authorization: Bearer <MCP caller token> ด้วย ส่วนหัวนี้ใช้ตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ MCP และแยกจาก X-Grafana-Service-Account-Token ซึ่งใช้กับอินสแตนซ์ Grafana ที่เลือก proxy ของคุณสามารถส่งโทเค็น Grafana ที่แตกต่างกันสำหรับแต่ละอินสแตนซ์ได้ เซิร์ฟเวอร์จะไม่ใช้โทเค็นที่กำหนดค่าไว้ร่วมกันระหว่างอินสแตนซ์ ส่วนหัว X-Grafana-API-Key ที่เลิกใช้แล้วก็ยังใช้งานได้ คำขอที่มีส่วนหัว URL แต่ไม่มีโทเค็น Grafana สำหรับคำขอจะถูกปฏิเสธ ใช้ TLS สำหรับคำขอขาเข้าเนื่องจากมีโทเค็นอยู่

รายการอนุญาตจะจับคู่ URL ฐานแบบตรงกันทุกประการ รวมถึง scheme, port และ path; ไม่รองรับ wildcard การตรวจสอบสิทธิ์ Grafana ไม่ใช่มาตรการป้องกัน SSRF

สำหรับ URL ที่เลือก เซิร์ฟเวอร์จะไม่ใช้ GRAFANA_SERVICE_ACCOUNT_TOKEN, GRAFANA_SERVICE_ACCOUNT_TOKEN_FILE, GRAFANA_API_KEY, การตรวจสอบสิทธิ์พื้นฐานจากสภาพแวดล้อม, GRAFANA_EXTRA_HEADERS หรือใบรับรองไคลเอ็นต์ การตรวจสอบ TLS ยังคงเปิดใช้งานแม้ตั้งค่า --tls-skip-verify ไว้ และยังคงใช้ไฟล์ CA ที่กำหนดค่าไว้ ส่วนหัวที่ส่งต่อจากคำขอนั้นอย่างชัดเจนยังคงมีผล ระบบจะบล็อกการเปลี่ยนเส้นทางและคำขอ API ของ Grafana อื่นๆ ที่อยู่นอก URL ฐานที่เลือก คำขอที่ไม่มี X-Grafana-URL จะยังคงใช้พฤติกรรมปกติของ GRAFANA_URL และข้อมูลรับรองจากสภาพแวดล้อม ตัวเลือกนี้ใช้ได้เฉพาะกับ streamable HTTP เท่านั้น ใช้ผ่าน SSE ไม่ได้ เนื่องจาก SSE ไม่ส่งต่อส่วนหัวของแต่ละคำขอไปยังการเรียกใช้เครื่องมือ URL ที่เลือกผ่าน SSE จึงถูกใช้โดยไม่มีโทเค็นของผู้เรียก ทำให้การเรียกใช้ล้มเหลว

การดีบักและการบันทึกล็อก:

  • --debug: เปิดใช้โหมดดีบักเพื่อบันทึกรายละเอียดคำขอ/การตอบกลับ HTTP
  • --log-level: ระดับล็อก (debug, info, warn, error) - ค่าเริ่มต้น: info

ตัวเลือกไคลเอ็นต์ Grafana:

  • --grafana-timeout: จำกัดเวลาสำหรับคำขอที่ไคลเอ็นต์ Grafana ส่ง รองรับสตริงระยะเวลา Go (เช่น 10s, 500ms) - ค่าเริ่มต้น: 30s
  • --allow-cross-origin-redirects: อนุญาตให้ไคลเอ็นต์ Grafana ขาออกติดตามการเปลี่ยนเส้นทางไปยัง scheme, host หรือ port อื่น ค่าเริ่มต้นคือ false; GRAFANA_ALLOW_CROSS_ORIGIN_REDIRECTS เป็นค่าทดแทนจากสภาพแวดล้อม การเปิดใช้ตัวเลือกนี้อาจส่งข้อมูลรับรอง Grafana ไปยังปลายทางที่เปลี่ยนเส้นทาง คำขอที่เลือก URL ของ Grafana จะยังคงถูกจำกัดให้อยู่ที่ปลายทางที่เลือก
  • --include-args-in-spans: รวมอาร์กิวเมนต์การเรียกใช้เครื่องมือไว้ใน span ของ OpenTelemetry เปิดใช้เฉพาะในสภาพแวดล้อมที่ไม่ใช่ production หรือเมื่อทราบแน่ชัดว่าอาร์กิวเมนต์ไม่มี PII - ค่าเริ่มต้น: false

การสังเกตการณ์ระบบ:

  • --metrics: เปิดใช้ endpoint เมตริก Prometheus ที่ /metrics
  • --metrics-address: ที่อยู่แยกต่างหากสำหรับเซิร์ฟเวอร์เมตริก (เช่น :9090) หากเว้นว่าง เมตริกจะให้บริการบนเซิร์ฟเวอร์หลัก
  • --healthz-address: ที่อยู่แยกต่างหากสำหรับ /healthz (เช่น :8080) หากเว้นว่าง /healthz จะให้บริการบนเซิร์ฟเวอร์หลัก ใช้ตัวรับฟังร่วมกับ --metrics-address เมื่อที่อยู่ทั้งสองตรงกัน ตัวรับฟังเสริมจะข้ามการตรวจสอบ Host/Origin
  • --slow-request-threshold: บันทึกเหตุการณ์เมื่อคำขอ MCP ใดๆ (การเรียกใช้เครื่องมือ, การแสดงรายการ, การอ่านทรัพยากร ฯลฯ) ใช้เวลานานกว่าระยะเวลานี้ รองรับสตริงระยะเวลา Go (เช่น 500ms, 5s) ค่าเริ่มต้น 0 จะปิดการบันทึกคำขอที่ใช้เวลานาน ดูส่วน การบันทึกคำขอที่ใช้เวลานาน
  • --slow-request-log-level: ระดับล็อกสำหรับเหตุการณ์คำขอที่ใช้เวลานาน (info หรือ warn) - ค่าเริ่มต้น: warn

สถิติการใช้งานแบบไม่ระบุตัวตน:

  • --usage-stats: การรายงานสถิติการใช้งานแบบไม่ระบุตัวตน: enabled, disabled หรือ log (พิมพ์รายงานที่จะส่งไปยัง stderr โดยไม่ส่งข้อมูลใดๆ) ใช้แทนตัวแปรสภาพแวดล้อม GRAFANA_USAGE_STATS ซึ่งจะใช้แทน DO_NOT_TRACK อีกทอดหนึ่ง; ค่าที่ไม่รู้จักจะปิดการรายงาน ดูส่วน สถิติการใช้งานแบบไม่ระบุตัวตน การกำหนดค่าเครื่องมือ:

  • --enabled-tools: รายการหมวดหมู่ที่เปิดใช้งาน คั่นด้วยจุลภาค — ค่าเริ่มต้น: ทุกหมวดหมู่ ยกเว้น admin, agento11y, assistant, athena, clickhouse, cloudlogging, cloudwatch, dsquery, elasticsearch, examples, graphite, quickwit, runpanelquery และ snowflake หากต้องการเปิดใช้งานหมวดหมู่ที่ปิดอยู่ ให้เพิ่มหมวดหมู่เหล่านั้นลงในรายการ (เช่น "search,datasource,...,snowflake")

  • --max-loki-log-limit: จำนวนบรรทัดบันทึกสูงสุดที่ส่งคืนต่อการเรียก query_loki_logs — ค่าเริ่มต้น: 100 หมายเหตุ: ตั้งค่านี้ให้ต่ำกว่า max_entries_limit_per_query ฝั่งเซิร์ฟเวอร์ของ Loki อย่างน้อย 1 เพื่อให้ตรวจจับการตัดทอนได้ (เครื่องมือจะร้องขอ limit+1 ภายในเพื่อตรวจสอบว่ามีข้อมูลเพิ่มเติมหรือไม่)

  • --loki-guardrail-mode: กลไกป้องกันต้นทุนของคิวรี Loki สำหรับ query_loki_logs — ค่าเริ่มต้น: off Loki ไม่บังคับใช้ max_query_bytes_read กับคิวรีบันทึกที่ไม่มีตัวกรองบรรทัด ดังนั้นตัวเลือกแบบกว้างในช่วงเวลาที่ยาวอาจสแกนข้อมูลระดับเทราไบต์ได้ กลไกป้องกันนี้กำหนดให้ใช้ตัวเลือกสตรีมที่เจาะจง จำกัดช่วงเวลาที่มีผล (รวมถึงระยะเวลาของ range vector เช่น [30d]) และตรวจสอบค่าประมาณจำนวนไบต์จากดัชนี/สถิติของ Loki ก่อนเรียกใช้คิวรี shadow บันทึกคิวรีที่จะถูกบล็อกแต่ยังคงให้ทำงานต่อ (ยังคงมีค่าใช้จ่ายจากการเรียกดัชนี/สถิติ); enforce ปฏิเสธคิวรีเหล่านั้นพร้อมคำแนะนำในการเขียนใหม่ที่ LLM นำไปใช้ได้ สำหรับ VictoriaLogs กลไกป้องกันนี้ใช้กับคิวรีรูปแบบตัวเลือก ({...}) เท่านั้น — หากแยกวิเคราะห์ตัวเลือกไม่ได้ (รูปแบบ LogsQL ปกติที่ไม่มีวงเล็บปีกกา) คิวรีจะผ่านไปโดยไม่มีการตรวจสอบ และจะไม่มีการตรวจสอบงบประมาณไบต์ (ไม่มีค่าประมาณจากดัชนีที่คำนวณได้อย่างรวดเร็ว) ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_LOKI_GUARDRAIL_MODE.

  • --loki-guardrail-max-bytes: จำนวนไบต์สูงสุดที่การเรียก query_loki_logs หนึ่งครั้งอาจสแกนได้ โดยประมาณจาก API ดัชนี/สถิติของ Loki — ค่าเริ่มต้น: 107374182400 (100 GiB) 0 ปิดการตรวจสอบงบประมาณไบต์ ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_LOKI_GUARDRAIL_MAX_BYTES.

  • --loki-guardrail-max-range: ช่วงเวลาที่มีผลสูงสุดสำหรับการเรียก query_loki_logs หนึ่งครั้ง รวมถึงระยะเวลาของ range vector — ค่าเริ่มต้น: 24h รองรับสตริงระยะเวลาของ Go 0 ปิดการตรวจสอบช่วงเวลา ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_LOKI_GUARDRAIL_MAX_RANGE.

  • --prometheus-guardrail-mode: กลไกป้องกันคิวรี Prometheus สำหรับ query_prometheus, query_prometheus_histogram และคิวรี Prometheus ของ run_panel_query — ค่าเริ่มต้น: off กลไกป้องกันนี้จำกัดช่วงเวลาที่มีผลของคิวรีและจำนวนจุดต่อซีรีส์ที่ร้องขอ ก่อนส่งคิวรีไปยังแหล่งข้อมูล นโยบายตัวเลือกที่เปิดใช้แยกต่างหากสามารถกำหนดให้ตัวเลือกเวกเตอร์ทุกตัวมีข้อกำหนดป้ายกำกับเชิงบวกที่ไม่ว่างเปล่า นอกเหนือจากชื่อเมตริก ดูตัวอย่างและข้อจำกัดได้ที่ นโยบายตัวเลือก shadow บันทึกคิวรีที่จะถูกบล็อกแต่ยังคงให้ทำงานต่อ; enforce ปฏิเสธคิวรีเหล่านั้นพร้อมคำแนะนำในการเขียนใหม่ที่ LLM นำไปใช้ได้ (run_panel_query รายงานข้อมูลนี้ในรายการ errors ของผลลัพธ์สำหรับพาเนลนั้น) ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_MODE.

  • --prometheus-guardrail-require-selective-labels: กำหนดให้ตัวเลือกเวกเตอร์แต่ละตัวมีข้อกำหนดป้ายกำกับเชิงบวกที่ไม่ว่างเปล่า นอกเหนือจากชื่อเมตริก ค่าเริ่มต้น: false; ทำงานแยกจากงบประมาณช่วงเวลาและจำนวนจุด รวมถึงกรณีที่ทั้งสองค่าเป็น 0 ใช้เฉพาะเมื่อโหมดกลไกป้องกันไม่ใช่ off ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_REQUIRE_SELECTIVE_LABELS ค่า CLI ที่ระบุอย่างชัดเจน รวมถึง false จะมีลำดับความสำคัญเหนือสภาพแวดล้อม

  • --prometheus-guardrail-max-range: ช่วงเวลาที่มีผลสูงสุดสำหรับคิวรี PromQL หนึ่งครั้ง — ค่าเริ่มต้น: 192h ช่วงเวลาที่มีผลคือช่วงเวลาของคิวรีเอง (เป็นศูนย์สำหรับคิวรีแบบ instant) บวกกับหน้าต่าง range vector หรือ subquery ที่ยาวที่สุดในนิพจน์ โดยช่วงของ subquery ที่ซ้อนกันจะนำมาบวกกัน ดังนั้น max_over_time(rate(x[5m])[30d:1m]) จึงอ่านได้ว่า 30d5m รองรับสตริงระยะเวลาของ Go ดังนั้นให้เขียน 192h ไม่ใช่ 8d 0 ปิดการตรวจสอบช่วงเวลา ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_MAX_RANGE.

  • --prometheus-guardrail-max-points: จำนวนจุดสูงสุดต่อซีรีส์ที่คิวรีแบบ range ร้องขอได้ คือ floor(range / step) + 1 — ค่าเริ่มต้น: 11000 ซึ่งเป็นขีดจำกัดต่อซีรีส์ของ Prometheus เอง คำแนะนำจะระบุ stepSeconds ที่น้อยที่สุดซึ่งเพียงพอ 0 ปิดการตรวจสอบจำนวนจุด ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_MAX_POINTS.

  • --prometheus-guardrail-max-metric-cardinality: นโยบายขอบเขต TSDB แบบเลือกเปิด ค่าเริ่มต้น: 0 (ปิดใช้งาน) ชื่อเมตริกที่ตรงกันทุกประการและมีจำนวนซีรีส์สูงกว่าเกณฑ์นี้ ต้องมีตัวจับคู่แบบตรงกันทุกประการที่ไม่ว่างเปล่าบนป้ายกำกับขอบเขตที่กำหนดค่าไว้ ทำงานเฉพาะเมื่อโหมดไม่ใช่ off ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_MAX_METRIC_CARDINALITY.

  • --prometheus-guardrail-cardinality-cache-ttl: อายุการใช้งานของสแนปช็อต TSDB ที่แคชไว้ ค่าเริ่มต้น: 10m; 0 ใช้ 10m ด้วย ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_CARDINALITY_CACHE_TTL.

  • --prometheus-guardrail-cardinality-scope-labels: รายการป้ายกำกับคั่นด้วยจุลภาค ซึ่งตัวจับคู่แบบตรงกันทุกประการที่ไม่ว่างเปล่าจะถือว่าผ่านนโยบายคาร์ดินาลิตี ค่าเริ่มต้น: job,instance,namespace,pod,service,cluster; หากเว้นว่างไว้จะใช้ค่าเริ่มต้นเหล่านี้ ไม่อนุญาตให้ใช้ __name__ ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_PROMETHEUS_GUARDRAIL_CARDINALITY_SCOPE_LABELS การตั้งค่า CLI ที่ระบุอย่างชัดเจนจะมีลำดับความสำคัญเหนือค่าตัวแปรสภาพแวดล้อมที่เกี่ยวข้อง

    ข้อจำกัดของกลไกป้องกัน Prometheus: การตรวจสอบจำนวนจุดจะคำนวณตามความละเอียดที่ร้องขอ ไม่ใช่จำนวนซีรีส์ ตัวอย่าง หรือการประเมิน subquery และ Grafana อาจปรับแนวช่วงเวลาหรือขยาย step โดยไม่สนใจตัวปรับแต่ง offset และ @ มาโครของ Grafana เช่น $__rate_interval และ $__range จะถูกแทนค่าก่อนวัดนิพจน์ โดยใช้ค่าที่ Grafana ใช้ ($__rate_interval มีค่าเป็นสี่เท่าของ step) นิพจน์ที่กลไกป้องกันยังแยกวิเคราะห์ไม่ได้ (เช่น นิพจน์ที่มีตัวแปรแดชบอร์ดอย่าง $window หรือไวยากรณ์ที่มีเฉพาะในภาษาถิ่นอื่น) จะตรวจสอบเฉพาะช่วงเวลาและ step ของคิวรีเอง แล้วจึงทำงานต่อ run_panel_query ไม่มีพารามิเตอร์ step จึงขยาย step 1 นาทีสำหรับช่วงเวลาที่ยาวเพื่อให้อยู่ภายใน 11000 จุด เช่นเดียวกับ Grafana หรือภายในค่า --prometheus-guardrail-max-points ที่ต่ำกว่าในโหมด enforce.

  • --prometheus-enforced-matchers: ตัวจับคู่ป้ายกำกับ PromQL ที่นำมา AND เข้ากับคิวรี native-Prometheus ทุกคิวรี เพื่อจำกัดซีรีส์ที่อ่านได้ (เช่น environment=~"prod|staging") ต้องใช้ --disable-api ดู การบังคับใช้นโยบายคิวรี Prometheus.

  • --loki-enforced-matchers: ตัวจับคู่ป้ายกำกับ LogQL ที่นำมา AND เข้ากับคิวรี native-Loki ทุกคิวรี เพื่อจำกัดสตรีมบันทึกที่อ่านได้ (เช่น environment=~"prod|staging") ต้องใช้ --disable-api ดู การบังคับใช้นโยบายคิวรี Loki.

  • --loki-label-enumeration-fallback: สิ่งที่เครื่องมือแจกแจงป้ายกำกับทำเมื่อไม่สามารถใช้ตัวจับคู่ที่บังคับใช้แบบปฏิเสธเพื่อกำหนดขอบเขตได้: reject (ค่าเริ่มต้น) หรือ unfiltered ดู การบังคับใช้นโยบายคิวรี Loki.

  • --dashboard-schema: ตั้งค่าเป็น v2 เพื่อให้ update_dashboard ปฏิเสธเนื้อหาแบบ classic v1 (panels[]) ที่จะสร้างแดชบอร์ดใหม่เมื่อ Grafana ให้บริการสคีมาแดชบอร์ด v2 ข้อผิดพลาดจะมีเนื้อหา v2 ขั้นต่ำสำหรับลองใหม่ แดชบอร์ด v1 ที่มีอยู่ยังแก้ไขได้ และจะไม่มีผลกับ Grafana ที่ไม่มี v2 ค่าเริ่มต้น: ว่างเปล่า (ไม่มีการเปลี่ยนแปลง) ค่าทดแทนจากสภาพแวดล้อม: GRAFANA_DASHBOARD_SCHEMA.

  • --disable-search: ปิดใช้งานเครื่องมือค้นหา

  • --disable-datasource: ปิดใช้งานเครื่องมือแหล่งข้อมูล

  • --disable-incident: ปิดใช้งานเครื่องมือเหตุการณ์

  • --disable-prometheus: ปิดใช้งานเครื่องมือ Prometheus

  • --disable-write: ปิดใช้งานเครื่องมือเขียน (การดำเนินการสร้าง/อัปเดต)

  • --disable-query: ปิดใช้งานเครื่องมือคิวรี (เครื่องมือที่เรียกใช้คิวรีกับแหล่งข้อมูล); เครื่องมือข้อมูลเมตาและค้นหาทรัพยากรยังคงใช้งานได้

  • --enable-query: คงการลงทะเบียนเครื่องมือคิวรี raw-SQL (query_sql, query_influxdb) ไว้แม้ใช้ --disable-write และคง query_datasource ซึ่งเป็นแหล่งของ render_grafana_app ไว้ให้ใช้งาน สำหรับเครื่องมือ raw-SQL จะเทียบเท่ากับ --enable-write-tools=query_sql,query_influxdb; คงตัวเลือกนี้ไว้เป็นทางลัดสำหรับกรณีที่ใช้บ่อย

  • --enable-write-tools: รายชื่อเครื่องมือแต่ละรายการคั่นด้วยจุลภาค ที่จะคงการลงทะเบียนไว้แม้ใช้ --disable-write สำหรับเครื่องมือที่มีขอบเขตการเขียนแคบพอที่จะเปิดใช้กลับแยกกันได้ ไม่มีผลกับเครื่องมือที่ปิดใช้งานทั้งหมวดหมู่ ตัวอย่างเช่น --enable-write-tools=generate_deeplink ทำให้การย่อ URL (shorten=true) ยังคงทำงานภายใต้ --disable-write และ --enable-write-tools=alerting_rules_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-admin: ปิดใช้งานเครื่องมือผู้ดูแลระบบ

  • --disable-pyroscope: ปิดใช้งานเครื่องมือ Pyroscope

  • --disable-navigation: ปิดใช้งานเครื่องมือนำทาง

  • --disable-rendering: ปิดใช้งานเครื่องมือเรนเดอร์ (ส่งออกภาพพาเนล/แดชบอร์ด)

  • --disable-snapshot: ปิดใช้งานเครื่องมือสแนปช็อต

  • --disable-cloudwatch: ปิดใช้งานเครื่องมือ CloudWatch

  • --disable-cloudlogging: ปิดใช้งานเครื่องมือ Google Cloud Logging

  • --disable-examples: ปิดใช้งานเครื่องมือตัวอย่างคิวรี

  • --disable-sql: ปิดใช้งานเครื่องมือแหล่งข้อมูล SQL (ClickHouse, Snowflake, Athena, MySQL, PostgreSQL, MSSQL, BigQuery) นอกจากนี้ยังใช้ชื่อแทน --disable-clickhouse, --disable-snowflake, --disable-athena ได้

  • --disable-runpanelquery: ปิดใช้งานเครื่องมือเรียกใช้คิวรีพาเนล

  • --disable-graphite: ปิดใช้งานเครื่องมือ Graphite

  • --disable-dsquery: ปิดใช้งานแหล่งข้อมูล query_datasource ของ render_grafana_app

  • --disable-provisioning: ปิดใช้งานเครื่องมือจัดเตรียมระบบ

  • --disable-agento11y: ปิดใช้งานเครื่องมือ Agent Observability

  • --disable-assistant: ปิดใช้งานเครื่องมือ Grafana Assistant

  • --disable-docs: ปิดใช้งานเครื่องมือเอกสาร

โหมดอ่านอย่างเดียว

แฟล็ก --disable-write ช่วยให้เรียกใช้เซิร์ฟเวอร์ MCP ในโหมดอ่านอย่างเดียว โดยป้องกันการดำเนินการเขียนใด ๆ กับอินสแตนซ์ Grafana ของคุณ เหมาะสำหรับกรณีที่ต้องการให้สิทธิ์เข้าถึงแบบอ่านอย่างเดียวที่ปลอดภัย เช่น:

  • ใช้บัญชีบริการที่มีสิทธิ์อ่านอย่างเดียวแบบจำกัด
  • ให้ผู้ช่วย AI เข้าถึงข้อมูลการสังเกตการณ์โดยไม่มีความสามารถในการแก้ไข
  • เรียกใช้ในสภาพแวดล้อมการใช้งานจริงที่ควรจำกัดสิทธิ์เขียน
  • ใช้ในสถานการณ์ทดสอบและพัฒนาที่ต้องการป้องกันการแก้ไขโดยไม่ตั้งใจ

เมื่อเปิดใช้ --disable-write การดำเนินการเขียนต่อไปนี้จะถูกปิดใช้งาน:

เครื่องมือแดชบอร์ด:

  • update_dashboard

เครื่องมือโฟลเดอร์:

  • create_folder

เครื่องมือเหตุการณ์:

  • create_incident
  • add_activity_to_incident
  • update_incident

เครื่องมือแจ้งเตือน:

  • alerting_rules_write (การดำเนินการสร้าง อัปเดต และลบ)
  • alerting_silences_write (การดำเนินการสร้าง อัปเดต และลบ)
  • alerting_routing_write (การดำเนินการ create_contact_point)

สามารถคงเครื่องมือเขียนแจ้งเตือนแต่ละรายการไว้ได้ด้วย --enable-write-tools=<name>.

เครื่องมือ OnCall:

  • update_alert_group

เครื่องมือคำอธิบายประกอบ:

  • create_annotation
  • update_annotation
  • delete_annotation

เครื่องมือสแนปช็อต:

  • create_snapshot
  • delete_snapshot

เครื่องมือนำทาง:

  • generate_deeplink (จะไม่สนใจ shorten=true และส่งคืน URL แบบเต็ม; ส่ง --enable-write-tools=generate_deeplink เพื่อคงการย่อ URL ไว้)

เครื่องมือคิวรี Raw-SQL:

เครื่องมือเหล่านี้จะเรียกใช้คิวรีที่คุณระบุโดยไม่ตรวจสอบ ดังนั้นจึงอาจเขียนข้อมูลได้หากข้อมูลรับรองของแหล่งข้อมูลอนุญาต — query_sql จะเรียกใช้ DROP TABLE ส่วน query_influxdb จะเรียกใช้ DELETE ดังนั้นโหมดอ่านอย่างเดียวจึงนำเครื่องมือเหล่านี้ออก ส่ง --enable-query เพื่อคงเครื่องมือเหล่านี้ไว้เมื่อทราบว่าข้อมูลรับรองของแหล่งข้อมูลเป็นแบบอ่านอย่างเดียว

  • query_sql
  • query_influxdb

เครื่องมือ Agent Observability:

  • agento11y_manage_evaluators (การดำเนินการ upsert, ลบ, fork และทดสอบ evaluator)
  • agento11y_manage_eval_rules (การดำเนินการสร้าง อัปเดต ลบ และแสดงตัวอย่างกฎและ guard)
  • agento11y_manage_eval_collections (บันทึกและลบบทสนทนาที่บันทึกไว้; สร้าง อัปเดต และลบคอลเลกชัน; เพิ่มและนำสมาชิกออกจากคอลเลกชัน)
  • agento11y_manage_experiments (การดำเนินการอัปเดตและยกเลิกการทดลอง)
  • agento11y_manage_test_suites (สร้างและอัปเดตชุดทดสอบ; สร้างและเผยแพร่เวอร์ชัน; upsert และลบกรณีทดสอบ)

การดำเนินการอ่านทั้งหมดยังคงใช้งานได้ คุณจึงสามารถค้นหาข้อมูลแดชบอร์ด เรียกใช้คิวรี PromQL/LogQL แสดงรายการทรัพยากร และดึงข้อมูลได้ ภาษาคิวรีที่ไม่สามารถใช้เขียนข้อมูลได้ — PromQL, LogQL, TraceQL, Elasticsearch DSL, Graphite และ CloudWatch — จะยังคงมีเครื่องมือคิวรีในโหมดอ่านอย่างเดียว ส่วนเครื่องมือ raw-SQL ที่ระบุไว้ข้างต้นเท่านั้นที่จะถูกนำออก

โหมดไม่มีคิวรี

แฟล็ก --disable-query จะนำเครื่องมือทั้งหมดที่เรียกใช้คิวรีกับแหล่งข้อมูลออก โดยยังคงเครื่องมือข้อมูลเมตาและการค้นหาไว้ เหมาะสำหรับกรณีที่ต้องการให้ผู้ช่วยสำรวจสิ่งที่มีอยู่ — แหล่งข้อมูล แดชบอร์ด ชื่อเมตริก ป้ายกำกับ สคีมาตาราง — โดยไม่เรียกใช้คิวรีที่อาจมีค่าใช้จ่ายสูงหรือเปิดเผยข้อมูล ตัวอย่างเช่น เมื่อบัญชีบริการมี datasources:read แต่ไม่มี datasources:query

การตั้งค่านี้เข้มงวดที่สุดในบรรดาการตั้งค่าคิวรีทั้งสาม และมีผลเหนือกว่า --enable-query:

Flagsเครื่องมือคิวรีที่ปลอดภัย (query_prometheus, query_loki_logs, run_panel_query, …)เครื่องมือคิวรี Raw-SQL (query_sql, query_influxdb)
(none)ลงทะเบียนแล้วลงทะเบียนแล้ว
--disable-writeลงทะเบียนแล้วไม่ได้ลงทะเบียน
--disable-write --enable-queryลงทะเบียนแล้วลงทะเบียนแล้ว
--disable-queryไม่ได้ลงทะเบียนไม่ได้ลงทะเบียน
--disable-query --enable-queryไม่ได้ลงทะเบียนไม่ได้ลงทะเบียน

เมื่อเปิดใช้ --disable-query เครื่องมือต่อไปนี้จะไม่ได้รับการลงทะเบียน:

เครื่องมือ Prometheus:

  • query_prometheus
  • query_prometheus_histogram

เครื่องมือการเรนเดอร์:

  • render_grafana_app

เครื่องมือ Loki:

  • query_loki_logs
  • query_loki_patterns

query_loki_stats และ analyze_loki_labels ยังคงลงทะเบียนอยู่: ทั้งคู่ส่ง selector ไปยังแหล่งข้อมูล แต่จะอ่านดัชนีและส่งคืนจำนวนสตรีม ชังก์ และไบต์ แทนเนื้อหาบันทึก

เครื่องมือ Elasticsearch/OpenSearch และ Quickwit:

  • query_elasticsearch
  • query_quickwit

เครื่องมือ InfluxDB (ถูกนำออกโดย --disable-write ด้วย ดูด้านบน):

  • query_influxdb

เครื่องมือแหล่งข้อมูล SQL (ถูกนำออกโดย --disable-write ด้วย ดูด้านบน):

  • query_sql

เครื่องมือ Graphite:

  • query_graphite
  • query_graphite_density

เครื่องมือ CloudWatch:

  • query_cloudwatch
  • query_cloudwatch_logs

เครื่องมือ Google Cloud Logging:

  • query_cloud_logging

เครื่องมือ Pyroscope:

  • query_pyroscope

เครื่องมือเรียกใช้คิวรีแผงควบคุม:

  • run_panel_query

หมวดหมู่ elasticsearch, quickwit, influxdb และ runpanelquery ไม่มีเครื่องมืออื่น จึงไม่มีการลงทะเบียนเครื่องมือใดเลยเมื่อปิดใช้คิวรี ส่วนเครื่องมืออื่นในทุกหมวดหมู่ — list_prometheus_metric_names, list_loki_label_values, describe_sql_table, list_cloudwatch_metrics, list_cloud_logging_projects และอื่น ๆ — ยังคงใช้งานได้

โปรดทราบว่า --disable-query ควบคุมเครื่องมือคิวรีและเส้นทาง POST ไปยัง /api/ds/query ของ grafana_api_request แต่ไม่ได้ควบคุมทุกเส้นทางที่ไปยังแหล่งข้อมูล ในโหมดอ่านอย่างเดียว grafana_api_request อนุญาตให้ POST ไปยัง /api/ds/query เฉพาะเมื่อเปิดใช้เครื่องมือคิวรีเท่านั้น (ใช้เงื่อนไขเดียวกับเครื่องมือ Raw-SQL — ถูกบล็อกโดย --disable-write เว้นแต่ --enable-query จะมีผลเหนือกว่า) ส่วน get_panel_image ซึ่งเรนเดอร์แผงควบคุมฝั่งเซิร์ฟเวอร์ จะไม่ได้รับผลกระทบ

การกำหนดค่า TLS ของไคลเอ็นต์ (สำหรับการเชื่อมต่อ Grafana):

  • --tls-cert-file: เส้นทางไปยังไฟล์ใบรับรอง TLS สำหรับการยืนยันตัวตนไคลเอ็นต์
  • --tls-key-file: เส้นทางไปยังไฟล์คีย์ส่วนตัว TLS สำหรับการยืนยันตัวตนไคลเอ็นต์
  • --tls-ca-file: เส้นทางไปยังไฟล์ใบรับรอง CA ของ TLS สำหรับการตรวจสอบเซิร์ฟเวอร์
  • --tls-skip-verify: ข้ามการตรวจสอบใบรับรอง TLS (ไม่ปลอดภัย)

การกำหนดค่า TLS ของเซิร์ฟเวอร์ (เฉพาะการขนส่ง streamable-http):

  • --server.tls-cert-file: เส้นทางไปยังไฟล์ใบรับรอง TLS สำหรับ HTTPS ของเซิร์ฟเวอร์
  • --server.tls-key-file: เส้นทางไปยังไฟล์คีย์ส่วนตัว TLS สำหรับ HTTPS ของเซิร์ฟเวอร์

การใช้งาน

เซิร์ฟเวอร์ MCP นี้ใช้งานได้กับทั้งอินสแตนซ์ Grafana ในเครื่องและ Grafana Cloud สำหรับ Grafana Cloud ให้ใช้ URL ของอินสแตนซ์ (เช่น https://myinstance.grafana.net) แทน http://localhost:3000 ในตัวอย่างการกำหนดค่าด้านล่าง

  1. หากใช้การยืนยันตัวตนด้วยโทเค็นบัญชีบริการ ให้สร้างบัญชีบริการใน 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: กำหนด X-Grafana-Org-Id เมื่อใช้การขนส่ง streamable HTTP (ส่วนหัวมีลำดับความสำคัญสูงกว่าตัวแปรสภาพแวดล้อม — หมายความว่าคุณสามารถกำหนดองค์กรเริ่มต้นไว้ได้ด้วย)

เมื่อระบุ ID องค์กร เซิร์ฟเวอร์ MCP จะกำหนดส่วนหัว X-Grafana-Org-Id ให้กับคำขอทั้งหมดที่ส่งไปยัง Grafana เพื่อให้แน่ใจว่าการดำเนินการต่าง ๆ อยู่ภายในบริบทขององค์กรที่ระบุ

การเลือกองค์กรแบบไดนามิก (ต่อการเรียกใช้)

ตัวเลือกข้างต้นกำหนดองค์กรเดียวสำหรับการเชื่อมต่อทั้งหมด หากต้องการให้การเชื่อมต่อเดียวเลือกองค์กรต่างกันได้ในแต่ละการเรียกใช้เครื่องมือ ให้เริ่มเซิร์ฟเวอร์ด้วยแฟล็ก --dynamic-multi-org โดยค่าเริ่มต้นจะปิดใช้งานไว้

เมื่อเปิดใช้ เครื่องมือทุกตัวจะรับอาร์กิวเมนต์ orgId ซึ่งเป็นตัวเลือกเสริม เพื่อแทนที่องค์กรของการเชื่อมต่อสำหรับการเรียกใช้นั้น (กำหนดทั้งส่วนหัว X-Grafana-Org-Id และเนมสเปซ Kubernetes ที่แก้ไขแล้วสำหรับ API ของแพลตฟอร์มแอป) นอกจากนี้ ระบบจะค้นพบเครื่องมือแหล่งข้อมูลพร็อกซีจากทุกองค์กรที่ข้อมูลรับรองเข้าถึงได้ การเรียกใช้ที่ไม่ระบุ orgId จะใช้องค์กรเริ่มต้นของการเชื่อมต่อ

วิธีนี้ใช้ได้เฉพาะกับข้อมูลรับรองที่เป็นสมาชิกของมากกว่าหนึ่งองค์กร (เช่น ผู้ใช้หรือข้อมูลระบุตัวตนแบบ on-behalf-of) ส่วนโทเค็นบัญชีบริการจะยังคงผูกกับองค์กรเดียว ใช้เครื่องมือ user_info เพื่อค้นหาค่า orgId ที่ถูกต้อง

ตัวอย่างที่ใช้ 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 แบบกำหนดเอง

คุณสามารถเพิ่มส่วนหัว HTTP ใด ๆ ให้กับคำขอ API ของ Grafana ทั้งหมดได้โดยใช้ตัวแปรสภาพแวดล้อม GRAFANA_EXTRA_HEADERS ค่าควรเป็นออบเจ็กต์ JSON ที่จับคู่ชื่อส่วนหัวกับค่า

ตัวอย่างส่วนหัวแบบกำหนดเอง:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
        "GRAFANA_EXTRA_HEADERS": "{\"X-Custom-Header\": \"custom-value\", \"X-Tenant-ID\": \"tenant-123\"}"
      }
    }
  }
}

พร็อกซี SOCKS5

คุณสามารถกำหนดเส้นทางคำขอทั้งหมดที่เซิร์ฟเวอร์นี้ส่งไปยัง Grafana ผ่านพร็อกซี SOCKS5 ได้โดยใช้ตัวแปรสภาพแวดล้อม GRAFANA_SOCKS5_PROXY พร็อกซีนี้มีผลเฉพาะกับการรับส่งข้อมูล Grafana ของเซิร์ฟเวอร์นี้เท่านั้น โดยจะไม่แก้ไขตัวแปรส่วนกลาง HTTP_PROXY/HTTPS_PROXY และเมื่อกำหนดค่าไว้ จะมีผลเหนือกว่าการเลือกพร็อกซีของตัวแปรเหล่านั้นเฉพาะสำหรับการขนส่ง Grafana โดยไม่กระทบต่อเซิร์ฟเวอร์ MCP อื่นหรือเซสชันเชลล์ของคุณ หากไม่ได้กำหนดค่าไว้ พฤติกรรมจะไม่เปลี่ยนแปลง

URL ต้องใช้สคีม socks5:// หรือ socks5h:// (Go ถือว่าทั้งสองแบบเหมือนกัน: การแก้ไขชื่อโฮสต์จะมอบหมายให้พร็อกซี) และอาจมีข้อมูลรับรอง เช่น socks5://user:pass@127.0.0.1:1080

ตัวอย่าง:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your token>",
        "GRAFANA_SOCKS5_PROXY": "socks5://127.0.0.1:1080"
      }
    }
  }
}

URL พร็อกซีที่ไม่ถูกต้องจะทำให้เริ่มต้นระบบไม่สำเร็จ และหากสร้างการเชื่อมต่อผ่านพร็อกซีไม่สำเร็จขณะทำงาน เซิร์ฟเวอร์จะปฏิเสธการเชื่อมต่อแทนการส่งการรับส่งข้อมูล Grafana โดยตรงโดยไม่แจ้งให้ทราบ

ส่งต่อส่วนหัวจากไคลเอ็นต์ (เฉพาะ Streamable-HTTP)

เมื่อเซิร์ฟเวอร์ MCP ทำงานอยู่หลังเกตเวย์หรือพร็อกซีย้อนกลับที่จัดการ SSO (เช่น AWS ALB ที่ใช้ OIDC) คุกกี้เซสชันของผู้ใช้แต่ละคนต้องส่งไปถึง Grafana เพื่อให้ Grafana เชื่อมโยงคำขอกับผู้ใช้ที่ผ่านการยืนยันตัวตนได้ ตัวแปรสภาพแวดล้อม GRAFANA_FORWARD_HEADERS เปิดใช้ความสามารถนี้โดยระบุรายการอนุญาตของชื่อส่วนหัวที่คั่นด้วยจุลภาค เพื่อคัดลอกจากคำขอ HTTP ขาเข้า ไปยังคำขอ API ของ Grafana ขาออก ทุกคำขอ

ใช้ได้เฉพาะเมื่อใช้การขนส่ง streamable-http (-t streamable-http) เท่านั้น ไม่มีผลในโหมด stdio หรือ SSE

ตัวอย่าง: ส่งต่อคุกกี้เซสชัน

{
  "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 หากชื่อส่วนหัวปรากฏอยู่ทั้งสองแห่ง ค่าจากคำขอขาเข้าจะมีลำดับความสำคัญสูงกว่าสำหรับคำขอนั้น

ส่วนหัวบริบทการติดตาม (traceparent, tracestate, baggage) เป็นข้อยกเว้น: เซิร์ฟเวอร์จะส่งต่อบริบทการติดตามด้วยตนเอง ดังนั้นค่าที่ส่งต่อมาจะไม่มีวันแทนที่ค่าที่เซิร์ฟเวอร์กำหนด ดู การสังเกตการณ์ระบบ

  1. คุณมีตัวเลือกหลายวิธีในการติดตั้ง mcp-grafana:

    • uvx (แนะนำ): หากติดตั้ง uv แล้ว ไม่ต้องตั้งค่าเพิ่มเติม — uvx จะดาวน์โหลดและเรียกใช้เซิร์ฟเวอร์โดยอัตโนมัติ:

      uvx mcp-grafana
      
    • อิมเมจ Docker: ใช้อิมเมจ Docker ที่สร้างไว้ล่วงหน้าจาก Docker Hub

      สำคัญ: จุดเริ่มต้นของอิมเมจ Docker ถูกกำหนดให้เรียกใช้เซิร์ฟเวอร์ MCP ในโหมด SSE โดยค่าเริ่มต้น แต่ผู้ใช้ส่วนใหญ่ควรใช้โหมด STDIO เพื่อผสานการทำงานโดยตรงกับผู้ช่วย AI เช่น Claude Desktop:

      1. โหมด STDIO: สำหรับโหมด stdio คุณต้องแทนที่ค่าเริ่มต้นอย่างชัดเจนด้วย -t stdio และใส่แฟล็ก -i เพื่อให้ stdin เปิดอยู่:
      docker pull grafana/mcp-grafana
      # For local Grafana:
      docker run --rm -i -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> grafana/mcp-grafana -t stdio
      # For Grafana Cloud:
      docker run --rm -i -e GRAFANA_URL=https://myinstance.grafana.net -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> grafana/mcp-grafana -t stdio
      

      หมายเหตุ — รักษาความปลอดภัยของโหมดเครือข่าย: ในโหมด SSE และ streamable-http คอนเทนเนอร์จะผูกกับที่อยู่ที่ไม่ใช่ loopback (0.0.0.0:8000) หากไม่มีโทเค็นผู้เรียก เซิร์ฟเวอร์จะ เริ่มทำงานแต่บันทึกข้อผิดพลาดด้านความปลอดภัย (ที่ระดับบันทึก error จึงไม่ถูกซ่อนโดย --log-level; และในรุ่นหลักถัดไป เซิร์ฟเวอร์จะปฏิเสธการเริ่มทำงาน) กำหนด MCP_GRAFANA_SERVER_TOKEN เพื่อบังคับให้ไคลเอ็นต์ส่ง Authorization: Bearer <token> (แนะนำ) โหมด STDIO ไม่ได้รับผลกระทบ ดู การยืนยันตัวตนผู้เรียก

      1. โหมด SSE: ในโหมดนี้ เซิร์ฟเวอร์จะทำงานเป็นเซิร์ฟเวอร์ HTTP ที่ไคลเอ็นต์เชื่อมต่อได้ คุณต้องเปิดพอร์ต 8000 โดยใช้แฟล็ก -p:
      docker pull grafana/mcp-grafana
      docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> grafana/mcp-grafana
      
      1. โหมด Streamable HTTP: ในโหมดนี้ เซิร์ฟเวอร์ทำงานเป็นกระบวนการอิสระที่รองรับการเชื่อมต่อจากไคลเอ็นต์หลายราย คุณต้องเปิดพอร์ต 8000 โดยใช้แฟล็ก -p: สำหรับโหมดนี้ คุณต้องแทนที่ค่าเริ่มต้นอย่างชัดเจนด้วย -t streamable-http
      docker pull grafana/mcp-grafana
      docker run --rm -p 8000:8000 -e GRAFANA_URL=http://localhost:3000 -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> grafana/mcp-grafana -t streamable-http
      

      สำหรับโหมด Streamable HTTP แบบ HTTPS ที่ใช้ใบรับรอง TLS ของเซิร์ฟเวอร์:

      docker pull grafana/mcp-grafana
      docker run --rm -p 8443:8443 \
        -v /path/to/certs:/certs:ro \
        -e GRAFANA_URL=http://localhost:3000 \
        -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> \
        -e MCP_GRAFANA_SERVER_TOKEN=<caller auth token> \
        grafana/mcp-grafana \
        -t streamable-http \
        -addr :8443 \
        --server.tls-cert-file /certs/server.crt \
        --server.tls-key-file /certs/server.key
      
    • ดาวน์โหลดไบนารี: ดาวน์โหลดรุ่นล่าสุดของ mcp-grafana จาก หน้ารุ่นที่เผยแพร่ แล้ววางไว้ใน $PATH

    • สร้างจากซอร์ส: หากติดตั้ง Go toolchain แล้ว คุณสามารถสร้างและติดตั้งจากซอร์สได้เช่นกัน โดยใช้ตัวแปรสภาพแวดล้อม GOBIN เพื่อระบุไดเรกทอรีที่จะติดตั้งไบนารี ซึ่งควรอยู่ใน $PATH ด้วย

      GOBIN="$HOME/go/bin" go install github.com/grafana/mcp-grafana/v2/cmd/mcp-grafana@latest
      
    • ติดตั้งใช้งานบน Kubernetes โดยใช้ Helm: ใช้ Helm chart จากที่เก็บ helm-charts ของ Grafana

      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
      
  2. เพิ่มการกำหนดค่าเซิร์ฟเวอร์ลงในไฟล์การกำหนดค่าของไคลเอ็นต์ ตัวอย่างเช่น สำหรับ Claude Desktop:

    หากใช้ uvx:

    {
      "mcpServers": {
        "grafana": {
          "command": "uvx",
          "args": ["mcp-grafana"],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
          }
        }
      }
    }
    

    หากใช้ไบนารี:

    {
      "mcpServers": {
        "grafana": {
          "command": "mcp-grafana",
          "args": [],
          "env": {
            "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
            "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>",
            // If using username/password authentication
            "GRAFANA_USERNAME": "<your username>",
            "GRAFANA_PASSWORD": "<your password>",
            // Optional: specify organization ID for multi-org support
            "GRAFANA_ORG_ID": "1"
          }
        }
      }
    }
    

หมายเหตุ: หากเห็น Error: spawn mcp-grafana ENOENT ใน Claude Desktop คุณต้องระบุพาธแบบเต็มไปยัง mcp-grafana

หากใช้ Docker:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t",
        "stdio"
      ],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>",
        // If using username/password authentication
        "GRAFANA_USERNAME": "<your username>",
        "GRAFANA_PASSWORD": "<your password>",
        // Optional: specify organization ID for multi-org support
        "GRAFANA_ORG_ID": "1"
      }
    }
  }
}

หมายเหตุ: อาร์กิวเมนต์ -t stdio จำเป็นในกรณีนี้ เนื่องจากใช้แทนที่โหมด SSE เริ่มต้นในอิมเมจ Docker

การใช้ VSCode กับเซิร์ฟเวอร์ MCP ระยะไกล

หากคุณใช้ VSCode และเรียกใช้เซิร์ฟเวอร์ MCP ในโหมด SSE (ซึ่งเป็นค่าเริ่มต้นเมื่อใช้อิมเมจ Docker โดยไม่ได้แทนที่ transport) โปรดตรวจสอบว่า .vscode/settings.json ของคุณมีรายการต่อไปนี้:

"mcp": {
  "servers": {
    "grafana": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    }
  }
}

สำหรับโหมด HTTPS streamable HTTP ที่ใช้ใบรับรอง TLS ของเซิร์ฟเวอร์:

"mcp": {
  "servers": {
    "grafana": {
      "type": "sse",
      "url": "https://localhost:8443/sse"
    }
  }
}

โหมดดีบัก

คุณสามารถเปิดใช้โหมดดีบักสำหรับ Grafana transport ได้โดยเพิ่มแฟล็ก -debug ลงในคำสั่ง ซึ่งจะแสดงบันทึกโดยละเอียดของคำขอและการตอบกลับ HTTP ระหว่างเซิร์ฟเวอร์ MCP กับ Grafana API ซึ่งอาจเป็นประโยชน์ในการแก้ไขปัญหา

หากต้องการใช้โหมดดีบักกับการกำหนดค่า Claude Desktop ให้อัปเดตการกำหนดค่าดังนี้:

หากใช้ไบนารี:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": ["-debug"],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

หากใช้ Docker:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t",
        "stdio",
        "-debug"
      ],
      "env": {
        "GRAFANA_URL": "http://localhost:3000",  // Or "https://myinstance.grafana.net" for Grafana Cloud
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

หมายเหตุ: เช่นเดียวกับการกำหนดค่ามาตรฐาน จำเป็นต้องใช้อาร์กิวเมนต์ -t stdio เพื่อแทนที่โหมด SSE เริ่มต้นในอิมเมจ Docker

การกำหนดค่า TLS

หากอินสแตนซ์ Grafana ของคุณอยู่หลัง mTLS หรือต้องใช้ใบรับรอง TLS แบบกำหนดเอง คุณสามารถกำหนดค่าเซิร์ฟเวอร์ MCP ให้ใช้ใบรับรองแบบกำหนดเองได้ เซิร์ฟเวอร์รองรับตัวเลือกการกำหนดค่า TLS ต่อไปนี้:

  • --tls-cert-file: พาธไปยังไฟล์ใบรับรอง TLS สำหรับการยืนยันตัวตนไคลเอ็นต์
  • --tls-key-file: พาธไปยังไฟล์คีย์ส่วนตัว TLS สำหรับการยืนยันตัวตนไคลเอ็นต์
  • --tls-ca-file: พาธไปยังไฟล์ใบรับรอง CA ของ TLS สำหรับการตรวจสอบเซิร์ฟเวอร์
  • --tls-skip-verify: ข้ามการตรวจสอบใบรับรอง TLS (ไม่ปลอดภัย ใช้เพื่อการทดสอบเท่านั้น)

ตัวอย่างการยืนยันตัวตนด้วยใบรับรองไคลเอ็นต์:

{
  "mcpServers": {
    "grafana": {
      "command": "mcp-grafana",
      "args": [
        "--tls-cert-file",
        "/path/to/client.crt",
        "--tls-key-file",
        "/path/to/client.key",
        "--tls-ca-file",
        "/path/to/ca.crt"
      ],
      "env": {
        "GRAFANA_URL": "https://secure-grafana.example.com",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

ตัวอย่างการใช้ Docker:

{
  "mcpServers": {
    "grafana": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-v",
        "/path/to/certs:/certs:ro",
        "-e",
        "GRAFANA_URL",
        "-e",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN",
        "grafana/mcp-grafana",
        "-t",
        "stdio",
        "--tls-cert-file",
        "/certs/client.crt",
        "--tls-key-file",
        "/certs/client.key",
        "--tls-ca-file",
        "/certs/ca.crt"
      ],
      "env": {
        "GRAFANA_URL": "https://secure-grafana.example.com",
        "GRAFANA_SERVICE_ACCOUNT_TOKEN": "<your service account token>"
      }
    }
  }
}

การกำหนดค่า TLS จะมีผลกับไคลเอ็นต์ HTTP ทั้งหมดที่เซิร์ฟเวอร์ MCP ใช้ ซึ่งรวมถึง:

  • ไคลเอ็นต์ Grafana OpenAPI หลัก
  • ไคลเอ็นต์ Prometheus datasource
  • ไคลเอ็นต์ Loki datasource
  • ไคลเอ็นต์การจัดการเหตุการณ์
  • ไคลเอ็นต์การแจ้งเตือน
  • ไคลเอ็นต์ 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

การใช้งานแบบโปรแกรม:

หากคุณใช้ไลบรารีนี้แบบโปรแกรม คุณยังสามารถสร้างฟังก์ชัน context ที่เปิดใช้ TLS ได้ด้วย:

// Using struct literals
tlsConfig := &mcpgrafana.TLSConfig{
    CertFile: "/path/to/client.crt",
    KeyFile:  "/path/to/client.key",
    CAFile:   "/path/to/ca.crt",
}
grafanaConfig := mcpgrafana.GrafanaConfig{
    Debug:     true,
    TLSConfig: tlsConfig,
}
contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)

// Or inline
grafanaConfig := mcpgrafana.GrafanaConfig{
    Debug: true,
    TLSConfig: &mcpgrafana.TLSConfig{
        CertFile: "/path/to/client.crt",
        KeyFile:  "/path/to/client.key",
        CAFile:   "/path/to/ca.crt",
    },
}
contextFunc := mcpgrafana.ComposedStdioContextFunc(grafanaConfig)

การตรวจสอบ URL:

เมื่อเรียก NewGrafanaClient โดยตรง (stdio หรือการสร้างแบบโปรแกรม) ให้ตรวจสอบ URL ล่วงหน้าเพื่อหลีกเลี่ยง panic ที่อาจเกิดขึ้น:

if err := mcpgrafana.ValidateGrafanaURL(urlFromHeader); err != nil {
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
}
client := mcpgrafana.NewGrafanaClient(ctx, urlFromHeader, apiKey, nil)

การกำหนดค่า TLS ของเซิร์ฟเวอร์ (เฉพาะ Streamable HTTP Transport)

เมื่อใช้ streamable HTTP transport (-t streamable-http) คุณสามารถกำหนดค่าให้เซิร์ฟเวอร์ MCP ให้บริการ HTTPS แทน HTTP ได้ ซึ่งมีประโยชน์เมื่อต้องการรักษาความปลอดภัยของการเชื่อมต่อระหว่างไคลเอ็นต์ MCP กับตัวเซิร์ฟเวอร์เอง

เซิร์ฟเวอร์รองรับตัวเลือกการกำหนดค่า TLS ต่อไปนี้สำหรับ streamable HTTP transport:

  • --server.tls-cert-file: พาธไปยังไฟล์ใบรับรอง TLS สำหรับ HTTPS ของเซิร์ฟเวอร์ (จำเป็นสำหรับ TLS)
  • --server.tls-key-file: พาธไปยังไฟล์คีย์ส่วนตัว TLS สำหรับ HTTPS ของเซิร์ฟเวอร์ (จำเป็นสำหรับ TLS)

หมายเหตุ: แฟล็กเหล่านี้แยกจากแฟล็ก TLS ของไคลเอ็นต์ที่อธิบายไว้ข้างต้นโดยสิ้นเชิง แฟล็ก TLS ของไคลเอ็นต์กำหนดค่าวิธีที่เซิร์ฟเวอร์ MCP เชื่อมต่อกับ Grafana ส่วนแฟล็ก TLS ของเซิร์ฟเวอร์เหล่านี้กำหนดค่าวิธีที่ไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์ MCP เมื่อใช้ streamable HTTP transport

ตัวอย่างเซิร์ฟเวอร์ HTTPS streamable HTTP:

./mcp-grafana \
  -t streamable-http \
  --server.tls-cert-file /path/to/server.crt \
  --server.tls-key-file /path/to/server.key \
  -addr :8443

คำสั่งนี้จะเริ่มเซิร์ฟเวอร์ MCP บนพอร์ต HTTPS 8443 จากนั้นไคลเอ็นต์จะเชื่อมต่อกับ https://localhost:8443/ แทน http://localhost:8000/

ตัวอย่าง Docker ที่ใช้ TLS ของเซิร์ฟเวอร์:

docker run --rm -p 8443:8443 \
  -v /path/to/certs:/certs:ro \
  -e GRAFANA_URL=http://localhost:3000 \
  -e GRAFANA_SERVICE_ACCOUNT_TOKEN=<your service account token> \
  grafana/mcp-grafana \
  -t streamable-http \
  -addr :8443 \
  --server.tls-cert-file /certs/server.crt \
  --server.tls-key-file /certs/server.key

Endpoint ตรวจสอบสถานะ

เมื่อใช้ transport แบบ SSE (-t sse) หรือ streamable HTTP (-t streamable-http) เซิร์ฟเวอร์ MCP จะเปิดเผย endpoint ตรวจสอบสถานะที่ /healthz Load balancer, ระบบมอนิเตอร์ หรือแพลตฟอร์ม orchestration สามารถใช้ endpoint นี้เพื่อตรวจสอบว่าเซิร์ฟเวอร์กำลังทำงานและยอมรับการเชื่อมต่ออยู่หรือไม่

Endpoint: GET /healthz

การตอบกลับ:

  • รหัสสถานะ: 200 OK
  • เนื้อหา: ok

ตัวอย่างการใช้งาน:

# For streamable HTTP or SSE transport on default port
curl http://localhost:8000/healthz

# Probe a side listener while MCP stays on loopback (Kubernetes + sidecar)
./mcp-grafana -t streamable-http --address 127.0.0.1:8000 --healthz-address :8080
curl http://127.0.0.1:8080/healthz

# With --base-path /my-base the MCP routes move under the prefix
# (/my-base/sse, /my-base/mcp), but healthz does not:
curl http://localhost:8000/healthz          # 200 ok
curl http://localhost:8000/my-base/healthz  # 404

หมายเหตุ: endpoint ตรวจสอบสถานะใช้ได้เฉพาะเมื่อใช้ transport แบบ SSE หรือ streamable HTTP เท่านั้น ไม่สามารถใช้ได้เมื่อใช้ stdio transport (-t stdio) เนื่องจาก stdio ไม่ได้เปิดเผยเซิร์ฟเวอร์ HTTP

สถิติการใช้งานแบบไม่ระบุตัวตน

เซิร์ฟเวอร์สามารถรายงานสถิติการใช้งานแบบไม่ระบุตัวตนเกี่ยวกับตัวเซิร์ฟเวอร์ไปยัง Grafana Labs ได้แก่ มีการเรียกใช้เครื่องมือใดบ้าง มีการเรียกใช้กี่ครั้งที่ล้มเหลว และเซิร์ฟเวอร์ได้รับการกำหนดค่าอย่างไร รายงานแต่ละฉบับครอบคลุม โปรเซส ของเซิร์ฟเวอร์หนึ่งโปรเซส ไม่ใช่ผู้ใช้หนึ่งคนหรือการสนทนาหนึ่งรายการ และจะส่งทุก 4 ชั่วโมง รวมถึงส่งอีกครั้งเมื่อปิดระบบ การรายงานเปิดใช้งานเป็นค่าเริ่มต้น หากต้องการปิด ให้ตั้งค่า --usage-stats=disabled, GRAFANA_USAGE_STATS=disabled หรือ DO_NOT_TRACK=1

ระบบจะไม่ส่งอาร์กิวเมนต์ของเครื่องมือ ชื่อทรัพยากร คิวรี บรรทัดบันทึก ข้อความแสดงข้อผิดพลาด หรือข้อมูลรับรองใดๆ ทั้งสิ้น ระบบจะบันทึกแฟล็กตามชื่อเท่านั้น ไม่บันทึกค่าของแฟล็ก และจะระบุอินสแตนซ์ Grafana เพียงว่าเป็น cloud หรือ self_hosted เท่านั้น โดยจะไม่ระบุ URL ชื่อโฮสต์ stack slug หรือ org ไม่มีข้อมูลใดผูกกับผู้ใช้ เซสชัน หรือไคลเอ็นต์: ไม่มีตัวระบุเซสชันส่งผ่านเครือข่าย และไม่มีวิธีระบุว่าการเรียกใช้เครื่องมือมาจากไคลเอ็นต์ใดโดยเฉพาะ

# Turn reporting on
mcp-grafana --usage-stats=enabled

# Turn it off (or GRAFANA_USAGE_STATS=disabled)
mcp-grafana --usage-stats=disabled

# Print what would be sent, to stderr, and send nothing
GRAFANA_USAGE_STATS=log mcp-grafana

DO_NOT_TRACK=1 จะปิดการรายงานด้วย โดยเป็นไปตามรูปแบบ DO_NOT_TRACK ที่ใช้ร่วมกันในเครื่องมือต่างๆ มีเพียง 1 เท่านั้นที่มีผล และใช้ปิดได้เท่านั้น ส่วนทั้ง --usage-stats และ GRAFANA_USAGE_STATS จะมีลำดับความสำคัญเหนือกว่า ดังนั้นโฮสต์ที่ตั้งค่านี้ไว้ทั่วโลกยังสามารถเลือกเปิดใช้กับเซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่งได้

GRAFANA_USAGE_STATS_ENDPOINT เปลี่ยนปลายทาง ไม่ได้ปิดการรายงาน

ดูรายการฟิลด์ทั้งหมด ข้อมูลที่ไม่มีการส่ง วิธีอ่านข้อมูล และข้อจำกัดได้ที่ สถิติการใช้งานแบบไม่ระบุตัวตน

Observability

เซิร์ฟเวอร์ MCP รองรับเมตริก Prometheus, distributed tracing ของ OpenTelemetry และการส่งออกบันทึกของ OpenTelemetry ตาม OTel MCP semantic conventions การกำหนดค่า tracing และการส่งออกบันทึกใช้ตัวแปรสภาพแวดล้อมมาตรฐานของ OTEL_* และทำงานได้กับทุก transport

หมายเหตุ: ขณะนี้ mcp-grafana รองรับเฉพาะ transport OTLP/gRPC สำหรับทั้ง traces และ logs เท่านั้น โดยจะไม่ใช้ OTEL_EXPORTER_OTLP_PROTOCOL (รวมถึงรูปแบบย่อย _TRACES_PROTOCOL / _LOGS_PROTOCOL) และจะใช้ gRPC ไม่ว่าในกรณีใด

เมตริก

เมื่อใช้ transport แบบ SSE หรือ streamable HTTP ให้เปิดใช้เมตริก Prometheus ด้วยแฟล็ก --metrics:

# Metrics served on the main server at /metrics
./mcp-grafana -t streamable-http --metrics

# Metrics served on a separate address
./mcp-grafana -t streamable-http --metrics --metrics-address :9090

เมตริกที่ใช้ได้:

เมตริกประเภทคำอธิบาย
mcp_server_operation_duration_secondsHistogramระยะเวลาของการดำเนินการ MCP (ป้ายกำกับ: mcp_method_name, gen_ai_tool_name, error_type, network_transport, mcp_protocol_version)
http_server_request_duration_secondsHistogramระยะเวลาของคำขอไปยังเซิร์ฟเวอร์ HTTP (จาก otelhttp)

หมายเหตุ: เมตริกใช้ได้เฉพาะเมื่อใช้ transport แบบ SSE หรือ streamable HTTP เท่านั้น ไม่สามารถใช้กับ stdio transport ได้

เมื่อเปิดใช้ Loki cost guardrail (--loki-guardrail-mode) จะมีตัวนับเพิ่มอีกสี่รายการเพื่อบันทึกการตัดสินใจของ guardrail:

เมตริกประเภทคำอธิบาย
mcp_loki_guardrail_admitted_totalCounterคิวรีที่ผ่านการตรวจสอบที่เปิดใช้ทั้งหมด (ป้ายกำกับ: backend)
mcp_loki_guardrail_would_block_totalCounterคิวรีที่ไม่ผ่านการตรวจสอบในโหมด shadow แต่ยังคงทำงานต่อ (ป้ายกำกับ: backend, reason)
mcp_loki_guardrail_blocked_totalCounterคิวรีที่ถูกปฏิเสธในโหมด enforce (ป้ายกำกับ: backend, reason)
mcp_loki_guardrail_fail_open_totalCounterคิวรีที่ guardrail ประเมินไม่ได้และอนุญาตให้ผ่าน (ป้ายกำกับ: backend, cause)

reason เป็นหนึ่งใน selector, range, bytes; cause เป็นหนึ่งใน unparseable, estimate_failed; backend เป็นหนึ่งใน loki, victorialogs, unknown คิวรีที่ไม่ผ่านการตรวจสอบหลายรายการจะถูกนับเพียงครั้งเดียว โดยติดป้ายกำกับตามการตรวจสอบที่ทำงานก่อน (selector ตามด้วย range แล้วจึง bytes) ดังนั้นตัวนับทั้งสี่จึงครอบคลุมกลุ่มคิวรีที่อยู่ภายใต้ guardrail ทั้งหมด ดู Observability เพื่อเรียนรู้วิธีอ่านค่าเหล่านี้ระหว่างการทยอยเปลี่ยนจาก shadow → enforce

เมื่อเปิดใช้ Prometheus guardrail (--prometheus-guardrail-mode) จะมีตัวนับสี่รายการบันทึกการตัดสินใจในลักษณะเดียวกัน:

เมตริกประเภทคำอธิบาย
mcp_prometheus_guardrail_admitted_totalCounterคิวรีที่ผ่านการตรวจสอบที่เปิดใช้ทั้งหมด
mcp_prometheus_guardrail_would_block_totalCounterคิวรีที่ไม่ผ่านการตรวจสอบในโหมด shadow แต่ยังคงทำงานต่อ (ป้ายกำกับ: reason)
mcp_prometheus_guardrail_blocked_totalCounterคิวรีที่ถูกปฏิเสธในโหมด enforce (ป้ายกำกับ: reason)
mcp_prometheus_guardrail_fail_open_totalCounterคิวรีที่ได้รับอนุญาตให้ผ่านทั้งที่การประเมินที่เปิดใช้ไม่พร้อมใช้งาน (ป้ายกำกับ: reason)

reason เป็น selector, range, points หรือ cardinality บน would_block และ blocked โดยนับเพียงครั้งเดียวภายใต้การตรวจสอบแรกที่ไม่ผ่านตามลำดับนั้น fail_open ใช้ unparseable หรือ cardinality_unknown นโยบาย cardinality ที่เป็นตัวเลือกจะใช้สถิติ TSDB ของ top-N ที่แคชไว้ เพื่อกำหนดให้ระบุ scope อย่างชัดเจนสำหรับเมตริกที่ทราบว่ามี cardinality สูง โดยไม่ได้ประมาณจำนวน series ที่เลือก และไม่ได้ยืนยันว่าเมตริกที่ขาดหายไปนั้นปลอดภัย Endpoint ของ TSDB ที่ไม่รองรับจะเปิดให้ผ่านสำหรับนโยบายนี้ ไม่มีป้ายกำกับ backend

ผู้ฝังไลบรารีควรกำหนด GrafanaConfig.MeterProvider (ซึ่งเป็นส่วนที่เทียบเท่ากับเมตริกของ GrafanaConfig.Logger): guardrail ทำงานภายในตัวจัดการเครื่องมือ จึงไม่มีตัวเลือกใน constructor และหากโปรเซสติดตั้ง MeterProvider แบบ noop เป็น global การบันทึกทั้งหมดก็จะถูกทิ้ง

การบันทึกคำขอที่ใช้เวลานาน

แฟล็ก --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ค่าข้อผิดพลาดเมื่อคำขอล้มเหลว (บริบทตามความพยายามอย่างดีที่สุด โดยเนื้อหาจะขึ้นอยู่กับการห่อหุ้มข้อผิดพลาดจาก upstream)
error.typeการจัดประเภทข้อผิดพลาดที่มี cardinality จำกัด (_OTHER สำหรับข้อผิดพลาดที่ไม่มีชนิดกำกับ)

การบันทึกคำขอที่ใช้เวลานานทำงานได้กับทุก transport (รวมถึง stdio) และไม่จำเป็นต้องใช้ --metrics ค่าเกณฑ์เริ่มต้น 0 จะปิดใช้งานฟีเจอร์นี้ทั้งหมด เครื่องมือที่พร็อกซีผ่าน tools/call จะได้รับการครอบคลุมโดยอัตโนมัติ

Tracing

การกำหนดค่า distributed tracing ใช้ตัวแปรสภาพแวดล้อมมาตรฐานของ OTEL_* และทำงานแยกจากแฟล็ก --metrics เมื่อกำหนด OTEL_EXPORTER_OTLP_ENDPOINT (หรือ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT สำหรับสัญญาณเฉพาะ) เซิร์ฟเวอร์จะส่งออก traces ผ่าน 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

Span ของการเรียกใช้เครื่องมือจะใช้รูปแบบการตั้งชื่อตาม semconv (tools/call <tool_name>) และมีแอตทริบิวต์ เช่น gen_ai.tool.name, mcp.method.name และ mcp.session.id เซิร์ฟเวอร์ยังรองรับการส่งต่อบริบท trace ของ W3C จากฟิลด์ _meta ของคำขอเรียกใช้เครื่องมือด้วย

Logs

เมื่อกำหนด OTEL_EXPORTER_OTLP_ENDPOINT (หรือ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT สำหรับสัญญาณเฉพาะ) เซิร์ฟเวอร์จะส่งออกบันทึกแบบมีโครงสร้างผ่าน OTLP/gRPC เพิ่มเติมจากเอาต์พุตข้อความธรรมดาที่ stderr ซึ่งมีอยู่แล้ว bridge otelslog จะเพิ่ม trace_id และ span_id จาก span ที่กำลังทำงานอยู่โดยอัตโนมัติ ทำให้ระเบียนบันทึกเชื่อมโยงกับ traces ที่เซิร์ฟเวอร์ส่งออกอยู่แล้วได้

Traces และ logs จะ resolve endpoints แยกจากกัน ดังนั้นจึงเปิดใช้สัญญาณทั้งสองแยกกันได้: การตั้งค่าเฉพาะ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT จะเปิดใช้ tracing โดยไม่มี การส่งออก logs การตั้งค่าเฉพาะ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT จะเปิดใช้การส่งออก logs โดยไม่มี tracing และ OTEL_EXPORTER_OTLP_ENDPOINT แบบทั่วไปจะเปิดใช้ทั้งสองอย่าง

หากคุณใช้ OTEL_EXPORTER_OTLP_ENDPOINT แบบทั่วไป แต่ต้องการปิดการส่งออก logs (เช่น backend ของคุณไม่รองรับ LogsService) ให้ตั้งค่า:

OTEL_LOGS_EXPORTER=none

การตั้งค่านี้จะป้องกันไม่ให้เซิร์ฟเวอร์สร้าง OTLP logs exporter โดยไม่ขึ้นกับการกำหนดค่า endpoint และช่วยหลีกเลี่ยงข้อผิดพลาดอย่าง unknown service opentelemetry.proto.collector.logs.v1.LogsService

การบันทึกลง stderr จะไม่เปลี่ยนแปลงเมื่อเปิดใช้ OTLP logging คุณยังคงใช้ container logs หรือ pipe 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

transport คือ OTLP/gRPC (พอร์ตเริ่มต้น 4317) สามารถส่ง logs ไปยัง managed backend ใดก็ได้ที่รองรับ OTLP/gRPC โดยตรง — ตัวอย่างเช่น Grafana Cloud — เพียงกำหนด OTEL_EXPORTER_OTLP_LOGS_ENDPOINT (หรือ OTEL_EXPORTER_OTLP_ENDPOINT แบบทั่วไป) ให้ชี้ไปยัง gRPC endpoint ระยะไกล และระบุข้อมูลยืนยันตัวตนผ่าน OTEL_EXPORTER_OTLP_LOGS_HEADERS (หรือ OTEL_EXPORTER_OTLP_HEADERS) เช่นเดียวกับตัวอย่าง tracing ด้านบน ไม่จำเป็นต้องใช้ OTel collector ในเครื่อง — มีประโยชน์สำหรับการกระจายข้อมูล การทำ batching หรือการกำหนดเส้นทางไปยังหลาย backend แต่ไม่ใช่สิ่งจำเป็น

ตัวแปรเฉพาะสัญญาณ 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 exporter สำหรับรายการทั้งหมดและกฎลำดับความสำคัญ

หากไม่สามารถเข้าถึง collector ที่กำหนดค่าไว้ได้ ระเบียน log จะถูกบัฟเฟอร์ไว้ในหน่วยความจำ (คิวเริ่มต้น: 2048) และระเบียนที่เก่าที่สุดจะถูกทิ้งเมื่อคิวเต็ม กระบวนการจะทำงานต่อไปโดยไม่บล็อก service หากต้องการบัฟเฟอร์โดยไม่สูญเสียข้อมูลระหว่างระบบขัดข้อง ให้กำหนดค่า OTel collector ในเครื่อง

นอกจากนี้ยังส่งออก logs ผ่าน stdio transport ด้วย ซึ่งช่วยให้รวม logs จากอินสแตนซ์ mcp-grafana ในเครื่องที่ IDE clients เรียกใช้ได้ง่าย

ตัวอย่าง Docker ที่มี metrics, tracing และ 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

การบังคับใช้นโยบาย Prometheus query

--prometheus-enforced-matchers ช่วยให้ผู้ดูแลระบบจำกัด series ของ Prometheus ที่เครื่องมือ Prometheus แบบ native อ่านได้ โดยนำ PromQL label matchers ชุดคงที่มาเชื่อมด้วย AND เข้ากับ vector selector ทุกตัวในแต่ละ Prometheus query แบบ native ที่เซิร์ฟเวอร์ส่ง วิธีนี้มีประโยชน์เมื่อ datasource มี series ที่ต้องไม่เปิดเผย (เช่น metrics ที่มี tenant หรือ customer labels ซึ่งเป็นข้อมูลละเอียดอ่อน) แต่คุณไม่สามารถจำกัดสิทธิ์การเข้าถึงที่ระดับ Prometheus ได้

# Only ever read prod/staging environments (allowlist)
./mcp-grafana --prometheus-enforced-matchers 'environment=~"prod|staging"' --disable-api --disable-rendering --disable-assistant

# Never read the vault or payments namespaces (exclusion)
./mcp-grafana --prometheus-enforced-matchers 'namespace!~"vault|payments"' --disable-api --disable-rendering --disable-assistant

วิธีการทำงาน:

  • ระบบจะแยกวิเคราะห์ matchers เพียงครั้งเดียวเมื่อเริ่มต้น (หากข้อมูลไม่ถูกต้อง เซิร์ฟเวอร์จะหยุดทำงาน) แล้วเพิ่มเข้าไปใน vector selector ทุกตัวของแต่ละ query query ของผู้ใช้ทำได้เพียง จำกัด ผลลัพธ์ให้อยู่ภายในขอบเขตที่บังคับใช้เท่านั้น ไม่สามารถขยายขอบเขตได้
  • ครอบคลุม query_prometheus, query_prometheus_histogram และแผง Prometheus ใน run_panel_query
  • การค้นหาแบบ native-Prometheus ผ่าน list_prometheus_label_names, list_prometheus_label_values และ list_prometheus_metric_names จะใช้ matchers กับ series selector ทุกตัวด้วย รวมถึงกรณีที่ไม่ได้ระบุ selector
  • ระบบจะปฏิเสธ list_prometheus_metric_metadata ขณะเปิดใช้การบังคับใช้นโยบาย เนื่องจาก metadata endpoint ของ Prometheus ไม่สามารถกรองตาม series labels และรวม metadata จากหลาย targets เข้าด้วยกัน นอกจากนี้ยังปฏิเสธการค้นหา Cloud Monitoring เนื่องจาก discovery APIs ไม่สามารถใช้นโยบาย Prometheus matcher ได้ครบถ้วน
  • ระบบจะ ปฏิเสธโดยปิดกั้น: query ใดที่แยกวิเคราะห์ไม่ได้จะถูกปฏิเสธ แทนที่จะส่งไปโดยไม่มีการกรอง

[!IMPORTANT] เครื่องมืออื่นที่เปิดใช้อาจข้าม matchers เหล่านี้ได้ ปิดใช้ grafana_api_request ด้วย --disable-api, เครื่องมือ rendering ด้วย --disable-rendering และ Grafana Assistant ด้วย --disable-assistant (หรือ --disable-write) โดยเฉพาะอย่างยิ่ง render_grafana_app สามารถส่ง Prometheus queries ที่ไม่มีการกรองผ่าน source query_datasource ได้ --disable-dsquery จะปิด source นั้น แต่ไม่ได้ ปิดการ rendering แผงฝั่งเซิร์ฟเวอร์ snapshots ของ dashboard ที่มีอยู่แล้วก็อาจมี ข้อมูลที่ไม่มีการจำกัดสิทธิ์ได้เช่นกัน หากเป็นประเด็นสำคัญ ให้ใช้ --disable-snapshot

การบังคับใช้นโยบาย Loki query

--loki-enforced-matchers ช่วยให้ผู้ดูแลระบบจำกัด log streams ของ Loki ที่เซิร์ฟเวอร์อ่านได้ โดยนำ LogQL label matchers ชุดคงที่มาเชื่อมด้วย AND เข้ากับ native-Loki query ทุกตัวที่เซิร์ฟเวอร์ส่ง วิธีนี้มีประโยชน์เมื่อ datasource มี streams ที่ต้องไม่เปิดเผย (เช่น logs ที่อาจมีข้อมูลละเอียดอ่อน) แต่คุณไม่สามารถจำกัดสิทธิ์การเข้าถึงที่ระดับ Grafana หรือ Loki ได้ (OSS ไม่มีการควบคุมสิทธิ์เข้าถึง labels แยกตาม datasource หรือผู้ใช้)

# Only ever read prod/staging environments (allowlist)
./mcp-grafana --loki-enforced-matchers 'environment=~"prod|staging"' --disable-api

# Never read the vault or payments namespaces (exclusion)
./mcp-grafana --loki-enforced-matchers 'namespace!~"vault|payments"' --disable-api

วิธีการทำงาน:

  • ระบบจะแยกวิเคราะห์ matchers เพียงครั้งเดียวเมื่อเริ่มต้น (หากข้อมูลไม่ถูกต้อง เซิร์ฟเวอร์จะหยุดทำงาน) แล้วเพิ่มเข้าไปใน stream selector ทุกตัวของแต่ละ query เนื่องจาก Loki ใช้ AND กับ matchers ภายใน selector query ของผู้ใช้จึงทำได้เพียง จำกัด ผลลัพธ์ให้อยู่ภายในขอบเขตที่บังคับใช้เท่านั้น ไม่สามารถขยายขอบเขตได้ selector ของผู้ใช้ที่ขัดแย้งกับนโยบาย (เช่น ขอ {namespace="vault"} ภายใต้การยกเว้น) จะไม่คืนผลลัพธ์ใด ๆ
  • ครอบคลุม query_loki_logs, query_loki_stats, query_loki_patterns, list_loki_label_names และ list_loki_label_values
  • ระบบจะ ปฏิเสธโดยปิดกั้น: query ใดที่แยกวิเคราะห์ไม่ได้จะถูกปฏิเสธ แทนที่จะส่งไปโดยไม่มีการกรอง
  • datasource VictoriaLogs ใช้ LogsQL ซึ่งไม่สามารถเขียนใหม่ได้อย่างปลอดภัย ดังนั้นระบบจะปฏิเสธทั้งหมดขณะเปิดใช้การบังคับใช้นโยบาย
  • matchers ที่เป็นค่าลบล้วนไม่สามารถจำกัดขอบเขตของ endpoints สำหรับแจกแจง labels ได้ (Loki ปฏิเสธ selector เดี่ยวที่ไม่มี matcher เชิงบวก) ควบคุมกรณีนี้ด้วย --loki-label-enumeration-fallback (ค่าเริ่มต้นคือ reject หรือใช้ unfiltered เพื่ออนุญาตการแจกแจง label metadata โดยไม่มีขอบเขต — จะไม่มีการเปิดเผยบรรทัด log) matchers เชิงบวก/allowlist จะไม่ได้รับผลกระทบ

[!IMPORTANT] การบังคับใช้นโยบายมีผลเฉพาะกับเครื่องมือ Loki query เท่านั้น เครื่องมืออื่นอาจเข้าถึง ข้อมูล log ของ Loki ผ่านเส้นทางที่ไม่ผ่าน backend ที่บังคับใช้นโยบาย ดังนั้นหากต้องการให้ ข้อจำกัดมีผลจริง คุณต้องปิดใช้เครื่องมือเหล่านั้นด้วย:

  • --disable-api — grafana_api_request สามารถ query Loki datasource proxy ได้โดยตรง (ข้ามข้อจำกัดทั้งหมด)
  • --disable-rendering — get_panel_image render แผง Loki ฝั่งเซิร์ฟเวอร์ ทำให้ได้ภาพที่มีบรรทัด log ซึ่งไม่มีการจำกัดสิทธิ์
  • --disable-assistant — ask_assistant มอบหมายงานให้ Grafana Assistant ซึ่งอ่านข้อมูล Loki ฝั่งเซิร์ฟเวอร์จากทุก streams โดยจะลงทะเบียนเฉพาะเมื่อเปิดใช้เครื่องมือเขียน ดังนั้น --disable-write จึงปิดเครื่องมือนี้ได้เช่นกัน

เมื่อเริ่มต้น เซิร์ฟเวอร์จะบันทึกคำเตือนที่ระบุชื่อเครื่องมือแต่ละรายการที่ยังเปิดใช้อยู่ run_panel_query ปลอดภัย (ใช้เส้นทาง query ที่บังคับใช้นโยบาย) เครื่องมือ Tempo query traces ไม่ใช่ logs ของ Loki จึงไม่ใช่ช่องทางข้ามข้อจำกัด snapshots ของ dashboard (--disable-snapshot) ก็อาจฝังข้อมูลจากแผง log ที่บันทึกไว้นอกการบังคับใช้นโยบายได้เช่นกัน

การแก้ไขปัญหา

ความเข้ากันได้ของ Grafana เวอร์ชันต่าง ๆ

หากพบข้อผิดพลาดต่อไปนี้เมื่อใช้เครื่องมือที่เกี่ยวข้องกับ datasource:

get datasource by uid : [GET /datasources/uid/{uid}][400] getDataSourceByUidBadRequest {"message":"id is invalid"}

โดยทั่วไปหมายความว่าคุณกำลังใช้ Grafana เวอร์ชันก่อน 9.0 API endpoint /datasources/uid/{uid} เริ่มมีใน Grafana 9.0 และการดำเนินการกับ datasource จะล้มเหลวในเวอร์ชันก่อนหน้า

วิธีแก้ไข: อัปเกรด Grafana instance เป็นเวอร์ชัน 9.0 ขึ้นไปเพื่อแก้ปัญหานี้

การพัฒนา

ยินดีรับการมีส่วนร่วม! โปรดอ่าน CONTRIBUTING.md ก่อน — เอกสารนี้อธิบายว่าสิ่งใดเหมาะจะเพิ่มในเซิร์ฟเวอร์นี้ และวิธีเสนอแนวคิด

หากคุณกำลัง เพิ่มเครื่องมือใหม่ โปรด ส่งข้อเสนอเครื่องมือ ก่อนเริ่มเขียนโค้ด เครื่องมือทุกตัวที่เปิดใช้เป็นค่าเริ่มต้นจะถูกส่งให้โมเดลในทุกคำขอของผู้ใช้ทุกคน ดังนั้นเราจึงอยากหารือเกี่ยวกับแนวคิดก่อน มากกว่าปฏิเสธ pull request ที่ทำเสร็จแล้ว การแก้บั๊ก เอกสาร การทดสอบ และพารามิเตอร์ใหม่สำหรับเครื่องมือที่มีอยู่ ไม่ต้องส่งข้อเสนอ — ส่ง PR ได้เลย

โปรเจกต์นี้เขียนด้วย Go เวอร์ชันของเครื่องมือและงานพัฒนาอยู่ใน mise.toml: ติดตั้ง mise, เรียกใช้ mise install เพื่อรับเครื่องมือเวอร์ชันที่กำหนดไว้ และเรียกใช้ mise tasks เพื่อแสดงรายการงาน

หากต้องการเรียกใช้เซิร์ฟเวอร์ในเครื่องด้วยโหมด STDIO (ซึ่งเป็นค่าเริ่มต้นสำหรับการพัฒนาในเครื่อง) ให้ใช้:

mise run run

หากต้องการเรียกใช้เซิร์ฟเวอร์ในเครื่องด้วยโหมด SSE ให้ใช้:

go run ./cmd/mcp-grafana --transport sse

คุณยังสามารถเรียกใช้เซิร์ฟเวอร์โดยใช้ SSE transport ภายใน Docker image ที่สร้างขึ้นเองได้ เช่นเดียวกับ Docker image ที่เผยแพร่ entrypoint ของ image ที่สร้างเองนี้จะใช้โหมด SSE เป็นค่าเริ่มต้น หากต้องการสร้าง image ให้ใช้:

mise run build-image

และหากต้องการเรียกใช้ image ในโหมด SSE (ค่าเริ่มต้น) ให้ใช้:

docker run -it --rm -p 8000:8000 mcp-grafana:latest

หากต้องการเรียกใช้ในโหมด STDIO แทน ให้กำหนดค่า transport ใหม่:

docker run -it --rm mcp-grafana:latest -t stdio

การทดสอบ

มีการทดสอบให้เลือกสามประเภท:

  1. Unit Tests (ไม่ต้องใช้ dependencies ภายนอก):
mise run test-unit

คุณยังสามารถเรียกใช้ unit tests ด้วย:

mise run test
  1. Integration Tests (ต้องเปิดใช้งาน docker containers):
mise run test-integration
  1. Cloud Tests (ต้องมี Grafana instance บน cloud และข้อมูลรับรอง):
mise run test-cloud

หมายเหตุ: Cloud tests จะได้รับการกำหนดค่าโดยอัตโนมัติใน CI สำหรับการพัฒนาในเครื่อง คุณต้องตั้งค่า Grafana Cloud instance และข้อมูลรับรองของคุณเอง

Integration tests ที่ครอบคลุมยิ่งขึ้นต้องมี Grafana instance ที่กำลังทำงานในเครื่องบนพอร์ต 3000 คุณสามารถเริ่มใช้งานด้วย Docker Compose:

docker-compose up -d

หากคุณกำลังเพิ่มเครื่องมือ โปรดเพิ่ม integration tests สำหรับเครื่องมือนั้นด้วย การทดสอบที่มีอยู่เป็นจุดเริ่มต้นที่ดี

การตรวจสอบโค้ด

หากต้องการตรวจสอบโค้ด ให้เรียกใช้:

mise run lint

คำสั่งนี้รวม linter แบบกำหนดเองที่ตรวจหาเครื่องหมายจุลภาคที่ไม่ได้ escape ใน struct tags ของ jsonschema เครื่องหมายจุลภาคใน fields ของ description ต้อง escape ด้วย \\, เพื่อป้องกันการตัดข้อมูลโดยไม่แจ้งเตือน คุณสามารถเรียกใช้เฉพาะ linter นี้ได้ด้วย:

mise run lint-jsonschema

ดูรายละเอียดเพิ่มเติมได้ที่ เอกสาร JSONSchema Linter

ใบอนุญาต

โปรเจกต์นี้เผยแพร่ภายใต้ Apache License, Version 2.0