Skip to main content
Glama
lukleh

mcp-read-only-grafana

by lukleh

MCP Read-Only Grafana Server

Tests

A secure MCP (Model Context Protocol) server for Grafana with a read-only default and a separate mcp-grafana-write command for write-capable workflows.

Default layout:

  • Live config: ~/.config/lukleh/mcp-read-only-grafana/connections.yaml

  • Credentials: injected via the MCP client or shell environment

  • Rotated session state: ~/.local/state/lukleh/mcp-read-only-grafana/session_tokens.json

  • Cache: ~/.cache/lukleh/mcp-read-only-grafana/

Compatibility: Targeted and tested against Grafana 9.5.x. Newer versions (e.g., 10.x) should work for read-only endpoints but may expose extra fields not covered here.

Features

  • Read-only by default - mcp-read-only-grafana exposes the safe default surface

  • Separate write command - mcp-grafana-write enables dashboard saves, alerting writes, folders, and related mutations from the same package

  • API key first authentication - Prefers Grafana API keys or service-account tokens for stable machine access

  • Deprecated session-cookie fallback - Still supports Grafana session cookies, including automatic capture of rotated cookies in session_tokens.json

  • Hierarchical dashboard navigation - Handle large dashboards efficiently with lightweight metadata queries and per-panel detail fetching

  • Multiple instances - Support for multiple Grafana connections

  • Comprehensive API coverage - Access dashboards, panels, folders, datasources, and alerts

  • Security focused - Timeouts, SSL verification, and secure token storage

Related MCP server: grafana-mcp

Prerequisites

  • Python 3.11 or higher

  • uv

  • Grafana credentials for at least one instance

  • an MCP client such as Claude Code or Codex

Quick Start

1. Install the Server

# Run the published package without cloning the repository
uvx mcp-read-only-grafana@latest --write-sample-config

# Or install it once and reuse the command directly
uv tool install mcp-read-only-grafana
mcp-read-only-grafana --write-sample-config

# The same install also provides the separate write-capable command
mcp-grafana-write --print-paths

When using uvx, prefer mcp-read-only-grafana@latest in user-facing docs and MCP client configs. This avoids reusing a stale cached tool environment after a new release is published. For the separate write-capable command, use uvx --from mcp-read-only-grafana@latest mcp-grafana-write.

The command above writes a starter config and matching schema to:

  • ~/.config/lukleh/mcp-read-only-grafana/connections.yaml

  • ~/.config/lukleh/mcp-read-only-grafana/connections.schema.json

The live runtime config file used by the installed server is ~/.config/lukleh/mcp-read-only-grafana/connections.yaml.

2. Confirm Runtime Paths

uvx mcp-read-only-grafana@latest --print-paths

Where connections.yaml Lives

By default, the server reads the live runtime config from:

  • ~/.config/lukleh/mcp-read-only-grafana/connections.yaml

On this machine, that expands to:

  • /Users/<your-user>/.config/lukleh/mcp-read-only-grafana/connections.yaml

Important distinction:

  • The live runtime file is ~/.config/lukleh/mcp-read-only-grafana/connections.yaml

  • The checked-in repo sample is connections.yaml.sample

The sample file documents the format, but it is not the file the installed server reads unless you explicitly copy or generate it into the runtime config directory.

3. Edit the Connections File

Edit ~/.config/lukleh/mcp-read-only-grafana/connections.yaml with your Grafana instances:

- connection_name: production_grafana
  url: https://grafana.example.com
  description: Production Grafana instance
  api_key: glsa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

- connection_name: staging_grafana
  url: https://staging-grafana.example.com
  description: Staging Grafana instance

4. Set Up Authentication

You can keep credentials either directly in connections.yaml or in the environment used to launch the server. Prefer api_key for normal use. For local shell testing you can export credentials directly; for normal MCP use, inject them through the client config when you want runtime overrides.

YAML credentials:

- connection_name: production_grafana
  url: https://grafana.example.com
  api_key: glsa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

You can authenticate with either a Grafana API key or a deprecated session cookie fallback:

  • API key or service-account token:

    export GRAFANA_API_KEY_PRODUCTION_GRAFANA=your_api_key_here
  • Deprecated session cookie fallback:

    export GRAFANA_SESSION_PRODUCTION_GRAFANA=your_session_token_here

Precedence is:

  • Rotated session cookies in session_tokens.json

  • Runtime environment variables

  • Credentials declared in connections.yaml

If both a session token and an API key are available for the same connection, the server prefers the API key.

Deprecated: How to Get a Grafana Session Token

  1. Log in to Grafana in a web browser

  2. Open developer tools

  3. Go to Application/Storage -> Cookies

  4. Find the cookie named grafana_session or grafana_sess

  5. Copy the value and export or inject it as GRAFANA_SESSION_<CONNECTION_NAME>

Use this only as a temporary fallback. Browser session cookies rotate and expire quickly, so they are less reliable than API keys for MCP usage.

How to Get a Grafana API Key

  1. In Grafana, go to Administration -> Service Accounts or Configuration -> API Keys

  2. Create a key with the minimum required permissions

  3. Export or inject it as GRAFANA_API_KEY_<CONNECTION_NAME>

If you start with a session cookie, the server will keep refreshed cookies in ~/.local/state/lukleh/mcp-read-only-grafana/session_tokens.json. On later requests, that persisted state file takes precedence over the live GRAFANA_SESSION_* environment value and any static session_token in connections.yaml until you update or remove it.

5. Configure Your MCP Client

Claude Code

claude mcp add mcp-read-only-grafana \
  --scope user \
  -e GRAFANA_API_KEY_PRODUCTION_GRAFANA=your_api_key_here \
  -- uvx mcp-read-only-grafana@latest

Codex

codex mcp add mcp-read-only-grafana \
  --env GRAFANA_API_KEY_PRODUCTION_GRAFANA=your_api_key_here \
  -- uvx mcp-read-only-grafana@latest

If you absolutely need the deprecated session-cookie fallback, swap GRAFANA_API_KEY_* for GRAFANA_SESSION_* in the MCP client config.

If you want the write-capable endpoints, launch the separate write command from the same package:

uvx --from mcp-read-only-grafana@latest mcp-grafana-write

For a persistent install created with uv tool install mcp-read-only-grafana, run mcp-grafana-write directly.

6. Restart and Test

Restart your MCP client and try a simple query such as:

List all dashboards in the production Grafana instance.

Command Line Testing

# Show the resolved runtime paths
uvx mcp-read-only-grafana@latest --print-paths

# Write or refresh the default connections.yaml
uvx mcp-read-only-grafana@latest --write-sample-config
uvx mcp-read-only-grafana@latest --write-sample-config --overwrite

# Run the server with the default home-directory config
uvx mcp-read-only-grafana@latest

# Run the separate write-capable command from the same package
uvx --from mcp-read-only-grafana@latest mcp-grafana-write

# Point the server at a different config root
uvx mcp-read-only-grafana@latest --config-dir /path/to/config-dir

# Validate the generated configuration
uvx mcp-read-only-grafana@latest validate-config

# Test all configured Grafana connections
uvx mcp-read-only-grafana@latest test-connection

# Test one specific connection
uvx mcp-read-only-grafana@latest test-connection production_grafana

Local Development

If you want to work on the repository itself:

git clone https://github.com/lukleh/mcp-read-only-grafana.git
cd mcp-read-only-grafana
uv sync --extra dev
uv run pytest -q
uv run mcp-read-only-grafana --print-paths
uv run mcp-grafana-write --print-paths

The checked-in sample file remains available at connections.yaml.sample for documentation and review, but package users should prefer --write-sample-config.

Even during local development, the server still uses the resolved runtime config path by default. It does not automatically read the repo's connections.yaml.sample.

Available MCP Tools

list_connections

List all configured Grafana instances.

Returns: JSON with connection names, URLs, and descriptions

get_health

Check Grafana instance health and version.

Parameters:

  • connection_name (required): Name of the Grafana connection

Returns: Health status and version information

search_dashboards

Search for dashboards by name or tag.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • query (optional): Search query for dashboard names

  • tag (optional): Tag to filter dashboards

  • limit (optional): Maximum results per page (Grafana default 1000, max 5000)

  • page (optional): Page number (1-indexed)

  • fields (optional): Subset of Grafana fields to return (e.g., uid, title, url, type, tags, folderTitle, folderUid)

Returns: List of matching dashboards with UIDs, titles, and tags

get_dashboard_info

Get lightweight dashboard metadata and panel list (without full panel definitions). Recommended first step for exploring dashboards, especially large ones.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • dashboard_uid (required): UID of the dashboard

Returns: Dashboard metadata, variables, and list of all panels with basic info

get_dashboard_panel

Get full configuration for a single panel from a dashboard. Use this after get_dashboard_info() to explore specific panels in detail.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • dashboard_uid (required): UID of the dashboard

  • panel_id (required): Panel ID to retrieve

Returns: Full panel JSON including queries, transformations, and field config

get_dashboard

Get complete dashboard definition. Use with caution for large dashboards - may exceed token limits. Prefer get_dashboard_info() + get_dashboard_panel() for large dashboards.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • dashboard_uid (required): UID of the dashboard

Returns: Full dashboard JSON including panels, variables, and settings

get_dashboard_panels

Get simplified panel information from a dashboard. Returns basic panel metadata without full configuration.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • dashboard_uid (required): UID of the dashboard

Returns: List of panels with IDs, titles, types, and descriptions

list_folders

List all folders in Grafana.

Parameters:

  • connection_name (required): Name of the Grafana connection

Returns: Folder hierarchy with IDs and titles

list_folder_dashboards

List all dashboards within a specific folder.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • folder_uid (required): UID of the folder

  • limit (optional): Maximum results per page

  • page (optional): Page number

  • fields (optional): Subset of Grafana fields (e.g., uid, title, url, tags, folderUid)

Returns: List of dashboards in the folder with UIDs, titles, and URLs

list_datasources

List configured data sources.

Parameters:

  • connection_name (required): Name of the Grafana connection

Returns: Data source names, types, UIDs, and configuration

get_datasource_health

Run the datasource-specific Grafana health check when the datasource plugin supports it.

Note: Not every datasource plugin implements GET /api/datasources/uid/:uid/health. When Grafana returns 404, the MCP returns a structured unsupported or not_found result instead of surfacing the raw error.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • datasource_uid (required): UID of the datasource

Returns: Health information for supported datasources, or a structured explanation when the health endpoint is unavailable

query_prometheus

Execute a PromQL query against a Prometheus datasource.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • datasource_uid (required): UID of the Prometheus datasource

  • query (required): PromQL query string

  • time_from (optional): Start time (RFC3339 or relative like "now-1h")

  • time_to (optional): End time (RFC3339 or "now")

  • step (optional): Query resolution step (e.g., "15s", "1m")

Returns: Query results with timestamps and values

query_loki

Execute a LogQL query against a Loki datasource.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • datasource_uid (required): UID of the Loki datasource

  • query (required): LogQL query string

  • time_from (optional): Start time (RFC3339 or relative like "now-1h")

  • time_to (optional): End time (RFC3339 or "now")

  • limit (optional): Maximum number of log lines (default: 100)

Returns: Log query results with timestamps and log lines

explore_query

Execute Grafana Explore queries via the /api/ds/query endpoint.

Note: This is the only tool that issues an HTTP POST (required by Grafana Explore). The call is still read-only and does not mutate Grafana state.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • queries (required): List of Explore query definitions (including datasource, refId, etc.)

  • range_from (optional): Relative or absolute start time (e.g., now-6h)

  • range_to (optional): End time (e.g., now)

  • max_data_points (optional): Maximum number of datapoints to request

  • interval_ms (optional): Query interval in milliseconds

  • additional_options (optional): Extra request fields that must not overlap with reserved keys

Returns: Raw Explore results as returned by Grafana

list_alerts

List alert rules.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • folder_uid (optional): Filter alerts by folder

Returns: Alert rules with status and conditions

get_alert_rule_by_uid

Get a specific alert rule by its UID.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • alert_uid (required): UID of the alert rule

Returns: Alert rule details including conditions, labels, and annotations

get_alert_rules_with_state

Get all alert rules with their current evaluation state. This is the same endpoint used by Grafana's Alert List panel - useful for checking if an alert is working after creation.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • state (optional): Filter by state (e.g., "firing", "pending", "inactive")

  • rule_name (optional): Filter by rule name (partial match)

Returns: Rules organized by namespace with current state (Normal, Pending, Alerting, NoData, Error), health status, and evaluation info

get_firing_alerts

Get currently firing alert instances from Alertmanager. Returns alerts that have transitioned from Pending to Firing state.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • filter_labels (optional): Label matchers (e.g., ["alertname=HighCPU", "severity=critical"])

  • silenced (optional): Include silenced alerts (default: true)

  • inhibited (optional): Include inhibited alerts (default: true)

  • active (optional): Include active alerts (default: true)

Returns: List of firing alert instances with labels, annotations, startsAt, and other metadata

get_alert_state_history

Get alert state transition history. Useful for debugging alert behavior and understanding evaluation patterns.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • rule_uid (optional): Filter by specific rule UID

  • labels (optional): Label matchers to filter history

  • from_time (optional): Start time (ISO 8601 or relative like "now-1h")

  • to_time (optional): End time (ISO 8601 or relative like "now")

  • limit (optional): Maximum number of history entries

Returns: State history entries with timestamps and state transitions (Normal, Pending, Alerting, NoData, Error)

list_provisioned_alert_rules

Fetch all alert rules through Grafana's provisioning API (GET /api/v1/provisioning/alert-rules) to audit provisioned definitions exactly as stored on the server.

Parameters:

  • connection_name (required): Name of the Grafana connection

Returns: Provisioned alert rule payload grouped by folder/namespace and alert rule metadata

list_annotations

List annotations (events marked on dashboards).

Parameters:

  • connection_name (required): Name of the Grafana connection

  • time_from (optional): Start time for annotation search

  • time_to (optional): End time for annotation search

  • dashboard_id (optional): Filter by dashboard ID

  • tags (optional): List of tags to filter by

Returns: Annotations with timestamps, text, and tags

get_dashboard_versions

Get version history for a dashboard.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • dashboard_uid (required): UID of the dashboard

Returns: List of dashboard versions with timestamps and change messages

get_current_org

Get current organization information.

Parameters:

  • connection_name (required): Name of the Grafana connection

Returns: Organization name and ID

get_current_user

Return the profile for the currently authenticated Grafana user (name, login, email, role, theme, etc.).

Note: This endpoint only works with session-based authentication. API keys are service account tokens and are not associated with a user profile. When API key auth is in use, the MCP returns a structured unavailable result instead of surfacing Grafana's raw 404 response.

Parameters:

  • connection_name (required): Name of the Grafana connection

Returns: User object as provided by GET /api/user

list_users

List all users in the organization.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • page (optional): Page number

  • per_page (optional): Page size

  • fields (optional): Subset of Grafana fields (userId, email, name, login, role, lastSeenAt, lastSeenAtAge)

Returns: User list with IDs, names, emails, and roles

list_teams

List all teams in the organization.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • page (optional): Page number

  • per_page (optional): Page size

  • fields (optional): Subset of Grafana fields (id, uid, name, email, memberCount)

Returns: Team list with IDs, names, and member counts


Write Tools (requires mcp-grafana-write)

The following tools are only available when running the separate mcp-grafana-write command. They enable write operations for dashboards, folders, and Grafana alerting resources. The required Grafana permission scope depends on the specific endpoint.

Warning: These tools can create, modify, and delete Grafana resources. Use with caution.

Dashboards

save_dashboard

Create or update a dashboard using raw Grafana dashboard JSON.

When the dashboard UID already exists, the server first fetches the live dashboard and reuses its current id and version. If you do not pass folder_uid or folder_id, it also preserves the current folder so updates do not accidentally move the dashboard to the root level.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • dashboard (required): Raw Grafana dashboard model JSON object

  • folder_uid (optional): Folder UID override for the save target

  • folder_id (optional): Folder ID override for the save target

  • message (optional): Dashboard version history message

  • overwrite (optional): Set to true to overwrite an existing dashboard with the same UID

Returns: Grafana's save-dashboard response with id, uid, url, status, and version

Folders

create_folder

Create a new folder in Grafana.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • title (required): Folder title

  • uid (optional): Explicit folder UID

  • parent_uid (optional): Parent folder UID for nested folders

Returns: Created folder details including UID and URL

Alert Rules

create_alert_rule

Create a new alert rule via the provisioning API.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • rule (required): Alert rule definition (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the alert editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Created alert rule with UID

update_alert_rule

Update an existing alert rule.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • rule_uid (required): UID of the alert rule to update

  • rule (required): Updated alert rule definition (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the alert editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Updated alert rule

delete_alert_rule

Delete an alert rule.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • rule_uid (required): UID of the alert rule to delete

  • editable_in_ui (optional): Defaults to true and keeps related provisioning resources editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Confirmation of deletion

update_rule_group

Update a rule group's interval configuration.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • folder_uid (required): UID of the folder containing the rule group

  • group_name (required): Name of the rule group

  • config (required): Rule group configuration (JSON object with interval, etc.)

  • editable_in_ui (optional): Defaults to true and keeps the rule group and its alerts editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Updated rule group configuration

Contact Points

create_contact_point

Create a new contact point for alert notifications.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • contact_point (required): Contact point definition (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the contact point editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Created contact point with UID

update_contact_point

Update an existing contact point.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • contact_point_uid (required): UID of the contact point to update

  • contact_point (required): Updated contact point definition (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the contact point editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Updated contact point

delete_contact_point

Delete a contact point.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • contact_point_uid (required): UID of the contact point to delete

  • editable_in_ui (optional): Defaults to true and keeps related provisioning resources editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Confirmation of deletion

Notification Policies

set_notification_policies

Set the entire notification policy tree.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • policies (required): Notification policy tree (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the notification policy tree editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Updated notification policies

delete_notification_policies

Reset notification policies to default.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • editable_in_ui (optional): Defaults to true and keeps the notification policy tree editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Confirmation of reset

Mute Timings

create_mute_timing

Create a new mute timing for silencing alerts.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • mute_timing (required): Mute timing definition (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the mute timing editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Created mute timing

update_mute_timing

Update an existing mute timing.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • mute_timing_name (required): Name of the mute timing to update

  • mute_timing (required): Updated mute timing definition (JSON object)

  • editable_in_ui (optional): Defaults to true and keeps the mute timing editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Updated mute timing

delete_mute_timing

Delete a mute timing.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • mute_timing_name (required): Name of the mute timing to delete

  • editable_in_ui (optional): Defaults to true and keeps related provisioning resources editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Confirmation of deletion

Notification Templates

set_notification_template

Create or update a notification template.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • template_name (required): Name of the template

  • template (required): Template definition (JSON object with template field)

  • editable_in_ui (optional): Defaults to true and keeps the notification template editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Created/updated template

delete_notification_template

Delete a notification template.

Parameters:

  • connection_name (required): Name of the Grafana connection

  • template_name (required): Name of the template to delete

  • editable_in_ui (optional): Defaults to true and keeps related provisioning resources editable in the Grafana UI. Set to false to keep Grafana's provisioned behavior

Returns: Confirmation of deletion


Configuration Options

Connection Settings

Each connection in connections.yaml supports:

  • connection_name: Unique identifier (letters, numbers, underscores)

  • url: Grafana instance URL (without trailing slash)

  • description: Human-readable description

  • timeout: Request timeout in seconds (default: 30)

  • verify_ssl: Verify SSL certificates (default: true)

Environment Variables

  • GRAFANA_API_KEY_<CONNECTION_NAME>: Preferred Grafana API key / service-account token

  • GRAFANA_SESSION_<CONNECTION_NAME>: Deprecated session-token fallback

  • GRAFANA_TIMEOUT_<CONNECTION_NAME>: Override timeout for specific connection

Security

The server implements a secure-by-default model:

  1. Read-only by default - mcp-read-only-grafana only performs safe read operations

  2. Separate write command - mcp-grafana-write exposes write-capable tools when you intentionally opt into that command

  3. Timeout protection - Configurable request timeouts (default: 30s)

  4. SSL verification - Enabled by default for all connections

  5. Credential security - Keep API keys or fallback session tokens in local config, env, or MCP-managed state only

Default Mode (Read-Only)

When launched via mcp-read-only-grafana, the server only performs HTTP GET requests:

  • GET - Read operations only (dashboards, datasources, alerts, users, teams, etc.)

  • POST - Limited to read-only query execution (/api/ds/query for Explore)

It is impossible to modify, create, or delete any Grafana resources in default mode.

Write Mode (mcp-grafana-write)

When running via mcp-grafana-write, additional write operations are enabled:

  • POST - Save dashboards, create folders, create new alert rules, contact points, mute timings

  • PUT - Update existing alert rules, contact points, notification policies, mute timings, templates

  • DELETE - Remove alert rules, contact points, notification policies, mute timings, templates

Warning: The write command enables destructive operations. Only use it when you need write-capable Grafana access. The API key or deprecated session fallback must have the Grafana permissions required by the endpoints you plan to call.

Additional Security Considerations

  1. Credentials are sensitive - Never commit real credentials or your local connections.yaml to version control

  2. Automatic fallback refresh - Deprecated session tokens are automatically captured and persisted when Grafana rotates them (API keys are static)

  3. Permission scope - The server inherits the read permissions of the provided API key or deprecated session fallback

  4. Prefer local-only secret storage - Keep secrets in local connections.yaml, MCP-injected env, or the rotated session_tokens.json cache, never in source-controlled config

Troubleshooting

Session Token Management

Session tokens are deprecated and should be used only as a temporary fallback.

Automatic Token Refresh: Grafana rotates session tokens every 10 minutes. When you are using the deprecated session-cookie fallback, the server automatically:

  • Captures refreshed tokens from Grafana API response headers

  • Updates tokens in memory immediately

  • Persists new tokens back to session_tokens.json

  • Reuses those rotated tokens on later requests

If you manually need to update a fallback session token:

  1. Update the session_token in connections.yaml or the GRAFANA_SESSION_* value in your MCP client env/current shell

  2. Also remove or update the cached value in session_tokens.json if one was already persisted

  3. No restart is needed once the active credential source has been updated

Authentication Failed

If you get authentication errors despite automatic refresh:

  1. Prefer switching to an API key if you are still using the deprecated session fallback

  2. Verify the current token or API key is valid in connections.yaml, your current environment, or session_tokens.json

  3. Check that the state directory is writable (needed for automatic token persistence)

  4. Ensure the environment variable name matches the connection name (e.g., GRAFANA_SESSION_PRODUCTION_GRAFANA for connection_name: production_grafana)

Connection Timeout

If requests are timing out:

  1. Increase the timeout in connections.yaml

  2. Or set GRAFANA_TIMEOUT_<CONNECTION_NAME> in the current environment

  3. Check network connectivity to the Grafana instance

SSL Verification Issues

For self-signed certificates (not recommended for production):

- connection_name: local_grafana
  url: https://localhost:3000
  verify_ssl: false

Development

Available Commands

See all available commands:

just

Common commands:

just install          # Install dependencies
just validate         # Validate configuration
just test-connection  # Test Grafana connections
just run              # Run the server
just lint             # Run linter
just lint-fix         # Auto-fix linting issues
just test             # Run tests

Running Tests

just test
# or
uv run pytest

Code Formatting

just lint
# or
uv run ruff check src/mcp_read_only_grafana/ tests/
uv run mcp-read-only-grafana validate-config
uv run mcp-read-only-grafana test-connection

License

MIT License - See LICENSE file for details

Available Tools

29 tools
explore_queryB

Execute a Grafana Explore query via the /api/ds/query endpoint.

Args: connection_name: Name of the Grafana connection queries: List of Explore query definitions to execute range_from: Optional relative or absolute start time (e.g., 'now-6h') range_to: Optional end time (e.g., 'now') max_data_points: Optional maximum number of datapoints to request interval_ms: Optional query interval in milliseconds additional_options: Extra fields to merge into the request body

Returns: JSON string with the query response payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
queriesYes
range_toNo
range_fromNo
interval_msNo
connection_nameYes
max_data_pointsNo
additional_optionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of disclosing behavioral traits. It does not mention whether the operation is read-only, whether it can trigger side effects, auth requirements, rate limits, or any other safety-relevant behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured with an Args section, and includes a clear Returns note. Every sentence serves a purpose and there is no redundant or misleading content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the parameters and return type at a basic level, but lacks detail about the expected structure of a query definition, the exact response format, error behavior, or how this endpoint differs from other query tools. It is adequate for a simple use case but not fully complete for a complex Explore query.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description gives a brief explanation for every parameter, including meaning for range_from, range_to, max_data_points, interval_ms, and additional_options. This adds useful semantics beyond the raw schema, though some explanations like 'query definitions' and 'extra fields' remain somewhat vague.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Execute') and the resource ('a Grafana Explore query via the /api/ds/query endpoint'). However, it does not explicitly differentiate this generic Explore query capability from the more specific sibling tools like query_prometheus and query_loki.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus the alternative query tools, or when it would be inappropriate to use. There is no explicit scoping, exclusions, or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alert_rule_by_uidA

Get detailed information about a specific alert rule.

Args: connection_name: Name of the Grafana connection alert_uid: UID of the alert rule

Returns: JSON string with alert rule details.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full behavioral burden. It only says 'Get detailed information', which implies a read-only operation, but it does not disclose permissions, side effects, error behavior, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, with a clear purpose line, short parameter explanations, and a return-value note. There is no redundant or extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool, the description provides the essential purpose, parameter meanings, and return type. However, it lacks usage guidance, behavioral transparency, and details about error cases or output structure, which are important for a fully self-sufficient description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args section gives meaningful explanation for both parameters: `connection_name` identifies the Grafana connection and `alert_uid` is the alert rule's UID. The schema only provides types and titles, so the description adds necessary semantic context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action, 'Get detailed information about a specific alert rule', with a unique identifier parameter (`alert_uid`). This distinguishes it from sibling list/search tools such as `list_alerts` and `get_alert_rules_with_state`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance is provided, and there is no comparison to sibling alert-rule tools. The description implies use for retrieving one specific alert rule by UID, but it does not state when this tool is preferred over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alert_rules_with_stateA

Get all alert rules with their current evaluation state.

This endpoint returns rules organized by namespace with their current state (Normal, Pending, Alerting, NoData, Error). It's the same endpoint used by Grafana's Alert List panel - useful for checking if an alert is working after creation.

Args: connection_name: Name of the Grafana connection state: Optional filter by state (e.g., "firing", "pending", "inactive") rule_name: Optional filter by rule name (partial match)

Returns: JSON string with rules organized by namespace, each including state, health, and evaluation info.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo
rule_nameNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does mention the return format (JSON string with state, health, and evaluation info) and implies a read-only get, but it does not discuss side effects, permissions, error behavior, or filtering nuances.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well structured, with a clear lead sentence followed by a brief explanatory note and per-parameter descriptions. There is no redundant or vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool returning a JSON string, the description covers purpose, filter parameters, and return contents. It does not include an example response or error cases, but given the tool's simplicity and the presence of related siblings, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are individually described: connection_name identifies the Grafana connection, state filters by state, and rule_name filters by partial match. The description also lists possible state values (Normal, Pending, Alerting, NoData, Error), adding meaning beyond the bare schema, though it lacks examples and constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool retrieves all alert rules with their current evaluation state, organized by namespace. It also distinguishes itself from sibling tools by noting it is the same endpoint used by Grafana's Alert List panel and is useful for checking whether an alert is working after creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: checking if an alert is working after creation. It does not explicitly enumerate alternatives like get_firing_alerts or get_alert_rule_by_uid, but the focus on all rules with current state makes the intended scenario clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alert_state_historyA

Get alert state transition history.

Returns the history of state changes for alert rules, including transitions between Normal, Pending, Alerting, NoData, and Error states. Useful for debugging alert behavior and understanding evaluation patterns.

Args: connection_name: Name of the Grafana connection rule_uid: Optional filter by specific rule UID labels: Optional label matchers to filter history from_time: Start time (ISO 8601 or relative like "now-1h") to_time: End time (ISO 8601 or relative like "now") limit: Maximum number of history entries to return

Returns: JSON string with state history entries including timestamps and state transitions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
labelsNo
to_timeNo
rule_uidNo
from_timeNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses that the tool returns a JSON string with state history entries including timestamps and transitions, implying a read-only operation. It does not cover error cases or permission requirements, but the main behavior is clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured with a short purpose statement, an Args list, and a Returns line. It is concise, contains no fluff, and is easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all input parameters, the output format, and the intended use case. Even though an output schema exists, the description still usefully states that the result is a JSON string with timestamps and state transitions, making the tool's behavior clear end to end.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema itself has no descriptions, the tool description's Args section explains every parameter: connection_name, rule_uid, labels, from_time, to_time, and limit. It even gives time format examples like 'now-1h' and clarifies limit as a maximum number of entries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get alert state transition history.' It clearly distinguishes this tool from siblings like get_alert_rules_with_state and get_firing_alerts by focusing on historical state changes rather than current state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: 'Useful for debugging alert behavior and understanding evaluation patterns.' It does not explicitly mention when not to use this tool or recommend alternatives, but the history-focused language makes the primary use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_current_orgB

Get current organization information.

Args: connection_name: Name of the Grafana connection

Returns: JSON string with organization details.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of explaining behavior. It only states that it returns a JSON string with organization details; it does not explicitly state that the operation is read-only, nor does it mention potential errors, permissions, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and free of superfluous content. It contains exactly the essential information about purpose, input, and output in a compact format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read operation, the description is mostly adequate. However, it does not elaborate on the structure of the returned organization details, nor does it mention any failure modes or edge cases. Given the low complexity, this is acceptable but not thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'connection_name' is described with the same wording as its title ('Name of the Grafana connection'). The description adds no extra meaning beyond the schema, so it receives the baseline score for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and the target resource ('current organization information'). It is distinguishable from sibling tools, which focus on other resources like dashboards, alerts, or users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, such as needing an active connection, nor any indication of scenarios where this tool would be preferred over others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_current_userA

Get profile information for the authenticated Grafana user.

Note: This endpoint only works with session-based authentication. API keys are service account tokens and are not associated with a user profile. When using API key auth, this will return a 404 error.

Args: connection_name: Name of the Grafana connection

Returns: JSON string describing the current user (id, login, email, role, etc.). When the connection uses API key auth, returns a structured explanation instead of surfacing Grafana's raw 404 response.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the session-based auth requirement, the API-key incompatibility, the 404 failure mode, the structured explanation fallback, and the return format. This is unusually thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized with clear sections for purpose, caveat, args, and returns. Every sentence adds useful information, and the important auth limitation is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with an output schema, the description covers purpose, auth constraints, error behavior, and return format. The only meaningful gap is the lack of concrete guidance on where valid connection_name values come from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented connection_name parameter. However, 'Name of the Grafana connection' adds little beyond the schema title 'Connection Name' and does not explain how to obtain or format valid connection names, such as referencing list_connections.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object: 'Get profile information for the authenticated Grafana user.' It clearly identifies the resource and distinguishes this from siblings like list_users or get_current_org by emphasizing the current authenticated user.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly warns that the endpoint only works with session-based authentication and that API key auth returns a 404, which gives clear when-not-to-use guidance. It does not name an alternative tool for API-key scenarios, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dashboardA

Get full dashboard definition including all panels and settings.

WARNING: Large dashboards (>50 panels) will likely exceed MCP response limits (25,000 tokens). For large dashboards, use this workflow instead:

  1. get_dashboard_info() - Get overview and panel list

  2. get_dashboard_panel() - Get details for specific panels of interest

Args: connection_name: Name of the Grafana connection dashboard_uid: UID of the dashboard to retrieve

Returns: JSON string with complete dashboard definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It implies a read-only retrieval operation and states the return format, but it does not explicitly confirm there are no side effects, nor does it mention authentication, permissions, or rate limits. The behavior is mostly inferable from the word 'get' but not fully explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and reasonably concise. The warning and workflow guidance are valuable and not excessive, and the Args/Returns sections are clear. It could be slightly tighter, but the content is purposeful and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description states that the tool returns a JSON string with the complete dashboard definition, which is sufficient for basic use. However, it does not mention error conditions, how the connection_name is resolved, or whether the output is structured in a particular schema. It is adequate but leaves some operational context unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides no descriptions (0% coverage) and the Args section in the description merely repeats the parameter names without adding detail. While 'connection_name' and 'dashboard_uid' are somewhat self-explanatory, the description does not explain their format, source, or how they are used, so it fails to compensate for the missing schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the full dashboard definition including all panels and settings, and the 'get' verb makes the operation unambiguous. It also implicitly distinguishes itself from related sibling tools like get_dashboard_info and get_dashboard_panel by specifying the complete payload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives: it warns that dashboards with more than 50 panels may exceed response limits and directs users to a two-step workflow with get_dashboard_info and get_dashboard_panel. This is concrete, actionable, and distinguishes it from sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dashboard_infoA

Get lightweight dashboard metadata and panel list (without full panel definitions).

This is the RECOMMENDED first step for exploring dashboards, especially large ones. Returns dashboard metadata, variables, and a list of all panels with basic info (id, title, type). Use get_dashboard_panel() to get full details for specific panels of interest.

Args: connection_name: Name of the Grafana connection dashboard_uid: UID of the dashboard

Returns: JSON string with dashboard metadata and panel summary list.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It discloses that the tool returns a summary ('lightweight', 'without full panel definitions') and lists the contents of the response, but it does not explicitly state read-only or side-effect-free behavior, though the name 'get' implies an idempotent retrieval.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the primary purpose, followed by usage tips and return details. It is slightly repetitive (e.g., mentioning 'without full panel definitions' and later 'basic info'), but overall remains concise and easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a getter of this complexity: it explains what it does, when to use it, and the parameters. Since an output schema is present, the return value description is sufficient, and no critical information is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes an 'Args' section that explains each parameter: 'connection_name: Name of the Grafana connection' and 'dashboard_uid: UID of the dashboard'. This adds meaningful context beyond the bare schema, which has no descriptions, fully covering the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves lightweight dashboard metadata and a panel list, using the specific verb 'Get' with a precise resource. It distinguishes itself from sibling tools by explicitly mentioning 'without full panel definitions' and pointing to get_dashboard_panel for full details, ensuring no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance, calling it the 'RECOMMENDED first step for exploring dashboards, especially large ones,' and instructs to use get_dashboard_panel for specific panel details. This clearly communicates when to use this tool and when to choose an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dashboard_panelA

Get full configuration for a single panel from a dashboard.

Use this after get_dashboard_info() to explore specific panels in detail. Returns complete panel definition including queries, transforms, and display settings.

Args: connection_name: Name of the Grafana connection dashboard_uid: UID of the dashboard panel_id: ID of the specific panel to retrieve

Returns: JSON string with complete panel configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
panel_idYes
dashboard_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral transparency burden. It discloses the return type ('JSON string') and what the result contains ('complete panel definition including queries, transforms, and display settings'). It does not mention error cases or permissions, but for a read-only retrieval tool the provided detail is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose sentence, a usage hint, and separate Args/Returns sections. It is concise and front-loaded, though there is slight redundancy between 'Returns complete panel definition' and the later 'Returns: JSON string with complete panel configuration.'

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read operation with three required scalar parameters and an output schema, the description is largely complete. It provides usage context, parameter meanings, and return content. It could more explicitly differentiate from get_dashboard_panels and note failure behavior, but these are minor gaps given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description's Args section provides meaningful explanations for all three parameters: connection_name, dashboard_uid, and panel_id. This fully compensates for the schema's lack of descriptions and gives an agent enough to populate each argument correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Get full configuration for a single panel from a dashboard.' It differentiates from sibling tools by emphasizing 'single panel' and mentions specific contents ('queries, transforms, and display settings'). The reference to get_dashboard_info() as a predecessor further clarifies where this tool fits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this after get_dashboard_info() to explore specific panels in detail,' giving a clear workflow context. It does not explicitly state when not to use it or name alternative panel-fetching siblings, but the 'single panel' scoping provides enough directional guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dashboard_panelsA

Get simplified panel information from a dashboard.

Use this instead of get_dashboard() for large dashboards to avoid MCP size limits. Returns only essential panel information without full query definitions.

Args: connection_name: Name of the Grafana connection dashboard_uid: UID of the dashboard

Returns: JSON string with list of panels and their basic properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations present, so description carries the burden. It discloses that it returns simplified panel info without full query definitions, and that it exists to avoid size limits. It does not explicitly mention read-only or auth, but as a 'get' operation it implies no side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, starts with purpose, then usage note, then output. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what, why, and parameter meanings. Output is described as JSON string with list of panels. Sufficient for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides short explanations for both connection_name and dashboard_uid, adding meaning beyond the schema which has no descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action clearly (get simplified panel information) and identifies the resource (dashboard). It also distinguishes from alternative get_dashboard() by mentioning size limits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises using this tool for large dashboards to avoid MCP size limits, and implies get_dashboard() for other cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dashboard_versionsA

Get version history of a dashboard.

Args: connection_name: Name of the Grafana connection dashboard_uid: UID of the dashboard

Returns: JSON string with list of dashboard versions.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return type (JSON string with list of dashboard versions) and implies a read-only operation, but it does not mention authentication, errors, or any other side effects. This is minimal but adequate for a simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two short sentences with no redundant information. It efficiently communicates the purpose and parameters without any fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple getter tool with two parameters and no output schema in the prompt, the description provides sufficient information: what it does, the parameters, and the return type. It does not miss any critical context, though it could mention pagination or ordering if applicable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides titles, but the description explains each parameter: 'connection_name: Name of the Grafana connection' and 'dashboard_uid: UID of the dashboard.' This adds meaningful context beyond the schema, achieving full coverage of the two parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Get) and the resource (version history of a dashboard), making it distinct from sibling tools like get_dashboard, get_dashboard_info, and get_dashboard_panels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies when to use it (when you need version history), but it does not explicitly mention alternatives or provide conditions for choosing this tool over others. The sibling list adds context, but the description itself lacks explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_datasource_healthA

Run the health check for a specific datasource.

Args: connection_name: Name of the Grafana connection datasource_uid: UID of the datasource to probe

Returns: JSON string with health information reported by Grafana. If Grafana returns 404, the tool returns a structured unsupported or not_found result instead of a raw error.

ParametersJSON Schema
NameRequiredDescriptionDefault
datasource_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return format (JSON string) and the 404 handling behavior (structured 'unsupported' or 'not_found'), but it does not explicitly mention whether the operation is read-only or if any side effects are possible. A health check implies non-mutating behavior, but it is not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It clearly separates purpose, arguments, and return behavior with no unnecessary information or verbose phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main return behavior, including a specific special case (404). However, it does not mention other potential error conditions, prerequisites (such as needing an existing connection or datasource), or how this relates to the sibling tools. For a simple health-check tool, the provided context is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description provides only one-line explanations for each parameter. It clarifies that connection_name is the Grafana connection and datasource_uid is the datasource to probe, but it does not elaborate on expected formats, sources, or validation constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Run the health check') and identifies the target resource ('a specific datasource'). It also names the required parameters, making the core function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but does not explicitly state when to choose it over sibling tools like get_health, list_datasources, or query_prometheus. The context implies it is for probing a specific datasource's health, but no direct comparison or selection guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firing_alertsA

Get currently firing alert instances from Alertmanager.

Returns alerts that have transitioned from Pending to Firing state. Use this to see which alerts are actively firing and their details.

Args: connection_name: Name of the Grafana connection filter_labels: Optional label matchers (e.g., ["alertname=HighCPU", "severity=critical"]) silenced: Include silenced alerts (default: true) inhibited: Include inhibited alerts (default: true) active: Include active alerts (default: true)

Returns: JSON string with list of firing alert instances including labels, annotations, and startsAt.

ParametersJSON Schema
NameRequiredDescriptionDefault
activeNo
silencedNo
inhibitedNo
filter_labelsNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It explains that the tool returns firing alerts from Alertmanager and that it is a read operation. It does not discuss side effects, but this is typical for a 'get' tool. No contradictions with annotations since none exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear title, purpose, Args section, and Returns section. No unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the purpose, usage, parameters, and return value, which is quite complete. However, the default-value error in the parameter descriptions affects the overall accuracy, so it is not perfect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does provide purpose for each parameter, but it incorrectly states that active, silenced, and inhibited have default values of true, while the schema defines their defaults as null. This misleading information undermines the usefulness of the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the action (get) and the resource (currently firing alert instances from Alertmanager). It also clarifies the state transition from Pending to Firing, making it distinct from other alert-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear use case ('Use this to see which alerts are actively firing') but does not explicitly mention when not to use it or directly compare with sibling tools. Still, the context is sufficient for basic guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_healthA

Check Grafana instance health and version information.

Args: connection_name: Name of the Grafana connection to check

Returns: JSON string with health status and version information.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must convey side effects. 'Check' clearly indicates a read-only, non-destructive operation, making the behavior transparent enough for a health check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using two sentences to state the purpose and return value without any unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple health check, the description provides sufficient context: it states what is checked (instance health and version) and what is returned (JSON with that info). No additional context is needed for the single parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only the parameter name 'connection_name' with no description. The tool description does not explain the parameter further, but the meaning is reasonably self-evident in the context of Grafana connections. Schema coverage is low, yet the parameter is simple.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the verb 'Check' with the specific object 'Grafana instance health and version information', clearly distinguishing it from sibling tools like get_datasource_health which targets a datasource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for checking overall instance health but does not provide explicit guidance on when to choose this tool over alternatives such as get_datasource_health or when not to use it. Adequate but minimal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ruler_groupA

Get a specific alert rule group from a namespace.

Args: connection_name: Name of the Grafana connection namespace: The namespace/folder name group_name: The rule group name

Returns: JSON string with rule group configuration including all rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceYes
group_nameYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. 'Get' implies a read-only operation and the return type is stated, but side effects, permission requirements, error behavior, and rate limits are not disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well structured, with a clear one-line purpose followed by a compact argument list. There is no redundant or unnecessary content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter read operation, the description provides the operation, argument meanings, and return type. It does not cover edge cases or errors, but these are not essential for this straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no description coverage, but the tool description's Args section explains all three parameters: connection_name is the Grafana connection, namespace is the folder, and group_name is the rule group. This adds basic semantic meaning beyond the raw parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: getting a specific alert rule group from a namespace. It is clearly distinguishable from sibling tools like get_ruler_namespace_rules, which list groups in a namespace.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus related siblings such as get_ruler_rules or get_ruler_namespace_rules, and does not mention prerequisites or typical call scenarios beyond naming the arguments.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ruler_namespace_rulesA

Get all rule groups for a specific namespace (folder).

Args: connection_name: Name of the Grafana connection namespace: The namespace/folder name

Returns: JSON string with dict mapping namespace to rule groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
namespaceYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the return format ('JSON string with dict mapping namespace to rule groups') but does not mention side effects, read-only nature, error conditions, or authentication requirements. Since there are no annotations, the burden falls on the description, and it fails to cover these behavioral aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, starting with the main purpose statement, followed by parameter definitions and return type. It contains no unnecessary information and is easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters, the description is mostly complete: it covers purpose, parameters, and return format. However, it lacks details on error handling (e.g., if the namespace is not found) or prerequisites (e.g., valid connection), which leaves some gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly explains each parameter: connection_name is 'Name of the Grafana connection' and namespace is 'The namespace/folder name.' This adds meaningful context beyond the schema's titles, fully clarifying the expected input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get all rule groups for a specific namespace (folder).' It specifies the action (get), the resource (rule groups), and the scope (a specific namespace/folder), which distinguishes it from sibling tools that operate on all rules or a single group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context that this tool is for a specific namespace, which implies when to use it. However, it does not explicitly mention alternatives like get_ruler_rules or get_ruler_group, nor does it state when not to use this tool. The context is clear but lacks explicit exclusions or comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ruler_rulesA

Get all alert rules from the Ruler API.

Returns a dict mapping namespace (folder) to list of rule groups. Each rule group contains rules and evaluation configuration. This is the non-admin alternative to the Provisioning API.

Args: connection_name: Name of the Grafana connection

Returns: JSON string with all rule groups organized by namespace.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does not disclose any potential side effects, permissions required, rate limits, or whether the operation is read-only (though 'get' implies it). The lack of such details limits transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with separate lines for the main purpose, return format, an alternative note, and the argument description. Every sentence adds meaningful information without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides the essential information for an agent to understand the tool's purpose, output, and parameter. It does not cover error cases or additional nuances, but for a simple getter that is acceptable. It lacks details that could be considered nice-to-have, like examples, but is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no descriptions for the parameter, and the description adds only a minimal explanation: 'Name of the Grafana connection'. This clarifies the parameter's role but does not elaborate on accepted values, defaults, or how the connection is used. It adds some meaning beyond the raw schema but not much.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get all alert rules') and the specific resource ('Ruler API'). It also specifies the return format (dict mapping namespace to rule groups), which distinguishes it from sibling tools like get_alert_rule_by_uid or get_ruler_namespace_rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'This is the non-admin alternative to the Provisioning API', providing some context about a use case. However, it does not explicitly state when to choose this tool over other similar listing tools (e.g., get_ruler_namespace_rules) or mention any prerequisites or conditions for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_permissionsA

Get permissions granted to the authenticated user.

Lists the permissions granted to the signed-in user. Returns a map of action names to their authorized scopes. Useful for checking what the current API key or session can access.

Note: Requires Grafana 8.0+ with RBAC enabled. May return 404 on older versions or instances without fine-grained access control.

Args: connection_name: Name of the Grafana connection

Returns: JSON string mapping action names to authorized scopes.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is transparent about prerequisites (Grafana 8.0+, RBAC enabled) and possible failure (404 on older versions/instances). Since no annotations are present, it carries the full burden and does so well, though it does not detail every error condition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is generally concise and well-structured, but there is slight redundancy between 'Get permissions granted' and 'Lists the permissions granted.' Overall it is efficient and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description provides adequate context: purpose, parameter, return format, and operational prerequisites. It does not over-explain, but the lack of explicit output schema details in the visible content is mitigated by the stated return description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides a title for connection_name, but the description includes an Args section explaining it as 'Name of the Grafana connection.' This compensates for the lack of schema-level detail and fully covers the single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: getting permissions granted to the authenticated user. It distinguishes itself from sibling tools like get_current_user by emphasizing the return of action-to-scope mappings, making its specific resource and action unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides useful context for when the tool is appropriate ('checking what the current API key or session can access') and notes version/RBAC requirements. However, it does not explicitly contrast with alternative tools or state when not to use it, leaving some inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_alertsA

List alert rules, optionally filtered by folder.

Args: connection_name: Name of the Grafana connection folder_uid: Optional folder UID to filter alerts

Returns: JSON string with list of alert rules and their status.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_uidNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of disclosing behavior. It accurately implies a read-only list operation and states the return format ('JSON string with list of alert rules and their status'), but it does not mention pagination, sorting, or potential edge cases. It is adequate but not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with two short sentences and no redundant or filler content. Every phrase contributes useful information about the tool's behavior or parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core action, the optional filter, and the return type. Given that an output schema exists, it does not need to specify every output field. It lacks a small amount of context around default behavior (e.g., whether all alert rules are returned when folder_uid is omitted) but is generally complete for a simple list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains both parameters: connection_name as 'Name of the Grafana connection' and folder_uid as 'Optional folder UID to filter alerts.' This adds meaningful context beyond the bare parameter names in the schema, though it could provide more detail on how to obtain the UID or what 'filter' means exactly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'List alert rules, optionally filtered by folder.' It names the resource and the optional filtering behavior, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not indicate when to prefer this tool over related siblings such as get_alert_rules_with_state, get_firing_alerts, or get_alert_rule_by_uid. It mentions filtering by folder, but gives no guidance on selection criteria or use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_annotationsB

List annotations for a time range.

Args: connection_name: Name of the Grafana connection time_from: Start time for annotations time_to: End time for annotations dashboard_id: Filter by dashboard ID tags: Filter by tags

Returns: JSON string with list of annotations.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
time_toNo
time_fromNo
dashboard_idNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden for behavioral disclosure. It implies a read-only list operation but does not mention side effects, authentication needs, rate limits, or potential errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and free of irrelevant content. It states the action, lists the arguments, and indicates the return type in a compact, well-organized structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter tool with no annotations, the description is too sparse. It lacks essential context such as time format, filtering behavior, pagination or limits, and any output schema details beyond a generic JSON string.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description repeats parameter names but adds no detail beyond them. It does not explain the expected format for time_from/time_to, how tags are matched, or the meaning of dashboard_id, leaving schema coverage effectively zero.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists annotations for a time range, using a specific verb and resource. It is distinguishable from the sibling tools, none of which focus on annotations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives. The description does not mention any conditions, prerequisites, or scenarios where this tool is preferable over sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_connectionsA

List all available Grafana connections with their configuration details.

Returns: JSON string with connection details including name, url, and description.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description indicates a read-only listing operation but does not explicitly state that no modifications occur or mention permissions or potential errors. Since no annotations are provided, the description carries the full burden, but 'list all' reasonably implies non-destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using two sentences to convey purpose and return format without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides the return type (JSON string) and included fields (name, url, description). While no output schema is present, for a simple listing tool this is sufficient. Sibling tool context further clarifies its role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters in the schema, so the description correctly omits parameter explanations. Nothing additional is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all available Grafana connections and their configuration details, with a specific verb and resource. It is distinct from sibling tools, which focus on dashboards, alerts, datasources, or users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for discovering or enumerating connections, and the return format is stated. It does not explicitly contrast with alternatives, but the scope is clear enough for an agent to select it when a list of connections is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_datasourcesB

List all configured data sources in Grafana.

Args: connection_name: Name of the Grafana connection

Returns: JSON string with list of data sources and their configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the return type ('JSON string') and scope ('all configured data sources'), and 'List' implies a read-only operation. However, it does not mention permission requirements, connection validity, or pagination/filtering behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the core purpose. The Args/Returns structure is clear, though the Returns line partly duplicates what the output schema already conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter list tool with an output schema, the description covers purpose, parameter, and return format. It lacks usage guidance and deeper parameter context, so it is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only says 'Name of the Grafana connection', which adds minimal meaning beyond the property name/title. It does not explain how to find valid connection names or what happens if the connection does not exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('List all configured data sources') and identifies the Grafana context. This clearly distinguishes it from sibling tools like list_connections or get_datasource_health, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It does not mention list_connections, get_datasource_health, or any conditions/exclusions. The only implied context is that a Grafana connection name is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_folder_dashboardsA

List all dashboards in a specific folder.

Args: connection_name: Name of the Grafana connection folder_uid: UID of the folder limit: Optional maximum results per page page: Optional page number fields: Optional subset of Grafana search fields to return (for example: id,orgId,uid,title,uri,url,slug,type,tags,isStarred,folderId,folderUid,folderTitle,folderUrl)

Returns: JSON string with list of dashboards in the folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
fieldsNo
folder_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses the return format ('JSON string with list of dashboards') and optional pagination parameters, but it does not mention defaults, error behavior, authentication requirements, or what happens if the folder does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear one-sentence summary followed by a compact Args section. Every sentence adds value, especially the fields example, without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward folder-scoped listing tool, the description covers purpose, all parameters, and the return format. Minor gaps remain around pagination defaults and error conditions, but the overall definition is sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the Args section explains every parameter, including what fields can be requested and that limit/page are optional. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List all dashboards in a specific folder.' This clearly distinguishes it from sibling tools like search_dashboards and get_dashboard by emphasizing folder-scoped, unfiltered listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'in a specific folder' provides clear context for when to use this tool, and the required folder_uid reinforces that. However, it does not explicitly name alternatives or state when not to use it, such as choosing search_dashboards for broader searching.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_foldersB

List all folders in the Grafana instance.

Args: connection_name: Name of the Grafana connection

Returns: JSON string with list of folders and their properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It only states that folders are listed and a JSON string is returned, which largely restates the tool's name. It does not address permission-based visibility, error behavior, or whether 'all' folders really means all folders accessible to the connection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the core purpose. The Args and Returns sections are clean, though the Returns line is somewhat redundant given the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter list tool, the description is mostly adequate, especially with an output schema available. However, it lacks usage guidance and caveats about permissions or connection name resolution, leaving some gaps for an agent deciding how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds minimal context to the connection_name parameter by calling it 'Name of the Grafana connection,' which is slightly more than the schema title 'Connection Name.' However, it does not explain how to find valid connection names or what happens if an invalid one is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List all folders in the Grafana instance.' This clearly distinguishes it from siblings like list_folder_dashboards and list_connections, making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or related tools such as list_connections for obtaining valid connection names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_teamsA

List all teams in the organization.

Args: connection_name: Name of the Grafana connection page: Optional page number per_page: Optional page size fields: Optional subset of Grafana team fields (for example: id,orgId,uid,name,avatarUrl,email,memberCount)

Returns: JSON string with list of teams.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
fieldsNo
per_pageNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states that it returns a JSON string with a list of teams, so basic output behavior is disclosed. However, with no annotations, it does not clarify pagination behavior, default page size, whether 'all teams' means all pages or only the first page, or any permission/error scenarios.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with an Args/Returns format. There is no redundant or filler text; every sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation, the description provides enough context: the resource, scope, parameter meanings, and return format. It could be stronger with pagination defaults or error conditions, but the presence of page/per_page is implied by the parameter names and basic explanations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions, so the description carries the burden. It gives a meaningful one-line explanation for each parameter, including naming connection_name, page, per_page, and providing example fields for the 'fields' parameter. It lacks constraints or allowed values but covers the basics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: 'List all teams in the organization.' It names the resource (teams), the scope (organization), and clearly distinguishes this from sibling list tools like list_users or list_connections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Use is implied by the title and description: an agent would use this when it needs all teams. However, there is no explicit guidance about when to prefer this over sibling tools or when it would be inappropriate, such as needing users, folders, or datasources.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA

List all users in the current organization.

Args: connection_name: Name of the Grafana connection page: Optional page number (1-indexed) per_page: Optional page size fields: Optional subset of Grafana org-user fields (for example: orgId,userId,avatarUrl,email,name,login,role,lastSeenAt,lastSeenAtAge,authLabels)

Returns: JSON string with list of users.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
fieldsNo
per_pageNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose side effects, permissions, rate limits, or confirm read-only behavior beyond the verb 'List'. The absence of any transparency about potential impacts or access requirements leaves a gap for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a short purpose statement followed by a clean list of parameters and a return note. No redundant or verbose content is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing operation, the description covers purpose, parameter meanings, and return format ('JSON string with list of users'). However, it omits details like error conditions, pagination behavior, or response structure, but these are not critical for such a basic tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes a brief explanation for each parameter (e.g., connection_name as 'Name of the Grafana connection', page as '1-indexed', per_page as 'page size', and fields with examples). This adds meaning beyond the bare schema, though it lacks details on defaults or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and the resource ('all users in the current organization'), making the tool's purpose unambiguous. It is distinct from sibling tools like list_teams or list_annotations, and the tool name reinforces this clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives. While no direct sibling for listing users exists, the description does not mention any conditions, exclusions, or comparisons with other list operations, leaving the agent without explicit usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_lokiA

Execute a LogQL query against a Loki datasource.

Args: connection_name: Name of the Grafana connection datasource_uid: UID of the Loki datasource query: LogQL query to execute time_from: Start time in nanoseconds or relative time time_to: End time in nanoseconds or relative time limit: Maximum number of log lines to return

Returns: JSON string with query results.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
time_toNo
time_fromNo
datasource_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden; it states that a query is executed and JSON is returned, but it does not disclose possible side effects, error behavior, or operational constraints like rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, starts with a clear purpose, and uses a compact parameter list with no irrelevant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given six parameters and no schema descriptions, the description sufficiently covers purpose, parameters, and return type, though it could add examples or note optional defaults.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args section in the description defines all six parameters, adding useful semantics such as time format and limit meaning that are absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states tool executes LogQL queries against a Loki datasource, distinguishing it from Prometheus or generic explore tools by naming the exact query language and target.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The LogQL and Loki references give clear context for when to use the tool, but it does not explicitly mention alternatives such as query_prometheus or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_prometheusA

Execute a PromQL query against a Prometheus datasource.

Args: connection_name: Name of the Grafana connection datasource_uid: UID of the Prometheus datasource query: PromQL query to execute time_from: Start time (e.g., 'now-1h' or timestamp) time_to: End time (e.g., 'now' or timestamp) step: Query resolution step (e.g., '15s')

Returns: JSON string with query results.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepNo
queryYes
time_toNo
time_fromNo
datasource_uidYes
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It states that the tool returns a JSON string with query results, but it does not explicitly mention whether the operation is read-only, what happens on errors, or whether any side effects occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured, with a single purpose statement and a clean parameter list. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward query tool with six parameters and no nested objects, the description and schema together provide enough information to invoke it correctly. Some detail about output structure and optional parameter defaults is absent, but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no per-parameter descriptions, but the tool description names and explains all six parameters with practical examples for time and step formats. It does not specify optional behavior when time_to/time_from or step are omitted, but the core semantics are clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Execute') and clearly identifies the resource ('Prometheus datasource') and query language ('PromQL'), making the tool's purpose immediately obvious and distinct from sibling query tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool—whenever a PromQL query needs to be executed against Prometheus—but it does not explicitly contrast it with sibling tools such as query_loki or explore_query, so some inference is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_dashboardsA

Search for dashboards by name or tag.

Args: connection_name: Name of the Grafana connection query: Optional search query for dashboard names tag: Optional tag to filter dashboards limit: Optional maximum number of results per page page: Optional page number (1-indexed) fields: Optional subset of Grafana search fields to return (for example: id,orgId,uid,title,uri,url,slug,type,tags,isStarred,folderId,folderUid,folderTitle,folderUrl)

Returns: JSON string with list of matching dashboards.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
pageNo
limitNo
queryNo
fieldsNo
connection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry full behavioral disclosure. It does not mention that this is a read-only operation, any potential side effects, authentication requirements, rate limits, or pagination behavior beyond the parameter descriptions. The lack of such context leaves the agent uninformed about operational implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized into an Args block and a Returns block. It is concise, with each parameter getting one line. The example in fields is useful but slightly verbose; the overall structure is clear and easy to parse, though it could be slightly tighter without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 6 params (1 required) and returns a list, the description adequately covers the purpose, all parameter semantics, and the return format as a JSON string. It does not discuss error cases, but this is not critical for a search operation. Overall, it provides the essential context an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains each parameter with a short phrase: query is for dashboard names, tag filters by tag, limit/page control pagination, fields is a selectable subset with an example list, and connection_name identifies the Grafana instance. This adds meaningful context that the schema lacks (since schema coverage is 0%), helping the agent choose appropriate values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Search for dashboards by name or tag.' This specifies a definite action (search) and resource (dashboards), and the method is implied by the parameters. It distinguishes itself from sibling tools like get_dashboard (which retrieves a specific dashboard) and list_folders (which lists folders), making it easy to select.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: it is for searching dashboards by name or tag. However, it does not explicitly mention when not to use it or point to alternatives (e.g., 'For retrieving a single dashboard, use get_dashboard'). The guidance is minimal but not absent; it is left to the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 29 tool updatesv0.4.0
    • First observedexplore_query
    • First observedget_alert_rule_by_uid
    • First observedget_alert_rules_with_state
    • First observedget_alert_state_history
    • First observedget_current_org
    • First observedget_current_user
    • First observedget_dashboard
    • First observedget_dashboard_info
    • First observedget_dashboard_panel
    • First observedget_dashboard_panels
    • First observedget_dashboard_versions
    • First observedget_datasource_health
    • First observedget_firing_alerts
    • First observedget_health
    • First observedget_ruler_group
    • First observedget_ruler_namespace_rules
    • First observedget_ruler_rules
    • First observedget_user_permissions
    • First observedlist_alerts
    • First observedlist_annotations
    • First observedlist_connections
    • First observedlist_datasources
    • First observedlist_folder_dashboards
    • First observedlist_folders
    • First observedlist_teams
    • First observedlist_users
    • First observedquery_loki
    • First observedquery_prometheus
    • First observedsearch_dashboards

TDQS

A3.6/5.0

Scored across 29 tools

Disambiguation4/5

Most tools have clear, distinct purposes (dashboards vs alerts vs datasources vs users). Some overlap exists: get_dashboard vs get_dashboard_info vs get_dashboard_panels and get_ruler_group vs get_alert_rules_with_state could confuse agents, though descriptions help differentiate.

Naming Consistency3/5

Names generally follow a verb_noun pattern (list_, get_, query_, explore_), but inconsistencies exist: get_ruler_rules vs list_alerts (same domain), get_alert_rules_with_state vs get_firing_alerts (semantic overlap), and get_dashboard_panels vs get_dashboard_panel (plural/singular ambiguity). The pattern is recognizable but not fully consistent.

Tool Count4/5

29 tools is on the higher end but justified for a comprehensive Grafana read-only MCP covering dashboards, alerts, datasources, queries, and admin. It feels slightly heavy but each tool addresses a distinct API endpoint or workflow need; not excessive given the platform's breadth.

Completeness4/5

Covers major read-only Grafana surfaces: dashboards, folders, alerts, datasources, queries (Prometheus, Loki, Explore), users, teams, annotations. Missing some common read-only endpoints like org details, notification policies, or snapshot listing, but the core operations for monitoring and exploration are well represented.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A server that enables AI assistants to access and query Grafana dashboards, metrics, logs, and configurations through an MCP protocol interface.
    10
    6
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    This MCP server enables natural-language querying of Grafana logs by automatically detecting log sources and service labels. It provides read-only access to log data with intelligent caching for efficient repeat queries.
    22 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    In-cluster MCP server for read-only diagnostics of Grafana, Prometheus, Alertmanager, and Loki, enabling metric queries, alert listings, and log queries through Grafana datasource proxies with Kubernetes RBAC authentication.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server for Grafana that provides tools to interact with dashboards, data sources, alerts, and more.
    1
    -