mcp-read-only-grafana
Provides read-only (and optionally write) access to Grafana instances, enabling management of dashboards, panels, folders, datasources, and alerts via API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-read-only-grafanalist dashboards in production_grafana"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Read-Only Grafana Server
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.yamlCredentials: injected via the MCP client or shell environment
Rotated session state:
~/.local/state/lukleh/mcp-read-only-grafana/session_tokens.jsonCache:
~/.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-grafanaexposes the safe default surfaceSeparate write command -
mcp-grafana-writeenables dashboard saves, alerting writes, folders, and related mutations from the same packageAPI 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.jsonHierarchical 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
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-pathsWhen 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-pathsWhere 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.yamlThe 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 instance4. 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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxYou 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_hereDeprecated session cookie fallback:
export GRAFANA_SESSION_PRODUCTION_GRAFANA=your_session_token_here
Precedence is:
Rotated session cookies in
session_tokens.jsonRuntime 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
Log in to Grafana in a web browser
Open developer tools
Go to Application/Storage -> Cookies
Find the cookie named
grafana_sessionorgrafana_sessCopy 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
In Grafana, go to Administration -> Service Accounts or Configuration -> API Keys
Create a key with the minimum required permissions
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@latestCodex
codex mcp add mcp-read-only-grafana \
--env GRAFANA_API_KEY_PRODUCTION_GRAFANA=your_api_key_here \
-- uvx mcp-read-only-grafana@latestIf 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-writeFor 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_grafanaLocal 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-pathsThe 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 connectionquery(optional): Search query for dashboard namestag(optional): Tag to filter dashboardslimit(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 connectiondashboard_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 connectiondashboard_uid(required): UID of the dashboardpanel_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 connectiondashboard_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 connectiondashboard_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 connectionfolder_uid(required): UID of the folderlimit(optional): Maximum results per pagepage(optional): Page numberfields(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 returns404, the MCP returns a structuredunsupportedornot_foundresult instead of surfacing the raw error.
Parameters:
connection_name(required): Name of the Grafana connectiondatasource_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 connectiondatasource_uid(required): UID of the Prometheus datasourcequery(required): PromQL query stringtime_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 connectiondatasource_uid(required): UID of the Loki datasourcequery(required): LogQL query stringtime_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 connectionqueries(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 requestinterval_ms(optional): Query interval in millisecondsadditional_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 connectionfolder_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 connectionalert_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 connectionstate(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 connectionfilter_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 connectionrule_uid(optional): Filter by specific rule UIDlabels(optional): Label matchers to filter historyfrom_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 connectiontime_from(optional): Start time for annotation searchtime_to(optional): End time for annotation searchdashboard_id(optional): Filter by dashboard IDtags(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 connectiondashboard_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
unavailableresult instead of surfacing Grafana's raw404response.
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 connectionpage(optional): Page numberper_page(optional): Page sizefields(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 connectionpage(optional): Page numberper_page(optional): Page sizefields(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 connectiondashboard(required): Raw Grafana dashboard model JSON objectfolder_uid(optional): Folder UID override for the save targetfolder_id(optional): Folder ID override for the save targetmessage(optional): Dashboard version history messageoverwrite(optional): Set totrueto 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 connectiontitle(required): Folder titleuid(optional): Explicit folder UIDparent_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 connectionrule(required): Alert rule definition (JSON object)editable_in_ui(optional): Defaults totrueand keeps the alert editable in the Grafana UI. Set tofalseto 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 connectionrule_uid(required): UID of the alert rule to updaterule(required): Updated alert rule definition (JSON object)editable_in_ui(optional): Defaults totrueand keeps the alert editable in the Grafana UI. Set tofalseto keep Grafana's provisioned behavior
Returns: Updated alert rule
delete_alert_rule
Delete an alert rule.
Parameters:
connection_name(required): Name of the Grafana connectionrule_uid(required): UID of the alert rule to deleteeditable_in_ui(optional): Defaults totrueand keeps related provisioning resources editable in the Grafana UI. Set tofalseto 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 connectionfolder_uid(required): UID of the folder containing the rule groupgroup_name(required): Name of the rule groupconfig(required): Rule group configuration (JSON object withinterval, etc.)editable_in_ui(optional): Defaults totrueand keeps the rule group and its alerts editable in the Grafana UI. Set tofalseto 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 connectioncontact_point(required): Contact point definition (JSON object)editable_in_ui(optional): Defaults totrueand keeps the contact point editable in the Grafana UI. Set tofalseto 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 connectioncontact_point_uid(required): UID of the contact point to updatecontact_point(required): Updated contact point definition (JSON object)editable_in_ui(optional): Defaults totrueand keeps the contact point editable in the Grafana UI. Set tofalseto keep Grafana's provisioned behavior
Returns: Updated contact point
delete_contact_point
Delete a contact point.
Parameters:
connection_name(required): Name of the Grafana connectioncontact_point_uid(required): UID of the contact point to deleteeditable_in_ui(optional): Defaults totrueand keeps related provisioning resources editable in the Grafana UI. Set tofalseto 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 connectionpolicies(required): Notification policy tree (JSON object)editable_in_ui(optional): Defaults totrueand keeps the notification policy tree editable in the Grafana UI. Set tofalseto 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 connectioneditable_in_ui(optional): Defaults totrueand keeps the notification policy tree editable in the Grafana UI. Set tofalseto 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 connectionmute_timing(required): Mute timing definition (JSON object)editable_in_ui(optional): Defaults totrueand keeps the mute timing editable in the Grafana UI. Set tofalseto 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 connectionmute_timing_name(required): Name of the mute timing to updatemute_timing(required): Updated mute timing definition (JSON object)editable_in_ui(optional): Defaults totrueand keeps the mute timing editable in the Grafana UI. Set tofalseto keep Grafana's provisioned behavior
Returns: Updated mute timing
delete_mute_timing
Delete a mute timing.
Parameters:
connection_name(required): Name of the Grafana connectionmute_timing_name(required): Name of the mute timing to deleteeditable_in_ui(optional): Defaults totrueand keeps related provisioning resources editable in the Grafana UI. Set tofalseto 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 connectiontemplate_name(required): Name of the templatetemplate(required): Template definition (JSON object withtemplatefield)editable_in_ui(optional): Defaults totrueand keeps the notification template editable in the Grafana UI. Set tofalseto keep Grafana's provisioned behavior
Returns: Created/updated template
delete_notification_template
Delete a notification template.
Parameters:
connection_name(required): Name of the Grafana connectiontemplate_name(required): Name of the template to deleteeditable_in_ui(optional): Defaults totrueand keeps related provisioning resources editable in the Grafana UI. Set tofalseto 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 descriptiontimeout: 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 tokenGRAFANA_SESSION_<CONNECTION_NAME>: Deprecated session-token fallbackGRAFANA_TIMEOUT_<CONNECTION_NAME>: Override timeout for specific connection
Security
The server implements a secure-by-default model:
Read-only by default -
mcp-read-only-grafanaonly performs safe read operationsSeparate write command -
mcp-grafana-writeexposes write-capable tools when you intentionally opt into that commandTimeout protection - Configurable request timeouts (default: 30s)
SSL verification - Enabled by default for all connections
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/queryfor 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
Credentials are sensitive - Never commit real credentials or your local
connections.yamlto version controlAutomatic fallback refresh - Deprecated session tokens are automatically captured and persisted when Grafana rotates them (API keys are static)
Permission scope - The server inherits the read permissions of the provided API key or deprecated session fallback
Prefer local-only secret storage - Keep secrets in local
connections.yaml, MCP-injected env, or the rotatedsession_tokens.jsoncache, 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.jsonReuses those rotated tokens on later requests
If you manually need to update a fallback session token:
Update the
session_tokeninconnections.yamlor theGRAFANA_SESSION_*value in your MCP client env/current shellAlso remove or update the cached value in
session_tokens.jsonif one was already persistedNo restart is needed once the active credential source has been updated
Authentication Failed
If you get authentication errors despite automatic refresh:
Prefer switching to an API key if you are still using the deprecated session fallback
Verify the current token or API key is valid in
connections.yaml, your current environment, orsession_tokens.jsonCheck that the state directory is writable (needed for automatic token persistence)
Ensure the environment variable name matches the connection name (e.g.,
GRAFANA_SESSION_PRODUCTION_GRAFANAforconnection_name: production_grafana)
Connection Timeout
If requests are timing out:
Increase the timeout in
connections.yamlOr set
GRAFANA_TIMEOUT_<CONNECTION_NAME>in the current environmentCheck 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: falseDevelopment
Available Commands
See all available commands:
justCommon 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 testsRunning Tests
just test
# or
uv run pytestCode 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-connectionLicense
MIT License - See LICENSE file for details
Available Tools
29 toolsexplore_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.
| Name | Required | Description | Default |
|---|---|---|---|
| queries | Yes | ||
| range_to | No | ||
| range_from | No | ||
| interval_ms | No | ||
| connection_name | Yes | ||
| max_data_points | No | ||
| additional_options | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | ||
| rule_name | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| labels | No | ||
| to_time | No | ||
| rule_uid | No | ||
| from_time | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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:
get_dashboard_info() - Get overview and panel list
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| panel_id | Yes | ||
| dashboard_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| datasource_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | ||
| silenced | No | ||
| inhibited | No | ||
| filter_labels | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | Yes | ||
| group_name | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_uid | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| time_to | No | ||
| time_from | No | ||
| dashboard_id | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| fields | No | ||
| folder_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| fields | No | ||
| per_page | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| fields | No | ||
| per_page | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| time_to | No | ||
| time_from | No | ||
| datasource_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| step | No | ||
| query | Yes | ||
| time_to | No | ||
| time_from | No | ||
| datasource_uid | Yes | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| page | No | ||
| limit | No | ||
| query | No | ||
| fields | No | ||
| connection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
29 tool updates
v0.4.0- First observed
explore_query - First observed
get_alert_rule_by_uid - First observed
get_alert_rules_with_state - First observed
get_alert_state_history - First observed
get_current_org - First observed
get_current_user - First observed
get_dashboard - First observed
get_dashboard_info - First observed
get_dashboard_panel - First observed
get_dashboard_panels - First observed
get_dashboard_versions - First observed
get_datasource_health - First observed
get_firing_alerts - First observed
get_health - First observed
get_ruler_group - First observed
get_ruler_namespace_rules - First observed
get_ruler_rules - First observed
get_user_permissions - First observed
list_alerts - First observed
list_annotations - First observed
list_connections - First observed
list_datasources - First observed
list_folder_dashboards - First observed
list_folders - First observed
list_teams - First observed
list_users - First observed
query_loki - First observed
query_prometheus - First observed
search_dashboards
TDQS
Scored across 29 tools
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.
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.
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.
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
Related MCP Connectors
An MCP server giving access to Grafana dashboards, data and more.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Related MCP Servers
- AlicenseAqualityDmaintenanceA server that enables AI assistants to access and query Grafana dashboards, metrics, logs, and configurations through an MCP protocol interface.106MIT
- AlicenseNot gradedqualityDmaintenanceThis 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 npmMIT
- FlicenseNot gradedqualityDmaintenanceIn-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.-
- FlicenseNot gradedqualityDmaintenanceMCP server for Grafana that provides tools to interact with dashboards, data sources, alerts, and more.1-