Enterprise Open source

Anonymous usage statistics

The Grafana MCP server can report limited usage statistics about itself to Grafana Labs. Grafana Labs uses this data to improve tools and investigate failures.

To preserve anonymity, the emitted data describes the shape of usage only. Things like tool arguments, resource names, dashboards, queries, log lines, error messages and credentials are never sent, and neither is the Grafana instance’s URL, hostname, stack slug, organisation name or organisation ID.

Nothing an MCP client reports about itself - things like name and version - is collected. Any other value that comes from outside the binary is reduced to a fixed vocabulary before being emitted, so we don’t emit a potentially-identifying value.

Note

Usage statistics reporting is disabled by default. To disable reporting explicitly, refer to Opt out.

Before you begin

Understand which data is collected

Each server process generates one identifier, process_id, as a random UUID in memory when it starts.

Every event carries the following data:

FieldDescriptionExample
serviceAlways mcp-grafana.mcp-grafana
versionThe version of the mcp-grafana binary.1.4.2
osOperating system.linux, darwin, windows
archCPU architecture.amd64, arm64
process_idA random per-process UID.UUID
report_reasonWhy this event was sent: interval (once every 4h) or shutdown.interval
process_uptime_msHow long the process had been running when the event was built, in milliseconds.1234
report_seqThis process’s reports numbered from 1. A gap in the sequence for a process_id is a report that was built and never arrived.3
tools_calledComma-separated names of the tools called since the previous event.list_datasources,query_prometheus
tool_callsA nested object keyed by tool name, each holding calls and errors.{"query_prometheus":{"calls":4,"errors":1}}
grafana_versionThe version the Grafana instance reported. This is read from a response the server had already fetched for its own reasons, and truncated to 64 bytes. Absent whenever that version is not already known.12.1.0
target_kindcloud for Grafana Cloud or self_hosted for other hostnames. Grafana Cloud instances reached through custom domains report self_hosted.cloud
auth_methodThe credential category the connection resolved, from a fixed vocabulary.service_account_token
transportThe transport the server is running: stdio, sse or streamable-http.stdio
flagsThe names of the command-line flags that were set. No flag values are sent.disable-write,transport
env_setThe names of the configuration environment variables that are set. No free-form values are sent.GRAFANA_SERVICE_ACCOUNT_TOKEN,GRAFANA_URL
enabled_toolsThe tool category names that are active.alerting,dashboard,search
disabled_toolsThe tool category names a --disable-<category> flag turned off.oncall
tls_enabledWhether the server is serving HTTPS (only the streamable-http transport does).false
metrics_enabledWhether the Prometheus /metrics endpoint is served.true
dynamic_multi_orgWhether per-call organisation selection is enabled.false
proxied_enabledWhether proxied tools from external MCP servers are enabled.true

Server-side enrichment

Reports are received by Grafana’s usage-stats service, the same service that receives usage reports from Grafana, Loki, Mimir and Tempo. On receipt, the service adds two pieces of information derived from the connection rather than from the event:

  • A coarse geographic region, for example, a country or subdivision, taken from headers added by the CDN edge.
  • The network organisation name from a whois lookup of the connecting IP address, which typically resolves to your ISP, your cloud provider or your employer’s network.

Inspect what would be sent

To inspect the report, set either the --usage-stats=log flag or the GRAFANA_USAGE_STATS=log environment variable. In this mode, the server prints each event to stderr and doesn’t send it:

shell
GRAFANA_USAGE_STATS=log mcp-grafana

The server prints a report every four hours and on graceful shutdown. To inspect a report sooner, stop the server gracefully after you run the tool calls you want to inspect. If you run the server in a terminal, press Ctrl+C.

Under the stdio transport, stderr goes wherever your MCP client sends the server’s logs. Read the printed events there.

How the report is sent

PropertyValue
Destinationhttps://stats.grafana.org/mcp-grafana-usage-report
MethodA single POST with the event as a JSON object
AttemptsOne. A failed report is never retried and never stored.
TimingEvery four hours, and once more as the process exits
Time limitOne second for the shutdown report, so exit is never delayed longer than that

Because a failed report is never retried, and the counters reset when a report is built rather than when it arrives, a total summed across a process_id is a floor rather than an exact count. report_seq is how a missing report is identified.

To send reports somewhere else, set GRAFANA_USAGE_STATS_ENDPOINT to another URL. This changes the destination only; it is not an opt-out.

Opt out

Use one of the following controls. The --usage-stats flag overrides GRAFANA_USAGE_STATS, and both override DO_NOT_TRACK. Unrecognized mode values disable reporting. Only DO_NOT_TRACK=1 has an effect; other values don’t change the reporting mode.

The controls appear in order of precedence, highest first:

  1. --usage-stats flag: set it to enabled, disabled or log.

    shell
    mcp-grafana --usage-stats=disabled
  2. GRAFANA_USAGE_STATS environment variable: set it to enabled, disabled or log.

    shell
    export GRAFANA_USAGE_STATS=disabled
  3. DO_NOT_TRACK environment variable: set it to 1 to disable reporting, following the cross-tool DO_NOT_TRACK convention.

    shell
    export DO_NOT_TRACK=1

Next steps